Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

빈 생명주기 콜백 본문

인프런/[인프런] Spring 핵심원리 이해

빈 생명주기 콜백

Seung__ 2021. 7. 30. 20:51

DB 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요한다.

 

1. Test


  • 시작시 connect되고 애플리케이션 종료시  close되는 코드를 작성해보자.
  • NetworkClient class
    public class NetworkClient {
    
        private String url;
    
        public NetworkClient(){
            System.out.println("생성자 호출, url =" + url);
    
            connect();
            call("초기화 연결 메세지");
    
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        //서비스 시작시 호출
        public void connect(){
            System.out.println("connect : " + url);
    
        }
    
        public void call(String message){
            System.out.println("call = " + url + " message = " + message);
        }
    
        //서비스 종료 시
        public void disconnect(){
            System.out.println("close : " + url);
        }
    }​
  • Test
    - 객체를 생성하면서 바로 connect
    - 생성자를 통해 connect 호출
    public class BeanLifeCycleTest {
    
        @Test
        public void lifeCycleTest(){
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(NetworkClient.class);
            NetworkClient client = ac.getBean(NetworkClient.class);
            ac.close();
        }
    
        @Configuration
        static class LifeCycleConfig{
    
            @Bean
            public NetworkClient networkClient(){
                NetworkClient networkClient = new NetworkClient();
                networkClient.setUrl("http://hello-spring.dev");
                return networkClient;
            }
        }
    }​
    생성시 url이 입력이 안되어 null이 출력됨. 객체가 생성된 뒤 url이 입력됨.
  • 생성자 호출, url =null connect : null call = null message = 초기화 연결 메세지​

 

 

2. 스프링 빈의 라이프 사이클


객체생성 --> 의존관계 주입

스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝나야 사용할 준비 완료!

 

따라서 초기화 작업은! 의존관계 주입이 끝난 후! 호출해야 한다.

 

그런데? 의존관계 주입이 끝난 시점을 어떻게 알아?

 

  • 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해
    초기화 시점을 알려주는 기능 제공
    ??? : 준비 끝났다아아
  • 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줌!!!
    ??? : 종료된다아, 빈 없어지기 직전임~~

 

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

 

 

3. 콜백


  • 초기화 콜백 : 빈이 생성되고, 의존관계 주입 완료된 후! 호출
  • 소멸 전 콜백 : 빈이 소멸되지 직전에 호출

 

 

4. 객체의 생성과 초기화를 분리하자(단일책임 원칙)


  • 객체 생성은 객체 생성만..
  • 초기화 = 객체가 동작하는 것 과 같음
  • 따라서 생성과 초기화를 분리하자..
  • 생성자는 필수정보(파라미터)를 받고 메모리를 할당, 객체 생성하는 책임!
  • 초기화는 "생성된 값"들을! "활용"하여, 외부 커넥션을 연결하는 등 무거운 "동작" 수행
  • 장점
    - 객체 생성후 초기화는 어떤 최초 액션이 발생할 때 진행. 최대한 지연가능

 

 

5. 스프링이 제공하는 콜백 방법


  • 인터페이스
  • 설정 정보에 초기화 메서드, 종료 메서드 지정
  • @PostConstructor, @PreDestroy

 

6. GitHub : 210730 Spring bean lifeCycle


 

GitHub - bsh6463/SpringCoreFunction

Contribute to bsh6463/SpringCoreFunction development by creating an account on GitHub.

github.com

 

Comments