AI와 5일 만에 만드는 엔터프라이즈 번역 시스템 4탄: 대규모 리팩토링 & 기능 고도화 편

“하루 만에 11개의 기능을 완성하고, 시스템 전체의 체질을 개선할 수 있을까?”
단순히 기능을 나열하는 단계를 넘어, 실제 기업 환경에서 사용해도 손색없는 ‘프로덕션 레벨’의 시스템으로 진화시키기 위한 대규모 리팩토링이 시작된 날입니다.
3일 동안, 개발에 ㄱ자도 잘 모르는 사람이 엄청난 양의 AI 코드를 쏟아 냈으니 이쯤 되면 디버깅 및 리팩토링이 필요한 시점이라 생각했다.

Claude Code와의 6시간 페어 프로그래밍이었고, AI를 단순한 코드 생성기가 아닌, 아키텍처를 고민하고 보안 취약점을 함께 찾는 ‘시니어급 파트너’로 대했을 때 어떤 폭발적인 생산성을 보여줬는지 기록을 해보겠다.

1. 오늘의 미션: ‘돌아가는’ 시스템에서 ‘정상적인’ 시스템으로

POC 프로젝트의 완성도가 80%에 달했지만, 마지막 20%의 ‘디테일’이 POC의 완성을 더한다고 생각했고, 아래와 같은 부분을 고도화 하기로 마음을 먹었다.

1. P1급 결함 전수 수정: 성능 저하, 보안 취약점, 동시성 충돌 등 서비스 운영의 치명적 결함 해결
2. 비즈니스 고도화: 번역 출처 추적, 용어집 승인 워크플로우 등 실무용 핵심 기능 추가
3. 디자인 시스템 확립: 파편화된 UI를 하나의 브랜드 언어로 통일
4. 데이터 인프라 강화: 신규 로직 반영을 위한 4회의 데이터베이스 마이그레이션 실행

2. Phase 1: 시스템 체질 개선 – 치명적 버그 고치기

운영 중인 시스템에서 가장 무서운 것은 ‘느린 속도’와 ‘보안 구멍’이다. 그래서, AI가 짠 코드지만 AI 코드를 수정해보기로 했다.

ㄱ. 성능의 적, N+1 쿼리 최적화 (N+1 Query Problem)

문제 발견: 용어집(Glossary) 메뉴를 클릭했을 때 목록을 불러오는 시간이 3초를 넘겼다.
원인 분석을 요청하니, 용어 1,000개를 가져오면서 각 용어에 연결된 제품 정보를 루프 안에서 일일이 따로 호출하고 있었다.
즉, DB를 1,001번이나 찌르고 있는 불필요한 작업을 하고 있었다.

1. Claude Code의 진단: “이 구조는 데이터가 많아질수록 기하급수적으로 느려지며, Supabase(PostgreSQL)의 JOIN 기능을 활용해 단 한 번의 호출로 끝낼 수 있도록 함
2. 해결 방법: Nested Select 문법을 적용하여 쿼리 횟수를 1,001번에서 1번으로 줄임
3. 결과: API 응답 속도가 3초에서 0.2초로 무려 15배 단축

ㄴ. 파일 업로드 보안: “XSS 공격을 원천 차단하라”

엑셀(Excel) 임포트 기능은 편리하지만, 보안상 매우 위험한 통로가 될 수 있다,
공격자가 파일명에 악성 스크립트를 심어 업로드할 경우 시스템 전체가 마비될 수 있기 때문이였다.
그래서, 3단계 보안 검증 시스템을 만들어 달라고 요청 했다.

1. MIME 타입 검증: 확장자만 바꾼 가짜 파일인지 브라우저 수준에서 확인
2. 용량 제한(DoS 방지): 서버 부하를 막기 위해 최대 크기를 4.5MB로 제한
3. 이중 확장자 검사: .xlsx, .csv 등 허용된 확장자인지 다시 한번 정교하게 필터링

ㄷ. 동시 편집 충돌 해결 (Optimistic Locking)

여러 명이 동시에 번역하는 협업 시스템에서 가장 흔한 사고는 ‘덮어쓰기’다.
사용자 A와 B가 동시에 같은 문장을 열고 수정했을 때, 나중에 저장한 사람이 이전 사람의 작업물을 무단으로 덮어버리는 현상으로 당황스러울수도 있다.

해결: 타임스탬프 기반의 낙관적 잠금(Optimistic Locking)을 도입해서, 저장 시점에 내가 처음 읽어온 데이터의 수정 시각과 현재 DB의 시각이 다르면, 시스템이 즉시 경고를 띄우고 수정을 막는 방법을 우선 선택했다.
“다른 사용자가 이미 수정했습니다. 새로고침 후 다시 작업해 주세요.”라는 메시지는 협업의 필수 안전장치가 되었다.

3. Phase 2: 비즈니스 로직 고도화 – 실무자의 마음을 읽다

