[데브코스] Bean 생성에 대해서

Updated: Categories:

W3D3 - Component Scan / Auto Wired / Bean Scope 를 공부해보자

Streotype Annotation

  • @Configuration : App Context(IoC 컨테이너)로 등록하기
  • @Bean : 컴포넌트 객체(의존성주입을 위한)를 직접 등록하고 싶을때 사용

Component

  • 컴포넌트 어노테이션엔 다양한 종류가 존재한다.
  • 어노테이션을 달아놓은 파일을 컴포넌트라고 칭한다
  • @ComponentScan : 컴포넌트들을 모두 스캔하여 Bean으로 등록한다. 스캔 범위 지정이 가능
    • @ComponentScan(basePackages = {"패키지명", ...}
    • @ComponentScan(basePackageClasses = {클래스, ...})
  • @Service, @Repository … 등등 계층구조로 역할을 나눠 명시한다


Auto Wired

  • 스프링의 ComponentScan 사용시 Bean을 직접 지정하지 않는다.
  • 따라서 @Bean으로 직접 의존관계 주입해주던 방식을 자동화해주는 Auto Wired 기능이 등장.
  • 컴포넌트로 등록된 파일 내의 메소드에 @Autowired 어노테이션을 붙여준다.
    • 초기화시 필요한 모든 의존관계가 형성됨
    • 잘못된 패턴을 찾을 수 있도록 도와줌
    • 테스트를 쉽게 해줌
    • 불변성을 확보
  • @Autowired 생략시 생성자에 자동으로 어노테이션이 붙는다.
  • 만약 생성자와 관련된 Bean이 두개 이상이라면? => 해당 Bean에 어노테이션을 달아줘야함.
    • @Primary : 가장 우선이 되는 Bean을 뜻함
    • @Qualifier("별명") : Bean 파일에서 별명 설정 후, 생성자에서 명시해줘야함


Bean Scope

  • 총 6개의 Bean Scope가 존재함
    • singleton, prototype, request, session, application, websocket
  • 기본적으로 싱글톤 스코프를 가진다.
  • 싱글톤으로 생성된 Bean을 객체로 가져오면 모두 같은 주소를 가진다
  • 다른 주소를 가지게하려면 prototype 스코프로 변경해야함

Scope 변경하기

  • 컴포넌트 파일 정의시 어노테이션을 통해 스코프를 정의할 수 있다
  • @Scope(value = ConfigurableBeanFactory.스코프문자열)
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)


Bean Life Cycle

  • AppContext(IoC 컨테이너) 등록시 연관된 Bean들이 생성된다.
  • AppContext는 .close() 메소드로 종료할 수 있으며, 종료시 내부의 모든 Bean들이 소멸된다.
  • Bean의 생성과 소멸시에 콜백함수를 설정할 수 있다.

Bean 생성 콜백

  1. @PostConstruct 어노테이션이 적용된 메소드 호출
  2. Bean이 InitializingBean 인터페이스 구현시 afterPropertiesSet 호출
  3. @Bean 어노테이션의 initMethod에 설정한 메소드 호출

Bean 소멸 콜백

  1. @PreDestroy 어노테이션이 적용된 메소드 호출
  2. Bean이 DisposableBean 인터페이스 구현시 destroy 호출
  3. @Bean 어노테이션의 destroyMethod에 설정한 메소드 호출