• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

의존 관계 자동 주입 시 아직 등록되지 않은 빈이 어떻게 들어가는지 궁금합니다.

23.05.17 20:40 작성 23.05.17 20:42 수정 조회수 364

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

안녕하세요. 강의를 듣고 이해하던 중에 궁금한 점이 생겼습니다. 먼저 결과 이미지입니다.


위 결과를 보면 memberServiceImpl의 인스턴스가 먼저 생성이되고 등록되는 거 같아보입니다.

그런데 여기서 제가 궁금한 것은 바로 밑에 memoryMemberRepository가 등록되는데 제가 생각하기로는 두 객체의 인스턴스가 반대 순서로 등록이 되어야 아닌가 하는 생각이 들었습니다.

그 이유는 다음 코드를 봐주시면 감사하겠습니다.
위 코드처럼 MemberServiceImpl은 생성될 때, MemberRepository를 넣어서 생성합니다. 그렇다면 MemoryMemberRepository 빈이 등록되지 않은 상태에서 MemberServiceImpl의 빈이 만들어진다면 객체가 만들어진 후에 넣을 수 있어야 말이 된다고 생각했습니다. 하지만 현재 제 코드에서는 private final MemberRepository이기 때문에 후에 setter나 다른 메서드로는 넣을 수 없는 걸로 알고 있습니다. 또한 MemberRepository를 넣을 수 있는 setter나 다른 메서드들 또한 없습니다.


그렇다고 했을 때, 어째서 MemberServiceImpl 빈이 먼저 만들어지는데도 불구하고 에러가 나지 않는지 궁금합니다.

답변 1

답변을 작성해보세요.

0

OMG님의 프로필

OMG

2023.05.17

안녕하세요. 이지현님, 공식 서포터즈 OMG입니다.
.

스프링이 스프링 컨테이너 생성 및 초기화 시점 빈의 의존관계를 확인하기 때문에 해당 빈이 생성되고 나서 의존성 주입을 수행합니다.

따라서 스프링에서 의존성 주입 시점에서 참조하고 있는 다른 스프링 빈이 아직 등록되지 않은 경우에도 스프링은 해당 문제를 자동으로 해결해줍니다 :)
.
감사합니다.

이지현님의 프로필

이지현

질문자

2023.05.17

답변 감사합니다.
그러니까 말씀대로라면 의존성을 나중에 넣는 다는 것이 클래스 인스턴스가 생성된 후에 넣는 다는 말씀이신건가요?

그리고 그렇다면 스프링이 알아서 생성자 주입이더라도 인스턴스 생성후에 다시 넣을 수 있도록 해준다는 건가요?
머릿속으로 흐름이 이해되지 않아서 질문 다시 남깁니다.