스프링 핵심원리-기본편 (김영한님) 수업을 듣고 정리한 글입니다.
빈 생명주기 콜백
애플리케이션 시작 시점에 필요한 연결을 미리 하고, 종료 시점에 종료하는 작업을 진행하려면 객체의 초기화와 종료 작업이 필요하다.
네트워크 클라이언트 만들기
연결시점에 connect() 호출, 종료시점에 disconnect() 호출
생성되면 연결하고 연결되었다고 메세지보내기
테스트 만들기
networkClient를 생성하고 빈으로 등록한다.
✔️ close 함수를 사용하기위해 ConfigurableApplicationContext를 사용했다 - AnnotationConfigApplicationContext의 부모
결과
url 값이 null인 이유는 생성자로 객체가 생성된 후에(NetworkClient()) setter로 url이 주입되었기때문이다.
스프링 빈의 라이프사이클: 객체 생성 => 의존관계 주입(setter, 필드)
초기화 작업은 객체 생성이 끝나고 의존관계까지 주입된 뒤에 수행되어야한다.
=> 이 주입 완료 시점은 스프링이 콜백 메서드를 통해 알려준다.
스프링 컨테이너 종료 시점도 소멸 콜백으로 알려준다.
스프링 빈의 이벤트 라이프사이클
스프링 컨테이너 생성 => 스프링 빈 생성 => 의존관계 주입 => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료
생성자와 초기화
생성자는 객체를 생성하고, 초기화는 생성 값들을 활용하여 무거운 동작을 수행한다.
생성자에 초기화 작업까지 포함할 경우 너무 무거워져서 유지보수가 어려우므로 객체 생성과 초기화 부분을 명확하게 나누자!
빈 생명주기 콜백 지원
3종류가 있다.
1. 초기화, 소멸전 콜백 (지금은 거의 안쓰임)
의존관계 주입 후 초기화시 콜백 - InitializingBean의 afterPropertiesSet()
소멸전 콜백 - DisposableBean의 destroy()
초기화, 소멸을 지원하는 함수 사용하기
테스트 수행
의존관계 주입 후 networkClient는 afterProperties() 함수를 실행시킨다.
싱글톤이므로 수행된 이후에는 종료되는데 이때 destroy() 함수를 실행시킨다.
networkClient 생성만 해주었는데 때에 맞춰서 정의된 작업을 해준다!
하지만 이 방식은 스프링 전용 인터페이스를 그대로 가져와서 사용된 것이기때문에 이름도 변경하지 못하고 그대로 사용해야하고,
내가 코드를 고칠 수 없는 외부 라이브러리는 적용할 수 없다.
현재는 이 방식은 거의 안쓰고, 다음 방식을 사용한다(뒤뒤에 설명할 postConstruct, preDestroy)
2. 빈 등록 초기화, 소멸 메서드 지정 - 외부 라이브러리 사용시(코드 고치기 어려울때)
@Bean옆에 @Bean(initMethod="초기화메서드", destroyMethod="소멸메서드")로 적어주면 된다.
우선 초기화, 소멸 메서드의 이름을 원하는대로 바꾸고
@Bean(initMethod = "init", destroyMethod = "close")
을 적어준다.
이렇게 하면 스프링 코드에 의존하지않고 메서드 이름도 자유로우면서 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
종료 메서드 추론
@Bean의 destroyMethod가 명시되지않았을때 close, shutdown이라는 이름의 함수를 종료 메서드로 추론하여 실행시킨다.
추론 기능을 사용하고 싶지 않으면 destroyMethod=""처럼 빈 공백을 지정하면 된다.
3. @PostConstruct, @PreDestroy - 가장 권장하는 방법
애노테이션만 붙이면 된다.
테스트 시 잘 수행된다.
이 방식은 최신 스프링에서 가장 권장하는 방식이고 매우 편리하다. 그리고 javax에서 import하기때문에 스프링이 아닌 자바표준에서 지원한다. 또한 빈을 등록하지않기때문에 컴포넌트 스캔에서 사용이 편리하다.
단점: 외부 라이브러리에는 적용하지못한다. => 외부 라이브러리 사용시에는 이전의 @Bean의 initMethod, destroyMethod를 사용하자!
'Spring > 스프링 핵심 원리' 카테고리의 다른 글
스프링 : 빈 스코프 (0) | 2023.03.24 |
---|---|
의존관계 자동주입 (0) | 2023.02.27 |
컴포넌트 스캔 (2) | 2023.02.23 |
싱글톤 컨테이너 (0) | 2023.02.13 |
스프링으로 전환하기, 스프링 컨테이너와 스프링 빈 (0) | 2023.02.13 |