인프런 커뮤니티 질문&답변

gusdn85554님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

인터페이스 InitializingBean, DisposableBean

null 값은 스프링이 의존관계를 무조건적으로 주입해줄까요?

22.03.12 14:07 작성

·

212

0

영한님, 서포터즈님들 안녕하세요 !

이번 강의에서 NetworkClient Bean을 등록할 때 궁금한 점이 생겨 질문드립니다

앞서 해당 질문들을 다 읽어보았는데 한 가지 궁금한 점이 있습니다.

스프링이 의존관계 주입(해당 코드에선 값 주입)을 할 때, 앞에서 배운 "옵션 처리"를 한 프로퍼티를 제외하고는 null인 값(primitive 타입일 경우는 0) 을 "인지"하고, "의존관계 그래프"를 통해서 무조건 주입을 해주는걸까요??

감사합니다 !

답변 2

1

David님의 프로필 이미지

2022. 03. 12. 14:52

안녕하세요. gusdn85554님, 공식 서포터즈 David입니다.

 

클래스의 필드(url) 값이 null인 이유에 대해서 질문하시는게 맞으신가요?

 

객체 생성시 url이 null인 것은 묵시적 초기화에 의한 것입니다.

클래스 내 필드에 특정 값으로 명시적 초기화를 하지 않으면 묵시적 초기화가 진행됩니다.

자바 문법(묵시적 초기화)에서 지원하는 내용이오니 아래 표를 참고해주세요.

감사합니다.

 

0

gusdn85554님의 프로필 이미지
gusdn85554
질문자

2022. 03. 12. 15:01

안녕하세요 David 님 !

질문이 애매하게해서 죄송합니다ㅠ

다시 말씀드리자면

의존관계 주입이 완료되고 초기화 콜백이 이뤄집니다.

1. 그렇다면 스프링은 의존관계 주입이 완료됐다는 것을 어떻게 인지하나요??
제 생각 :  null 값이었던 url에 값이 할당되면 의존관계 주입(값 주입)이 완료됐다고 생각

3. 제 생각이 맞다면 스프링이 빈을 등록할 때, 앞에서 배운 "옵션 처리"를 제외한 나머지 프로퍼티들의 값이 주입되어야 의존관계 주입이 완료됐다고 인지하나요?

 

감사합니다 !

David님의 프로필 이미지

2022. 03. 12. 15:15

말씀하신 부분은 강의 "빈 생명주기 콜백 시작"편 14분35초에 설명하고 있습니다.

참고해주세요:)

gusdn85554님의 프로필 이미지
gusdn85554
질문자

2022. 03. 12. 15:24

강의에서는 개발자가 의존관계 주입이 모두 완료된 시점을 알기 위해 스프링 빈이 콜백 메서드를 통해 알려준다고 하셨습니다.

제가 궁금한 점은 "개발자가" 의존관계 주입이 완료됐다는 것을 어떻게 인지하는지가 아닌,

의존관계 주입이 완료됐다는 것을 "스프링 자체"가 어떻게 인지하는지  알고 싶습니다.

ex)

MemberService를 빈으로 등록할 때 MemberRepository가 없으면 MemberRepository를 빈으로 먼저 등록하고 MemberService를 등록 

이 때는 MemberRepository가 없다면 MemberService를 빈으로 등록할 떄 NPE가 발생하게 되므로 스프링이 이를 인지하고 MemberRepository를 등록한다고 생각했습니다.
 
 

해당 코드에서는 url이 null이지만, 코드는 잘 동작하지 않습니까? 그래서 여기서는 스프링이 의존관계 주입을 완료했다는 것을 어떻게 "스프링 자체가" 인지하는지 궁금합니다.

 

David님의 프로필 이미지

2022. 03. 12. 15:44

스프링 내부적으로 의존관계 주입을 수행하는 과정이 있습니다.

해당 과정을 마치면 콜백 메서드를 호출합니다.

 

특별한 뭔가가 있는게 아니라, 하나의 과정이 끝나면 그 다음 과정이 있을 뿐입니다.

이를 "스프링은 의존관계 주입이 완료되면"이라고 표현하신 것입니다.

 

예를 들어, 

class A {

methodB()

methodC()

}

 

A.methodB()

A.methodC()

메서드B와 메서드C가 순차적으로 진행될 때, B가 끝나면 C가 수행되듯

의존관계 주입이 끝나면 다음 단계로 콜백 메서드를 호출하는 것입니다. 

위 과정을 "메서드B가 완료되면" 메서드C 호출 로도 바꿔 말할 수 있습니다.

gusdn85554님의 프로필 이미지
gusdn85554
질문자

2022. 03. 12. 16:11

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님 ㅠㅠㅠ 

확실히 이해됐습니다 !! 답변해주셔서 감사합니다