Intro
자바에서 인터셉터는 애플리케이션의 요청과 응답을 가로채고 처리하는 기능을 제공하는 인터페이스입니다.
조금 더 풀어 설명 드리면, 클라이언트로부터 요청이 Controller에 전달되기 전, 혹은 Controller에서 응답이 클라이언트로 전달되기전 중간 단계라고 생각하시면 될 것 같습니다.
일반적으로 웹 애플리케이션에서 인터셉터는 HTTP 요청과 응답을 가로채서 로깅, 인증, 권한 부여 등과 같은 공통 작업을 수행하는 데 사용됩니다. 아래에 간단한 예제를 통해 소개해 드리겠습니다.
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 클래스를 빈으로 등록합니다.
주 사용 용도
- 인증과 권한 부여: 인터셉터를 사용하여 요청의 인증과 권한 부여를 처리할 수 있습니다. 예를 들어, 사용자의 로그인 상태를 확인하거나 특정 사용자의 권한을 확인하여 접근 제어를 할 수 있습니다.
- 로깅: 인터셉터를 사용하여 요청과 응답에 대한 로그를 기록할 수 있습니다. 이를 통해 애플리케이션의 동작을 추적하고 디버깅에 도움을 줄 수 있습니다.
- 캐싱: 인터셉터를 사용하여 요청의 결과를 캐싱하여 성능을 향상시킬 수 있습니다. 예를 들어, 동일한 요청에 대한 결과를 캐시에서 반환하여 서버 부하를 줄일 수 있습니다.
- 예외 처리: 인터셉터를 사용하여 예외 처리를 수행할 수 있습니다. 예외가 발생했을 때 특정한 처리를 하거나 예외를 변환하여 클라이언트에게 적절한 응답을 전달할 수 있습니다.
- 요청 및 응답 변환: 인터셉터를 사용하여 요청이나 응답을 변환할 수 있습니다. 예를 들어, 요청 데이터의 형식을 변경하거나 응답 데이터를 가공하여 클라이언트에게 전달할 수 있습니다.
- 성능 모니터링: 인터셉터를 사용하여 애플리케이션의 성능을 모니터링할 수 있습니다. 요청의 처리 시간을 측정하거나 특정 작업에 대한 통계 정보를 수집할 수 있습니다.
인터셉터는 애플리케이션의 여러 계층에서 사용될 수 있으며, 공통적인 작업을 처리하는 데 유용합니다. 예를 들어, 웹 애플리케이션에서는 인터셉터를 사용하여 인증, 로깅, 캐싱 등과 같은 공통 작업을 중앙에서 처리할 수 있습니다. 이렇게 함으로써 코드 중복을 줄이고 유지 보수성을 향상시킬 수 있습니다.
'Java' 카테고리의 다른 글
[Java] Map과 Generic(제네릭)이란? (예시 포함) (0) | 2023.06.13 |
---|---|
[Java] Spring_Front에서 전달 된 데이터 Controller에서 처리하는 방법 (0) | 2023.06.01 |
[Java] 자바 상속의 개념과 예시 (0) | 2023.05.31 |
[JAVA] Map과 Set이란? 그리고 그 차이 (0) | 2023.05.31 |