티스토리 뷰

반응형

[배워서 바로 쓰는 스프링 프레임워크 - www.yes24.com/Product/Goods/90051375]

 

1. 소개

  • 빈에 커스텀 초기화와 정리(파괴) 로직을 넣는 방법
  • 스프링 BeanPostProcessor 인터페이스를 구현해 새로 생성된 빈 인스턴스와 상호 작용하는 방법
  • 스프링 BeanFactoryPostProcessor 인터페이스를 구현해 빈 정의를 변경하는 방법

 

2. 빈의 초기화와 정리 로직 커스텀화하기

2.1 destory-method 속성에 지정한 정리 메서드 호출하기

  • 스프링의 ConfigurablrApplicationContext(ApplicationContext)의 하위 인터페이스에는 JVM에게 종료 훅을 등록할 수 있는 registerShutdownHook 메서드가 들어있다
    • 종료 훅은 JVM이 종료될 때 ApplicationContext를 닫는 책임을 가짐
    • 해당 메서드의 대안으로 ConfigurableApplicationContext의 close 메서드를 사용해 명시적으로 ApplicationContext를 닫는 방법도 있다

2.2 정리 메서드와 프로토타입 빈

  • 프로토타입 스코프 빈의 경우 스프링 컨테이너가 destory-method 속성을 무시한다
    • ApplicationContext에서 프로토타입 빈을 얻어낸 객체가 자신이 사용한 프로토타입 스코프 빈의 해제 메서드를 명시적으로 호출할 책임을 지도록 스프링 컨테이너가 원하기 때문에

2.3 모든 빈에 초기화 메서드와 메서드 정의하기

  • <beans> 엘리먼트의 default-init-method와 default-destroy-method 속성을 사용해 여러 빈의 초기화와 정리 메서드를 지정할 수 있다
  • <bean>에 init-method와 destory-method를 설정하면 <beans>에 정의된 디폴트 값을 오버라이드할 수 있다

2.4 InitializingBean과 DisposableBean 생애주기 인터페이스 초기화하기

  • 스프링 컨테이너는 ApplicationContextAware, InitializingBean, DisposableBean과 같은 생애주기 인터페이스를 구현하는 빈에 대해 콜백을 호출한다
    • 콜백은 해당 빈이 어떤 동작을 수행하거나, 빈 인스턴스에 필요한 정보를 제공하기 위한 목적으로 쓰인다
  • InitializingBean 인터페이스의 afterPropertiesSet 메서드는 스프링 컨테이너가 빈 프로퍼티를 설정한 다음에 호출되어 데이터베이스 연결, 읽기 위한 파일 열기 등의 초기화를 수행한다
  • DisposableBean 인터페이스의 destory 메서드는 스프링컨테이너가 빈 인스턴스가 제거될 때 호출한다

2.5 JSR 250 @PostConstruct와 @PreDestory 애너테이션

  • JSR 250(자바 플랫폼 공통 애너테이션) : 자바 기술에서 사용하는 표준 애너테이션 정의가 들어있음
  • @PostConstruct : 객체 초기화 메서드 지정
  • @PreConstruct : 객체 정리 메서드 지정
  • @PostConstruct와 @PreConstruct를 사용하기 위해서는 XML 파일 안에서 스프링 CommonAnnotationbeanPostProcessor를 빈으로 등록해야 한다

 

 

3. BeanPostProcessor를 사용해 새로 생성도니 빈 인스턴스와 상호 작용하기

  • BeanPostProcessor
    • 새로 생성된 빈 인스턴스가 스프링 컨테이너에 의해 초기화되기 전과 후에 상호 작용할 수 있음
    • 스프링 컨테이너가 빈 초기화 메서드를 호출하기 전과 후에 커스텀 로직을 실행할 수도 있음
    • 스프링 컨테이너는 BeanPostProcessor 빈을 자동으로 감지해서 실행함
    • 메서드
      • postPorcessBeforeInitialization : 빈 인스턴스의 초기화 메서드가 호출되기 전에 호출됨
      • postProcessAfterInitialization : 빈 인스턴스의 초기화 메서드가 호출된 다음에 호출됨
      • 새로 생성된 빈 인스턴스와 이름을 인수로 받고, 인수로 받은 빈 인스턴스와 동일하거나 변경된 인스턴스를 반환함
    • 스프링 컨테이너가 빈이 완전히 초기화된 것으로 간주하는 시점은 postProcessAfterInitialization 메서드가 호출된 다음
    • BeanPostProcessor 빈 정의에서 빈을 지연 생성하도록 설정하면
      스프링 컨테이너는 지연 초기화 설정을 무시하고 XML 파일에 정의된 다른 모든 싱글턴 스코프 빈보다 먼저
      BeanPostProcessor 빈을 생성한다
    • BeanFactoryPostProcessor 인터페이스를 구현한 빈이 BeanPostProcessor 인터페이스를 구현한 빈보다 먼저 생성된다

