강의

멘토링

커뮤니티

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

즐거운 개발자님의 프로필 이미지
즐거운 개발자

작성한 질문수

스프링 핵심 원리 - 고급편

스프링 AOP 구현6 - 어드바이스 종류

@AfterReturning 에서 메서드 시그니처 파라미터의 result 타입이 다를 경우

작성

·

327

1

안녕하세요, 강사님!

알기 쉽게 차근차근 빌드업 해주셔서.. 
강의 커리큘럼에도 놀랍고...
이해가 쏙쏙 되어 감사히 듣고있습니다.

한가지 질문이 있어서 남깁니다.

강의자료 23페이지 하단의

"returning 절에 지정된 타입의 값을 반환하는 메서드만 대상으로 실행된다"

부분을 테스트 해보았습니다. (다른 어드바이스는 제외하고 @AfterReturning 만으로 테스트)

Orderservice의 save는 String을 리턴하게 하고

어드바이스의 returning 타입은 Integer로 선언하여 테스트를 해보았고, 어드바이스가 적용되지 않는 것을 확인하였습니다. 

@AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()"returning = "result")public void doReturn(JoinPoint joinPoint, Integer result) {

그래서 OrderService에 적용되는 어드바이스가 하나도 없는데 프록시는 생성되었을까 하여 aopInfo() 테스트로 확인해보니 OrderService에 여전히 프록시가 적용된 것을 확인하였습니다.

 

  이전 강의에서 말씀해주신 포인트컷의 2가지 역할 중 첫번째 역할이 "빈 대상 객체가 포인트컷들 중에 하나라도 해당되면 프록시를 생성한다"  와 연결지어 생각해 보았을때,

포인트컷에 만족되기 때문에(모든 리턴타입에 대해 허용) 어드바이스 메서드 시그니처와는 관계없이 프록시를 생성한 것으로 추측됩니다.

 

이런 경우에 실제로는 사용할 어드바이스가 없지만 프록시를 생성하는 비용이 발생되는데, 실무에서는 조금 더 효율적으로 사용하기 위해서 포인트컷에 리턴타입을 명시해주는 것이 좋을까요? 

 

그런데 또 생각해보면... 이 어드바이스 하나만 놓고 보았을때는 프록시만 생성되고 실제로 사용되지 않을 것 같은데, Aspect가 여러개 적용되어 중간에 다른 Aspect의 @Around에서 리턴타입이 변경된 후 넘어오게 된다면 이 어드바이스가 적용되는 일이 생길수도 있을 것 같습니다.

이렇게 생각하니 생각보다 고려할게 굉장히 많게 느껴지네요... 잘못 사용하면 예상치 못한 일들도 발생할 수 있을 것 같습니다.^^;;

 

정해진 답은 없고 위와 같은 것들을 잘 고려해서 주어진 상황에 따라 설계하는 것이 답일까요??

 

감사합니다!

답변 1

5

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 즐거운 개발자님

사실 프록시가 생성된다고 해서 비용이 증가하거나 성능이 느려지는 것은 거의 없습니다. 그러니 이 부분은 크게 고민하지 않으셔도 됩니다^^

성능 보다는 나에게 필요한 포인트컷이 무엇일지를 고민하면 됩니다. 그리고 실무에서는 리턴 타입에 대한 부분은 잘 사용하지 않습니다.

감사합니다.

즐거운 개발자님의 프로필 이미지
즐거운 개발자

작성한 질문수

질문하기