- 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로 실행할 경우에러
자료출처
스프링 핵심 원리 - 기본편
'스프링' 카테고리의 다른 글
11. 스프링 빈 생명주기 콜백 (1) | 2024.10.13 |
---|---|
10. 다양한 의존관계 주입방법 (0) | 2024.10.07 |
8. BeanFactory, ApplicationContext 의 이해 (BeanDefinition포함) (0) | 2024.09.24 |
7. 스프링 컨테이너, 빈 (0) | 2024.09.22 |
5. IoC, DI, 컨테이너 (0) | 2024.09.22 |