MethodBeforeAdvice 와 HandlerInterceptorAdapter 사용시 질문입니다.
- 작성자 :
- 임*화
- 작성일 :
- 2010-11-09 04:37:37
- 조회수 :
- 3,019
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
전자정부 표준 프레임워크에 최대한 준수해서 작업을 하고 있습니다.
<질문 1>
AOP를 구현하려고 하는데요.. 인터페이스인 MethodBeforeAdvice 를 상속받아서
before(...) 메소드를 Override 시키려고 하는데요...
파라미터가 before(Method method, Object[] args, Object target) 이렇게
되어 있더라구요...
근데 제가 before 메소드에서 URL 체크를 해야할 일이 있어서 HttpServletRequest
객체가 필요한데... 저 HttpServletRequest 객체를 받아 올수 있는 방법은
없는건가요???
모든 메소드에서 현재 request 객체를 가지고 오고 있지 않기 때문에
Object[] args 파라미터를 이용해서 가져올 수도 없는 상황입니다.
<질문 2>
interceptor 같은 경우에는 예를 들어 preHandle(..) 메소드 실행후에
다른 interceptor 나 대상 컨트롤러 객체를 실행을 할지 여부를 return false;
또는 true를 주게 되는데...
AOP에서는 그렇게 처리를 할수 없는건가요??
제가 하려고 하는거는 AOP를 걸어서 이전 페이지의 도메인과 사용자가 요청한 도메인
이 같은지 체크를 해서 다를경우 디폴트 페이지로 이동을 하려고 합니다.
<질문 3>
교육자료에서와 같이 설정파일에서 아래와 같이 interceptor를 걸었는데요..
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (eventInfo.isComplete(request)) {
response.sendRedirect("complete.do");
return false;
} else {
return true;
}
}
제가 궁금한거는 저기 인터셉터에서 return true; 가 된다음에 실행이될
메소드명을 구해 올수 없는 건가요??
handler.getClass().getMethods() 하면 해당 컨트롤러의 메소드는 전부
가져올수가 있는데... 이녀석들 중에서 실행이 될 메소드가 어떤녀석인지 구해
오는 부분은 아무리 구글링 해봐도 나오지가 않네요..
질문 1번에서와 같이 AOP에서는 Method 를 파라미터로 받아서 사용할 수가 있는데
interceptor 에서도 interceptor 후에 실행될 객체의 메소드명을 구해올수 있을거
같은데... 방법을 잘 모르겠습니다...
<질문 1>
AOP를 구현하려고 하는데요.. 인터페이스인 MethodBeforeAdvice 를 상속받아서
before(...) 메소드를 Override 시키려고 하는데요...
파라미터가 before(Method method, Object[] args, Object target) 이렇게
되어 있더라구요...
근데 제가 before 메소드에서 URL 체크를 해야할 일이 있어서 HttpServletRequest
객체가 필요한데... 저 HttpServletRequest 객체를 받아 올수 있는 방법은
없는건가요???
모든 메소드에서 현재 request 객체를 가지고 오고 있지 않기 때문에
Object[] args 파라미터를 이용해서 가져올 수도 없는 상황입니다.
<질문 2>
interceptor 같은 경우에는 예를 들어 preHandle(..) 메소드 실행후에
다른 interceptor 나 대상 컨트롤러 객체를 실행을 할지 여부를 return false;
또는 true를 주게 되는데...
AOP에서는 그렇게 처리를 할수 없는건가요??
제가 하려고 하는거는 AOP를 걸어서 이전 페이지의 도메인과 사용자가 요청한 도메인
이 같은지 체크를 해서 다를경우 디폴트 페이지로 이동을 하려고 합니다.
<질문 3>
교육자료에서와 같이 설정파일에서 아래와 같이 interceptor를 걸었는데요..
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (eventInfo.isComplete(request)) {
response.sendRedirect("complete.do");
return false;
} else {
return true;
}
}
제가 궁금한거는 저기 인터셉터에서 return true; 가 된다음에 실행이될
메소드명을 구해 올수 없는 건가요??
handler.getClass().getMethods() 하면 해당 컨트롤러의 메소드는 전부
가져올수가 있는데... 이녀석들 중에서 실행이 될 메소드가 어떤녀석인지 구해
오는 부분은 아무리 구글링 해봐도 나오지가 않네요..
질문 1번에서와 같이 AOP에서는 Method 를 파라미터로 받아서 사용할 수가 있는데
interceptor 에서도 interceptor 후에 실행될 객체의 메소드명을 구해올수 있을거
같은데... 방법을 잘 모르겠습니다...
A
안녕하세요.. 임경화님..
<질문 1>
AOP의 특성상 필요한 정보들을 직접적인 방법으로 넘기실 수는 없습니다.
다만, 메소드 args를 통해 간접적인 방법으로 필요한 정보를 넘기실 수 있습니다.
예를 들면.. 모든 메소드의 파라미터를 특정 VO를 상속받도록 하시고.. 서비스 호출 전(Controller 호출 시 공통모듈 호출, Controller에서의 HandlerAdaptor를 통한 파라미터 변경 등) request로 부터 정보를 해당 VO(공통 VO를 상속한)에 넘기는 형태가 가능합니다.
참고로 AOP는 말씀하신 것 처럼 URL 체크를 하기 위한 목적이 아닙니다.
URL 체크의 경우 interceptor를 활용하시면 됩니다.
<질문 2>
AOP의 경우 interceptor처리 chain 상의 다른 interceptor를 진행할지 말지를 결정하는 요소는 없습니다.
before jointpoint의 경우 단순히 advice를 target 메소드 이전에 호출하고 원래의 흐름은 그대로 target 메소드를 호출하도록 되어 있습니다.
(다만, advice에서 강제적으로 Exception을 발생시키는 방법은 가능, 추가적으로 around의 경우는 target 메소드 호출 여부를 결정할 수 있음)
말씀하신 예 또한.. AOP 구현이 아닌 interceptor 구현이 맞을 것 같습니다.
<질문 3>
interceptor는 execution chain 방식으로 다음에 실행된 interceptor를 알 수는 없습니다.
말씀하신 것 처럼 Handler 즉, Controller의 정보를 가져올 수는 있지만.. 호출될 메소드 정보는 직접 얻을 수 없습니다.
가능하다면 request로 부터 URL을 추출하여 Controller의 @RequestMapping 정보들과 비교해서 해당 정보를 가져올 수는 있지만..
해당 메소드 정보로 할 수 있는 일은 없습니다.
우선.. 어떤 이유에서 해당 메소드를 가져와야 하는지 확인해 보실 필요가 있을 것 같습니다. 원하시는 기능을 다른 방식으로 구현하시는 것이 맞을 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.
<질문 1>
AOP의 특성상 필요한 정보들을 직접적인 방법으로 넘기실 수는 없습니다.
다만, 메소드 args를 통해 간접적인 방법으로 필요한 정보를 넘기실 수 있습니다.
예를 들면.. 모든 메소드의 파라미터를 특정 VO를 상속받도록 하시고.. 서비스 호출 전(Controller 호출 시 공통모듈 호출, Controller에서의 HandlerAdaptor를 통한 파라미터 변경 등) request로 부터 정보를 해당 VO(공통 VO를 상속한)에 넘기는 형태가 가능합니다.
참고로 AOP는 말씀하신 것 처럼 URL 체크를 하기 위한 목적이 아닙니다.
URL 체크의 경우 interceptor를 활용하시면 됩니다.
<질문 2>
AOP의 경우 interceptor처리 chain 상의 다른 interceptor를 진행할지 말지를 결정하는 요소는 없습니다.
before jointpoint의 경우 단순히 advice를 target 메소드 이전에 호출하고 원래의 흐름은 그대로 target 메소드를 호출하도록 되어 있습니다.
(다만, advice에서 강제적으로 Exception을 발생시키는 방법은 가능, 추가적으로 around의 경우는 target 메소드 호출 여부를 결정할 수 있음)
말씀하신 예 또한.. AOP 구현이 아닌 interceptor 구현이 맞을 것 같습니다.
<질문 3>
interceptor는 execution chain 방식으로 다음에 실행된 interceptor를 알 수는 없습니다.
말씀하신 것 처럼 Handler 즉, Controller의 정보를 가져올 수는 있지만.. 호출될 메소드 정보는 직접 얻을 수 없습니다.
가능하다면 request로 부터 URL을 추출하여 Controller의 @RequestMapping 정보들과 비교해서 해당 정보를 가져올 수는 있지만..
해당 메소드 정보로 할 수 있는 일은 없습니다.
우선.. 어떤 이유에서 해당 메소드를 가져와야 하는지 확인해 보실 필요가 있을 것 같습니다. 원하시는 기능을 다른 방식으로 구현하시는 것이 맞을 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.