728x90
Interceptor 란
- 가로채다
- 요청/응답 또는 메서드 실행을 가로채고 그 전후로 추가적인 처리를 수행하는 컴포넌트임.
- 사용자의 요청이 컨트롤러에 가기 전에 가로채고, 서버의 응답이 사용자에게 가기 전에 가로챔. HttpRequest, HttpResponse 객체를 가로채어 가공함.
Spring MVC HandlerInterceptor(Spring Framework)
- 역할 : Spring MVC 의 컨트롤러에 대한 요청을 가로채 전처리 또는 후처리 로직을 수행함.
- 메서드
preHandle()
: 컨트롤러가 실행되기전에 호출postHandle()
: 컨트롤러가 실행된 후에 호출되지만, 뷰를 렌더링하기 전afterCompletion()
: 뷰 렌더링까지 완료된 후에 호출됨.
예시
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Request URI: " + request.getRequestURI());
return true; // true를 반환하면 다음 인터셉터 또는 컨트롤러로 요청을 계속 전달
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("PostHandle: After handling the request");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("AfterCompletion: After completing the request and response");
}
}
Interceptor 등록
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor())
.addPathPatterns("/**") // 모든 경로에 대해 적용
.excludePathPatterns("/exclude"); // 제외할 경로
}
}
JPA/Hibernate Interceptor
- 엔티티가 변경되기 전후로 동작하며, 데이터베이스 조작에 대한 추가 로직을 수행함.
import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; import java.io.Serializable;
public class EntityInterceptor extends EmptyInterceptor {
@Override
public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
System.out.println("Saving entity: " + entity);
return false; // 상태 변경 시 true 반환
}
@Override
public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
System.out.println("Deleting entity: " + entity);
}
@Override
public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
System.out.println("Updating entity: " + entity);
return false;
}
}
**추가**
```java
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration()
.setInterceptor(new EntityInterceptor()) // 인터셉터 등록
.configure()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
728x90
'99클럽 TIL' 카테고리의 다른 글
31일 차 TIL Spring Interceptor vs AOP vs Filter (0) | 2024.05.18 |
---|---|
30일 차 TIL Spring Filter (0) | 2024.05.17 |
28일 차 TIL Spring Controller로 들어오는 입력값에 대한 Validation 방법 (0) | 2024.05.15 |
27일 차 TIL Spring 과 Spring Boot 의 차이점 (0) | 2024.05.14 |
26일차 TIL Spring DL 이란 (0) | 2024.05.13 |
Comment