스프링 인터셉터에 대한 자세한 설명
스프링 인터셉터는 스프링 MVC에서 HTTP 요청을 가로채어 처리하는 강력한 기능입니다. 클라이언트의 요청이 컨트롤러에 도달하기 전 또는 후에 특정 작업을 수행하여 애플리케이션의 다양한 부분에서 유용하게 활용될 수 있습니다.
인터셉터의 주요 기능
- 요청 가로채기: 클라이언트의 요청이 컨트롤러에 도달하기 전에 가로채서 특정 로직을 수행합니다.
- 응답 가로채기: 컨트롤러에서 처리된 결과가 클라이언트로 전달되기 전에 가로채서 추가적인 작업을 수행합니다.
- 공통 기능 처리: 로그인 인증, 권한 체크, 성능 측정 등 공통적으로 수행해야 하는 작업을 인터셉터에서 처리하여 코드 중복을 줄이고 유지보수성을 높입니다.
- AOP(Aspect Oriented Programming) 적용: AOP 관점에서 보면 인터셉터는 공통 관심사를 분리하여 처리하는 역할을 합니다.
인터셉터의 동작 방식
- preHandle() 메서드: 컨트롤러 메서드가 호출되기 전에 실행됩니다. 여기서 요청을 검증하거나, 공통적인 작업을 수행할 수 있습니다.
- postHandle() 메서드: 컨트롤러 메서드가 정상적으로 실행된 후에 호출됩니다. 여기서 모델이나 뷰를 수정하거나, 추가적인 처리를 할 수 있습니다.
- afterCompletion() 메서드: 전체 요청 처리가 완료된 후에 호출됩니다. 여기서 리소스 해제 등의 작업을 수행할 수 있습니다.
인터셉터의 활용 예시
- 로그인 인증: 사용자가 로그인되어 있는지 확인하고, 인증되지 않은 경우 로그인 페이지로 리다이렉트합니다.
- 권한 체크: 사용자가 특정 요청을 수행할 수 있는 권한이 있는지 확인합니다.
- 로그 기록: 요청 정보와 응답 정보를 로그 파일에 기록하여 시스템 오류를 분석하고 추적합니다.
- 성능 측정: 요청 처리 시간을 측정하여 시스템 성능을 분석합니다.
- 캐싱: 자주 요청되는 데이터를 캐싱하여 시스템 성능을 향상시킵니다.
Interceptor 기본 예시
1. 인터셉터 인터페이스 생성
public interface MyInterceptor {
void preHandle();
void postHandle();
void afterCompletion();
}
MyInterceptor 인터페이스는 preHandle(), postHandle(), afterCompletion() 세 가지 메서드를 정의하고 있습니다.
2. 인터셉터 구현
public class MyInterceptorImpl implements MyInterceptor {
@Override
public void preHandle() {
System.out.println("인터셉터: preHandle 메서드 호출");
// 요청 전처리 작업 수행
}
@Override
public void postHandle() {
System.out.println("인터셉터: postHandle 메서드 호출");
// 요청 후처리 작업 수행
}
@Override
public void afterCompletion() {
System.out.println("인터셉터: afterCompletion 메서드 호출");
// 응답 완료 후 작업 수행
}
}
MyInterceptorImpl 클래스는 이 인터페이스를 구현하여 각 메서드를 구체적으로 구현합니다.
3. 인터셉터를 사용하는 클래스 생성
public class UserController {
private MyInterceptor interceptor;
public UserController(MyInterceptor interceptor) {
this.interceptor = interceptor;
}
public void handleRequest() {
interceptor.preHandle();
// 요청 처리 작업 수행
interceptor.postHandle();
interceptor.afterCompletion();
}
}
UserController 클래스는 생성자를 통해 인터셉터를 주입받고, handleRequest() 메서드에서 인터셉터의 메서드를 호출하여 요청 처리 전후의 작업을 수행합니다.
4. 실행 클래스에서 인터셉터를 생성하여 사용
public class Main {
public static void main(String[] args) {
MyInterceptor interceptor = new MyInterceptorImpl();
UserController controller = new UserController(interceptor);
controller.handleRequest();
}
}
Main 클래스에서는 인터셉터 객체를 생성하여 컨트롤러에 주입하고 handleRequest() 메서드를 호출합니다.
Spring 프레임워크에서의 인터셉터 예시
1. 인터셉터 구현
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("인터셉터: preHandle 메서드 호출");
// 요청 전처리 작업 수행
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("인터셉터: postHandle 메서드 호출");
// 요청 후처리 작업 수행
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
System.out.println("인터셉터: afterCompletion 메서드 호출");
// 응답 완료 후 작업 수행
}
}
MyInterceptor 클래스는 HandlerInterceptor 인터페이스를 구현합니다. preHandle() 메서드는 요청 전에 호출되며, postHandle() 메서드는 요청 처리 후에 호출되고 afterCompletion() 메서드는 응답 완료 후 호출됩니다. 각 메서드에서 원하는 작업을 수행할 수 있습니다.
2. 인터셉터 등록
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class MyInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
MyInterceptorConfig 클래스는 WebMvcConfigurer 인터페이스를 구현하여 addInterceptors() 메서드를 재정의합니다. 이 메서드에서 인터셉터를 등록합니다.
3. Spring 구성 파일에 인터셉터 설정 추가
<mvc:interceptors>
<bean class="com.example.MyInterceptorConfig" />
</mvc:interceptors>
마지막으로, Spring 구성 파일(XML 파일)에 인터셉터 설정을 추가합니다. <mvc:interceptors> 요소 안에 MyInterceptorConfig 클래스를 빈으로 등록합니다.
출처 :
https://plitche-dev.tistory.com/10
'STUDY > SpringLegacy' 카테고리의 다른 글
[Spring] MultipartFile 다중 파일 업로드 받아 API에 전달하는 컨트롤러 구현 (0) | 2024.11.22 |
---|---|
[Spring] maven grpc client 구현을 위한 pom.xml 작성 (0) | 2024.11.19 |
[STS] Spring MVC Project 템플릿 없음 해결방법 (0) | 2024.10.11 |
[Spring] Spring에서 클라이언트로부터 파라미터를 받는 방법과 Content-Type 설정 (0) | 2024.07.30 |
[Spring] @Autowired null 문제 해결 (필드 주입 사용 시) (0) | 2024.06.10 |