본문

IT로그/프로그래밍

[Spring] AOP - Advice 호출이 되지 않는 문제

아래 사진과 같이 Advice 설정과 Pointcuts 설정은 제대로 적용되어 각 메소드에 화살표 아이콘이 표시되는 것을 확인 할 수 있다.

하지만 데이터를 날려보면 Advice 에서 생성되어야 할 로그가 출력되지 않는다.

advice code image

advice log image

에러가 뜨는 것도 없고 데이터 베이스에 데이터도 꼬박꼬박 잘 들어오는데 Advice 로그만 출력이 안되는 상황.

로그의 문제인가 싶어 System.out.println 으로 출력을 넣어봐도 안나오는것을 보면 Advice 호출 자체가 안되는 것으로 보인다.

이 문제를 가지고서 한참을 헤매다 해당 교재의 카페에서 같은 문제상황에 대한 답변으로 root-context.xml 과 servlet-context.xml 에 autoproxy 태그와 aop 패키지를 추가한 각각의 경우에 대해 AOP 가 적용되고 안됨을 비교한 답변을 찾을 수 있었다.

해당 답변을 참고하여 이리저리 테스트 해본 결과 servlet-context.xml 에 해당 태그들을 추가해주면 제대로 로그가 출력이 되긴하는데 교재의 방식과 다르게 작동한다는 것은 무언가 잘못된 점이 있다는것이기에 근본적인 원인을 찾고 싶었다.

해당 문제에 대한 결론부터 먼저 얘기하자면 servlet-context.xml 에 controller 패키지가 등록되어 있지 않아서 생기는 문제였다.

프로젝트를 생성할 때 입력하는 패키지는 기본적으로 servlet-context.xml 에 등록되어 있는데 교재에서는 패키지명을 xxx.xxx.controller 로 생성했기 때문에 servlet-context.xml 에 controller 패키지가 자동으로 등록되어 있었고 본인은 게시판 프로젝트랍시고 패키지명을 xxx.xxx.board 로 생성하여 servlet-context.xml 에 controller 패키지 대신 board 패키지가 등록되어 있었다.

해당 사실을 알고나서 교재의 앞부분을 다시 보니 MVC 모델 설명에서 servlet-context.xml 과 controller 에 대한 설명이 있었다….

servlet-context.xml 에 controller 패키지를 등록해주니 이제서야 AOP가 제대로 적용이 된다.

advice log image2

root-context.xml
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:component-scan base-package="org.dasom.board.dao"></context:component-scan>
<context:component-scan base-package="org.dasom.board.service"></context:component-scan>
<context:component-scan base-package="org.dasom.board.aop" ></context:component-scan>
servlet-context.xml
<context:component-scan base-package="org.dasom.board.controller" ></context:component-scan>

그동안 controller 사용에 있어서 아무런 문제가 없었기 때문에 계속 놓쳤을지도 몰랐을 부분인데 이번 문제상황을 통해 다행히도 찾을 수 있었다.

 

<사용교재>

코드로 배우는 스프링 웹 프로젝트

댓글 0

티스토리 툴바