일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BeanValidation
- 프로토콜 스택 4계층
- 스프링 컨테이너
- BeanDefnition
- REST #REST API #HTTP 메서드
- 객체지향
- 체크에러
- 언체크에러
- 깃허브 저장소 합치기
- 스프링 예외변환기
- 스프링 파일 업로드
- 스프링 빈
- 커밋로그
- 스프링
- 스프링 타입컨버터
- DI
- HTTP 요청 메시지
- ExceptionResolver
- BasicErrorController
- 백준4256
- 김영한
- http
- 웹 스코프
- HTTP메시지
- HTTP 응답 메시지
- 예외추상화
- 의존관계
- 프로토타입 스코프
- 백준 2263
- 서블릿
Archives
- Today
- Total
Enthusiasm! Enthusiasm!
빈 생명주기 콜백 본문
객체의 생성 및 초기화
데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화 및 종료 작업이 필요하다. 스프링이 이러한 초기화 작업과 종료 작업을 어떻게 진행하는지 알아보자
- 스프링 빈의 간단한 생명주기: 객체생성→의존관계 주입
- 스프링 빈은 객체를 생성하고, 의존 관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존관계 주입이 모두 완료되고 난 다음에 호출해야하고 개발자는 의존관계 주입이 완료된 시점을 알아야한다!!! → 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다. 따라서 안전하게 종료 작업을 진행할 수 있다.
- 스프링 빈의 이벤트 라이프사이클
- 스프링컨테이너생성 → 스프링빈생성 → 의존관계주입 → 초기화콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
- 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
- 객체의 생성과 초기화를 분리
- 생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는등 무거운 동작을 수행한다.
- 따라서 생성자 안에서 무거운 초기화 작업을 함께 하는 것 보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다. 물론 초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우에는 생성자에서 한번에 다 처리하는게 더 나을 수 있다.
- 스프링이 제공하는 3가지 방법의 빈 생명주기 콜백
- 인터페이스를 이용한 콜백
- InitializingBean, DisposableBean를 상속받고 인터페이스의 afterPropertiesSet과 destroy 함수를 오버라이딩 해주면 된다.
- 스프링 초기에 쓰던 방법으로 스프링 전용 인터페이스기 때문에 초기화,소멸 메서드의 이름 변경이 불가능하며 외부 라이브러리에 적용할 수 없어 현재는 쓰이지 않는다.
- Bean 등록을 이용하여 초기화,소멸 메서드 지정
- 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close")처럼 초기화,소멸 메서드를 지정할 수 있다.
- 장점: 메서드 이름을 자유롭게 설정 가능, 스프링 코드에 의존하지 않음, 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부라이브러리에 초기화 종료 메서드를 적용 가능!
- 참고: destroyMethod에는 특별한 기능이 있는데 default값이 추론으로 되어있어, 값을 설정하지 않으면 close, shutdown과 같이 종료 메서드일것 같은 이름의 메서드를 추론해서 호출해준다. 따라서 추론 기능을 사용하지 않으려면 destroyMethod = "" 과 같이 설정해 줘야한다.
- 애노테이션 @PostConstruct, @PreDestroy
- 최신 스프링에서 권장! 이걸 사용하는게 가장 좋음
- 생성 및 종료 메서드에 애노테이션을 붙여주면 완료.
- 매우 간편, 스프링에 종속적인 기술이 아닌 자바 표준이다. 따라서 다른 컨테이너에서도 동작한다, 컴포넌트 스캔과 가장 잘 어울린다.
- 메서드에 애노테이션을 달아야 하므로 코드 변경이 불가능한 외부 라이브러리에는 적용이 불가능하다. 외부 라이브러리에 초기화,종료를 해야하면 Bean등록을 이용하자
- 인터페이스를 이용한 콜백
@PostConstruct
public void init(){
System.out.println("초기화 시작");
connect();
call("초기화 연결 메시지");
}
@PreDestroy
public void close() {
System.out.println("프로그램 종료");
disconnect();
}
이전 포스팅- 의존관계 자동주입(2) - https://yulddong.tistory.com/15
의존관계 자동 주입(2)
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 조회 빈이 2개이상일때 현재까지는 같은 타입에 대해서 스프링 빈으로 등록할 클래스
yulddong.tistory.com
다음 포스팅- 빈 스코프 https://yulddong.tistory.com/17
빈 스코프
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 빈 스코프 스프링 빈이 기본적으로는 싱글톤으로 디자인 되어있어, 컨테이너 생성과
yulddong.tistory.com
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.
'자바 스프링 > 스프링 핵심원리' 카테고리의 다른 글
빈 스코프 (0) | 2023.01.12 |
---|---|
의존관계 자동 주입(2) (4) | 2023.01.10 |
의존관계 자동 주입(1) (0) | 2023.01.09 |
컴포넌트 스캔 (0) | 2023.01.06 |
싱글톤 컨테이너 (0) | 2023.01.05 |
Comments