Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.
스프링 빈이 생성되거나 죽기 일보 직전에 스프링이 빈 안에 있는 메서드를 호출해줄 수 있는 기능이다.
NetworkClient 시작 시점에 connect() 메서드를 호출하여 연결NetworkClient 종료 시점에 disconnect() 메서드를 호출하여 연결 종료NetworkClient 코드
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("생성자 호출 = " + url);
connect();
call("초기화 연결 메세지");
}
public void setUrl(String url) {
this.url = url;
}
//서비스 시작시 호출
public void connect() {
System.out.println("connect : " + url);
}
//call
public void call(String message) {
System.out.println("call(); = " + url + " message = " + message);
}
//서비스 종료시 호출
public void disconnect() {
System.out.println("close " + url);
}
}
BeanLifeCycleTest 테스트 코드
public class BeanLifeCycleTest {
@Test
public void lifeCycleTest() {
ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(lifeCycleConfig.class);
NetworkClient client = ac.getBean(NetworkClient.class);
ac.close(); //close 메서드 사용하려면 ApplicatonContext는 안됨
}
@Configuration
static class lifeCycleConfig {
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
}
null 나오지 않을까.. 싶다생성자 호출 = null
connect : null
call(); = null message = 초기화 연결 메세지
null 나오는게 맞다.NetworkClient클래스의 생성자에서 메서드를 호출하고, setter를 통해 url값을 할당해준다.스프링 빈은 객체ㅔ를 생성하고 의존관계 주입까지 다 끝나야 필요한 데이터를 사용할 수 있는 준비가 된다.
참고 : 객체의 생성과 초기화를 분리하자
생성자는 필수 정보를 받고 메모리를 할당해서 객체를 생성하는 책임이 있다. 반면에 초기화는 이렇게 생성된 값을 사용하여 외부와 연결하는 무거운 동작을 수행한다.
단일 책임 원칙을 따라서 따로 나눠서 코딩하는게 유지보수 관점에서 좋다.
분리했을때의 장점
실제 외부 커넥션 맺거나 이런걸 최초의 어떤 행위가 올 때까지 미룰 수 있다.