-인프런 김영한 강사님의 스프링 핵심 원리를 정리한다.
-빈 생명주기와 생명주기에 따른 콜백 처리 방식을 알아본다.
-빈 스코프의 개념, 종류 및 특징을 알아본다.
-모든 소스는 깃허브에서 관리한다.(https://github.com/coderahn/Spring-Lecture2)
8.빈 생명주기 콜백
1.빈 생명주기 콜백 시작
DB Connection Pool과 같이 애플리케이션 시작 시점에 필요 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체 초기화 및 종료작업이 필요하다.
우선 빈의 라이프사이클은 다음과 같다.
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
보는 것처럼 의존관계 주입이 끝나고 초기화 콜백이 실행되며, 스프링 종료 직전에 소멸전 콜백이 실행된다.
스프링은 3가지 방법으로 빈 생명주기 콜백을 지원한다.
- 인터페이스(InitializingBean, DisposableBean)
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstruct, @PreDestroy
위의 방법들을 적용해볼 예제코드를 작성한다. 외부네트워크에 미리 연결하고 종료하는 테스트 객체를 다음과 같이 생성한다.
테스트는 다음과 같이 작성한다.
2.인터페이스 InitializingBean, DisposableBean
InitializingBean, DisposableBean을 implements하면 초기화 메소드를 오버라이드하여 사용할 수 있다. 최근에는 잘 사용 안 한다. 스프링 전용 인터페이스에 의존하며 초기화, 소멸 메소드 이름 변경이 불가능하다. 내가 코드 수정이 불가한 외부라이브러리에 적용할 수 없다. 다음과 같다.
3.빈 등록 초기화, 소멸 메서드 지정
다음과 같이 초기화 메소드를 만든다.
초기화메소드, 종료메소드를 적용할 Bean에 옵션을 작성한다.
initMethod, destroyMethod를 사용하면 메서드 이름을 자유롭게 사용할 수 있고 스프링 빈 스프링 코드에 의존하지 않는다. 설정 정보를 사용하기 때문에 외부라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
또한 종료 메서드에는 추론 기능이 있다. 보통 라이브러리는 대부분 close, shutdown 등의 종료 메서드명을 사용한다.
@Bean의 destroyMethod는 기본값이 (inferred)로 등록되어 있다. 그래서 close, shutdown 등의 메서드가 있을 경우 destroyMethod를 적지 않아도 작동한다. (destroyMethod=""는 작동 안 함)
4.애노테이션 @PostConstruct, @PreDestroy
다음과 같이 어노테이션을 붙여 간단하게 사용 가능하다.
9.빈 스코프
1.빈 스코프란?
기본적으로 스프링 빈은 싱글톤 빈이기 때문에 스프링 컨테이너 시작시에 생성되고 종료시에 소멸한다. 이런 스코프를 변경할 수 있다.
- 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위 스코프
- 프로토타입 : 스프링 컨테이너는 프로토타입의 빈 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 짧은 범위 스코프
- 웹관련스코프
- request : 웹요청 들어오고 나갈 때까지 유지되는 스코프(http)
- session : 웹세션이 생성되고 종료될 떄까지 유지되는 스코프
- application : 웹의 서블릿컨텍스트와 같은 범위로 유지되는 스코프
빈 스코프는 다음과 같이 지정한다.
//컴포넌트 스캔 빈등록
@Scope("prototype")
@Component
public class A {
//...
}
//수동 빈등록
@Scope("prototype")
@Bean
public class B {
//...
}
2.프로토타입 스코프
스프링컨테이너에 프로토타입 빈 요청시 항상 새로운 빈 인스턴스를 반환한다. 싱글톤과 반대이다. 클라이언트가 요청하면 클라이언트에 빈을 반환하고 이후 프로토타입 빈을 관리하지 않는다. 프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. 그래서 @PreDestroy 등이 호출되지 않는다.
'개발자 일지 > Spring' 카테고리의 다른 글
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(4) (0) | 2022.06.04 |
---|---|
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(3) (2) | 2022.05.31 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(2) (0) | 2022.05.16 |
[인프런 김영한 로드맵4]스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(1) (0) | 2022.05.12 |
[인프런 김영한 로드맵2]스프링 핵심 원리 정리(5) (0) | 2022.03.05 |
[인프런 김영한 로드맵2]스프링 핵심 원리 정리(3) (0) | 2022.02.04 |
[인프런 김영한 로드맵2]스프링 핵심 원리 정리(2) (0) | 2022.01.29 |
[인프런 김영한 로드맵2]스프링 핵심 원리 정리(1) (0) | 2022.01.23 |