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

    2022. 3. 20.

    by. 웰시코더

    반응형

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

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

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

    -모든 소스는 깃허브에서 관리한다.(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 등이 호출되지 않는다.

     

     

     

    반응형

    댓글