n인터셉터가 되기 위해서는 HandlerInterceptor를 구현 또는 HandlerInterceptorAdapter를 상속받아야 한다. HandlerInterceptor를 구현하는 경우에는 세가지 메소드(preHandle(), postHandle(), afterCompletion() )를 다 구현해야 하지만 HandlerInterceptorAdapter를 상속받는 경우에는 필요한 메소드만 재정의하면 된다.
npreHandle() : 컨트롤러 메소드가 실행되기 전에 실행되며 bool형 리턴 한다. 실행체인에서 계속 실행할지 중단할지를 true, false로 전달한다. false가 리턴되면 디스패처 서블릿은 핸들러가 직접 요청을 처리하여, 뷰를 직접 다룬다고 생각하고 다른 인터셉터나 핸들러의 실행을 중단한다.
npostHandle() : 컨트롤러 메소드가 실행된 후 호출 된다.
nafterCompletion() : 모든 요청이 완료되고 VIEW가 생성 된 후(응답이 만들어 진후) 호출된다.
nServlet Filter와 Interceptor의 차이
ü서블릿 필터는 Dispatcher Servlet이 호출되기전, 인터셉터는 Dispatcher Servlet이 호출된 후
ü서블릿 필터는 web.xml에서 설정, 인터셉터는 스프링 설정파일에서 설정
n실습(인터셉터를 이용한 커스텀 로깅 구현)
nFile >> new >> Project >> Spring Legacy Project >> Spring MVC Project
(STS4 에서는 Spring Legacy Project가 없으니 help >> Eclipse MarketPlace에서 “sts”로 검색 후 “Spring Tools 3 Add-On for Spring Tools 4 3.9.14.CI”를 설치하자)
n프로젝트 명 : interceptorTest.
nTop-level package : a.b.interceptorTest
(기본적으로 Spring Web MVC HelloWorld 예제 템플릿이 다운로드 된다.)
n 클래스 레벨에서 사용되는 @Configuration은 스프링 IoC 컨테이너에게 클래스가 자바 빈을 만드는(구성하는) 클래스임을 알린다.
n 메소드 레벨에서 사용되는 @Bean은 개발자가 만들지 않는 외부 라이브러리의 객체들을 빈으로 등록할 때 사용된다. 물론 개발자가 만든 클래스도 빈으로 만들 수 있지만 개발자가 만드는 클래스들은 주로 @Component, @Service, @Repository 등의 어노테이션을 이용하여 등록한다.
@Configuration
publicclassConfig{
@Bean
publicEmpgetService(){
return new Emp();
}
@Bean
publicMyClass1getArrayList(){
return new ArrayList();
}
}
@Component
n @Component, @Service, @Repository 등의 어노테이션을 이용하여 등록한 빈을 @Autowired를 이용하여 주입한다.
n @Component는 스프링 IoC 컨테이너에서 관리되는 자바 빈(객체)임을 표시하기 위해 사용하는 기본적인 어노테이션으로 주로 DTO, VO 용도의 클래스에 대해 주로 사용한다.
n @Service는 비즈니스 로직이나 영속성 계층(Respository Layer)의 클래스를 호출하는 클래스에 사용된다. 기능적으로는 @Component와 동일하다.
n @Repository는 DB쪽 데이터 처리를 위한 Data Repository, DAO 클래스임을 나타내는 어노테이션이다. @Component와 기능적으로 동일하지만 @Repository는 발생되는 Unchecked Exception을 Spring의 Runtime 예외인 DataAccessException으로 처리할 수 있게 해준다. DataAccessException은 DAO에서 상용구 catch-and-throw 블록 및 예외 선언을 작성하지 않고도 예외를 처리 할 수 있다.
n 실습(Spring JDBC를 이용한 오라클 사원(Emp) 테이블 Data Insert)