제가 궁금했던 부분은 강사님이 답변해주신 부분 이후에 어떻게 생성자를 통해 그 값이 MemberServiceImpl 지역변수인 memberRepository에 전달이 되는 과정이 궁금했습니다.
AppConfig에서
@Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); }
위와 같이 역할에 구현체 관계를 만들어주었습니다.
그러면, MemberService interface가 실행이되면서, MemberServiceImpl(memberRepository())가 return이 되고, memberRepository()가 실행되면서, memoryMemberRepository가 return이 되게되어 memberRepository의 객체에는 memoryMemberRepository가 들어있는 상태에서
private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
생성자 MemberServiceImpl이 실행되면서, 매개변수에 memberRepository가 들어가는데, 이 때, memberRepository에는 memoryMemberRepsitory가 들어있기 때문에 this.memberRepository = memberRepository(memoryMemberRepsitory값이 들어있음)을 통해 지역변수인 memberRepository에 memoryMemberRepository의 값이 들어가는 원리로 볼 수 있을까요?
위의 과정은 제가 생각해본 생성자를 통해서 지역변수 memberRepository 객체에 구현체가 들어가는 과정을 풀어낸 것입니다. 이 과정으로 구현이 되는 것이 맞는지 확인해주시면 감사하겠습니다.
@Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); }
@Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); }
다음과 같이 memberService(), memberRepository() 메소드를 만들어 구현체를 return해주었습니다.
private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; }
이후, memberServiceImpl class에서 memberRepository의 객체를 생성자를 통해 주입시켜 주었습니다.
여기서 궁금한 점이, memberServiceImpl class에서 AppConfig를 따로 import하지도 않고, 인스턴스를 생성해서 AppConfig의 메소드를 불러와 값을 넣어주지도 않았는데, 어떤 원리로 생성자를 통해 AppConfig에서 구현체를 return해준 메소드들이 실현이 되었는지가 궁금합니다.
제가 아는 지식으로는 보통 메서드를 실행하려면, 메서드가 포함된 class를 import 후, 인스턴스를 생성하고, AppConfig.memberRepository()와 같이 실행 문법을 적용해줘야할텐데요. memberServiceImpl에서는 따로 AppConfig를 import하지도, AppConfig.memberRepository()와 같이 메서드를 실행하는 문법을 적용시켜주지도 않았습니다. 그런데 어떻게 AppConfig에서 관계를 설정한 것이 생성자를 통해서 구현됐는지가 궁금합니다.
두 번째 질문입니다.
MemberService memberService; @BeforeEach //test 실행하기 전 실행 public void beforeEach() { AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); }
테스트에서는 위와같이 AppConfig의 인스턴스를 생성하여 메소드를 넣어주는 식으로 구현했습니다. 하지만, 실제로는 첫 번째 질문에서와 같이 AppConfig의 인스턴스가 아닌 생성자를 통해서 객체를 주입시켜주는 원리로 해주셨다고 하셨습니다. 실제로는 왜 인스턴스로 넣어주는 것이 아닌 생성자를 통해서 넣어준것인지가 궁금합니다.
[영상]
관심사의 분리 6분40초~7분50초: AppConfig에서 설정한 관계 메소드를 생성자를 통해 구현하는 부분
-> 7분15초쯤 부터 AppConfig를 통해 memberService를 불러다 쓰면, memberServiceimpl이 생성이되고, 구현체가 AppConfig에서 들어간다고 말씀하셨는데, 제가 궁금한 부분이 생성자를 통해서 AppConfig의 memberService()가 어떻게 호출되는지가 궁금합니다.
관심사의 분리 24분~24분50초: Test에서 AppConfig 인스턴스 객체 생성 후, 생성한 인스턴스 메서드를 통해 Service의 구현체를 넣어주는 부분
-> 실제 구현에서는 생성자를 통해서 구현했는데, 왜 Test에서는 AppConfig 인스턴스 객체 생성 후 구현했는지 궁금합니다.
Test 부분에서 구현한 원리가 제가 생각하고 있는 구현원리인데, 실제 생성자를 통해서 객체를 주입한 부분은 어떤 원리로 돌아가는지 모르겠네요.
최대한 제가 모르는 부분을 나름 표현해서 적긴했는데요. 제가 기초적인 지식이 부족해서 그런가 전달이 어렵나봅니다.