인프런 커뮤니티 질문&답변
대상 클래스에 기본 생성자가 없을 때
작성
·
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 인턴입니다.
조태준님, 질문에 대해 설명드리겠습니다.
스프링에서 빈이 등록될 때, 다음과 같은 순서로 프록시가 생성됩니다:
ProxyTargetClass 설정:
@SpringBootTest(properties = {"spring.aop.proxy-target-class=true"})설정으로 인해 CGLIB 프록시가 사용됩니다.원본 객체 주입: Spring은 대상 클래스의 빈을 생성하기 위해 먼저 원본 객체를 생성합니다. 이때 생성자 주입을 통해 의존성을 해결합니다.
AutoProxyCreator: 원본 빈이
AutoProxyCreator에게 전달됩니다.프록시 생성 시도: CGLIB는 프록시를 생성하려고 시도하는데, 이때 기본 생성자가 없는 경우 프록시 생성에 제약이 있을 수 있습니다.
기본 생성자 문제: 스프링 4.0 이후로는 기본 생성자가 없어도 프록시 생성이 가능하도록 개선되었지만, 특정한 상황에서는 여전히 문제를 일으킬 수 있습니다. 예를 들어, CGLIB가 원본 객체의 새로운 인스턴스를 생성하려 할 때 원본 클래스에 상속할 기본 생성자가 필요할 수 있습니다.
결과적으로, 이러한 이유로 프록시가 아닌 원본 객체가 주입되는 상황이 발생할 수 있습니다. 프록시가 생성되지 않은 경우에 대한 것은 여러 요인에 의한 것이며, CGLIB의 제한일 수 있습니다.
위의 설명과 연관된 이미지와 정보를 원하실 경우 아래 URL을 참고하시기 바랍니다:
스프링 부트 문서
추가적으로, 정확한 해결을 위해서는 구체적인 환경 설정과 코드를 확인하는 과정이 필요할 수 있습니다. 도움이 되셨기를 바랍니다.





