[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>
'Dev' 카테고리의 다른 글
Restful 하다는 것은 뭘까? (0) | 2022.07.18 |
---|---|
[Spring] 의존성 주입(DI)에 대해 알아보자 - 3 / 의존성 주입 (0) | 2022.03.03 |
[Spring] 의존성 주입(DI) 에 대해 알아보자 - 1 / 개요, Bean 정의 (0) | 2022.02.28 |
13. 기술면접 전 보고가면 좋은 내용 공유 2 (0) | 2021.04.19 |
12. [면접질문 정리] 인터넷 네트워크 (0) | 2021.04.19 |