반응형

스프링 부트가 처음에 시작되면 스프링 컨테이너가 생성된다.

 

스프링 부트와 관련된 어노테이션은 이 컨테이너 내부에 존재하는 객체들을 기반으로 동작하게 된다.

 

스프링 컨테이너에 객체, 즉 스프링 빈을 등록하는 방법은 크게 두 가지가 있다.

   - 컴포넌트 스캔

   - 스프링 빈을 직접 등록(Java, Xml)

 

여기서는 컴포넌트 스캔과 스프링 빈을 Java로 직접 등록하는 것을 알아보자.

(스프링 빈을 직접 등록 시, 스프링 부트에서는 Java로 등록하는 것을 권장한다.)

 

컴포넌트 스캔

컴포넌트 스캔 위치로 지정된 패키지로부터 어노테이션을 찾는다.

@Component 와 관련된 어노테이션(@Controller, @Service, @Repository)이 등록된 클래스는 

스프링이 자동으로 해당 클래스의 객체를 생성해서 스프링 컨테이너에 넣어준다.

(스프링 컨테이너에서 스프링 빈이 관리된다와 동일한 의미) 

 

그런데 스프링 부트 프로젝트 생성 시, 우리가 따로 컴포넌트 스캔을 설정한 적은 없었다.

애플리케이션 실행 부분에 있는 @SpringBootApplication 가 수상하다. 확인해보자.

 

 

내부에 컴포넌트 스캔하는 부분이 있다. @ComponentScan 설정에 패키지 경로가 지정되지 않았는데 이런 경우에는 어노테이션을 선언한 클래스의 패키지로 경로가 설정된다.

스프링 빈을 직접 등록(Java)

@Configuration, @Bean 어노테이션을 이용하여 스프링 빈을 직접 컨테이너에 등록할 수 있다.

 

@Configuration,  @Bean을 선언하면 스프링 컨테이너가 런타임에 Bean 정의 및 서비스 요청을 생성해야한다고 알려주는 의미이다 .

 

 

두 가지 방식을 사용하는 경우

컴포넌트 스캔
 - 정형화된 코드. 즉, 상황에 따라 변경되지 않는 코드

스프링 빈으로 직접등록하여 사용
- 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 할 때 

 

위의 이미지를 참고하면 기존 ???Repository를 사용하다가 문제가 발견되어 다른 HeroRepository로 변경하였다.

이 때 컴포넌트 스캔을 사용중이라면 기존에 사용 중인 ???Repository 실제 코드 수정이 필요하다.(어노테이션 수정 등)

그러나 스프링 빈을 직접 등록하는 방식으로 의존성 주입을 하고 있다면, 설정에서 구현체만 바꿔주면 기존 코드를 건들 필요없이 바로 HeroRepository를 적용 시킬 수 있다.

 

반면 정형화된 코드에 스프링 빈을 직접 등록해서 사용하게 되면 객체간의 의존관계는 설정에 등록된 객체를 모두 확인해야하니 파악이 어려울 수 있다. 따라서 두 가지 방법 적절하게 병행해서 사용하는 것이 좋다.

 

 

[참고자료]

@Component

@Configuration

반응형

+ Recent posts