projects

Endo Report

2024.11 ~ 현재프론트엔드 개발

AI 기반 내시경 검진 결과를 의료진용 전문 리포트로 자동 생성하고 관리하는 웹 솔루션.

  • Vue 3
  • TypeScript
  • Vite
  • Pinia
  • TanStack Query
  • Tailwind CSS

무한 스크롤 기능 구현 및 성능 최적화

.problem

리포트 편집 화면에서 검사 이미지를 한 번에 모두 로딩하여 초기 로딩 시간이 길어지고 메모리 사용량이 과도하게 증가. 수백 장의 의료 이미지를 한 번에 렌더링하면서 브라우저 성능 저하 발생.

.solution

TanStack Query의 useInfiniteQuery hook을 활용한 페이지네이션 기반 무한 스크롤 구현. Intersection Observer API 기반 센티넬 요소를 통한 자동 다음 페이지 로딩. 역순 정렬 시 현재까지 스크롤된 이미지 개수만큼 역순으로 refetch하여 중복 fetching 방지.

.tradeoff

advantages
초기 로딩 속도 개선, 메모리 사용량 감소, 네트워크 대역폭 효율적 사용
disadvantages
페이지네이션 로직 추가로 코드 복잡도 증가, 역순 정렬 시 추가 refetch 필요
rationale
의료 이미지의 특성상 고해상도 이미지를 다수 다루므로, 성능 최적화가 사용성에 더 중요하다고 판단

.result

페이지네이션으로 인한 초기 로딩 데이터량 약 90% 감소 (전체 이미지 → 첫 10개).

.learning

TanStack Query의 useInfiniteQuery를 활용한 페이지네이션 패턴 이해. Intersection Observer API를 통한 효율적인 스크롤 이벤트 처리 방법 습득. 대용량 데이터 렌더링 시 가상화(Virtualization)와 페이지네이션의 트레이드오프 이해.

PDF 변환 텍스트 깨짐 및 이미지 렌더링 문제 해결

.problem

vue3-html2pdf 라이브러리를 사용한 PDF 변환 시 한글 단어가 중간에서 줄바꿈되어 텍스트 가독성 저하. HTML에서는 정상이던 띄어쓰기가 PDF에서 어색하게 표시. SVG의 linear gradient가 PDF에서 렌더링되지 않고 빈 공간으로 표시.

.solution

- CSS word-break: keep-all 속성을 소견 텍스트에 적용하여 단어 단위 줄바꿈 보장. - CSS white-space: pre 속성으로 모든 공백과 줄바꿈을 원본 그대로 보존. - PDF 변환용 solid color SVG 아이콘을 별도로 생성하여 조건부 렌더링.

.tradeoff

advantages
텍스트 정확성 보장으로 의료 문서로서의 신뢰성 확보, 추가 라이브러리 없이 CSS 속성만으로 해결하여 번들 크기 유지
disadvantages
word-break: keep-all로 인해 긴 단어가 있을 경우 레이아웃이 넓어질 수 있음, PDF 전용 아이콘 추가로 아이콘 관리 포인트 증가

.result

PDF 변환 시 텍스트 깨짐 이슈 0건으로 감소.

.learning

HTML to Canvas 변환 시 CSS 렌더링 차이에 대한 이해. 브라우저 렌더링과 Canvas 기반 렌더링의 차이점 학습. SVG gradient가 canvas에서 지원되지 않는 한계 인식 및 우회 전략 수립.