상세 페이지를 만들다 보니
치과 정보 페이지를 만들면서 병원별 진료과목도 실제 데이터로 보여주고 싶었다.
현재 프로젝트에서는 병원정보서비스 API를 사용해 전국 치과 정보를 저장하고 있는데, 병원명, 주소, 전화번호, 좌표 같은 기본 정보만 저장하고 있었다.
상세 페이지에서 진료과목까지 보여주려다 보니 병원정보서비스만으로는 부족했고, 의료기관별상세정보서비스 API를 추가로 연동하게 되었다.
진료과목 정보를 가져오려면 병원정보서비스에서 내려주는 ykiho 값이 필요했다. 그래서 치과 정보를 저장할 때 해당 값도 함께 저장하도록 수정했다.
병원정보서비스
↓
치과 목록 저장
↓
ykiho 저장
↓
의료기관별상세정보서비스 호출
↓
진료과목 저장
병원별 진료과목을 저장하기 위해 별도의 테이블도 추가했다.
dental_hospital_subject
id
dental_hospital_id
subject_code
subject_name
진료과목 데이터가 저장되지 않는 문제
진료과목 저장 API를 구현한 뒤 실행해 보니 문제가 있었다.
Postman에서는 정상적으로 성공 메시지가 내려오는데 데이터베이스에는 아무 데이터도 저장되지 않고 있었다.
처음에는 저장 로직에 문제가 있나 해서 중복 체크 로직도 확인해 보고, 테이블 생성 상태도 다시 확인하고, 저장 코드도 하나씩 살펴봤다.
하지만 특별히 이상한 부분은 보이지 않았다.
그래서 API 응답을 좀 더 확인해 보기 위해 실제 응답 내용도 함께 출력하도록 로그를 추가했다.
if (!responseBody.trim().startsWith("{")) {
System.out.println("병원명 = " + dentalHospital.getName());
System.out.println("실제 응답 = " + responseBody);
continue;
}
로그를 확인해 보니 아래와 같은 내용이 계속 출력되고 있었다.
실제 응답 = Forbidden
이 로그를 통해 저장 로직이나 데이터베이스 문제가 아니라 API 호출 단계에서 문제가 발생하고 있다는 것을 알 수 있었다.
원인 찾기
API 호출 부분 코드를 보다 보니 ykiho 값을 API 호출 전에 인코딩하고 있었다.
urlBuilder.append("&ykiho=")
.append(
URLEncoder.encode(
encryptedYkiho,
StandardCharsets.UTF_8
)
);
처음에는 URL 파라미터니까 인코딩하는 것이 맞다고 생각했다.
그런데 병원정보서비스에서 내려주는 ykiho 값은 이미 의료기관을 식별하기 위한 고유 값이었다.
// 이런 형태
JDQ4MTYyMiM1MSMkMSMkMCMkNzIk...
처음에는 단순히 암호화된 문자열 정도로 생각했는데, 실제로는 의료기관별상세정보서비스에서 병원을 찾기 위한 키 역할을 하고 있었다.
문제는 이 값을 다시 인코딩하면서 원래 값이 변경되고 있었다는 점이었다.
결과적으로 의료기관별상세정보서비스에서는 해당 병원을 찾지 못했고, 진료과목 데이터도 가져오지 못하고 있었다.
인코딩 제거 후 해결
인코딩 코드를 제거하고 다시 실행해 보니 정상적으로 응답이 내려왔고, 병원별 진료과목 데이터도 데이터베이스에 저장되었다.
// 수정 전
urlBuilder.append("&ykiho=")
.append(
URLEncoder.encode(
encryptedYkiho,
StandardCharsets.UTF_8
)
);
// 수정 후
urlBuilder.append("&ykiho=")
.append(encryptedYkiho);
마무리
처음에는 ykiho 도 다른 응답값들처럼 단순히 내려오는 값 중 하나라고 생각했다.
하지만 이번 작업을 하면서 실제로는 의료기관을 식별하기 위한 키 역할을 한다는 것을 알게 되었다.
병원정보서비스
↓
ykiho 획득
↓
의료기관별상세정보서비스
↓
해당 병원 상세 정보 조회
↓
진료과목 저장
이 구조를 이해하고 나니 왜 ykiho 가 필요한지, 왜 값이 조금만 달라져도 조회가 실패하는지 이해할 수 있었다.
처음에는 저장 로직과 데이터베이스를 먼저 확인했지만 실제 원인은 API에 전달되는 ykiho 값에 있었다.
응답 로그를 확인하면서 원인을 찾을 수 있었고, 인코딩을 제거한 뒤 정상적으로 진료과목 데이터가 저장되었다.
이제 병원별 진료과목 데이터도 정상적으로 저장되었고, 상세 페이지에서도 실제 데이터를 사용할 수 있게 되었다.
'개인 프로젝트 > [Web] Dentory 프로젝트' 카테고리의 다른 글
| Next.js에서 카카오 지도를 연동해 현재 위치와 마커 표시하기 (0) | 2026.06.15 |
|---|