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

ahah525님의 프로필 이미지
ahah525

작성한 질문수

스프링 핵심 원리 - 기본편

생성자 주입을 선택해라!

질문있습니다!

작성

·

334

3

안녕하세요! 강의 너무 재밌게 잘 듣고 있습니다. 몇가지 질문이 있는데요!

1. OrderServiceImplTest의 createOrder() 가 순수한 자바로 테스트하는 코드라고 하셨는데, 정확히 그 의미가 어떤 것 인가요?? 스프링 컨테이너를 생성해서 getBean(OrderService.class) 이런식으로 받아오지 않고 new OrderServiceImpl()로 생성해서 테스트하기 때문인가요?? 

2. 4분 28초쯤에 createOrder() 테스트를 실행하면 오류가 나서 선생님께서 AppConfig의 orderService()의 return을 null로 바꾸셨습니다. 저는 createOrder()에서 new orderServiceimpl() 생성자를 호출하면 OrderServiceImpl 클래스의 디폴트 생성자가 호출된다고 생각했는데, 오류가 왜 AppConfig에서 나는 건가요?? 왜 저기 코드를 고쳐야하는건지 이해가 잘 가지 않습니다ㅠㅠ 

답변 1

2

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

1. 네, 맞습니다.

2. 3분26초쯤 보시면 orderServiceImpl 내 파라미터를 가지는 생성자는 주석처리 되어있습니다. 따라서 AppConfig 내 OrderServiceImpl( a, b) 형태의 생성자는 현재 사용할 수 없기 때문에 주석처리하고 임시방편으로 null을 리턴한 것입니다.

감사합니다.

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

2번에서 OrderServiceImpl(a,b) 형태의 생성자를 주석처리하고 수정자 주입 코드로 변경하게 되면서, AppConfig 내 OrderServiceImpl( a, b) 형태의 생성자는 사용할 수 없기 때문에 null을 리턴했다는 것은 이해가 갔습니다.

1. OrderServiceImplTest createOrder() 테스트를 실행하는 도중에 AppConfig쪽에 오류가 난 것이 아니라, AppConfig 자체에서 OrderServiceImpl(a,b)형태의 생성자가 없는데 사용을 해서 컴파일 오류가 나는 것을 고친 것이라고 이해하면 될까요??? OrderServiceImplTest에서 하는 테스트는 순수 자바 코드로 테스트하는 것이니 AppConfig와는 상관이 없는게 맞는 건가요??

2. 아래 링크의 질문의 답변에 의문이 있어 질문드립니다.

https://www.inflearn.com/questions/474564

저 답변 내용에 따르면, 원래 아래코드에서 3번째 줄 코드를 아래와 같이 했을때, 정상작동한다고 했습니다.

OrderServiceImpl orderService = new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());

이 코드에서 new MemoryMemberRepository()를 해도 MemoryMemberRepository 는 클래스에 @Component 애노테이션이 붙어있어 이미 스프링 빈으로 등록되어있어 싱글톤으로 관리되므로 같은 객체를 반환하기 때문에 save가 제대로 동작한 것이라고 이해했습니다. 

그런데, getBean()으로 얻어온 객체아 아니라 하더라도 결국엔 new로 생성된 MemoryMemberRepository가 스프링 빈으로 등록된 것이면 이를 사용하면 순수 자바 코드로 테스트 하는게 아니지 않나요??? 

여기 코드에서는 ApplicationContext ac = new ~ 이런식으로 스프링 컨테이너를 생성하지 않았는데, MemoryMemberRepository 스프링 빈은 어디에서 관리되는건가요??

 

 

 

1. 네, 컴파일 오류 때문에 고친 것입니다.

2. 말씀해주신 글에 답변을 추가로 작성하였습니다. 해당 글의 질문에서는 스프링 컨텍스트가 사용되지 않았습니다. 싱글톤으로 등록되어 있는 MemoryMemberRepository가 아니라, 사용자가 직접 생성한 MemoryMemberRepository가 2개 있는 것입니다. 그럼에도 동작하는 이유는 해당 글 답변을 참고부탁드립니다.

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

자세한 설명 감사합니다!! 덕분에 궁금증이 풀렸습니다ㅎㅎ

ahah525님의 프로필 이미지
ahah525

작성한 질문수

질문하기