본문 바로가기
개발자 일지/Spring

[인프런 김영한 로드맵2]스프링 핵심 원리 정리(6)

by 네빌링 2022. 3. 20.
반응형

-인프런 김영한 강사님의 스프링 핵심 원리를 정리한다.

-빈 생명주기와 생명주기에 따른 콜백 처리 방식을 알아본다.

-빈 스코프의 개념, 종류 및 특징을 알아본다.

-모든 소스는 깃허브에서 관리한다.(https://github.com/coderahn/Spring-Lecture2)


8.빈 생명주기 콜백

 

1.빈 생명주기 콜백 시작

 

DB Connection Pool과 같이 애플리케이션 시작 시점에 필요 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체 초기화 및 종료작업이 필요하다. 

 

우선 빈의 라이프사이클은 다음과 같다.

 

더보기

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료

 

보는 것처럼 의존관계 주입이 끝나고 초기화 콜백이 실행되며, 스프링 종료 직전에 소멸전 콜백이 실행된다.

 

스프링은 3가지 방법으로 빈 생명주기 콜백을 지원한다.

 

  • 인터페이스(InitializingBean, DisposableBean)
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @PostConstruct, @PreDestroy

위의 방법들을 적용해볼 예제코드를 작성한다. 외부네트워크에 미리 연결하고 종료하는 테스트 객체를 다음과 같이 생성한다.

 

NetworkClient.java / 네트워크 

 

테스트는 다음과 같이 작성한다.

 

BeanLifeCycleTest.java / 객체생성단계 이후에 setUrl() 처리를 하여 url이 null로 나온다.

 

 

2.인터페이스 InitializingBean, DisposableBean

 

InitializingBean, DisposableBean을 implements하면 초기화 메소드를 오버라이드하여 사용할 수 있다. 최근에는 잘 사용 안 한다. 스프링 전용 인터페이스에 의존하며 초기화, 소멸 메소드 이름 변경이 불가능하다. 내가 코드 수정이 불가한 외부라이브러리에 적용할 수 없다. 다음과 같다.

NetworkClient.java / implements InitializingBean, DisposableBean

 

3.빈 등록 초기화, 소멸 메서드 지정

 

다음과 같이 초기화 메소드를 만든다.

 

NetworkClient.java

 

초기화메소드, 종료메소드를 적용할 Bean에 옵션을 작성한다.

 

BeanLifeCycleTest.java / @Bean에 initMethod="init", destroyMethod="close"를 작성

initMethod, destroyMethod를 사용하면 메서드 이름을 자유롭게 사용할 수 있고 스프링 빈 스프링 코드에 의존하지 않는다. 설정 정보를 사용하기 때문에 외부라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

 

또한 종료 메서드에는 추론 기능이 있다. 보통 라이브러리는 대부분 close, shutdown 등의 종료 메서드명을 사용한다.

@Bean의 destroyMethod는 기본값이 (inferred)로 등록되어 있다. 그래서 close, shutdown 등의 메서드가 있을 경우 destroyMethod를 적지 않아도 작동한다. (destroyMethod=""는 작동 안 함)

 

4.애노테이션 @PostConstruct, @PreDestroy

 

다음과 같이 어노테이션을 붙여 간단하게 사용 가능하다.

 

NetworkClient.java

 

9.빈 스코프

 

1.빈 스코프란?

 

기본적으로 스프링 빈은 싱글톤 빈이기 때문에 스프링 컨테이너 시작시에 생성되고 종료시에 소멸한다. 이런 스코프를 변경할 수 있다.

 

  • 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위 스코프
  • 프로토타입 : 스프링 컨테이너는 프로토타입의 빈 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 짧은 범위 스코프
  • 웹관련스코프
    • request : 웹요청 들어오고 나갈 때까지 유지되는 스코프(http)
    • session : 웹세션이 생성되고 종료될 떄까지 유지되는 스코프
    • application : 웹의 서블릿컨텍스트와 같은 범위로 유지되는 스코프

 

빈 스코프는 다음과 같이 지정한다.

 

//컴포넌트 스캔 빈등록
@Scope("prototype")
@Component
public class A {
//...
}


//수동 빈등록
@Scope("prototype")
@Bean
public class B {
//...
}

 

2.프로토타입 스코프

 

스프링컨테이너에 프로토타입 빈 요청시 항상 새로운 빈 인스턴스를 반환한다. 싱글톤과 반대이다. 클라이언트가 요청하면 클라이언트에 빈을 반환하고 이후 프로토타입 빈을 관리하지 않는다. 프로토타입 빈을 관리할 책임은 프로토타입 빈을 받은 클라이언트에 있다. 그래서 @PreDestroy 등이 호출되지 않는다.

 

 

 

반응형