1. 오늘 작업 목표
오늘 작업의 목표는 MedExplain의 서버 흐름 중에서
STT 결과 처리, 빈 결과 예외 처리, 기록 저장/조회 안정화를 점검하고,
프론트와 연동되는 records 흐름이 실제로 동작하는지 확인하는 것이었다.
특히 MedExplain은 단순히 결과를 한 번 보여주는 데서 끝나는 것이 아니라,
진료 날짜 / 진료과 / 원문 텍스트 / 요약 / 의료 용어가 기록으로 저장되고 다시 조회되는 구조가 중요하기 때문에 이 흐름을 우선적으로 확인하였다.
2. 오늘 진행한 주요 작업
(1) 프론트 최신 코드 반영 및 실행 환경 정리
- GitHub에 올라온 프론트 최신 코드를 로컬에 pull하여 반영함
- 실행 과정에서 누락된 파일(section_card.dart) 문제를 확인하였고, A가 push한 후 다시 pull하여 해결함
- 웹소켓 주소가 팀원 로컬 IPv4로 설정되어 있어 연결 오류가 발생하였고, 이를 사용자 환경에 맞게 수정하여 실행되도록 조정함
(2) WebSocket STT 연결 및 빈 결과 처리 보완
- STT 웹소켓 연결이 정상적으로 이루어지는지 확인함
- 무음 또는 실질적 인식 실패 시 text='' 형태의 final STT 결과가 반환되는 것을 로그로 확인함
- 이 경우 그냥 정상 흐름처럼 넘어가지 않도록, 서버에서 warning 이벤트를 전송하도록 ws_stt.py를 수정함
- warning 메시지는
“음성이 인식되지 않았습니다. 다시 녹음해주세요.”
형태로 내려가도록 처리함
(3) 빈 STT 결과의 저장 차단
- 기록 저장 API인 POST /records에서 clean_text가 비어 있거나 공백뿐인 경우 저장되지 않도록 records.py를 수정함
- 이를 통해 무음/인식 실패 상태가 records 목록에 의미 없는 기록으로 쌓이는 문제를 방지함
(4) records 저장/조회 구조 안정화
- records.py에서 저장/조회 흐름을 점검함
- records 목록은 날짜 / 진료과 / 요약 한 줄 카드 형태로 표시되고,
- 상세 화면은 날짜 / 진료과 / 원문 텍스트 / 요약 / 의료 용어를 보여주는 구조임을 기준으로 삼았음
- 저장 데이터의 summary, terms 구조를 점검하고, 프론트가 쓰기 쉽게 summary와 terms가 항상 안정적인 형태로 내려가도록 정리함
(5) records 상세 조회 500 에러 수정
- 저장은 성공했지만 GET /records/{record_id}에서 500 에러가 발생하는 문제를 확인함
- 원인은 저장된 terms 구조와 RecordDetailResponse 스키마가 기대하는 필드명이 서로 달랐기 때문이었음
- 저장된 terms는 easy 기반이었고, 상세 조회 응답은 description을 요구하고 있어 mismatch가 발생함
- 이를 수정하여, 상세 조회 시 기존 저장 데이터도 읽을 수 있도록 easy -> description 매핑을 보완함
- 이후 POST /records, GET /records, GET /records/{record_id}가 모두 200으로 동작하는 것을 확인함
(6) WebSocket 전송 안정화
- 기존 ws_stt.py에서는 asyncio.run_coroutine_threadsafe(...).result(timeout=5) 구조를 사용하고 있었고,
이 때문에 push_stt thread-safe failed와 같은 로그가 발생함 - 실제 전송은 되었지만 timeout 대기 구조 때문에 실패 로그가 남는 것으로 판단됨
- 이를 submit-only 방식으로 수정하여 unnecessary timeout을 제거하였고,
이후 push_stt thread-safe failed 로그가 사라진 것을 확인함
(7) 영어 의료용어 인식 개선 실험
- stt_google_streaming.py에서 한국어 문장 속 영어 의료용어 인식 개선을 위해 phrase hint를 추가함
- PRP, CRP, biopsy, gastrectomy, chemotherapy, adenocarcinoma 등 핵심 용어를 영어 표기와 한국식 발음 형태로 일부 보강함
- 테스트 결과 일부 짧은 용어는 약간 개선되었으나,
gastric adenocarcinoma, gastrectomy, chemotherapy 등 긴 영어 의료용어는 여전히 부정확하게 인식되는 한계가 확인됨 - 이 부분은 추후 고도화 과제로 남기고, 오늘은 핵심 저장/조회 안정화에 우선순위를 둠
3. 오늘 확인된 동작 결과
정상 케이스
- STT 결과가 정상적으로 반환됨
- /summary 호출 성공
- /explain 호출 성공
- /records 저장 성공
- /records 목록 조회 성공
- /records/{record_id} 상세 조회 성공
예외 케이스
- 무음 또는 인식 실패 시 warning 이벤트 전송 성공
- 빈 clean_text는 저장 차단됨
4. 오늘 작업의 의미
오늘 작업을 통해 MedExplain은 단순히 STT 결과를 보여주는 수준에서 벗어나,
실제 진료 기록을 저장하고 다시 조회할 수 있는 구조가 서버 기준으로 상당 부분 안정화되었다.
또한 무음/인식 실패 상태를 별도로 처리하고,
빈 결과가 records에 저장되지 않도록 방어 로직을 추가하여
사용자 경험과 데이터 품질을 함께 보완할 수 있었다.
5. 아직 남은 과제
- 프론트에서 warning, translate, stt, error 이벤트를 정확히 분기 처리
- warning 상태에서는 자동 저장이 타지 않도록 프론트 로직 보완
- department를 자동 확정이 아니라 추천 후보 + 사용자 수정 가능한 형태로 UI 개선
- 의료 용어(terms)는 하단 목록 UI로 정리하고, 추후 의료용 사전/API와 연동
- 영어 의료용어 STT 정확도 향상을 위한 후속 실험
- phrase hint 추가 보강
- 후처리 치환
- bilingual 설정 검토
'졸업프로젝트' 카테고리의 다른 글
| 5/5 STT 품질 개선 + 실험 (0) | 2026.05.06 |
|---|---|
| 4/3 데모 직전 수정하기 (0) | 2026.04.03 |
| 3/19 제미나이 연결해서 요약 하기 + 프엔 코드 살짝 수정 (0) | 2026.03.19 |
| 3/12 응 결국 수정 (0) | 2026.03.12 |
| 1/25 API 계약 최종 고정,JSON 깨짐 방어 로직 (0) | 2026.03.07 |