의료기관의 예약 시스템을 개선하고, 네이버·당근·카카오톡 등 외부 플랫폼과 환자 데이터를 연동해 병원과 환자를 자연스럽게 이어주는 연동 서비스를 만들었습니다.
한 줄로 요약하면 “연동”이었지만, 실제로 마주한 문제는 화면(UI)부터 데이터 모델, SEO/SSR, 배포 구조, 협업 체계, 레거시 한계까지 전방위였습니다.이번 글에서는 단순히 “무엇을 했다” 가 아니라, 프로젝트에서 반복적으로 나타난 문제를 어떻게 분류하고, 어떤 원칙으로 해결했는지(그리고 무엇을 배웠는지) 를 정리해보려 합니다.
초반에는 이슈가 서로 다른 종류처럼 보였습니다.
그런데 해결을 진행하면서 공통점이 하나 보였습니다.
“문제는 기능이 아니라 구조(입력 구조 / 데이터 구조 / 배포 구조 / 협업 구조)에서 터지고 있었다.”
그래서 저희 팀은 이 프로젝트를 구조를 재설계하는 프로젝트로 정의했습니다.
그리고 아래 순서로 문제를 풀려고 노력했습니다.
이 글에서는 기능 나열이 아니라, 문제가 구조에서 어떻게 발생했고 FE가 어떤 레벨까지 개입해 해결했는지를 정리하려고합니다.
의료 종사자의 플랫폼 접근성이 낮아 신규 병원 유입이 월 1곳 수준에 머물러 있었습니다.
가입 및 초기 세팅 과정에서 입력 단계가 복잡했고, 특히 입력 UI가 실제 병원 운영 방식과 맞지 않아 초기 이탈이 반복적으로 발생했습니다.
신규 병원 유입의 병목이 기능이 아니라 입력 구조와 UX에 있다고 판단했습니다.
초기 UI 설계 단계에서 디자이너와 가장 중점적으로 논의한 지점 역시 “얼마나 간편하게 첫 입력을 끝낼 수 있는가”였습니다.
닥톡의 주 고객층인 의료 종사자들은 공통적으로
자주 쓰는 화면, 큰 글자, 명확한 정보 구조를 선호했지만,
연령대와 전문과가 매우 다양해 모든 병의원을 포괄하는 UI는 현실적으로 어렵다고 판단했습니다.
이에 따라 대형 병원을 제외한 의원·중소 병원의 실제 사용 패턴에 초점을 맞추는 방향으로 합의했고,
프론트엔드 팀에서는 라이브러리를 사용하지 않고 직접 UI 컴포넌트를 설계·구현했습니다.
이 과정에서 다양한 케이스를 직접 테스트하며,
“최소 입력으로 최대한 정확한 운영 정보를 만들 수 있는 구조”를 목표로 반복 개선했습니다.
UI/UX는 화면을 예쁘게 만드는 문제가 아니라,
도메인과 사용자의 현실을 구조로 번역하는 작업이라는 점을 다시 체감했습니다.
특히 병원처럼 바쁜 사용자 환경에서는
‘완벽하게 정확한 입력’보다 현실적으로 빠르고 부담 없는 입력 경험이 더 중요했습니다.
이 경험을 통해, 입력 UI 설계가 곧 서비스 진입 장벽을 결정한다는 것을 명확히 인식하게 되었습니다.
네이버·당근·카카오·EMR 업체마다 데이터 구조가 모두 달라 FE/BE 연동 실패 사례가 계속 반복되고 밤새는 작업을 계속 했습니다. 표준 스키마가 없어서, 스펙 조율 비용이 계속해서 커지는 상태였습니다.
작업을 빨리 들어가야하는 상황속에서 제가 할수 있는 방법들은 아래와 같았습니다.
복잡한 외부 연동 환경에서는 FE가 단순 UI구현자가 아니라,
데이터 모델링 중심의 조율자가 되어야 한다는 걸 확실히 느꼈습니다.
타입 정의/모델 정리는 중간 정리와 팀내부의 조율역할까지 할수 있기에 FE가 기술적 리더십을 가질 수 있는 강력한 수단이었습니다.
Vue2 기반 구조로 SSR이 어려워 검색 노출이 거의 되지 않았습니다.
주요 페이지 검색 유입이 끊기면서 서비스 인지도가 낮아졌습니다.
SEO는 마케팅 문제가 아니라 기술 구조가 같이 들어가 마케팅 영역에 직접적으로 영향을 주는 영역이었습니다.
Vue 기반에서도 SSR 전환 플랜을 초기에 잡아야 비용이 줄어듭니다.
Jenkins 중심 구조에서 FE는 빌드/배포 상태를 직접 확인하기 어려웠고,
배포 실패 원인 파악도 BE에 의존해 비효율이 컸습니다.
배포 파이프라인은 전적으로 DevOps만의 영역이 아니라,
FE 생산성을 좌우하는 핵심 인프라라는 걸 확실히 깨달았습니다.
SNS·차트사·병원 등 이해관계자가 많고 일정이 다 달라 조율 난이도가 높았습니다.
내부도 문서/스펙 기준이 불명확해 커뮤니케이션 비용이 커졌습니다.
이해관계자가 많은 프로젝트일수록 FE가 정리자(Organizer) 역할을 해야 합니다.
문서화는 귀찮은 작업이 아니라 리스크를 제거하는 가장 강력한 도구였습니다.
Vue2 기반 구조에서 목적성 있는 아키텍처 적용이 어려웠고,
일정 압박으로 테스트 코드(TDD) 적용이 불가해 QA 부담이 컸습니다.
레거시는 “오래된 코드”가 아니라,
기술적 의도를 반영할 공간이 부족한 상태라는 걸 체감했습니다.
다음 프로젝트에서는 TDD/구조 설계를 반드시 초기에 도입해야 한다는 확신이 생겼습니다.
병원 운영시간 입력 Input 컴포넌트는
주말·공휴일 체크, 평일 중 특정 요일 휴무, 요일별 운영시간 설정이 서로 강하게 결합된 UI였습니다.
시간과 스케줄이 동시에 변경되며 상호 영향을 주는 구조였기 때문에, 초기 구현 단계에서 QA 이슈가 집중적으로 발생했습니다.
초반에는
문제의 원인을 분석해보니,
하나의 함수가 너무 많은 역할을 동시에 수행하고 있었고,
시간 계산, 요일 활성화 여부, 휴무 판단 로직이 서로 얽혀 있었습니다.
그에 따른 QA 이슈가 다수 발생했고 제 머릿속에는 상호작용이 정리 되어 있지 않아 큰 복잡함을 느끼게 되었습니다.
이후 접근 방식을 명확히 바꿨습니다.
즉,
복잡한 기능을 만드는 함수가 아니라
단순한 기능을 수행하는 함수들을 조립해 복잡한 동작을 만드는 구조로 전환했습니다.
이 구조로 전환한 뒤에는
QA 과정에서 문제가 발생했을 때도
이번 경험을 통해 명확히 얻은 교훈은 다음과 같았습니다.
이후 다른 UI를 설계할 때도
“이 함수가 한 가지만 하고 있는가?”,
“이 로직은 조합 가능한 형태인가?”를 먼저 점검하게 되었고,
복잡한 화면일수록 구조를 먼저 나누는 방식이 습관으로 자리 잡았습니다.
이 프로젝트는 단순히 기능을 구현하는 데서 끝난 작업이 아니라,
문제의 원인을 구조로 환원하고, 구조를 통해 해결해 나간 경험이었습니다.
결과적으로 “예약 연동”은 하나의 트리거였고,
실제 성과는 기술과 조직 양쪽을 함께 움직일 수 있는 구조를 만들어낸 것이었다고 생각합니다.
물론 부족한 부분도 분명했습니다.
하지만 이런 시행착오를 통해
“왜 구조와 기준이 초기에 필요했는지”를 몸으로 이해하게 되었고,
개인적으로는 이후 부트캠프를 통해 구조적 설계와 테스트에 대해 더 깊이 학습하게 된 계기가 되었습니다.
이 경험을 통해, 비슷한 규모와 복잡도를 가진 프로젝트를 다시 진행한다면 아래 원칙들은 반드시 지키고 싶다는 기준이 생겼습니다.
Storybook을 활용한 디자인 시스템 선제 구축
→ UI 변경과 커뮤니케이션 비용 최소화
기능을 최소 단위로 분해해 조립하는 방식으로 구현
→ 개발 시간 단축과 QA 비용 감소
문서화를 ‘사후 정리’가 아닌 ‘개발 과정의 일부’로 체계화
이 프로젝트를 통해 얻은 가장 큰 교훈은,
복잡한 문제를 해결하는 가장 현실적인 방법은 더 많은 기능이 아니라 더 나은 구조라는 점이었습니다.
앞으로도 기능 구현에 앞서
“이 문제를 구조로 풀 수 있는가?”를 먼저 고민하는 개발자로 성장해가고 싶습니다.