스프링

9. 컴포넌트 스캔과 의존관계 자동 주입

juhoyang 2024. 10. 5. 16:35

- 1~8 번까지는 Annotaion으로 AppConfig.java파일을 만들거나 xml파일로 스프링빈, 의존관계를 정리했다.

- 스프링은 설정 파일이 없어도 자동으로 빈을 등록하는 컴포넌트 스캔 기능이 있다.

- 의존관계 자동주입 기능은 @Autowired 애노테이션을 사용한다

 

@ComponentScan

- 클래스 설정정보에 붙여줌, @Bean으로 클래스 등록 안함

- @Component 애노테이션이 붙은 클래스 모두 스프링빈으로 등록해줌 -> 빈이름은 맨 앞글자만 소문자로 넣어 사용한다.

 

- @Configuration 애노테이션이 붙은것도 대상이 되는데 아래 소스 코드를 보면 @Component가 있음

 

빈등록 그림

빈이름은 첫 문자가 소문자

 

@Autowired

- 사용할 빈에 @Component 붙였다면 해당 빈의 의존관계 주입을 해야한다.

- 의존관계 주입이 필요한 생성자에 해당 애노테이션을 붙이면 해당 타입에 맞는 빈을 가져와 주입해준다. (getBean과 동일)

 

의존관계 주입 그림

 

탐색위치, 스캔대상

탐색위치 지정

- 모든 클래스를 컴포넌트 스캔하면 시간이 오래걸려 필요한 위치로 부터 탐색을 하는게 좋다.

- basePackages로 빈을 생성할 범위를 패키지로 지정가능하다. (패키지는 여러개 지정 가능하다.)

- basePackageClasses : 지정한 클래스의 속한 패키지가 시작 위치로 지정

- default는 해당@ConponentScan클래스의 패키지가 시작 위치가 됨 -> 따라서 설정클래스 위치를 프로젝트 최상단에 두는것이 좋다.

 

스프링부트를 쓸 경우

- 시작정보인 @SpringBootApplication이 프로젝트 시작 루트 위치에 두는것이 관례이다.

프로젝트 자동으로 만들때 생성된 파일

 

해당 SpringBootApplication 정보를 보면

-@ComponentScan이 있는것을 볼 수 있다. 스프링 부트를 쓰면 따로 @ComponentScan설정파일을 만들지 않아도 된다.

  (애노테이션은 상속 관계가 없고 특정애노테이션을 들고 있는것을 인식하는것을 스프링이 지원하는 기능이다.)

 

컴포넌트 스캔 대상

애노테이션 내용 부가기능
@Component 스프링 빈으로 등록할 대상  
@Controller 스프링 MVC 컨트롤러에서 사용 컨트롤러로 인식된다.
@Service  비즈니스 로직에서 사용  
@Repository  데이터 접근 계층에서 사용 데이터 접근계층으로 인식, 데이터 계층예외를 스프링 예외로 변환
@Configuration 설정정보에서 사용  스프링 설정정보로 인식해 싱글톤 유지하도록 처리함

 

 

필터

- includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다. -> 자주 사용은 안함

- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.

- 스프링 부트에서 컴포넌트 스캔을 기본으로 제공해서 보통은 해당 기본 설정에 맞추어 사용함

 

중복, 충돌

- 같은 빈 이름등록의 경우

1) Component스캔으로 자동으로 빈등록시 이름의 중복이 발생했을 때

- BeanDefinitionStoreException 에러 발생

 

2) 수동으로 빈을 등록했는데 Component스캔으로 같은이름의 빈이 등록대상인 경우

 - 수동빈으로 사용할수 있다. (수동빈이 자동빈을 오버라이딩한다.)

 - 해당 경우 스프링부트를 사용하면 에러가 발생하고 에러 유무를 설정 가능하다.

 

AppConfig

- 컴포넌트 스캔으로 생성된 빈은 첫문자가 소문자라서 위와같이 수정함

 

MemoryMemberRepository.java

 

SpringBoot로 실행할 경우에러