졸업프로젝트

3/26 서버(STT/저장/기록 조회) 안정화 및 예외 처리 보완 작업 보고서

ayoonistory 2026. 3. 26. 17:11

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. 아직 남은 과제

  1. 프론트에서 warning, translate, stt, error 이벤트를 정확히 분기 처리
  2. warning 상태에서는 자동 저장이 타지 않도록 프론트 로직 보완
  3. department를 자동 확정이 아니라 추천 후보 + 사용자 수정 가능한 형태로 UI 개선
  4. 의료 용어(terms)는 하단 목록 UI로 정리하고, 추후 의료용 사전/API와 연동
  5. 영어 의료용어 STT 정확도 향상을 위한 후속 실험
    • phrase hint 추가 보강
    • 후처리 치환
    • bilingual 설정 검토