Develop/Spring+JPA
[Spring 5 프로그래밍 입문] chapter 5, 6 - 컴포넌트 스캔과 빈 라이프 사이클
연로그
2022. 6. 4. 20:52
반응형
목차
- chapter 5: 컴포넌트 스캔
- 컴포넌트 스캔
- @ComponentScan
- 컴포넌트 스캔 충돌 처리
- chapter 6: 빈 라이프 사이클과 범위
- 컨테이너의 라이프 사이클
- 스프링 빈 객체의 라이프 사이클
- 프로토타입 빈의 라이프 사이클
Chapter 5 - 컴포넌트 스캔
📰 컴포넌트 스캔
- : 스프링이 직접 클래스를 검색해 빈으로 등록해주는 기능
- @Component로 등록 가능
- 어노테이션에 값을 주면 빈으로 등록 시 사용할 이름 지정 가능
- 값이 없을 경우 클래스 이름의 첫 글자를 소문자로 바꾼 이름으로 지정
- 기본 스캔 대상
- @Component
- @Controller
- @Service
- @Repository
- @Configuration
책에서는 @Aspect도 스캔 대상이라고 되어있는데 이는 오해를 부를 수 있는 표현이다.
@Aspect는 기본 스캔 대상이 아니다. (자세히 알아보기)
🤗 @ComponentScan
- basePackages: 스캔 대상 패키지 목록 지정 (하위 패키지까지 스캔 대상)
- excludeFilters: 스캔 대상에서 제외하기
@Configuration
@ComponentScan(basePackages = {"wooteco"},
excludeFilters = @Filter(type = FilterType.ASPECTJ))
public class AppContext {
// ...
}
Spring Boot를 이용하는 프로젝트를 보면 @ComponentScan 사용 안하는데 자동으로 빈 등록이 된다. main 메서드가 존재하는 클래스에 붙어있는 @SpringBootApplication를 잘 살펴보자.
👉 자세히 알아보기
💥 컴포넌트 스캔 충돌 처리
- 빈 이름이 충돌나는 경우
- 컴포넌트 스캔 과정에서 발견 가능
- 👉 둘 중 하나를 명시적으로 빈 이름 지정
- 수동 등록한 빈과 충돌나는 경우
- 스프링 부트 2.1 이전: 수동 등록 빈이 우선 순위
- 스프링 부트 2.1 이상: Exception 발생 (Spring Boot 2.1 릴리즈 노트 참고)
- 👉 필요 시 자동 주입하는 코드에서 @Qualifier를 이용해 알맞은 빈 선택
Chapter 6 - 빈 라이프 사이클과 범위
💫 컨테이너의 라이프 사이클
- 스프링 컨테이너는 초기화와 종료라는 라이프 사이클을 가짐
- 초기화: 빈 객체 생성, 의존 주입, 초기화 작업 포함
- 종료: 빈 객체의 소멸 작업 포함
🌱 스프링 빈 객체의 라이프 사이클
- 스프링 컨테이너가 관리
- 객체 생성
- 의존 설정
- 초기화 (방법 3가지)
- InitializingBean의 afterPropertiesSet() 실행
- @PostConstruct 어노테이션이 있는 메서드 실행
- @Bean의 initMethod 속성에서 지정한 메서드 실행
- 소멸 (방법 3가지)
- DisposableBean의 destroy() 실행
- @PreDestroy 어노테이션이 있는 메서드 실행
- @Bean의 destroyMethod 속성에서 지정한 메서드 실행
➰ 프로토타입 빈의 라이프 사이클
- 프로토타입 빈: 빈 객체를 구할 때마다 매번 새로운 객체를 생성함
- 컨테이너를 종료해도 프로토타입 빈 객체의 소멸 메서드를 실행하지는 않음
- 소멸 처리를 코드에서 직접 해야함
프로토타입 빈은 왜 쓸까?
의존 관계를 편하게 하기 위해 사용할 수도 있다. 다만 순수 자바 코드로도 해결할 수 있는 부분이기도 하고 실무에서 자주 사용하지는 않는 듯 하다.
👉 참고 링크1, 참고 링크2
이 글은 최범균 님의 '스프링5 프로그래밍 입문'을 보고 정리하는 글 입니다.
반응형