https://inblog.ai/hj/인터셉터와-aop-27527
프로젝트 글 내부에 적기엔 너무 구구절절하여 분리하였다…

스프링에서
인터셉터(Interceptor)
는 컨트롤러가 실행되기 전이나 후에 공통적인 로직을 실행하는 데 사용됩니다. 인터셉터는 무엇을 실행할지를 결정하고, 설정 클래스(예: WebConfig
클래스)에서는 어떻게 실행할지를 설정합니다.
1. 인터셉터 구현

인터셉터의 구현을 위해
HandlerInterceptor
인터페이스를 상속받습니다.
구현한 인터셉터의 동작확인을 위해 로그를 출력해봅니다.public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("프리핸들 동작-----------------------------------");
return true;//false 면 컨트롤러 진입안됨
}
}
인터셉터를 사용하여 사용자 인증 처리를 합니다. 이렇게 하면 이전에 컨트롤러마다 있었던
세션 체크부분을 생략할 수 있습니다.

public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (sessionUser == null) {
throw new Exception401("인증되지 않았어요");
}
return true;//false 면 컨트롤러 진입안됨
}
}
2. webConfig 설정
WebConfig
클래스에서 인터셉터를 설정하여 어떤 요청 경로에서 인터셉터가 동작할지 지정할 수 있습니다.@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/user/**")
.addPathPatterns("/board/**");
}
}
@Configuration
어노테이션을 통해 ioC 컨테이너에 등록합니다.
인터셉터 설정이 정상적으로 동작하는 모습
그리고 실행해보면
/board/** , /user/** 들이 접근이 막혀있습니다.
그러나 지금 프로젝트의 메인 페이지인 list 의 요청 url 은
/board
이므로 로그인 하지 않았을 때 메인 페이지 접근이 불가하다.public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/api/**");
}
}
이처럼 인증이 필요한 페이지는
/api/board/**
/api/user/**
같이 공통된 패턴을 사용하여 한번에 관리할 수 있습니다.따라서, 요청 url 은 주의깊게 설정하는 편이 좋습니다.


- 예외처리
게시글 수정삭제 버튼 활성화를 위해 게시글 상세보기 하면 세션을 체크하도록 작성되어 있습니다.
BoardRequest
DTO 의 코드에 세션 확인 로직을 if
문 사용하여 추가해주면 괜찮아집니다. public DetailDTO(Board board, User sessionUser) {
this.boardId = board.getId();
this.title = board.getTitle();
this.content = board.getContent();
this.userId = board.getUser().getId();
this.username = board.getUser().getUsername();
this.isOwner = false;
if (sessionUser != null) {
if (board.getUser().getId() == sessionUser.getId()) {
isOwner = true;
}
}
}
리팩토링 작업을 통해 V1 버전을 마무리하고, DTO와 다양한 핸들러를 추가하여 V2 리팩토링을 완료했습니다.
이번 리팩토링에서는 예외 처리와 인가 검사를 어노테이션을 사용해 효율적으로 관리할 수 있도록 했습니다.
이를 통해 코드의 유지보수성을 높이고, 관리하기 쉬운 구조로 개선할 수 있었습니다. 👍👍
스프링부트 게시판 시리즈 v2 -1. https://inblog.ai/hj/27190 (User 테이블 생성 및 쿼리 수정) -2. https://inblog.ai/hj/27193 (User, Board 테이블 조인 과 JPQL) -3. https://inblog.ai/hj/27224 (회원 가입) -4. https://inblog.ai/hj/27225 DTO 를 통한 리팩토링 -5. https://inblog.ai/hj/27310 로그인, 로그아웃 -6. https://inblog.ai/hj/27316 서비스 레이어 추가 및 DTO 활용 -7. https://inblog.ai/hj/27430 예외처리 핸들러 설정과 User 서비스 리팩토링 -8. https://inblog.ai/hj/27431 Board 기능 리팩토링 -9. https://inblog.ai/hj/27560 게시글 수정, 더티체킹(flush) -10. https://inblog.ai/hj/27561 인터셉터, AOP 사용 / 마무리
Share article