[Class~] with preset Content-Type 'null'

SaGo_MunGcci·2022년 8월 13일
0

스프링

목록 보기
20/31

Definition Access

  • 미니 프로젝트가 시작되어서 프런트 분들과 같이 협업하게 되었다.

  • 내가 크롤링한 부분을 전달하기 위해서 json형태로 데이터를 반환하기 위해서 json형태로 변환하고 response하는데 자꾸 아래와 같은 오류가 출력되어 전혀 response되지 않았다.



Mechanism

  • 오류 단순 접근

      1. 먼저 크롤링을 해서 각 각의 데이터를 변수에 담는다
      1. 변수에 담은 데이터를 List<DTO'> list에 담는다.
      1. ResponseEntity<?> 형식으로 response한다.
  • 나의 로직에 문제가 있는지 한참 검토했다. 그래서 DTO의 내용을 바꾸어보고 또 아예 직접 ExampleResponseDTO Class를 생성하여 생성자를 통해서 ExampleResponseDTO를 ResponseEntity로 response해보았다.

  • 그래도 저 오류가 발생했다. 데이터의 흐름이나, 로직에 대한 나의 생각은 어느 정도 맞다고 생각했고, 더욱더 꼼꼼히 변수를 체크하고 어디서 새는 곳이 있는지 검토했고, 혹시 List가 아닌 ArrayList인지도 검토해보았지만 결과는 같았다.

  • 오류 심층 접근

      1. 만약 나의 로직이 맞다면 로직의 문제가 아닌 request의 문제다.
      1. request의 문제가 아니라면 controller 자체의 문제다.
      1. controller가 문제가 아니면 service자체의 문제다.
      1. DB를 사용하지 않는 크롤링이기에 repository의 문제는 절대 아니다.
      1. 그래들에 implement를 하지 않아 발생한 문제다.
  • 1~4번까지 다시 검토했다. 내가 프로젝트를 새로 생성했지만, 이전 코드를 많이 가져와서 지금 내가 실행하고자 하는 controller~repository까지 DI와 property까지 검토했다. 내가 Yml도 같이 쓰고 있었기에 yml도 검토했다.

  • 그래도 오류가 발생했다. 그런와중

  • 해결의 실마리.

  • postman에 request 헤더이다.

    • Content-Type : text/plan/charset=utf-8
      참고 : https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type

    • 나는 이때까지 Json으로 요청받고 있었는데????

    • 나는 text, UTF-8로 요청한 적이없는데??

    • 내가 크롤링하고자 하는 예제가 Gson을 String으로 받고있었는데, 이것을 간과했다. 간과했어도 Gson이 new Gson().toJson(list); 으로 response는 Json으로 response되는건 같다.

  • 일단 request가 잘못됬다는 1번가정에 무게가 실려서 컨틀롤러를 다시 살펴 보았다.

  • 혹시 뭐가 잘못 되어있는지 알겠는가????

@RequestMapping의 produces 속성을 이용하여 Response의 Content-Type을 제어할 수 있다.

  • ........

참고 : https://2ham-s.tistory.com/292

  • 문제의 원인을 발견한 순간 저번주에 코딩을 잘하는 법에 대해서 여쭤봤을 때 기술 매니저님께서 답변이 아닌 당부하신 말씀이 귓가에 메아리 쳤다.

-"사고뭉치님 기술블로그에 있는 코드들이 좋은 것도 많지만 뭉치님이 이해할 수 없다면 사용하지 않는 것을 권장합니다. 합니다.. 합니다... 합니다...."

@Consumes : 수신 하고자하는 데이터 포맷을 정의한다.

@Produces : 출력하고자 하는 데이터 포맷을 정의한다.

  • 내 컨트롤러 코드 produces = "text/plain;charset=UTF-8"

  • 이러니까 안됐지......

  • 애초에 이컨트롤러에 매핑이 된 순간 결과는 이미 정해져있었다.

  • Content-Type이 text/plain;charset=UTF-8로만 정해졌는데 내가 Json으로 반환하니까 당연히 text/plain;charset=UTF-8으로 정해진 Content-Type은 null이 뜰것이다.

  • 요약하면 Content-Type이 text/plain;charset=UTF-8만 반환할 수 있는데 json으로 반환하니까 오류가 난것이었다.

- 해결

  • produces = "text/plain;charset=UTF-8"을 삭제하고 원래 매핑하던데로 매핑을 함.
  • 결과
"data": [
        {
            "img": "https://img.cgv.co.kr/Movie/Thumbnail/Poster/000086/86114/86114_320.jpg",
            "movieAge": "15세 이상",
            "movieTitle": "뮤지컬 이퀄_도쿄공연(LIVE)",
            "movieRate": "0.0%",
            "movieOpenDate": "2022.08.14 개봉 D-1",
            "like": "?",
            "seq": 3
        },
        {
            "img": "https://img.cgv.co.kr/Movie/Thumbnail/Poster/000086/86098/86098_320.jpg",
            "movieAge": "청소년 관람불가",
            "movieTitle": "[콘서트&와인]예술가의 와인, 헝가리",
            "movieRate": "0.0%",
            "movieOpenDate": "2022.08.14 개봉 D-1",
            "like": "?",
            "seq": 4
        },
        {
            "img": "https://img.cgv.co.kr/Movie/Thumbnail/Poster/000086/86169/86169_320.jpg",
            "movieAge": "12세 이상",
            "movieTitle": "[2022 LCK 서머 스플릿] 15시 경기",
            "movieRate": "0.0%",
            "movieOpenDate": "2022.08.14 개봉 D-1",
            "like": "?",
            "seq": 5
        }
  • 정상 출력됨.


Retrospection

  • 전적으로 내 실수고 내 잘못이다.

  • 기술매니저님들께서 이래서 함부러 코드를 가져다가 쓰지말라고 하셨구나라고 깨달앗다.

  • 내가 쓰고 있는 형태와 거의 비슷해서 produces = "text/plain;charset=UTF-8" 이게 무슨 뜻 인지도 생각하지 않고 사용했다.

  • 그결과 오랜 시간동안 에러를 해결하는데 시간을 낭비했다.

  • 당연히 그냥 가져왔을때 사용가능한 예제라서 또 내 코드와 비슷한 예제라서 쉽게 내 프로젝트에 적용될 줄 알았다.

========== 기술 매니저님께서 해주신 말씀 중 ==========

  • 코드 한줄 한줄에는 반드시 이유가있고 이 이유를 이해하는 것이 우리가 코딩을 배우는 이유이다.

  • 만약 모든 코드를 이해 할 수 없다면 적어도 코드를 따라서 데이터가 어떻게 흘러가는 지는 알아야 한다.

  • 아... 오늘도 내 자신을 알게된 날이다...........



profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글