Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- AOP
- Android
- spring
- 스프링 핵심 기능
- 인프런
- kotlin
- transaction
- Spring Boot
- springdatajpa
- 백준
- 알고리즘
- Greedy
- 그리디
- db
- 김영한
- SpringBoot
- Proxy
- QueryDSL
- 스프링
- Thymeleaf
- 스프링 핵심 원리
- JPQL
- Servlet
- JDBC
- jpa
- 자바
- http
- Exception
- pointcut
- java
Archives
- Today
- Total
개발자되기 프로젝트
빈 생명주기 콜백 본문
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 호출
생성시 url이 입력이 안되어 null이 출력됨. 객체가 생성된 뒤 url이 입력됨.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 connect : null call = null message = 초기화 연결 메세지
2. 스프링 빈의 라이프 사이클
객체생성 --> 의존관계 주입
스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝나야 사용할 준비 완료!
따라서 초기화 작업은! 의존관계 주입이 끝난 후! 호출해야 한다.
그런데? 의존관계 주입이 끝난 시점을 어떻게 알아?
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해
초기화 시점을 알려주는 기능 제공
??? : 준비 끝났다아아 - 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줌!!!
??? : 종료된다아, 빈 없어지기 직전임~~
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입(setter, field 주입)
-> 초기화 콜백 -> 사용 -> 소멸 전 콜백 -> 스프링 종료
3. 콜백
- 초기화 콜백 : 빈이 생성되고, 의존관계 주입 완료된 후! 호출
- 소멸 전 콜백 : 빈이 소멸되지 직전에 호출
4. 객체의 생성과 초기화를 분리하자(단일책임 원칙)
- 객체 생성은 객체 생성만..
- 초기화 = 객체가 동작하는 것 과 같음
- 따라서 생성과 초기화를 분리하자..
- 생성자는 필수정보(파라미터)를 받고 메모리를 할당, 객체 생성하는 책임!
- 초기화는 "생성된 값"들을! "활용"하여, 외부 커넥션을 연결하는 등 무거운 "동작" 수행
- 장점
- 객체 생성후 초기화는 어떤 최초 액션이 발생할 때 진행. 최대한 지연가능
5. 스프링이 제공하는 콜백 방법
- 인터페이스
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstructor, @PreDestroy
6. GitHub : 210730 Spring bean lifeCycle
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
@PostConstruct, @PreDestroy (0) | 2021.07.30 |
---|---|
빈 생명주기 : @Bean(initMethod, destroyMethod) (0) | 2021.07.30 |
스프링 빈 수동 등록 vs 자동 등록 (0) | 2021.07.30 |
조회한 빈을 리스트, Map으로 받아보자 (0) | 2021.07.30 |
@Qualifier, 타입체크, annotaion만들기 (0) | 2021.07.30 |
Comments