우리의 응용 프로그램에 다음과 같은 레이어와 상호 작용이 있습니다AOP와 예외 문제
보기 (JSP) -> Ajax 호출 -> MyController에 (구현 봄 컨트롤러) -> 사용자 정의 서비스 조회를 통해 ->이면 MyService를 (기본 서비스 구현) -> My DAOimpl
우리의 아이디어는 예외 로깅을 위해 AOP를 사용하는 것이다. AOP 인터셉터를 간단하게 유지하기 위해 우리는 컨트롤러에서 커트를 정의하기로 결정했습니다. 컨트롤러에는 handleLequest 메소드에서 호출되는 onLoad, onUpdate (CRUD 연산과 관련 있음)와 같은 몇 가지 메소드가 있으며, 우리는 poitncut에 대해이 메소드를 정의하려고합니다. , 즉 서비스 계층 또는 그 이하의 예외는 버블 링되어 컨트롤러에 도달합니다. 예외 예외를 가로 채고 예외 세부 사항을 로그에 기록하도록 정의 된 AOP pointcut. 결과적으로 오류 코드가 적절하게 표시 될보기로 오류 코드가 다시 전송됩니다.
문제점 : - AOP는 onLoad 등의 메소드에 대한 호출을 차단하지 않습니다. handleRequest에서이 메소드를 호출하면 Controller에서 자체 호출로 처리되고 AOP가이를 가로 채지 않기 때문입니다. - 위의 문제를 피하기 위해 onLoad, onUpdate 메소드 및 onLoad 등 메소드를 구현하는 util 클래스 세트가있는 인터페이스를 만들었습니다. 컨트롤러는 이러한 유틸리티를 구성원으로 갖습니다. Pointcuts는 컨트롤러 대신 이러한 유틸리티에서 정의됩니다. 이 작업을 수행 할 때 AOP 설정이 AOP 선언 용 사용자 정의 xml이 아닌 spring-servlet xml에있는 경우에만 AOP가 작동합니다. 이 관찰은 컨트롤러에만 해당됩니다. AOP 컷이 서비스 레이어에 정의 된 경우 선언은 예상대로 작동합니다 (사용자 정의 XML에서). 스프링 서블릿 xml과 컨트롤러의 컷 사이의 의존성에 대해서는 확실하지 않습니다.
제안 사항 : - 컨트롤러에 대해 AOP를 정의해야합니까? 이것이 서비스 계층에서만 정의되어야 하는가? 컨트롤러에서는 예외가 'catch'되고 오류 메시지가 적절하게 표시됩니다. 원래 접근법에 근본적인 문제가 있는지 확인하고 싶었습니다.
힌트 : 봄 프록시 AOP 대신 실제 AspectJ의 AOP를 사용하는 경우 동일한 인스턴스 ('this.onLoad()')로부터도 호출을 가로 챌 수있을 것이다. – Ralph