• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

안녕하세요 aop에 대해서 질문이 있습니다.

20.08.30 01:41 작성 조회수 130

0

안녕하세요 강사님 강좌를 보고 난 뒤에 혼자 스프링을 공부하는데 질문이 있어서 이렇게 질문드립니다..

1. aspectj와 spring aop는 다른 것이며 spring aop는 프록시기반이고 aspectj는 ctw나 ltw로 실행되는데

왜 spring aop로 aop적용할때도(@EnableAspectAutoJProxy를 이용하여 다이나믹프록시방식을 사용할때) aspectj에 있는 @aspect를 쓰는 것인가요??

2. 그리고 커스텀에노테이션 선언할때 @LoginCheck 만들때 Retention Runtime이아니라 Class로해도 AOP 정상 실행이 되던데 이게 어떻게 가능한건가요?

다이나믹프록시는 런타임에 주입되니까 Runtime으로 선언해야하는거아닌가요?

답변 3

·

답변을 작성해보세요.

1

1. 프록시 객체가 런타임에 클래스 정보를 확인하는게 아니라, 프록시를 만들 객체를 찾을 때 등록된 빈들 중에 해당 포인트컷이나 특정 애노테이션이 달려있는 클래스를 찾는데 그때 바이트코드를 보고 특정 애노테이션이 있는 것들을 찾아서 프록시 객체를 생성하는거죠.

2. 클래스에는 애노테이션 정보가 남아있으니 바이트코드를 읽는다면 애노테이션 정보를 참조할 수 있습니다. 리텐션 전략이 클래스니까 클래스 파일에 당연히 남아있죠,

3, 런타임시에 어떤 방법으로 애노테이션 정보를 읽느냐에 따라 달라지는겁니다. 리플렉션으로 읽어들이려면 리텐션 전략을 런타임으로 해야 되지만, 바이트코드( 클래스파일)을 읽어서 확인한다면 클래스 까지만 유지해도 해당 정보를 읽을 수 있는거죠.

0

이성국님의 프로필

이성국

질문자

2020.08.30

아! 답변 감사합니다!!

조금 이해가 안가는 부분이 있는데요..

1. 답변해주신 2번 문항과 관련해서 질문입니다..

프록시객체는 런타임에 생성할때 그 런타임시간에 클래스정보(바이트코드)에 어노테이션을 참고하는건가요? 아니면 바이트코드가 만들어진후에(런타임시간전)   클래스정보(바이트코드)에 어노테이션을 참고해놓고 런타임시간에 프록시객체를 만들어주는 것인가요?

2.해당 어노테이션을 클래스까지 유지한다는 것은 런타임시간에도 클래스파일에는 어노테이션 정보가 남아있다는 것인가요?

3. 클래스시간까지 어노테이션유지로 설정을 해놓고 런타임시간에 클래스 어노테이션을 참고하는거랑

런타임시간까지 어노테이션 유지로 설정을 해놓은 거랑 어떠한 차이가 있는것인가요..?

어차피 RetentionPolicy를 클래스로 하나 런타임으로하나 어차피 런타임시간에 어노테이션정보를 볼수있는거아닌가요??

검색을 해도 자세히 나오지않아서 이렇게 질문드리게 되었습니다..

0

1. 흠 글쎄요. 스프링이 왜 AspectJ에 있는 애노테이션을 쓰기로 결정한지는 저도 모르겠습니다. 아마 자바 진영에 AspjectJ를 제외한 마땅한 AOP 기술이 없다보니 그런게 아닐까 싶네요.

2. 프록시 객체는 런타임에 생성해주는게 맞지만 런타임에 그 프록시를 생성할 (AOP 적용할) 타겟 빈을 찾을 때 클래스 정보 (바이트 코드)를 참고하기 때문에 런타임까지 해당 애노테이션을 유지할 필요는 없습니다.