반응형
기존에 자바스크립트 에서 자바로 로직 변경을 하면서 생긴 오류 정리
✅ 문제 원인 분석: 왜 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 |