인터셉터를 활용하여 코드 중복 줄이기

무지성개발자·2023년 12월 8일
0

문제

진행 중인 개인 프로젝트에 유저정보를 세션에 담아 사용하는 도중 컨트롤러에서 유저 정보를 너무 많은 곳에서 불러오게 되어 한 줄이지만 중복된 코드량이 많았다.

    @GetMapping("/api")
    public ResponseEntity<Void> resign() {
        Long userSeq = (Long) session.getAttribute("userSeq");
        service.method(userSeq);
        return ResponseEntity.noContent().build();
    }

Long userSeq = (Long) session.getAttribute("userSeq"); 이 코드가 중복되는 코드인데, 유저 정보를 사용해야한다면 반드시 필요한 값이다.

해결

위 같은 문제 때문에 인터셉터를 활용하여 중복된 코드를 줄여보기로 했다.

순서

  • HandlerInterceptor를 구현.
  • preHandle을 사용하여 controller 사용 전에 세션값을 reqeust 속성값으로 추가
  • controller에서 @ReqeustAttribute를 사용하여 세션값 사용

코드

HandlerInterceptor 구현객체 생성

@Component
@RequiredArgsConstructor
public class HandlerInterceptor implements HandlerInterceptor {
    private final HttpSession session;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Long userSeq = (Long) session.getAttribute("userSeq");
        request.setAttribute("userSeq", userSeq);
        return true;
    }
}

인터셉터 등록

@Component
@RequiredArgsConstructor
public class InterceptorConfig implements WebMvcConfigurer {
    private final SessionInjectionInterceptor sessionInjectionInterceptor;
 
        registry.addInterceptor(sessionInjectionInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("필요하다면");
    }
}

Controller 사용

    @GetMapping("/resign")
    public ResponseEntity<Void> resign(@RequestAttribute("userSeq") Long userSeq) {
        userService.resign(userSeq);
        session.invalidate();
        return ResponseEntity.noContent().build();
    }

한 줄평 : 이제 간단히 파라메터에 @RequestAttribute사용하여 중복 코드가 사라졌다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글