임시로 디버깅하는 방법
HttpEntity 클래스를 활용하여 body에 어떠한 JSON 값이 들어왔는지 확인한다.
//회원가입
@PostMapping("")
public void register(//@RequestBody UserRequest userRequest
HttpEntity http){
log.info("user : {} ", http.getBody()); // 바디 값 확인
}
- 정확한 request body의 내용이라기보다는 한번 더 캐스팅하여 사용해야하기 때문에 불편함이 있다.
- 클라이언트에게 어떠한 값을 전달했는지 확인하기도 어렵다.
필터 적용하기
로그를 찍어볼 수 있는 필터를 생성하여 확인한다.
package com.example.filter.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@Component
public class LoggerFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//필터 진입 전
log.info(">>>>>>>>> 진입 ");
//ContentCaching : reader로 읽을 때 따로 내부에다 Byte 배열로 내용을 저장해놓는다. 이로써 이후 컨트롤러에서 한번 더 읽을 수 있게 된다.
ContentCachingRequestWrapper req = new ContentCachingRequestWrapper((HttpServletRequest) request);
ContentCachingResponseWrapper res = new ContentCachingResponseWrapper((HttpServletResponse) response);
chain.doFilter(req, res);
// 요청으로 들어온 JSON의 내용을 출력.
String reqJson = new String(req.getContentAsByteArray());
log.info("req : {} ", reqJson);
String resJson = new String(res.getContentAsByteArray()); //한번 읽어 들였기 때문에 이후에 읽어지지 않음.
log.info("res : {} ", resJson);
log.info("<<<<<<<<< 리턴");
//필터 진입 후
res.copyBodyToResponse(); // 한번 읽었더라도 복사해둔 내용을 다시 한번 응답에 덮어씌워준다.
}
}
- 클라이언트에서 보낸 요청과 서버에서 처리후 보내는 응답을 명확히 확인할 수 있다.
- 그로 인해, 클라이언트 쪽의 문제인지, 서버 쪽의 문제인지 파악이 가능하다.
- 따라서, 데이터 처리에 있어서 어떠한 문제가 발생하였는지 잘 알 수 있다.
'Spring > SpringMVC' 카테고리의 다른 글
ExceptionResolver (0) | 2024.03.18 |
---|---|
HandlerExceptionResolver (0) | 2024.03.15 |
API 예외 처리 (1) | 2024.02.27 |
스프링 부트 - 오류페이지 처리 (0) | 2024.02.19 |
서블릿 예외처리 (0) | 2024.02.15 |