작성
·
49
0
[질문 내용]
질문 1.
ComponentScan과 Autowired를 이용한 스프링 빈 등록 과정을 다음과 같이 이해해보았는데 틀린 내용이 있을까요? 특히 2,3,4 과정이 자세히 알고 싶습니다.
@Component 애노테이션이 달린 클래스의 이름을 갖는 빈( 빈 껍데기 )을 등록
빈으로 등록된 클래스의 생성자를 실행
이 때 생성자의 매개변수가 적은 순서대로 실행 ( MemoryMemberRepository,RateDiscountPolicy -> MemberServiceImpl -> OrderServiceImpl )
@Autowired 애노테이션이 달려있다면 생성자의 매개변수 클래스 타입을 확인한다. 해당 클래스 타입을 등록되어 있는 스프링 빈에서 가져온다.
생성자를 실행하여 의존 관계 주입을 받은 인스턴스를 등록되어 있는 빈에 넣는다.
질문 2 .
3~4 과정에서 @Autowired 애노테이션이 없다면 의존 관계 주입이 이루어지지 않을 것이라고 생각해서 MemberServiceImpl에 @Autowired를 제거해보았는데 MemoryMemberRepository 빈을 알아서 가져와서 의존관계 주입을 받게 되는데 어떻게 주입 받는 것인지 궁금합니다.
Dependencies Diagram을 확인해보았더니 @Autowired를 통해서 주입 받는 orderServiceImplr과는 다르게 depends on 이라고 적혀있는데 MemoryMemberRepository가 @ComponentScan으로 빈으로 등록되어서 스프링이 자동으로 알맞은 의존 관계 주입을 해준 것인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
summerender님의 질문에 대해 설명해 드리겠습니다. 스프링에서 의존 관계 주입은 여러 방식으로 이루어질 수 있으며, 그 자동화된 과정에 대해 여러 가지 이해가 필요할 수 있습니다.
@Component 애노테이션 처리: @Component
애노테이션이 붙은 클래스는 컴포넌트 스캔 과정에서 스프링 컨테이너에 빈으로 등록됩니다. 이는 빈의 유니크한 이름을 스프링 컨텍스트 내에 등록하는 과정을 포함합니다.
빈 생성 및 의존 관계 자동 주입: 빈이 생성된 후 @Autowired
애노테이션을 사용하여 컨테이너 내 다른 빈을 주입하도록 구성할 수 있습니다. 생성자 주입 방식에서는 생성자의 매개변수를 통해 필요한 의존성을 주입합니다.
의존성 주입 확인 및 처리: @Autowired
가 명시된 생성자 및 필드를 조사하여 스프링은 적절한 빈을 찾아 주입합니다. 컴포넌트 스캔을 통해 자동으로 주입할 대상을 찾게 됩니다.
주입 후 인스턴스 등록: 의존성이 주입된 빈은 인스턴스화된 객체로 등록됩니다. 이 단계에서 모든 의존성의 주입이 완료되어 최종 객체로 관리됩니다.
@Autowired 없이도 주입되는 이유: Spring 4.3 이후부터는 생성자가 하나만 있는 경우 해당 생성자에 자동으로 @Autowired
가 붙은 것처럼 작동합니다. 이를 통해, 단일 생성자가 정의된 경우 스프링이 자동으로 해당 생성자를 사용하여 의존성을 주입합니다. 이 때문에 @Autowired
를 생략하더라도 스프링이 빈을 주입할 수 있습니다.
MemoryMemberRepository 빈의 주입: MemoryMemberRepository
는 @Component
로 등록된 빈이므로 스프링 컨테이너가 해당 의존성을 자동으로 주입하게 됩니다. 이는 위에서 설명한 자동 생성자 주입 규칙에 따라 이루어집니다.
첨부된 의존성 다이어그램을 참고하여 스프링이 어떻게 의존성을 처리하고 주입하는지를 이해하는 데 도움이 될 것입니다. 질문자님의 경우처럼 마크다운의 잘못된 표기 (예: “orderServiceImplr”)와 같은 부분은 복사와 오타로 보이며, 이러한 부분을 확인하시고 명확하게 정리하는 것이 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.