• 배달 스토어를 등록 테스트를 진행하는 과정에서 파라미터를 보냈지만 Null 값으로 들어가는 현상이 발생하여, 등록이 되지 않는 것을 알게 되었다.

  • 실제로 요청을 아래와 같이 요청을 보내면 Request Body 에는 전달이 되고 있다는 것을 Filter Log 를 통해서 알 수 있다.

    Untitled

    Untitled

  • 그렇다면 문제가 되는 부분이라고 들 수 있는 것은 Controller 에 파라미터를 변환하는 과정에서 문제가 발생하는 것으로 보인다. 즉, MessageConverter 에서 어려움이 발생하고 있는 듯 하다.

    Untitled

  • 현재 시스템에서는 JSON 형식을 객체의 타입으로 변환하는 과정을 진행하고 있기 때문에 Jackson2 Converter 를 파고 들면 될거 같다. 디버깅을 통해서 문제가 되는 부분을 하나씩 파고 들어가보자.

  • 하나씩 디버깅을 하다 보면 객체 파라미터를 역직렬화 하는 과정에서 파라미터를 찾을 수 없어서 진행되는 handleUnkonwProperty 를 찾아가게 되는 것을 볼 수 있다.

    Untitled

  • 파싱을 하는 과정에서 매칭이 되는 프로퍼티 정보를 찾지 못하는 경우 나타내는데 왜 매칭하지 못할까?

    Untitled

  • 현재 매핑 할 객체의 정보를 보니 매핑 정보가 스네이크 케이스로 바라보고 있다. 잘 보면 Swagger 를 통해서 파라미터를 전달할때 카멜 케이스로 처리 되는 것을 볼 수 있다.

    Untitled

    Untitled

  • 여기서 보면 분명 **storeCategory [카멜 케이스]로 전달하고 있고, 실제로 JSON 형식을 받으면 store_category [스네이크 케이스]**를 받을 거라고 생각하고 있다.

    • 서로 매핑이 되지 않아 등록 되지 않았던 것이다.
  • 왜 이런 이슈가 발생했을까?

    • Java 에서 사용하는 문법은 Camel Case 로 지금까지 Entity, Request 등은 Camel Case 를 기반으로 사용해 왔다.
    • 하지만 JSON 형식에 대해서는 Snake Case 를 많이 사용하기 때문에 JSON 으로 파싱하는 ObjectMapper 에 대해서 설정을 커스텀을 했는데, 그것을 까먹고 있다가 생각이 난 것이다.
    • ObjectMapper 에 대해서 Snake Case 를 사용할 것을 설정하면 이 후 JSON → 객체, 객채 → JSON 변환 과정에서 Camel Case 를 Snake Case 로 알아서 매핑을 하게 해준다. 이러한 기능을 사용하겠다고 선언 해놓고 사용하지 않고 있었던 것
  • Swagger 에서 보여주는 Naming 을 Snake Case 로 설정해주면 된다.

    • Swagger ModelResolver 를 재정의 해주면 된다. 이때, ObjectMapper 를 단순히 넣어주고 있는데 이러할 수 있는 이유는 ObjectMapper 도 재정의해서 사용하고 있으며, 재정의한 내용안에 Naming 을 Snake Case 로 설정되어 있기 때문이다.

      Untitled

      Untitled

  • 결과적으로 Swagger 의 Naming 도 Snake Case 가 적용된 것을 볼 수 있다.

    Untitled