긴급코딩! - Interceptor + AOP
💡 우리의 목표는?
Admin API 접근 시 인터셉터에서 인증, AOP에서 로깅 처리
목표 시나리오
/admin/** 경로에 접근 할때:
1. 인터셉터가 JWT 토큰을 검사하고, ADMIN 관한이 아니면 거부
- AOP가 요청 및 응답 내용을 로깅
Step 1. Interceptor - 인증 처리
1. AdminInterceptor.java
@Component
public class AdminInterceptor implements HandlerInterceptor {
private final JwtProvider jwtProvider;
public AdminInterceptor(JwtProvider jwtProvider) {
this.jwtProvider = jwtProvider;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = jwtProvider.resolveToken(request);
if (token == null || !jwtProvider.validateToken(token)) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
String role = jwtProvider.getRole(token);
if (!"ADMIN".equals(role)) {
response.setStatus(HttpStatus.FORBIDDEN.value());
return false;
}
return true;
}
}
2. WebConfig.java
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final AdminInterceptor adminInterceptor;
public WebConfig(AdminInterceptor adminInterceptor) {
this.adminInterceptor = adminInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminInterceptor)
.addPathPatterns("/admin/**");
}
}
Step 2. AOP - 요청/응답 로깅
1. AdminLoggingAspect.java
@Aspect
@Component
@Slf4j
public class AdminLoggingAspect {
@Pointcut("execution(* com.example.controller.admin..*(..))")
public void adminMethods() {}
@Around("adminMethods()")
public Object logAdminRequest(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String uri = request.getRequestURI();
String userId = request.getHeader("userId");
log.info("어드민 요청 - userId: {}, URI: {}, request: {}", userId, uri, Arrays.toString(joinPoint.getArgs()));
Object result = joinPoint.proceed();
log.info("어드민 응답 - userId: {}, URI: {}, response: {}", userId, uri, result);
return result;
}
}
Step 3. 테스트용 Admin Controller
1. UserAdminController.java
@RestController
@RequestMapping("/admin/users")
public class UserAdminController {
@PatchMapping("/{userId}")
public ResponseEntity<String> changeUserRole(@PathVariable Long userId, @RequestBody RoleUpdateRequest request) {
return ResponseEntity.ok("변경 완료");
}
}
마무리
[요청] → Interceptor (인증 확인)
↓
통과하면 AOP 진입 (로깅)
↓
컨트롤러 실행 (ex. changeUserRole)
↓
AOP 종료 로그
↓
[응답 반환]
| 기능 | 구현 위치 | 역할 |
|---|
| 권한 검사 | Interceptor | 인증 (사전 처리) |
| 로그 기록 | AOP | 로깅 (사후 처리 포함) |
| 관리자 API 예시 | UserAdminController | 테스트용 컨트롤러 |
선댓글 달겠습니다 휴일에 글이 올라오다니 너무 감사드립니다