본문으로 건너뛰기
유재진kyoroho

유재진

풀스택 개발자 · 6년

병원 웹사이트를 100개 넘게 만들고, 레거시 PHP를 Next.js·NestJS로 옮겨 운영까지 책임져 온 개발자

  • 병의원 웹 에이전시에서 6년 동안 홈페이지·CRM·블로그를 만들고 운영했습니다.
  • 서버에 PHP를 직접 올리던 방식에서 Next.js·NestJS와 컨테이너 배포로 넘어가는 전환을 맡아, 레거시 병원 사이트를 1:1로 옮겨 운영 전환까지 끝냈습니다.
  • 배포 뒤에 드러나는 보안 구멍과 장애를 원인부터 찾아 막는 것까지를 제 일로 여기고, AI로 구현 속도를 높이되 설계와 검증은 직접 합니다.

경력

  1. (주) 와커스

    2023.01 – 2026.08

    병의원·기업·쇼핑몰의 홈페이지 제작과 디지털 마케팅을 함께 하는 웹 에이전시입니다. 기획부터 디자인, 개발, SEO, 유지보수까지 한 곳에서 맡습니다.

    • 병의원·기업 웹사이트 100개 이상을 만들고 운영했습니다.
    • 1인 개발 조직을 5인 팀으로 키우며 신규 인원 온보딩을 맡았습니다.
    • PHP 중심의 제작·운영을 Next.js·NestJS와 Docker·GitHub Actions 배포로 옮기는 전환을 맡았습니다.
    1. 영문과 국문이 같은 구조의 PHP 파일로 따로 복제되어 있었고, 관리자는 PHP 파일 100여 개로 흩어져 있었습니다.

      먼저 레거시에서 검색 노출과 이미지 용량(258MB → 12MB)을 손봤습니다. 이전은 변환 스크립트로 본문을 옮기는 방식으로 시작했지만 레거시 스크립트와 화면이 맞지 않아 사흘 만에 버리고, 레거시 CSS·JS를 그대로 싣고 페이지를 1:1로 옮기는 방식으로 다시 했습니다. DB는 추정한 스키마 대신 운영 DB에서 구조를 뽑아 마이그레이션 기준으로 삼았습니다.

      결과 공개 페이지 39개(한·영)와 관리자 화면을 옮겨 운영을 전환했습니다. 테스트를 통과한 이미지만 배포되게 했고, E2E 테스트를 쓰다 운영 버그 2건을 찾아 고쳤습니다.

    2. 병원마다 블로그 저장소가 따로 있어, 같은 관리자 SEO 화면을 저장소마다 복사해 쓰고 있었습니다.

      한 병원용으로 시작한 코드에서 병원명·도메인 하드코딩을 걷어내고, 병원별 차이는 관리자 설정과 환경 변수로 나눴습니다. 배포는 병원 목록을 받아 병원마다 따로 올립니다. 검색·AI 검색 대응(구조화 데이터, sitemap, llms.txt, 발행 시 색인 알림)은 백엔드가 맡게 했습니다.

      결과 8명이 참여한 프로젝트에서 백엔드와 관리자단을 주도해 데이터 모델과 API 대부분을 설계·구현했습니다. 사용자 화면은 동료가 맡았습니다.

    3. 관리자 권한이 메뉴를 켜고 끄는 수준이라 계정별로 보기·쓰기·삭제를 나눠 달라는 요구가 있었고, 인사·자산·재고·매출을 다룰 메뉴가 없었습니다.

      권한을 메뉴별 보기·쓰기·삭제로 나누고, 재택근무자와 상담원의 조회 범위는 화면이 아니라 서버에서 제한했습니다. 동료가 만든 상담 DB 위에 콜 차수·콜 통계·업무 보고를 더하면서, 화면마다 다르던 '예약' 판정을 규칙 파일 하나로 통일했습니다.

      결과 인사·자산·재고·매출 등 운영 모듈 11개를 새로 만들었습니다. 인사 민감정보는 암호화하고 열람 기록을 남깁니다.

    4. 운영 중인 서비스의 보안 점검에서 인증·권한 검사 누락과 설정 노출이 나왔고, 안과 사이트는 트래픽이 몰릴 때 멈췄습니다.

      누락된 검사를 서버 가드로 채우고 시크릿과 내부 서비스 노출을 정리했습니다. 안과 사이트는 DB 커넥션 풀 소진이 원인이었는데, 첫 우회 수정이 연결 누수로 새 문제를 만들자 되돌리고 클라이언트가 중복 생성되던 근본 원인을 찾아 고쳤습니다.

      결과 인증서 자동 갱신 중단, 로그 적재로 인한 디스크 고갈처럼 조용히 쌓이던 운영 문제도 설정으로 재발을 막았습니다.

    5. Next.js·NestJS 사이트를 Docker로 운영하게 되면서, 여러 사이트에 같이 쓸 배포 방식을 만들었습니다.

      헬스체크를 통과한 새 컨테이너로만 Nginx를 넘기고, 설정 검사에 실패하면 되돌리는 블루-그린 배포와 롤백을 GitHub Actions로 작성했습니다.

      결과 동료가 이 템플릿을 병원 사이트 세 곳에 적용해 운영했고, 퇴사 뒤에도 이어서 쓰고 있습니다.

    6. 오픈 때 프로덕션 빌드가 막혀 개발 모드로 먼저 열었고, 다국어 로딩 구조 때문에 초기 HTML에는 로딩 스피너만 남아 검색 엔진과 AI 크롤러가 읽을 본문이 없었습니다.

      운영 프론트엔드를 프로덕션 빌드로 전환하고, 번역을 서버와 클라이언트에서 동기로 초기화해 첫 HTML에 본문이 담기게 했습니다. 구조화 데이터와 AI 검색 봇 허용 규칙도 넣었습니다.

      결과 4개 언어 모든 페이지의 초기 HTML에 본문과 내부 링크가 담기고, 설정을 바꿀 때마다 나던 502가 사라졌습니다.

    7. 병의원 고객관리 웹앱 (외부 CRM 연동)

      병원 내부 데이터와 외부 CRM이 분리되어 있어 고객 응대 때 두 번 조회해야 했습니다.

      CRM API와 병원 데이터를 한 번에 조회하는 구조를 설계하고, 프론트엔드와 백엔드를 혼자 개발했습니다.

      결과 WebView 기반 Android 앱으로 패키징해 스토어에 배포했습니다.

    그 밖의 운영 경험

    • 다국어 병원 사이트 SEO/AEO 개선 — 라이트하우스 기준 SEO 점수 35 → 88
    • 네이버 광고 검수 반복 실패 — 서버가 네이버 크롤러 IP를 막고 있던 원인을 찾아 해소
    • AWS 아웃바운드 트래픽 급증 — 로그로 원인을 분석하고 비용 조정을 요청
  2. (주) 에드엔 · 닥터허브

    2020.07 – 2023.01

    병의원 홈페이지 제작과 병의원 CRM(닥터허브)을 만드는 회사입니다.

    • Java Spring Boot·JPA·MySQL로 병의원 CRM(예약·고객·통계)을 설계·개발했습니다.
    • 병의원 홈페이지 20개를 만들고 유지보수하며 레거시 리팩토링과 보안 패치를 했습니다.

