들어가며
handDoc에서는 병원의 정보를 지도에 나타내어 보여주어야 하는 기능이 있었다. 원래는 handDoc을 사용하는 병원의 위치 정보를 가지고 지도에 표시해주는 것이지만, 우리는 일단 공공데이터를 활용해서 서울시 서대문구에 위치하는 병원의 데이터를 지도에 띄워서 보여주기로 했다.
1. WebClient 설정 및 준비
나는 WebClient 방식으로 외부 API를 호출하여 데이터를 가져오기로 했다. 그래서 WebClientConfig을 작성하고 다음과 같이 설정을 해주었다.
| 설정 항목 | 값 | 역할 및 설명 |
| Connection Timeout | 3000ms (3초) | 소켓 연결이 설정될 때까지 기다리는 최대 시간이다. |
| Response Timeout | 8초 | 요청을 보내내 후 응답 데이터를 모두 받을 때까지 기다리는 최대 시간이다. |
| Max In-Memory Size | 10MB | API 응답 데이터가 메모리에 버퍼링될 수 있는 최대 크기이다. 공공 API의 응답이 클 경우 메모리 부족을 방지한다. |
| Default Header | Accept:application/json | 서버에게 JSON 형식의 응답을 요청한다. |
2. 데이터 통기화 핵심 로직
1단계 : DB 데이터 준비
API로부터 받은 각 데이터가 DB에 이미 존재하는지 또는 신규 데이터인지를 확인하기 위해 기존에 DB에 있는 데이터를 준비하는 과정이다.
- 기존 데이터 조회 : `hospitalRepository.findAll()` 을 호출하여 DB에 저장된 모든 병원 데이터를 가져온다.
- Map으로 변환 : 이 데이터를 `Map<String, Hospital>` 형태로 변환한다. 이때 키는 공공 API의 고유 ID인 `openapiId` 를 사용한다.
- Map을 사용하는 이유 : API에서 병원 데이터를 하나 가져올 때마다, DB에 쿼리를 날려서 해당 병원이 존재하는지 확인하는 과정은 DB 부하와 시간 지연을 유발한다. Map을 통해서 모든 DB 데이터를 메모리에 한 번만 로드하고 나면, API에서 가져온 병원 ID를 키로 사용하여 즉시 해당 병원이 DB에 있는지 확인할 수 있다.
2단계 : API 반복 호출 및 데이터 파싱
- `while(true)` 루프를 이용해서 API를 반복 호출한다. 공공데이터를 호출하면 페이징 처리가 되어 있기 때문에 반복해서 호출을 한다. 응답은 `JsonNode` 객체로 받아 JSON 데이터를 구조적으로 다룰 수 있게 한다.
- API 응답에 더 이상 데이터가 없으면 루프를 종료한다.
3단계 : 데이터 검증 및 처리
루프 내에서 가져온 각 `JsonNode` 에 대해서 다음과 같이 수행한다.
- 필수 값 검증 : 병원명, 주소, 위도, 경도 중 하나라도 누락된 불완전한 데이터는 처리하지 않는다.
- 서비스 필터링 : 현재 서비스 요구사항인 '서대문구'에 위치한 '병원' 또는 '의원'에 해당하는 데이터만 처리한다. 조건에 맞지 않으면, 건너뛴다.
- 신규 데이터 처리 : `openapiId` 로 검색했을 때 데이터가 없으면 신규 Hospital 엔티티를 생성하고, 리스트에 추가한다.
- 기존 데이터가 존재하면, 변경점을 확인하고 변경점이 있으면 갱신한다.
4단계 : DB에 최종 반영
API 호출이 끝나면 트랜잭션 내에서 모든 변경 사항을 DB에 반영한다.
- 신규 데이터 저장 : 리스트에 모아둔 신규 병원들을 일괄 저장한다.
- 남아있는 병원들은 API 호출 시 필터링 조건을 통과하지 못했더나 하는 것들로 이들은 DB에서 삭제하여 동기화를 완료한다.
깃허브
https://github.com/3-NoPainNoGain/BE/pull/100
[FEAT] 지도 상에서 병원 조회 API 구현 by erika0915 · Pull Request #100 · 3-NoPainNoGain/BE
🪺 PR 개요 서울시 서대문구 내의 병원들을 db에 넣는 API 위경도와 반경을 통해 근처 병원을 조회하는 API 🌱 Issue Number [FEAT] 실시간 위치 기반 병원 리스트 조회 #66 ✨ 변경 사항 기능 추가 버그
github.com
'프로젝트 > handDoc' 카테고리의 다른 글
| [AI] 수어 동작 인식 모델 만들기 - CNN과 LSTM (0) | 2025.10.01 |
|---|---|
| [AI] 구음장애 환자 발화 데이터셋을 활용한 Whisper 모델 파인튜닝 (0) | 2025.09.21 |
| [Spring] WebRTC 정리 - 시그널링 서버와 STUN/TURN 서버 (0) | 2025.09.08 |
| [Spring] NAVER CLOVA CSR 적용하여 음성을 텍스트로 변환하기 (0) | 2025.08.15 |
| [Spring] MongoDB Atlas 설정하기 (0) | 2025.08.04 |