3.1 BeanPostProcessor 예제 - 빈 인스턴스 검증하기

 

3.2 BeanPostProcessor 예제 - 빈 의존 관계 해결하기

  • BeanPostProcessor 빈의 빈 설정에 order 속성으로 BeanPostProcessor의 우선순위를 정할 수 있다
    (낮을 수록 우선순의가 높다)
  • 스프링 컨테이너는 BeanPostProcessor 구현을 다른 BeanPostProcessor 구현에 적용하지 않는다

 

3.3 FactoryBean에 대한 BeanPostProcessor의 동작 방식

  • FactoryBean이 만들어내는 빈 인스턴스에 대해 오직 postProcessAfterInitialization만 호출된다
    • postProcessBeforeInitialization은 호출되지 않음

 

3.4 RequiredAnnotationBeanPostProecessor

  • 빈 프로퍼티의 세터 메서드에 스프링 @Required를 설정하면
    스프링의 RequiredAnnotationBeanPostProcessor는 빈 프로퍼티가 XML에서 제대로 설정되었는지 검사한다
  • 빈 프로퍼티가 빈 정의에 설되었는지만 검사함
  • 설정된 프로퍼티가 올바른지 확인하지 않음

 

3.5 BeanFactoryPostProcessor를 사용해 빈 정의 변경하기

  • 빈이 제거되기 전에 빈 인스턴스와 상호자굥
  • postProcessBeforeDescruction() : 스프링 컨테이너는 싱글턴 빈 인스턴스를 없애기 전에 해당 메서드를 호출함

 

4. BeanFactoryPostProcessor를 사용해 빈 정의 변경하기

  • BeanFactoryPostProcessor
    • 스프링 컨테이너가 빈 정의를 로드한 다음 빈 인스턴스를 만들어내기 전에 실행됨
    • XML 파일에 정의된 다른 모든 빈이 생성되기 전에 생성됨
    • 메서드
      • postProcessBeanFactory
        • 인수 : ConfigurableListableBeanFactory 타입, 스프링 컨테이너가 로드한 빈 정의를 얻어서 변경
        • 여기서 생성된 빈 인스턴스는 BeanPostProcessors의 메서드들이 호출되지 않음
  • ConfigurableListableBeanFactory
    • 스프링 컨테이너에 접근하게 해줌
    • 스프링 컨테이너를 설정하고 모든 빈을 이터레이션하며 빈 정의를 변경할 수 있게 해줌

 

4.1 BeanFactoryPostProcessor 예제

 

4.2 PropertySourcesPlaceholderConfigurer

  • PropertySourcesPlaceholderConfigurer를 사용해 빈 프로퍼티나 생성자 인수값을 프로퍼티 파일제 지정할 수 있음
    • <property>나 <constructor-arg>의 속성에 프로퍼티 위치 지정자만 사용하면된다
      형태 : ${<프로퍼티_파일에_있는_프로퍼티_이름>}
  • 스프링 컨테이너가 빈 정의를 로드할 때 PropertySourcesPlaceholderConfigurer가 실제 값을 프로퍼티 파일에서 가져와 빈 정의의 프로퍼티 위치 지정자를 실제값으로 바꿔줌
  • 프로퍼티
    • locations : 프로퍼티 위치 지정자의 값을 찾기 위해 검색하는 프로퍼티 파일 경로 지정
    • ignoreUnresolvablePlaceholders : 프로퍼티 파일에서 프로퍼티 위치 지정자의 값을 찾지 못했을 때 무시할지 예외를 발생할지
      • false -> 예외 발생
    • localOverride : true면 프로퍼티 파일에서 읽은 프로퍼티를 지역 프로퍼티를 사용해 대체
  • <property-placeholder> 엘리먼트로도 설정 가능

 

4.3 PropertyOverrideConfigurer

  • 외부 프로퍼티 파일에 빈 프로퍼티를 지정
  • 형식
    • <빈-이름>.<빈-프로퍼티-이름>=<값>
  • 빈 프로퍼티 값을 외부로 빼내고 싶을 때만 PropertyOverrideConfigurer를 사용할 수 있다
    즉, PropertyOverrideConfigurer를 사용해 생성자 인수값을 외부에 넣을 수는 없다
  • PropertySourcesPlaceholderConfigurer를 사용하면 프로퍼티 디폴트 값을 지정할 수 없다
    하지만 PropertyOverrideConfigurer를 사용하면 빈 프로퍼티의 디폴트값을 지정할 수 있다

 

5. 요약

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함