강의

멘토링

커뮤니티

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

조태준님의 프로필 이미지
조태준

작성한 질문수

스프링 핵심 원리 - 고급편

프록시 기술과 한계 - CGLIB

대상 클래스에 기본 생성자가 없을 때

작성

·

30

·

수정됨

0

제목과 같은 상황에서 어떻게 될지 궁금해서 테스트를 진행해봤습니다.

 

@Component
public class Test {
    public Test(MemberService memberService) {
    }
}

// =================================================

@Aspect
public class TestAspect {
    @Before("execution(* hello.aop..*.*(..))")
    public void doTrace(JoinPoint joinPoint) {
    }
}

// =================================================

@Slf4j
@SpringBootTest(properties = {"spring.aop.proxy-target-class=true"})
@Import(TestAspect.class)
public class ProxyTest {

    @Autowired Test test;

    @Test
    void test() {
        log.info("class={}", test.getClass());
    }
}

필드 test에 class=class hello.aop.test.Test와 같이 원본 객체가 주입된 것을 확인할 수 있습니다.

 

이러한 순서로 흘러가는 게 맞을까요?

  • 처음에 생성된 원본 Test 빈이 AutoProxyCreator에 전달된다

  • 포인트컷에 맞는 조건이므로 CGLIB로 프록시 생성 시도

  • CGLIB 내부에서 원본의 기본 생성자를 (호출할 수 없어서?) (찾을 수 없어서?) -> return 원본

  • 결국 반환된 원본이 빈으로 등록

 

추가) 다음 강의를 듣고왔는데 이해가 안되는 부분이 있습니다.

  • 스프링 4.0부터 기본 생성자가 필수인 문제가 해결되었다고 하는데 왜 위의 테스트에서는 프록시 객체가 아닌 원본 객체가 주입되었나요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
조태준님, 질문에 대해 설명드리겠습니다.

스프링에서 빈이 등록될 때, 다음과 같은 순서로 프록시가 생성됩니다:

  1. ProxyTargetClass 설정: @SpringBootTest(properties = {"spring.aop.proxy-target-class=true"}) 설정으로 인해 CGLIB 프록시가 사용됩니다.

  2. 원본 객체 주입: Spring은 대상 클래스의 빈을 생성하기 위해 먼저 원본 객체를 생성합니다. 이때 생성자 주입을 통해 의존성을 해결합니다.

  3. AutoProxyCreator: 원본 빈이 AutoProxyCreator에게 전달됩니다.

  4. 프록시 생성 시도: CGLIB는 프록시를 생성하려고 시도하는데, 이때 기본 생성자가 없는 경우 프록시 생성에 제약이 있을 수 있습니다.

  5. 기본 생성자 문제: 스프링 4.0 이후로는 기본 생성자가 없어도 프록시 생성이 가능하도록 개선되었지만, 특정한 상황에서는 여전히 문제를 일으킬 수 있습니다. 예를 들어, CGLIB가 원본 객체의 새로운 인스턴스를 생성하려 할 때 원본 클래스에 상속할 기본 생성자가 필요할 수 있습니다.

결과적으로, 이러한 이유로 프록시가 아닌 원본 객체가 주입되는 상황이 발생할 수 있습니다. 프록시가 생성되지 않은 경우에 대한 것은 여러 요인에 의한 것이며, CGLIB의 제한일 수 있습니다.

위의 설명과 연관된 이미지와 정보를 원하실 경우 아래 URL을 참고하시기 바랍니다:
스프링 부트 문서

추가적으로, 정확한 해결을 위해서는 구체적인 환경 설정과 코드를 확인하는 과정이 필요할 수 있습니다. 도움이 되셨기를 바랍니다.

조태준님의 프로필 이미지
조태준

작성한 질문수

질문하기