Super Kawaii Cute Cat Kaoani
본문 바로가기
{Troubleshooting}

[트러블슈팅] TMAP 204 NO_CONTENT 오류

by wonee1 2025. 9. 29.
728x90

 

 

 

 

트러블 슈팅 TMAP 204 NO_CONTENT 오류 

 

 

Tmap POI 검색 API 호출 시 특정 키워드(강남 등)를 검색하면 HTTP 204 No Content 가 반환되었다.  ttps://apis.openapi.sk.com/tmap/pois?version=1&format=json&searchKeyword=강남.. 이렇게 접속하면 정상적으로 응답이 내려왔다. 

 

 

 

우선 TMAP API 를 사용할 때 204에러가 뜨면 다음과 같은 문제가 발생한 것이다. 

 

 

에러 코드는 티맵 사이트에서 확인 가능하다

https://tmapapi.tmapmobility.com/main.html#webservice/guide/webserviceGuide.guide11

 

Guide | T MAP API

 

tmapapi.tmapmobility.com

 

 

 

 

🚨원래 코드 

 

        String url = UriComponentsBuilder.fromHttpUrl(apiUrl)
                .queryParam("version", 1)
                .queryParam("format", "json")
                .queryParam("searchKeyword", keyword)
                .queryParam("page", 1)
                .queryParam("count", 5)
                .queryParam("searchType", "all")
                .queryParam("searchtypCd", "A") // 원래 파라미터명으로 복원
                .queryParam("reqCoordType", "WGS84GEO")
                .queryParam("resCoordType", "WGS84GEO")
                .queryParam("appKey", apiKey) // API 키를 쿼리 파라미터로 이동
                .toUriString();

 

원인 분석

  • Spring에서 URL을 만들 때 UriComponentsBuilder 사용.
  • 이때 build(true)(기본값)으로 동작하여 자동 인코딩이 적용됨.
  • 이미 "강남" → %EA%B0%95%EB%82%A8 으로 인코딩된 문자열이 다시 %25EA%25B0... 처럼 이중 인코딩(double encoding) 되어 서버에서 검색어를 인식하지 못함.
  • 그 결과, Tmap 서버는 검색 결과가 없다고 판단 → 204 No Content 응답.

 

 

Spring의 UriComponentsBuilder 는 내부적으로 기본 encode() 처리를 하기 때문에, 이미 %EA%B0%95%EB%82%A8 로 변환된 상태에서 또 한 번 %25EA%25B0%2595%25EB... 이런 식으로 변환돼 버려서 서버가 인식을 못했던 것이다.  그래서 결과가 없다고(204) 내려왔던 것.

 

 

⭐수정 코드 

        String url = UriComponentsBuilder.fromHttpUrl(apiUrl)
                .queryParam("version", 1)
                .queryParam("format", "json")
                .queryParam("searchKeyword", keyword)
                .queryParam("page", 1)
                .queryParam("count", 5)
                .queryParam("searchType", "all")
                .queryParam("searchtypCd", "A") // 원래 파라미터명으로 복원
                .queryParam("reqCoordType", "WGS84GEO")
                .queryParam("resCoordType", "WGS84GEO")
                .queryParam("appKey", apiKey) // API 키를 쿼리 파라미터로 이동
                .build(false)
                .toUriString();

 

 

 

build(false) vs encode()

  • build(false) → 인코딩 건드리지 않음 (직접 인코딩한 문자열 그대로 사용).
  • build(true) (default) → 자동 인코딩 적용 (이중 인코딩 위험이있다.) 키워드 처리
    • 만약 keyword 를 직접 인코딩(URLEncoder.encode) 했다면 → 반드시 build(false) 와 같이 써야 한다. 

 

 

 

 

정리

  • 이중인코딩으로 204 에러 발생 
  • UriComponentsBuilder.build(false) 로 수정하면 해결됨.
728x90