request parameter 로깅 이슈 해결과정

sarah·2023년 3월 29일
0

진행중인 프로젝트에서 request로 파라미터를 보내는 경우, 아래의 3가지 케이스가 있다.

  • [GET] queryString
  • [POST] Multipart/form-data
  • [POST] Application/json

보통 request의 parameter를 읽을 때, 아래의 두가지 메서드를 사용하는데,

  • request.getParameterNames()
  • request.getInputStream()

각각 사용했을 경우, 위에서 언급한 파라미터를 보내는 방법에 따라 파라미터를 읽어 올 수 있는지 체크해보았다.

<getInputStream 으로 multipart/form-data 를 읽으면 안되는 이유>
AOP에서 @Before 시점에서 로그를 찍을 예정이기 때문에, MultipartFile을 getInputStream으로 먼저 읽게 되면 Controller 단에서 재사용 불가
getInputStream으로 파라미터 찍기야 하는데, Controller 단에서 오류남


그래서 모두를 아우르는 쉬운 방법이 없을까? 고민하다 AOP를 적용해서 로그를 찍으려고 하니, 그 특성을 사용해서 찍어보자 라는 생각이 들었고,
JoinPoint의 getArgs() 메서드를 통해 Controller의 인자값을 캐치해서 로그에 찍으면 타입 상관없이 다 찍히지 않을까! 생각했다.
getArgs()를 통해 Object 배열로 데이터를 받은걸 log 에 찍도록 하였다.
(DTO로 변환하는 경우, 해당 DTO의 toString() 재정의 필요!)

@Aspect
@Component
@Slf4j
public class LoggerAspect {
	@Autowired
    private HttpServletRequest request;
    
    @Before("포인트컷")
    public void before(JoinPoint joinPoint) {
    	Object[] args = joinPoint.getArgs();
        for(Object arg : args) {
        	log.debug("request_param => [{}]", arg);
        }
    }
}

아쉬움..

controller의 인자값을 찍는 경우, converter에 의해 어쨋든 가공된 값이기에
request에 들어있는 온전한 파라미터를 찍을 수 있는 방법은 없을까? 아쉬움이 남았다.
content-type에 따라 분기처리해서 찍을 수 밖에 없는것인가..?
(그렇다면 Multipart/form-data 형식은 어떻게 찍어야 하지...?)

0개의 댓글