미니 프로젝트가 시작되어서 프런트 분들과 같이 협업하게 되었다.
내가 크롤링한 부분을 전달하기 위해서 json형태로 데이터를 반환하기 위해서 json형태로 변환하고 response하는데 자꾸 아래와 같은 오류가 출력되어 전혀 response되지 않았다.
오류 단순 접근
나의 로직에 문제가 있는지 한참 검토했다. 그래서 DTO의 내용을 바꾸어보고 또 아예 직접 ExampleResponseDTO Class를 생성하여 생성자를 통해서 ExampleResponseDTO를 ResponseEntity로 response해보았다.
그래도 저 오류가 발생했다. 데이터의 흐름이나, 로직에 대한 나의 생각은 어느 정도 맞다고 생각했고, 더욱더 꼼꼼히 변수를 체크하고 어디서 새는 곳이 있는지 검토했고, 혹시 List가 아닌 ArrayList인지도 검토해보았지만 결과는 같았다.
오류 심층 접근
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번가정에 무게가 실려서 컨틀롤러를 다시 살펴 보았다.
참고 : https://2ham-s.tistory.com/292
-"사고뭉치님 기술블로그에 있는 코드들이 좋은 것도 많지만 뭉치님이 이해할 수 없다면 사용하지 않는 것을 권장합니다. 합니다.. 합니다... 합니다...."
내 컨트롤러 코드 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으로 반환하니까 오류가 난것이었다.
"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
}
전적으로 내 실수고 내 잘못이다.
기술매니저님들께서 이래서 함부러 코드를 가져다가 쓰지말라고 하셨구나라고 깨달앗다.
내가 쓰고 있는 형태와 거의 비슷해서 produces = "text/plain;charset=UTF-8" 이게 무슨 뜻 인지도 생각하지 않고 사용했다.
그결과 오랜 시간동안 에러를 해결하는데 시간을 낭비했다.
당연히 그냥 가져왔을때 사용가능한 예제라서 또 내 코드와 비슷한 예제라서 쉽게 내 프로젝트에 적용될 줄 알았다.
========== 기술 매니저님께서 해주신 말씀 중 ==========
코드 한줄 한줄에는 반드시 이유가있고 이 이유를 이해하는 것이 우리가 코딩을 배우는 이유이다.
만약 모든 코드를 이해 할 수 없다면 적어도 코드를 따라서 데이터가 어떻게 흘러가는 지는 알아야 한다.
아... 오늘도 내 자신을 알게된 날이다...........