Product Engineer의 사고방식으로 OpenAI Codex를 사용하여 9년 된 앱을 부활시키다
요약
OpenAI Codex를 활용하여 9년 된 노후화된 앱을 제품 엔지니어링 관점에서 성공적으로 복구한 사례를 다룹니다. 단순 리팩터링을 넘어 로컬 환경 복구, UX 개선, 보안 강화 및 Fly.io 배포까지의 과정을 설명합니다.
핵심 포인트
- Codex를 활용한 의존성 및 런타임 호환성 문제 해결
- 제품 가치 전달을 우선시하는 Product Engineering 접근법
- 데모 사용자 경험(UX)을 위한 로그인 경로 및 데이터 구성
- 보안 강화(Hardening)를 통한 프로덕션 환경 준비
- Fly.io를 이용한 현대적인 배포 워크플로우 구축
9년 전, 저는 Highlander라는 앱을 만들었습니다. 결코 잊을 수 없는 프로젝트 중 하나였지만, 시간이 흐르면서 오래된 의존성(dependencies), 구식 도구(tooling), 로컬 설정의 변질(local setup drift), 그리고 배포 차단 요소들로 인해 앱이 망가졌습니다. 이번 주, 저는 이 앱을 다시 살려냈습니다. 모든 것을 처음부터 다시 작성하는 방식이 아니었습니다. Codex와 협업하며 Product Engineer(제품 엔지니어)처럼 작업했습니다. 즉, 중요한 것을 수정하고, 사용자의 흐름을 막는 요소를 제거하며, 가치를 빠르게 전달(ship)하는 방식입니다.
문제점: 앱이 시간에 멈춰 있었습니다:
- 오래된 Node/Knex/Bookshelf 스택
- 망가진 로컬 부팅 흐름 (local boot flow)
- 데이터베이스(DB) 연결 문제
- 시드 데이터(Seed data) 문제
- 운영 환경에 부적합한 하드코딩된 localhost URL
- 배포 전 보안 취약점
앱이 너무 오랫동안 망가져 있었기에 솔직히 빠른 복구를 기대하지 않았습니다.
접근 방식: 단순한 리팩터링(Refactoring)이 아닌 Product Engineering:
저는 단순히 "코드를 깨끗하게" 만든 것이 아닙니다. 결과물을 우선순위에 두었습니다:
- 먼저 로컬 환경 작동시키기
- 데이터 및 인증(auth) 안정화
- 데모 사용자를 위한 UX 신뢰 문제 해결
- Fly.io로 배포
- 실제 사용을 위한 보안 강화 (Harden)
완벽함보다 이러한 순서가 더 중요했습니다.
제품 개발 맥락: 이번 재구축은 Trello의 Highlander 스프린트 보드에 있는 원래의 제품 기획 작업과도 다시 연결됩니다: Highlander product sprint board
해당 보드는 초기 MVP(Minimum Viable Product) 범위, 기능 우선순위, 그리고 로드맵 사고를 반영합니다. 이제 Codex와 함께 앱을 다시 살펴보면서, 원래의 제품 의도(product intent)를 현대적인 구현 및 배포 관행과 결합할 수 있었습니다.
Codex가 배포를 도운 부분:
- 로컬 부활
- 런타임 호환성 고정 (.nvmrc)
- 최신 macOS를 위한 핵심 의존성(deps) 업데이트
- 로컬 및 운영 환경을 지원하도록 DB 설정 수정
- 마이그레이션(migration)/시드(seed) 워크플로우 복구
- 데모 준비가 된 UX
UI에 직접 데모 로그인 경로를 추가했습니다. "계정이 없어도 문제없습니다..."
- 로그인 및 회원가입 페이지에 데모 자격 증명(credentials) 제공
- 회원가입에서 로그인으로 바로 가는 직접 링크
- 로그인 세션당 한 번씩 표시되는 대시보드 환영 메시지
- 보안 강화 (Security hardening)
배포 전, 핵심적인 리스크들을 조였습니다.
토큰 기반 인증 미들웨어 (Token-based auth middleware)
보호된 경로 (Protected routes)
로그인 속도 제한 (Login rate limiting)
민감한 콘솔 로그 제거 (Removed sensitive console logs)
API 응답 내 비밀번호 유출 제거 (Removed password leaks in API responses)
더 안전한 헤더 및 설정 기본값 추가 (Added safer headers and config defaults)
- Fly.io로의 배포 (Deployment to Fly.io)
fly.toml 추가 (Added fly.toml)
Dockerfile + .dockerignore 추가 (Added Dockerfile + .dockerignore)
릴리스 마이그레이션 흐름 구성 (Configured release migration flow)
프로덕션 데모 데이터 시딩 (Seeded production demo data)
코드 스냅샷: localhost 결합 제거 (Code Snapshot: killing localhost coupling)
가장 중요한 프로덕션 수정 사항 중 하나는 하드코딩된 localhost API 호출을 제거하는 것이었습니다. 그 한 가지 변화로 배포된 페이지에서의 혼합 콘텐츠 (mixed-content) 및 CORS 문제를 해결할 수 있었습니다.
이것이 나의 커리어 성장에 중요한 이유:
나는 소프트웨어 엔지니어링 (Software Engineering)에서 완전히 벗어나는 급격한 전환을 하고 있는 것이 아닙니다. 나는 커리어 옵션을 넓히고 더 다양한 팀과 고용주에게 더 가치 있는 존재가 되기 위해 소프트웨어 엔지니어 (Software Engineer)와 프로덕트 엔지니어 (Product Engineer)의 기술을 의도적으로 결합하고 있습니다. 이 프로젝트는 그러한 결합을 반영합니다:
- AI 지원 전달 속도 (AI-assisted delivery speed)
- 실용적인 제품 우선순위 지정 (practical product prioritization)
- 직접적인 코드 및 아키텍처 업데이트 (hands-on code and architecture updates)
- UX 개선 (UX improvements)
- 배포 및 프로덕션 강화 (deployment and production hardening)
이것은 단순한 코드 정리 (code cleanup)가 아니었습니다. 이는 엔드 투 엔드 (end-to-end) 제품 전달 연습이었습니다.
다음 단계:
나에게는 또 다른 9년 된 앱인 Highlander-react-redux가 있습니다. 동일한 백엔드 API를 사용하지만, 프론트엔드는 React/Redux를 사용합니다. 다음에는 다시 Codex를 사용하여 동일한 프로덕트 엔지니어의 관점으로 이를 부활시킬 것입니다:
- 온보딩 개선 (improve onboarding)
- 인증 및 데이터 흐름 현대화 (modernize auth + data flows)
- 복잡성 감소 (reduce complexity)
- 안정적인 배포 (ship reliably)
성공한 부분, 실패한 부분, 그리고 내 사고방식에서 변화된 점을 포함하여 그 과정 또한 기록할 예정입니다.
Highlander 프로젝트 데모: https://highlander.fly.dev/index.html
Github: https://github.com/heriberto-codes/highlander
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기