본문 바로가기
Develop/Spring+JPA

[Spring 5 프로그래밍 입문] chapter 5, 6 - 컴포넌트 스캔과 빈 라이프 사이클

by 연로그 2022. 6. 4.
반응형

목차

  • 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를 잘 살펴보자.
👉 자세히 알아보기

 

💥 컴포넌트 스캔 충돌 처리

  1. 빈 이름이 충돌나는 경우
    • 컴포넌트 스캔 과정에서 발견 가능
    • 👉 둘 중 하나를 명시적으로 빈 이름 지정

  2. 수동 등록한 빈과 충돌나는 경우
    • 스프링 부트 2.1 이전: 수동 등록 빈이 우선 순위
    • 스프링 부트 2.1 이상: Exception 발생 (Spring Boot 2.1 릴리즈 노트 참고)
    • 👉 필요 시 자동 주입하는 코드에서 @Qualifier를 이용해 알맞은 빈 선택

 


Chapter 6 - 빈 라이프 사이클과 범위

 

💫 컨테이너의 라이프 사이클

  • 스프링 컨테이너는 초기화와 종료라는 라이프 사이클을 가짐
  • 초기화: 빈 객체 생성, 의존 주입, 초기화 작업 포함
  • 종료: 빈 객체의 소멸 작업 포함

 

🌱 스프링 빈 객체의 라이프 사이클

  1. 스프링 컨테이너가 관리

 

  1. 객체 생성
  2. 의존 설정
  3. 초기화 (방법 3가지)
    • InitializingBean의 afterPropertiesSet() 실행
    • @PostConstruct 어노테이션이 있는 메서드 실행
    • @Bean의 initMethod 속성에서 지정한 메서드 실행
  4. 소멸 (방법 3가지)
    • DisposableBean의 destroy() 실행
    • @PreDestroy 어노테이션이 있는 메서드 실행
    • @Bean의 destroyMethod 속성에서 지정한 메서드 실행

 

➰ 프로토타입 빈의 라이프 사이클

  • 프로토타입 빈: 빈 객체를 구할 때마다 매번 새로운 객체를 생성함
  • 컨테이너를 종료해도 프로토타입 빈 객체의 소멸 메서드를 실행하지는 않음
  • 소멸 처리를 코드에서 직접 해야함

 

프로토타입 빈은 왜 쓸까?
의존 관계를 편하게 하기 위해 사용할 수도 있다. 다만 순수 자바 코드로도 해결할 수 있는 부분이기도 하고 실무에서 자주 사용하지는 않는 듯 하다. 
👉 참고 링크1참고 링크2

 


이 글은 최범균 님의 '스프링5 프로그래밍 입문'을 보고 정리하는 글 입니다.

반응형