본문 바로가기
Dev

[Spring] 의존성 주입(DI) 에 대해 알아보자 - 2 / Bean 설정

by VIPeveloper 2022. 3. 2.
반응형

[Spring] 의존성 주입(DI)에 대해 알아보자 - 1 / 개요, Bean 정의

빈 설정하는 방법

. 이전 글 뒷부분을 살짝 가져왔다.

. 위의 클래스 AppConfig처럼 빈을 설정하는 방법에도 3가지가 존재한다.

. 빈 설정 방식 3가지는 아래와 같다.

. ApplicationContext는 단독 앱에서 스프링 프레임워크를 사용하거나, JUnit으로 만든 테스트 케이스 안에서 스프링 프레임워크를 구동할 때 사용된다.

. 웹 앱 사용 시, 확장된 개념인 WebApplicationContext를 이용한다.

자바 기반 설정 방식

방법 설명 생성 방식
자바 기반 설정 방식 . 자바 클래스에 @Configuration 어노테이션을 사용하고, 메서드에 @Bean 어노테이션을 사용해서 빈을 정의한다.
. 스프링 부트에서 많이 쓰는 방식이다.
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

 

@Configuration
public class AppConfig {
    @Bean
    UserRepository userRepository(){
    	return new UserRepositoryImpl();
    }
    
    @Bean
    PasswordEncoder passwordEncoder(){
    	return new BCyptPasswordEncoder();
    }
    
    @Bean
    UserService userService(){
    	return new UserServiceImpl(userRepository(), passwordEncoder());
    }
}

. @Configuration : 설정 클래스는 여러 개 정의할 수 있다.

. @Bean : 메서드명이 빈의 이름이 되고, 그 빈의 인스턴스가 반환 값이 된다. 빈 이름을 다르게 명시하고 싶다면 @Bean(name="userRepo")와 같이 name옵션을 이용하면 된다.

. 어노테이션 방식과 결합하는 것이 좋다.

어노테이션 기반 설정 방식

방법 설명 생성 방식
어노테이션 기반 설정 방식 . @Component 같은 클래스를 탐색해서 DI 컨테이너에 빈을 자동으로 등록하는 방법이다. ApplicationContext context = new AnnotationConfigApplicationContext("com.example.app");

. DI 컨테이너에 관리할 빈을 빈 설정 파일에 정의하는 대신, 빈을 정의하는 어노테이션을 빈의 클래스에 부여하는 방식을 사용한다.

. 컴포넌트 스캔(Component Scan) : 어노테이션이 붙은 클래스를 탐색해서 DI 컨테이너에 자동으로 등록하는 탐색 과정

. 오토와이어링(Autowiring) : 의존성 주입을 명시적으로 설정하는 것이 아니라, 어노테이션이 붙어있는 것에 대해 DI 컨테이너가 자동으로 필요로 하는 의존 컴포넌트를 주입하는 것.

컴포넌트 스캔 수행 방법

. 빈의 이름은 기본적으로 클래스명의 첫 글자를 소문자로 바꾼 이름과 같다.

. 첫글자첫 글자 이후 대문자가 연속되는 경우에는 첫 글자를 소문자로 변환하지 않고 클래스명이 그대로 빈 이름으로 사용된다. (예 : BCyptPasswordEncoder -> BCyptPasswordEncoder)

. 명시적으로 빈 이름을 지정하고 싶다면 @Component("exampleName")처럼 설정해주면 된다.

. 자바 기반 설정 방식 : 

// 설정 방법
@ComponentScan("com.example.demo")

. XML 기반 설정 방식 : 

// 설정 방법
<context:component-scan base-package="com.example.demo" />

XML 기반 설정 방식

. XML 파일을 이용한다.

방법 설명 생성 방식
XML 기반 설정 방식 . XML 파일을 사용하는 방법이다.
. <constructor-arg>나 <property> 요소를 사용해 의존성을 주입할 수 있다.
ApplicationContext context = new AnnotationConfigApplicationContext("META-INF/spring/applicationContext-root.xml");
<beans ...>
    <bean id="userRepository" class="com.example..." />
    <bean id="passwordEncoder" class="com.example..." />
    <bean id="userService" class="com.example..." >
    	<constructor-arg ref="userRepository" />
        <constructor-arg ref="passwordEncoder" />
    </bean>
</beans>

 

반응형