프로젝트 23

인터셉터에서 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)는 디스패처..

시퀀스 다이어그램 기반, 클래스 다이어그램 작성해보기

개요피드백을 받은대로 시퀀스 다이어그램 작성이 완료되었다.시퀀스 다이어그램을 기반으로 PlantUML을 사용하여 클래스 다이어그램도 그려보자!  코드@startuml'class에 대한 주요 요소들을 정의'class Client { - accessToken: String - chatRoomPK: String - content: String + sendChatRequest(): void}class ChatServer { - database: Database - pushServer: PushServer - accessToken: String - userPK: String - chatRoomPK: String - content: String + vali..

로깅, 푸시 알림 요청 비동기로 처리하기

요구사항비즈니스 로직payload 로 넘어온 채팅방 PK가 정말 있는 채팅방인지와 사용자가 채팅방에 들어가있는지 확인해당 채팅방에 채팅 레코드 추가해당 채팅방에 있는 사용자 모두 조회조회된 사용자들의 device 에 모두 push 요청push 요청 보내기 시작하면서부터 모든 사용자의 device 에게 요청 다 보낼 때까지의 시간 측정로깅들어오는 모든 요청에 대해 로그를 남겨야 함response 없이 request 요청에 대한 로그만 남기도록request header 의 Authorization 헤더 제외http method, uri, 요청 온 시간, 요청 ip, request body 로깅 필요 (GET 요청 무시)DB 에다가도 로그 남겨야 하고 파일에다가도 로그 남아야 함DB 그리고 파일로의 로그 저장..