작성
·
217
답변 2
0
안녕하세요 David 님 !
질문이 애매하게해서 죄송합니다ㅠ
다시 말씀드리자면
의존관계 주입이 완료되고 초기화 콜백이 이뤄집니다.
1. 그렇다면 스프링은 의존관계 주입이 완료됐다는 것을 어떻게 인지하나요??
제 생각 : null 값이었던 url에 값이 할당되면 의존관계 주입(값 주입)이 완료됐다고 생각
3. 제 생각이 맞다면 스프링이 빈을 등록할 때, 앞에서 배운 "옵션 처리"를 제외한 나머지 프로퍼티들의 값이 주입되어야 의존관계 주입이 완료됐다고 인지하나요?
감사합니다 !
강의에서는 개발자가 의존관계 주입이 모두 완료된 시점을 알기 위해 스프링 빈이 콜백 메서드를 통해 알려준다고 하셨습니다.
제가 궁금한 점은 "개발자가" 의존관계 주입이 완료됐다는 것을 어떻게 인지하는지가 아닌,
의존관계 주입이 완료됐다는 것을 "스프링 자체"가 어떻게 인지하는지 알고 싶습니다.
ex)
해당 코드에서는 url이 null이지만, 코드는 잘 동작하지 않습니까? 그래서 여기서는 스프링이 의존관계 주입을 완료했다는 것을 어떻게 "스프링 자체가" 인지하는지 궁금합니다.
스프링 내부적으로 의존관계 주입을 수행하는 과정이 있습니다.
해당 과정을 마치면 콜백 메서드를 호출합니다.
특별한 뭔가가 있는게 아니라, 하나의 과정이 끝나면 그 다음 과정이 있을 뿐입니다.
이를 "스프링은 의존관계 주입이 완료되면"이라고 표현하신 것입니다.
예를 들어,
class A {
methodB()
methodC()
}
A.methodB()
A.methodC()
메서드B와 메서드C가 순차적으로 진행될 때, B가 끝나면 C가 수행되듯
의존관계 주입이 끝나면 다음 단계로 콜백 메서드를 호출하는 것입니다.
위 과정을 "메서드B가 완료되면" 메서드C 호출 로도 바꿔 말할 수 있습니다.
public class NetworkClient{
private String url;
public NetworkClient() {
System.out.println("생성자 호출, url = " + url);
}
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);
}
@PreDestroy
public void destroy() throws Exception {
disconnect();
}
@PostConstruct
public void init() throws Exception {
connect();
call("초기화 연결 메시지");
}
}
@Bean
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient(); //1번
networkClient.setUrl("http://hello-spring.dev"); //2번
return networkClient;
}
1. 1번에서 생성자를 호출합니다.
2. NetworkClient() 메서드 실행
2-1. 이 때 url값은 null
3. //궁금한 곳
4. 의존관계 주입이 완료되어 init 메서드 호출
3번에서 의존관계 주입이 이뤄질텐데 제가 궁금했던 점은 스프링 자체가 의존관계 주입이 완료된 것을 어떻게 아느냐였습니다.
천천히 생각해보니 수정자 메서드를 통한 의존관계 주입은 선택적이란 말이 떠올랐습니다,,
바보같은 질문에 답해주셔서 고생하셨습니다 David님 ㅠㅠㅠ
확실히 이해됐습니다 !! 답변해주셔서 감사합니다
말씀하신 부분은 강의 "빈 생명주기 콜백 시작"편 14분35초에 설명하고 있습니다.
참고해주세요:)