0. 개요
- 이전 포스팅에서 AppConfig 설정 파일을 이용하여 객체를 Spring Container에 Bean을 등록시키는 방법을 배웠다.
- 이처럼 AppConfig 파일을 사용하여 직접 Spring Bean을 명시하는 방법을 Bean 수동 등록이라고 한다.
- 실무에서는 수십, 수백 개의 Bean을 구성하여 프로젝트를 만든다.
- 그러므로 수 많은 Bean을 AppConfig에 일일이 작성하고 관리하는 것은 비효율적이다.
- 수 백줄의 AppConfig 파일에서 Bean의 역할과 의존관계를 개발자가 한번에 이해하고 수정하기 어렵기 때문이다.
- 그래서 현업에서는 AppConfig보다 Spring에서 제공하는 Bean 자동 등록 기능을 중점적으로 사용한다.
1. Bean 자동 등록
- AppConfig 파일을 사용하지 않고 Spring Container에 Bean을 등록하는 방식을 Bean 자동 등록이라고 한다.
- Bean 자동 등록은 어노테이션(@)을 사용하여 Bean을 명시하는데, Spring 에서는 2가지 어노테이션을 제공한다.
a) @Bean
- 메소드 레벨에 선언되는 어노테이션
- 메소드에서 return되는 객체를 Bean으로 Container에 등록한다.
@Bean
public TestService testService() {
return new TestServiceImpl(testRepository());
}
b) @Bean의 용도
- 개발자가 직접 통제할 수 없는 외부 라이브러리를 Bean으로 등록할 때 사용된다.
* 직접 통제할 수 없다는 의미는 소스코드의 직접적 접근 및 수정이 불가능하다는 뜻이다.
- 반대로, 개발자가 통제할 수 있는 클래스에는 @Bean을 사용할 수 없다. (컴파일 에러 발생)
c) @Component
- 클래스 레벨에 선언되는 어노테이션
- @Component가 붙어있는 클래스의 객체를 Spring Bean으로 등록한다.
@Component
public class TestServiceImpl implements TestService {}
d) @Component의 용도
- 개발자가 직접 통제할 수 있는 클래스를 Bean으로 등록할 때 사용된다.
- 해당 클래스가 Component Scan의 대상임을 명시한다.
e) 그 외 어노테이션
- @Bean, @Component 외에도 Component Scan의 대상으로 인식되는 어노테이션은 존재한다.
- 그러나 다른 어노테이션은 모두 @Bean 또는 @Component에서 파생된 어노테이션이다.
- 어노테이션 클래스 내부에 @Component를 포함하고 있기 때문이다.
- 이와 관련된 내용은 다음 포스팅에서 자세히 다룰 예정이다.
2. Spring이 Bean을 찾는 방법
- 위에서 2가지 어노테이션을 사용하여 Bean 자동 등록을 수행한다고 설명하였다.
- 그렇다면 Spring은 어떻게 이들을 찾아 Bean이라고 인지하는 걸까?
a) @ComponentScan
- @ComponentScan은 Bean을 탐색하여 Spring Container에 등록하는 역할을 수행하는 annotation이다.
- 클래스에 @ComponentScan을 부착하면 해당 클래스의 패키지를 기점으로 하위 경로까지 Bean을 탐색한다.
@ComponentScan
public class TestServiceImpl implements TestService{}
b) @ComponentScan의 동작원리
- Spring은 @ComponentScan이 붙은 클래스의 패키지를 기점으로 하위 클래스의 Bean을 탐색하여 Container에 등록한다.
- Spring Container는 Bean을 key:value 형식으로 관리하는데, key는 class 이름의 첫 글자를 소문자로 변환하여 사용한다.
ex) TestServiceImpl → testServiceImpl
- value는 생성자를 통해 생성된 구현체의 메모리 주소 값이 들어간다.
'Back-end > Spring 개념' 카테고리의 다른 글
10. Bean 자동 vs 수동 등록 (0) | 2022.02.09 |
---|---|
9. @ComponentScan의 동작원리와 옵션 (0) | 2022.02.08 |
7. Singleton Container (0) | 2022.02.02 |
6. Spring Container의 다형성 (0) | 2022.02.01 |
5. Spring Container (0) | 2022.01.31 |
댓글