분류 전체보기 234

Jacoco를 이용한 테스트 커버리지 측정후, 보완하기

왜 적용했는가?현재 테스팅을 통해 컨트롤러, 서비스, 도메인, 레포지토리 단에서 코드를 짜고 있다.내 테스트 코드가 얼마나 실제 도메인을 커버를 하고 있는지, 좋은 테스트를 짜고 있는지 궁금하여 Jacoco를 도입하였다. Jacoco란?JaCoCo는 단위 테스트 또는 통합 테스트를 실행하면서 어떤 코드가 실행되었는지 분석하고 커버리지 리포트를 생성해준다. 이를 통해 테스트가 충분히 작성되었는지 확인하고, 테스트 누락된 부분을 보완할 수 있다. Build.gradleplugins { id 'jacoco'}jacoco { toolVersion = "0.8.8" reportsDirectory = layout.buildDirectory.dir('customJacocoReportDir')}test { finali..

스프링 인터셉터(Spring Interceptor)로 API로그 DB에 저장하기

왜 적용했는가?기존 AOP를 통해 모든 API 호출에 대한 로깅을 진행하였다.그런데 PR 리뷰를 받던 중, 다음과 같은 피드백을 받게 되었다.1. 맞지 않는 URL로 요청을 보내는 경우2. Http Method를 이상하게 보내는 경우아예 Pointcut으로 지정한 컨트롤러 메서드를 타지 않기 때문에 로깅이 전혀 불가능하다.또한 치명적인 문제는, 컨트롤러에서 @Valid 어노테이션 조건을 걸어놓은 경우 AOP가 작동하지 않는다. (Valid 여부가 컨트롤러 호출보다 먼저 실행)따라서 본 프로젝트에는 AOP에서 Interceptor로 로깅 요청을 변경하였다. Interceptor로 변경하기프로젝트의 log 도메인이다. LoggingInterceptor와, RequestBodyWrappingFilter로 구분..

인터셉터에서 RequestBody를 Read 하지 못하는 이유 및 해결방법

들어가기 앞서Filter는 ServletRequest를 통해 사용자가 보낸 Http요청에 대한 requestBody 값을 읽어 들일 수 있다. Interceptor에서 또한, ServletRequest를 상속한 HttpServletRequest를 갖는데, 왜 requestBody를 읽을 수 없을까? [Filter]public interface Filter { default void init(FilterConfig filterConfig) throws ServletException { } void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; ..

Spring REST Docs와 Swagger-UI 결합하기

https://helloworld.kurly.com/blog/spring-rest-docs-guide/ 내가 만든 API를 널리 알리기 - Spring REST Docs 가이드편'추석맞이 선물하기 재개발'에 차출되어 API 문서화를 위해 도입한 Spring REST Docs 를 소개합니다.helloworld.kurly.com 들어가기 앞서위 글을 보고, 프로젝트에 RestDocs와 Swagger-UI를 적용해본 이유와 과정을 작성해보고자 합니다.Swagger의 단점기존에 사용하던 스웨거는 정말 편리하지만, 운영코드에 침투적이라는 큰 단점이 있다.RestDocs를 적용함으로써, 컨트롤러 단에서 테스트 코드를 작성해야 하므로, 'Spring RestDocs'를 적용해보았습니다. @GetMapping @..

필터(Filter) vs 인터셉터(Interceptor) vs AOP 차이점

https://mangkyu.tistory.com/173 [Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그 중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보고자mangkyu.tistory.com위의 글이 정말 정리가 잘 되어 있어서 위 글을 적극 참고하였다!  필터(Filter)필터는 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 URL 패턴에 맞는 모든 요청에 부가작업을 처리할 수 있는 작업을 말함 ( 필터는 스프링 범위 밖에서 처리가 되는 것이다) 필터 메서드ini..

스프링 로깅 전략을 AOP에서 interceptor로 변경하기

왜 AOP에서 Interceptor로 변경했는가?AOP가 메서드 수준에서 로깅을 처리하는 반면, Interceptor는 요청/응답 처리 흐름에 맞게 로깅을 적용할 수 있다.처음에 AOP를 적용했을 때, 모든 API 호출에 대한 로깅을 DB에 저장하였다. 하지만 여기서 큰 문제점이 발생한다. 어떠한 컨트롤러의 메소드도 타지 않는 경우 (아예 이상한 url 로 요청을 보내거나 http method 를 이상하게 보내는 경우)는 로깅이 불가능하다는 점이다! 왜 필터가 아닌 인터셉터 방식인가? 인터셉터(Interceptor)는 디스패처 서블릿(Dispatcher Servlet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있다. (스프링 컨테이너 내부에서 관리)필터(FIlter)는 디스패처..