티스토리 뷰
반응형
[배워서 바로 쓰는 스프링 프레임워크 - 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의 메서드들이 호출되지 않음
- postProcessBeanFactory
- ConfigurableListableBeanFactory
- 스프링 컨테이너에 접근하게 해줌
- 스프링 컨테이너를 설정하고 모든 빈을 이터레이션하며 빈 정의를 변경할 수 있게 해줌
4.1 BeanFactoryPostProcessor 예제
4.2 PropertySourcesPlaceholderConfigurer
- PropertySourcesPlaceholderConfigurer를 사용해 빈 프로퍼티나 생성자 인수값을 프로퍼티 파일제 지정할 수 있음
- <property>나 <constructor-arg>의 속성에 프로퍼티 위치 지정자만 사용하면된다
형태 : ${<프로퍼티_파일에_있는_프로퍼티_이름>}
- <property>나 <constructor-arg>의 속성에 프로퍼티 위치 지정자만 사용하면된다
- 스프링 컨테이너가 빈 정의를 로드할 때 PropertySourcesPlaceholderConfigurer가 실제 값을 프로퍼티 파일에서 가져와 빈 정의의 프로퍼티 위치 지정자를 실제값으로 바꿔줌
- 프로퍼티
- locations : 프로퍼티 위치 지정자의 값을 찾기 위해 검색하는 프로퍼티 파일 경로 지정
- ignoreUnresolvablePlaceholders : 프로퍼티 파일에서 프로퍼티 위치 지정자의 값을 찾지 못했을 때 무시할지 예외를 발생할지
- false -> 예외 발생
- localOverride : true면 프로퍼티 파일에서 읽은 프로퍼티를 지역 프로퍼티를 사용해 대체
- <property-placeholder> 엘리먼트로도 설정 가능
4.3 PropertyOverrideConfigurer
- 외부 프로퍼티 파일에 빈 프로퍼티를 지정
- 형식
- <빈-이름>.<빈-프로퍼티-이름>=<값>
- 빈 프로퍼티 값을 외부로 빼내고 싶을 때만 PropertyOverrideConfigurer를 사용할 수 있다
즉, PropertyOverrideConfigurer를 사용해 생성자 인수값을 외부에 넣을 수는 없다 - PropertySourcesPlaceholderConfigurer를 사용하면 프로퍼티 디폴트 값을 지정할 수 없다
하지만 PropertyOverrideConfigurer를 사용하면 빈 프로퍼티의 디폴트값을 지정할 수 있다
5. 요약
반응형
'study > 배워서 바로 쓰는 스프링 프레임워크' 카테고리의 다른 글
Chapter06. 애너테이션 기반 개발 (0) | 2021.07.26 |
---|---|
Chapter04. 의존 관계 주입 (0) | 2021.07.11 |
Chapter03. 빈 설정 (0) | 2021.05.24 |
Chapter02. 스프링 프레임워크 기초 (0) | 2021.05.10 |
Chapter01. 스프링 프레임워크 소개 (0) | 2021.01.16 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- IntelliJ
- 스프링부트
- JavaScript
- 도커
- docker pull limit
- 쿠버네티스
- back merge
- ImagePullBackOff
- java
- cacheable
- QuickTimePlayer
- 코틀린
- 자바
- 스프링
- linuxkit
- Spring
- gasmask
- kotlin
- 도메인주도설계
- Kubernetes
- docker
- k8s
- clean code
- kotlin In Action
- docker for mac
- ddd
- 자바스크립트
- springboot
- 클린코드
- gradle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함