[v2] Spring 게시판 조금 알고 따라하기 - 끝

인터셉트를 활용한 인가 확인
HootJem's avatar
Aug 26, 2024
[v2] Spring 게시판 조금 알고 따라하기 - 끝
https://inblog.ai/hj/인터셉터와-aop-27527 프로젝트 글 내부에 적기엔 너무 구구절절하여 분리하였다…

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

1. 인터셉터 구현

notion image
인터셉터의 구현을 위해 HandlerInterceptor 인터페이스를 상속받습니다. 구현한 인터셉터의 동작확인을 위해 로그를 출력해봅니다.
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("프리핸들 동작-----------------------------------"); return true;//false 면 컨트롤러 진입안됨 } }
 
인터셉터를 사용하여 사용자 인증 처리를 합니다. 이렇게 하면 이전에 컨트롤러마다 있었던 세션 체크부분을 생략할 수 있습니다.
notion image
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 컨테이너에 등록합니다.
 
notion image
인터셉터 설정이 정상적으로 동작하는 모습
 
그리고 실행해보면
/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 은 주의깊게 설정하는 편이 좋습니다.
notion image
notion image
 
  • 예외처리
게시글 수정삭제 버튼 활성화를 위해 게시글 상세보기 하면 세션을 체크하도록 작성되어 있습니다.
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

[HootJem] 개발 기록 블로그