반응형

기존에 자바스크립트 에서 자바로 로직 변경을 하면서 생긴 오류 정리

 

✅ 문제 원인 분석: 왜 String.format()은 실패하고 UriComponentsBuilder는 성공했는가?

🔴 이전 방식 (문제 발생)

String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 String url = String.format("...serviceKey=%s...", serviceKey); restTemplate.getForObject(url, String.class); // 문제 발생
String serviceKey = "iHy%2BX0abcde%3D%3D"; // 이미 인코딩된 키 
String url = String.format("...serviceKey=%s...", serviceKey); 
restTemplate.getForObject(url, String.class); // 문제 발생

⚠ 내부에서 벌어지는 일:

  • RestTemplate은 문자열로 된 URL을 URI 객체로 바꾸면서 다시 인코딩 시도
  • % 문자 자체를 %25로 이중 인코딩하는 경우가 있음
    → iHy%2BX... → iHy%252BX...
  • 공공데이터 API는 이중 인코딩된 키를 '다른 키'로 인식 → 등록되지 않은 키 오류

✅ 현재 방식 (성공)

UriComponentsBuilder.fromHttpUrl(baseUrl)
.queryParam("serviceKey", rawKey) // 디코딩된 원본 키 
...
.build(true) // 인코딩된 상태 그대로 유지!
  • queryParam()은 내부적으로 안전하게 인코딩
  • .build(true)는 쿼리 파라미터를 이중 인코딩하지 않음
  • URI 객체로 완성된 후 RestTemplate은 추가 조작 없이 그대로 전송 → 서버 OK

🧠 핵심 차이점

String.format() vs UriComponentsBuilder
인코딩 처리 수동 (직접 인코딩 필요) 자동 + 안전하게 처리
이중 인코딩 위험 높음 없음 (build(true)로 방지)
실수 확률 높음 (+, %, = 등) 낮음
가독성 낮음 (URL 길고 혼잡) 높음 (명확한 파라미터 명시)
유지보수 어려움 쉬움
 

🚀 성능 비교

String.format() vs UriComponentsBuilder

성능 차이 거의 없음 (100ms 미만 요청에서 무의미한 수준)  
객체 생성 비용 String 조작은 가볍지만 실수 많음 UriComponentsBuilder는 내부적으로 StringBuilder, Map을 사용 → 조금 더 무거움
실제 API 통신 시간 영향 없음 없음
 

📌 요약: 성능 차이는 미미하지만 안정성과 정확성에서는 UriComponentsBuilder가 월등히 우세


⚖️ 장단점 비교 정리

String.format() vs UriComponentsBuilder

 

✅ 장점 코드 간결 (짧게 쓰기 쉬움)
빠르게 테스트용 URL 만들기 편함
안정성, 가독성, 유지보수성 우수
자동 인코딩/검사 처리
이중 인코딩 방지
❌ 단점 이중 인코딩 실수 잦음
디버깅 어렵고 보안 이슈 유발 가능
조금 더 길고 복잡
초보자에겐 생소할 수 있음

✅ 결론

실제 서비스에서는 반드시 UriComponentsBuilder를 사용하는 것이 안정적이고 장기적으로 유지보수에 유리

특히 공공데이터, 외부 API 연동 등 인증 기반 API를 다룰 땐 이중 인코딩 방지가 생명

반응형

'공부 > Java' 카테고리의 다른 글

제네릭 사용이유  (0) 2024.10.02
메모리 가시성  (0) 2024.09.20
스레드 기본 정보  (1) 2024.09.18
스레드 생성과 실행  (0) 2024.09.16
프로세스와 스레드란  (0) 2024.09.16