• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

실제 Proxy 주입 확인에 대해 질문있습니다.

22.02.07 04:30 작성 조회수 137

0

 

        
/* MemberController*/
@Autowired
    public MemberController(MemberService memberService) {

        this.memberService = memberService;
        System.out.println("memberService = " + memberService.getClass()); // 프록시 조회해보기
    }


/* MemberService*/
 public MemberService(MemberRepository memberRepository) {

        this.memberRepository = memberRepository;

        System.out.println("memberRepository = " + memberRepository.getClass()); // 프록시 조회해보기

    }

 

 

 

 

 

안녕하세요! 프록시 조회에 대해서 질문드립니다!!

프록시를 조회하고 싶어서 print문을 써봤습니다.그런데 MemberService 프록시는 MemberController 생성자에 print문을 작성해주고 MemberRepository 프록시는 MemberService 생성자에 print문을 작성해주어 확인했는데,

MemberController 프록시는 어디에 print문을 작성해서 확인해야 하나요?

 

두번째 질문은 출력 순서를 보면

 

1. AOP START 다음 2. 레포지토리가 출력되고  3. END 출력 4.그 다음에 서비스 프록시가 출력되는데,

순서가 왜 이렇게 되는지 궁금합니다. 스프링을 실행시키면 어떤 부분이 가장 먼저 실행되나요?? AOP START가 가장 먼저 출력되는 걸 보니 TimeTraceAop가 실행되고 그 다음에 MemberService가 실행되는 것인가요..?? 

작동되는 순서를 전혀 모르겠습니다ㅠㅠㅠ

SpringConfig이 먼저 실행되어 START에 SpringConfig.memberSerivce 메소드가 찍히는 것인가요?

 

답변 1

답변을 작성해보세요.

0

David님의 프로필

David

2022.02.07

안녕하세요. 뮤언디님, 공식 서포터즈 David입니다.
1. Controller 내 메서드를 호출하는 코드가 필요합니다. 간단하게 테스트할 용도라면 Main 메서드 내에서 Controller 빈을 가져와서 호출하는 방법이 있습니다.

ConfigurableApplicationContext ac = SpringApplication.run(...);

MemberController memberController = (MemberController) ac.getBean("memberController");

memberController.getClass();

 

2. 이 부분은 AOP적용 강의를 천천히 보시고, 스프링 핵심 원리 - 기본편 강의의 섹션4,5,6,7을 학습하시면 이해하실 수 있습니다.

간단히 말씀드리면 빈을 등록하는 과정에서 Configuration 클래스 내 memberService() 메서드가 호출됩니다.

이때 Configuration 클래스는 AOP 적용대상이므로 memberService()가 실행되기 전에 AOP의 START 로그가 먼저 찍히게 되는 것입니다.


감사합니다.