단순한 번역 저장소를 넘어, 경영진과 실무자 모두가 만족할 수 있는 지표 관리 기능을 추가했다.

ㄱ. 번역 출처 추적: “비용 투명성의 시작”

“이 번역은 사람이 한 건가요, AI가 한 건가요?”라는 질문에 데이터로 기능을 만들기 시작했다.
번역 결과물마다 용어집(Glossary), AI, 수동(Manual), 가져오기(Imported)라는 출처 태그를 붙였서 구분 할 수 있도록 했다.
> 또한, 비즈니스 가치: 용어집 재사용 시 ‘무료’, AI 번역 시 ‘비용 발생’을 시각화하여 예산 관리의 효율성을 높였다

ㄴ. 용어집 승인 워크플로우: AI 품질 관리

AI가 문맥을 파악해 용어집에 단어를 자동 등록하는 것은 편리하지만, 품질 검수가 필요했다.
> 3단계 프로세스: AI가 단어를 제안하면 우선 승인 대기(Pending) 상태로 등록되고, 번역 검수 및 담당자는 전용 필터를 통해 대기 중인 항목들만 모아보고, 클릭 한 번으로 일괄 승인 처리를 할 수 있습니다. 품질과 자동화라는 두 마리 토끼를 모두 잡는 방법을 택했다.

ㄷ. 통계 대시보드: “AI 비용 절감을 숫자로 증명하다”

번역 효율을 숫자로 시각화했습니다. 단순히 번역 건수만 세는 게 아니라, 용어집 재사용을 통해 AI API 호출 비용을 얼마나 아꼈는지($) 실시간으로 계산해 보여주는 방식을 선택 했다.
> 실제 데이터: 단 하루 동안 용어집 재사용 1,245회를 통해 약 얼마 절약했다는 보여주고, 규모가 커질수록 이 수치는 핵심 지표가 될 수 있다.

4. Phase 3: 디자인 시스템 & 사용자 경험(UX) 최적화

기능이 많아질수록 UI의 일관성이 중요해졌고, 중구난방으로 작업한 부분을 ‘디자인 시스템’이라는 이름 아래 모든 페이지의 톤앤매너를 하나로 맞춰 달라고 요청을 했다.

ㄱ. ‘Soft Indigo’ 테마 통일

각기 놀던 버튼 색상과 테이블 스타일을 프로젝트 메인 컬러인 Indigo 400(#818CF8) 테마로 통일했다.
globals.css 파일을 중앙 집중화하여, 버튼 하나를 수정하면 수십 개의 페이지가 동시에 세련되게 변하도록 리팩토링했다.
(물론 지금은 예전과 많이 발전 되어가고 있다.)

ㄴ. ‘클릭 수 16회 → 0회’의 기적 (제품별 기본 언어 자동화)

실무에서 가장 귀찮은 일 중 하나는 매번 번역할 언어를 일일이 체크하는 것이다.
> 해결: 제품별(RC, RV 등)로 자주 사용하는 언어를 DB에 미리 설정했다. 예를 들어 제품을 선택하면 한국어, 영어, 일본어는 물론 중국어까지 자동으로 체크박스가 활성화됩니다. 기획자가 매번 16번씩 클릭하던 수고를 완전히 없앴다.

5. 숫자로 보는 오늘의 성과

구분,성과 및 변화
코드 변경,"신규 파일 6개 생성, 기존 파일 20개 대규모 수정"
인프라 작업,"4회의 DB 마이그레이션, 5개의 성능 최적화 인덱스 추가"
성능 체감,특정 API 응답 속도 15배 향상 (3s -> 0.2s)
UX 혁신,제품 선택 시 언어 자동 설정으로 반복 클릭 0화
생산성,기획자 1인 + AI 파트너 조합으로 11개 핵심 기능 동시 배포

6. Claude Code와 함께한 ‘미친 생산성’의 비밀

이번 리팩토링을 통해 느낀 점은, 이제 개발은 ‘코드를 직접 치는 행위’보다 ‘AI에게 맥락을 정확히 전달하고 의사결정하는 행위’로 변하고 있다는 것이다.

1.AI가 잘한 것: 방대한 코드 베이스 안에서 N+1 문제를 찾아내고, 보안 취약점을 먼저 경고하며, 일관된 스타일 가이드를 제안하는 능력.
2. 인간(기획자)이 잘한 것: “이 기능은 비용 절감 지표에 중요해”, “관리자는 이 버튼을 찾기 어려울 거야”와 같은 비즈니스적 우선순위 판단과 사용자 공감.

결론적으로 1(인간) + 1(AI) = 3 이상의 결과물이 나왔고,
AI와 함께라면 기술적 부채를 청산하는 지루한 리팩토링 과정조차 다른 일을 병행 할 수 있어서 시간절약이 엄청 되었다.

댓글 남기기