개인 작업

  1. 치과 홈페이지 섹션 CMS

    관리자가 섹션을 골라 홈페이지를 조립하는 CMS입니다. 같은 코드를 병원마다 서버를 따로 두어 배포해 세 곳이 운영 중이며, 운영 서버 침해 대응과 보안 점검까지 맡았습니다.

  2. 교회 수련회 안내·신청·운영 웹앱

    공개 사이트·예약·설문·관리자·교사용 링크를 Next.js 앱 하나로 만들어 운영 중입니다. Lightsail·Docker에서 Vercel로 옮겼습니다.

AI와 일하는 방식

설계와 판단은 제가 하고, 구현과 테스트 작성은 Claude Code와 Codex에 맡깁니다.

  • 프로젝트마다 AI용 규칙 문서(CLAUDE.md)에 스택·컨벤션·하지 말아야 할 것을 먼저 적고 시작합니다.
  • 작업 로그와 인수인계 문서를 남겨, 세션이 바뀌어도 같은 맥락에서 이어 가게 합니다.
  • AI가 만든 결과는 직접 실행해 보고, 테스트와 실측으로 한 번 더 확인합니다. CI를 통과한 이미지만 배포하고, 배포 전후 DB와 업로드 파일을 비교합니다.
  • 구현이 빨라진 만큼 판단은 더 엄격하게 합니다. 화면을 맞추지 못한 첫 이전 방식은 사흘 만에 버렸고, 새 장애를 만든 우회 수정은 되돌린 뒤 근본 원인을 찾았습니다.

학력 · 자격

청주대학교 컴퓨터정보공학과 졸업 (2020.02) · SQLD (SQL 개발자)