• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

@Autowired를 사용하는 setter가 AppConfig를 설정 정보로 갖는 test 클래스에서도 실행 가능한 이유

23.02.12 16:57 작성 조회수 341

0

안녕하세요! 김영한 선생님의 스프링 핵심 원리 강의를 수강하고 있는 학생입니다:)

다름 아니라 setter 주입의 예제 코드와 관련하여 궁금한 점이 생겨서 질문을 남기게 되었습니다.

7강 질문.jpg

강의 13:26에 나와있는 코드와 동일하게 setter와 생성자에 화면 출력 기능을 추가하였습니다. 그 결과, AutoAppConfig.class를 설정 정보로 하는 test 클래스를 실행하면 설명해주신 내용과 같이 생성자를 통한 의존 관계 주입이 먼저 일어나고 setter를 통한 의존 관계 주입이 나중에 일어남을 확인할 수 있었습니다.

더 나아가 AutoAppConfig.class가 아닌 AppConfig.class를 설정 정보로 하는 test 클래스를 실행하면 콘솔 화면에 어떤 내용이 출력될지 호기심이 생겨 test.java.hello.core.beanfind 패키지에 위치한 ApplicationContextBasicFindTest 클래스를 실행하였습니다.

실행 전에 저는 orderService라는 이름의 스프링 빈이 등록되는 과정에서 orderServiceImpl() 생성자가 호출되기 때문에 System.out.println("1. OrderServiceImpl.OrderServiceImp"); 코드가 실행될 것이라 예상하였습니다.

또한,

(1) AppConfig.class엔 setMemberRepository()와 setDiscountPolicy()를 호출하는 코드가 없고

(2) AppConfig.class는 @ComponentScan를 사용하지 않기 때문에

setMemberRepository()와 setDiscountPolicy()가 @Autowired를 사용하고 있더라도 의존 관계를 자동으로 주입할 수 없어 해당 메소드(setter) 내부에 기재되어있는 System.out.println("memberRepository = " + memberRepository); 코드와 System.out.println("discountPolicy = " + discountPolicy); 코드는 실행되지 않을 거라 예상했습니다.

하지만 저의 예상과는 다르게 setMemberRepository()와 setDiscountPolicy()가 모두 실행되었고 제가 어느 부분에서 잘못 생각하고 있는지 도움을 구하고자 질문을 남기게 되었습니다.

 

답변 2

·

답변을 작성해보세요.

1

안녕하세요. nanahoyoon님

스프링 빈으로 등록된 곳에 @Autowired가 있으면 해당 메서드도 추가 호출이 일어납니다.

감사합니다.

nanahoyoon님의 프로필

nanahoyoon

질문자

2023.02.28

답변 감사합니다:)

0

정원철님의 프로필

정원철

2023.02.21

강사님 7분44초에 오토앱컨피그테스트는 빈에서 MemberService를 가져왔는데

오더서비스임플 생성자의 sout문장이 나오는지 잘 모르겠습니다.

memberService생성자 값이 전달되어야 하는거 아닌가요?