프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

 

* 김영한님의 스프링 핵심원리 기본편 강좌를 수강하며 정리한 글입니다. *

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

 

이전 글에서는 의존 관계 주입의 여러 가지 방법에 대해 알아보았다.

 

 

서버에는 커넥션 풀이란 개념이 있다.

 

연결 풀 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

간단히 설명하자면 요청이 올 때마다 커넥션 객체를 만들어서 클라이언트와 연결하기보단, 미리 일정량을 풀에 만들어 두고 요청이 오면 연결해주는 식이다. 연결이 끝나면 객체를 제거하기보단 초기화시켜 다시 반환한다.

 

이러한 작업에는 객체의 초기화와 소멸 과정이 중요하다.

이를 위해 스프링이 지원하는 콜백 방식을 알아보자.

 

 

스프링 빈 라이프 사이클

 

스프링 빈은 객체 생성을 생성한 후, 의존 관계 주입한다. (생성자 주입만 동시 진행)

빈 객체를 사용하려면 의존 관계 주입도 끝난 후에 사용해야 한다.

이를 위해서 스프링은 의존 관계 주입이 완료됨을 콜백 메서드를 통해 알려준다.

또한 컨테이너 종료 직전에 소멸 콜백을 진행한다.

 

싱글톤의 빈의 라이프 사이클 이벤트를 요약하면 다음과 같은 순서로 이뤄진다.

1. 컨테이너 생성

2. 빈 생성 (생성자 주입)

3. 의존 관계 주입

4. 초기화 콜백

5. 사용

6. 소멸 전 콜백: 빈 소멸 직전에 호출

7. 스프링 종료

 

초기화를 왜 생성과 같이 진행하지 않는지 의문이 들 수 있다.

만약 생성자가 초기화의 책임까지 진다면 이는 단일 책임 원칙(SRP)의 위반이 될 수 있다.

초기화는 외부와 연결하는 무거운 작업을 진행할 수 있기 때문에, 생성자에서는 객체의 생성에만 집중하는 것이 유지보수 관점에서도 좋고 한다. 따라서 간단한 필드 값을 넣는 것이 아닌 이상 생성과 초기화는 분리해 진행하자.

 

이제 스프링이 지원하는 3가지 콜백을 공부해보자.

 

 

인터페이스 콜백 InitializingBean, DisposableBean

 

스프링 초창기에 나온 인터페이스를 이용한 콜백 방법으로 요즘에는 잘 사용하지 않는다.

 

InitializingBean 인터페이스를 상속하면 해당 클래스에 afterPropertiesSet()은 의존 관계 주입이 끝나면 호출된다.

@Override
public void afterPropertiesSet() throws Exception {
	//초기화 구문
}

 

소멸 콜백 인터 페이스인 DisposableBean를 상속하면  destroy()가 소멸시점에 자동 호출된다.

@Override
public void destroy() throws Exception {
	// 소멸 코드
}

 

단, 스프링 전용 인터페이스이기 때문에 수정 불가능한 외부 라이브러리에는 적용을 할 수 없다.

 

 

@Bean 초기화, 소멸 메서드 명시

 

빈 등록 시에 메서드 명을 적어주는 방법이다.

@Bean(initMethod = "initMethod", destroyMethod = "closeMethod")

//자동 추론 사용 시 생략가능
@Bean(initMethod = "initMethod" /*, destroyMethod = "closeMethod" */)

 

코드가 스프링에 전혀 의존하지 않아 외부 라이브러리에도 적용이 가능하다.

특이하게도 destroyMethod 속성은 소멸 메서드를 추론(inferred)하는 기능을 지원한다.

대부분의 라이브러리에서 소멸 메서드는 close, shutdown 이기 때문에, 이를 찾아서 자동으로 등록해준다.

 

 

어노테이션 @PostConstruct, @PreDestroy

 

자바 표준에서 공식 지원하는 어노테이션을 사용하는 방법이다.

각 초기화, 소멸 메서드에 붙여주면 끝이다.

@PostConstruct
public void init() {
	//초기화 구문
}

@PreDestroy
public void close() throws Exception {
	//소멸 구문
}

 

스프링에서도 권장하는 방식이지만, 외부 라이브러리를 수정하지 못하면 적용할 수 없다.

따라서 외부 라이브러리에는 위의 @Bean 방식을 사용하면 된다.

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함