본문 바로가기
Back-end/Spring 개념

8. Bean 자동 등록

by devraphy 2022. 2. 7.

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

댓글