inflearn logo
강의

Course

Instructor

Spring Core Principles - Advanced

Proxy Technology and Limitations - CGLIB

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

74

shong5096384

24 asked

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와 같이 원본 객체가 주입된 것을 확인할 수 있습니다.

 

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

 

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

spring 디자인-패턴

Answer 1

0

communityai8509

안녕하세요, 인프런 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을 참고하시기 바랍니다:
스프링 부트 문서

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

어드바이스 순서 디폴트 기준이 궁금합니다.

0

51

1

AspectV1 예제를 @Configuration 수동 등록으로도 가능한가요?

0

78

2

구체 클래스를 상속받아 확장한 형태도 클래스패턴/데코레이터 패턴이라고 칭하나요?

0

52

1

TraceTemplate 을 미리 빈으로 등록해서 사용할때 이렇게 설정하는게 맞는건가요?

0

53

1

Decorator 에서 추상메서드로 뺄때 질문 있습니다.

0

55

1

스프링 부트 버전 4.0 aop 의존성 명칭 변경

1

346

2

final 키워드 사용 관련 질문

0

75

1

안녕하세요

0

64

1

ThradLocal 실무 사례

0

97

2

실무에서의 동시성 문제

0

62

1

로그 등 부가 기능에 대한 테스트코드

0

50

1

ProceedingJoinPoint와 MethodInvocation에 대하여

0

67

1

실무 멀티스레딩에 대한 궁금증

0

69

1

안녕하세요 질문있습니다

0

43

1

AspectV3 aop 실행 순서 문의 드립니다

0

37

1

MDC vs AOP 중에 고민중입니다.

0

74

1

순환참조

0

158

2

this를 단독으로 사용할때랑 파라미터 바인딩 할때 차이

0

77

1

빈 후처리에 등록 질문 있습니다.

0

75

1

AppConfig 설정하는 설명중에 이해가 안되는게 있습니다.

0

88

1

ThreadLocal을 지역변수로 선언하면 remove가 필요할까요?

0

117

2

@Aspect 어노테이션으로 생성된 Advisor의 Bean 저장 여부

0

67

1

ThreadLocal 사용시 부작용이 있을수 있을까요? (ThreadLocal.remove()를 잘한다고 해도..)

0

73

2

빈으로 주입하지 않고 new로 객체 생성해도 되는데, 왜 ThreadLocal을 사용하나요?

0

72

1