Spring

Bean 객체의 생성과 소멸

자바지기 2022. 11. 13. 17:43
반응형

스프링 컨테이너는 초기화와 종료라는 사이클을 갖는다.

이 과정에서 스프링 컨테이너 내부에 존재하는 Bean 객체 또한 컨테이너의 라이프 사이클에 따라 생성과 소멸을 진행한다.

객체 생성  의존 설정  초기화  소멸

 

스프링 컨테이너가 초기화 될 때 Bean 객체의 생성 및 의존 설정이 진행된다.

이 부분은 이전 chapter를 공부하면서 살펴볼 수 있었다.

InitializingBean과 DisposableBean을 구현한다면 각각 Bean 객체가 초기화, 소멸될 때 지정된 메소드가 실행된다.

 

코드를 통해 확인해보자.

public class MemberDao implements InitializingBean, DisposableBean {
    @Override
    public void afterPropertiesSet() {
        System.out.println("memberDao 초기화!!!");
    }

    @Override
    public void destroy() {
        System.out.println("memberDao 소멸!!!");
    }

    public void findMember() {
        System.out.println("멤버찾는 메서드 실행!!!");
    }
}

 

위와 같이 InitializingBean, DisposableBean을 구현하는 MemberDao가 존재한다.

 

 

public static void main(String[] args) {
        // 1
        System.out.println("main 시작!!!");
        
        AnnotationConfigApplicationContext ctx = 
        	new AnnotationConfigApplicationContext(AppCtx.class);

        // 3
        System.out.println("ctx 초기화!!!");
        MemberDao memberDao = ctx.getBean("memberDao", MemberDao.class);

        // 4
        memberDao.findMember();

        // 5
        ctx.close();
    }

위 처럼 main을 작성하고 실행시켜보았다.

 

콘솔에서 확인해본 결과는 다음과 같다.

main 시작!!!

...

memberDao 초기화!!!
ctx 초기화!!!
멤버찾는 메서드 실행!!!

...

memberDao 소멸!!!

 

위를 통해 컨테이너의 동작 순서를 확인해볼 수 있었다.

  1. main이 시작된다.
  2. 컨테이너가 초기화될 때 DefaultListableBeanFactory - Creating , 즉 Bean들을 생성한다.
  3. Bean이 초기화되면서 afterPropertiesSet 메소드가 실행된다.
  4. 컨테이너가 소멸될 때, Bean 또한 소멸되면서 destroy 메소드를 실행한다.

이러한 동작과정은 @Bean 애노테이션을 통해서도 진행할 수 있다.

새로운 학습을 위한 MemberDao2 를 정의하였다.

public class MemberDao2 {

    public void start() {
        System.out.println("MemberDao2 초기화 !!!!!");
    }

    public void end() {
        System.out.println("MemberDao2 소멸 !!!!!");
    }

    public void findMember() {
        System.out.println("멤버찾는 메서드 실행!!!");
    }
}

그리고 @Bean에 initMethod , destroyMethod 를 설정하였다.

각각 초기화, 소멸 시 실행되어야하는 메소드를 의미한다.

@Bean(initMethod = "start", destroyMethod = "end")
public MemberDao2 memberDao2() {
    return new MemberDao2();
}

다시 한번 main을 실행해보면 결과는 다음과 같다.

main 시작!!!

...

MemberDao2 초기화 !!!!!
ctx 초기화!!!
멤버찾는 메서드 실행!!!

...

MemberDao2 소멸 !!!!!

위에서 보았던 결과와 같은 결과를 볼 수 있었다.

Bean 객체의 생성, 소멸 시 메소드를 실행할 수 있다는 사실을 알게 되었으므로,

프로젝트에 적용해보는 것도 좋은 경험일 것 같다!

반응형