포트폴리오

프로젝트를 선택하시면 자세한 내용을 확인 할 수 있습니다! 😊

개인 프로젝트

취업 준비 과정에서 반복되는 이력서 조합, 지원 현황 추적, 채용 메일 확인을 직접 겪으며 만든 이력서·지원 관리 에이전트 시스템입니다. 커리어와 지원 기록을 마크다운 기반 저장소로 구조화하고, 에이전트가 데이터를 직접 해석하거나 수정하지 않고 정해진 도구를 통해 조회·갱신하도록 설계했습니다. 이를 통해 데이터 형식을 일관되게 유지하고, 지원 상태 변경 같은 작업이 도메인 규칙을 따르도록 만들었습니다.

ResuMaker 시스템 아키텍처 — 3개 인터페이스(Next.js, MCP Server, OpenClaw Plugin)가 도메인 서비스를 통해 Markdown Store에 접근하는 구조

주요 구현

  • 커리어와 지원 기록을 마크다운 기반 저장소에 두고, 앱과 에이전트가 같은 스키마를 기준으로 데이터를 다룰 수 있게 했습니다.
  • MCP·OpenClaw 플러그인은 저장소를 직접 노출하지 않고 에이전트가 사용할 도구만 제공합니다. 도구 구현을 별도 레이어로 분리해 여러 인터페이스에서 재사용합니다.
  • 결정론적으로 처리할 수 있는 작업은 코드로 구현했습니다. 도구 입력은 스키마로 검증하고, 상태 변경은 코드에 정의된 전이 규칙을 따릅니다.

성과

  • 채용 관련 메일을 확인하고 기존 상태를 검색한 후 상태 갱신 혹은 메모를 추가하는 에이전트 흐름을 구현했습니다.
  • 도구 인터페이스에 도메인 규칙을 캡슐화하면, 에이전트 품질과 무관하게 데이터 무결성을 소프트웨어 수준에서 보장할 수 있습니다.

Next.js는 파일 경로 기반으로 API 주소가 생성됩니다. 개발 중 현재 파일의 정확한 API 엔드포인트를 파악하려면 파일 경로를 확인하고 route나 디렉터리 표시를 수동으로 지워가며 역추적해야 했습니다. 이 과정에서 잘못된 API를 호출하거나 엔드포인트를 틀리게 입력하는 실수가 자주 발생했습니다. Babel 기반 코드 분석으로 실제 경로를 표시해야 하는 함수를 정확히 식별하고, VS Code에서 즉시 API 주소를 확인할 수 있는 확장 프로그램을 개발했습니다.

주요 구현

  • Next.js App Router는 GET, POST, PUT, DELETE 등 다양한 HTTP 메서드를 파일 내 함수로 정의하는데, 수동으로 확인 시 현재 파일이 어떤 메서드를 지원하는지 일일이 열어봐야 했으므로 모든 HTTP 메서드를 자동 감지하여 한눈에 파악할 수 있도록 설계했습니다.
  • 개발자마다 Next.js API를 작성하는 방식(export default, export const, export function 등)이 달라 일부 패턴만 지원하면 도구가 제대로 동작하지 않으므로, Babel AST 파서로 모든 내보내기 패턴을 지원하여 작성 방식에 관계없이 정확한 API 주소를 표시할 수 있도록 했습니다.
  • VS Code의 Code Lens API를 활용해 코드 에디터를 벗어나지 않고도 API 주소를 즉시 확인하여 복사할 수 있도록 했습니다.

성과

  • 수동 역추적 과정을 제거하여 API 엔드포인트 확인 실수를 완전히 방지했습니다.
  • Next.js App Router API의 모든 라우팅 패턴을 완전 지원하여 개발 과정에서 즉시 정확한 API 주소를 확인할 수 있게 했습니다.

(주)스마트러닝코리아

2025-03 ~ 2026-02

운영팀에 콘텐츠 오류 문의가 반복 접수되면서, 신고된 건만 고치는 대신 전수조사를 시작했습니다. 하지만 영어 듣기 문제 약 8,000개를 운영자가 하루 수십 건씩 수작업으로 검수하면 분기 단위의 시간이 필요한 규모였습니다. 오류의 근원은 등록 환경 자체가 실수를 유발하던 구조였고, 그 환경은 이미 신규 CMS로 교체한 상태였으므로 이번 작업은 그 이전에 쌓인 데이터의 기술 부채를 청산하는 과정이었습니다. 음원과 문제 데이터를 Gemini로 교차 검증하는 자동 검수 파이프라인 도입을 직접 제안하고 설계·구현했습니다.

주요 구현

  • 검수 파이프라인 설계: Gemini로 음원을 텍스트로 전사(STT)해 DB에 저장 → 전사 텍스트를 문맥으로 문제·선택지의 정답을 독립 도출 → 등록된 정답과 대조. 등록 정답을 전제하지 않는 역방향 구조라 정답 키 자체의 오기입까지 검출
  • 사람이 최종 확인 가능한 구조: 모든 판정에 근거 요약을 동봉해, 운영자가 데이터 기반으로 검토·수정하도록 설계
  • 범위 판단: LLM 오판 케이스는 전수 재검수 대신 향후 신고 시스템 보강으로 대응하기로 결정, 리소스 대비 효과 우선

성과

  • 영어 듣기 문제 약 8,000개 전수 자동 검증 완료, 운영자의 수작업 검수 병목 해소
  • 전체의 약 3%에서 정답 오기입(인덱스 밀림)·오디오 파일 누락 등 실제 오류 검출·수정

CodeIgniter 2.x와 PHP 5.6 기반의 레거시 시스템에서 SQL 인젝션 공격이 실제로 성공하는 보안 사고가 발생했습니다. EOL(End of Life) 상태의 스택은 보안 패치가 불가능했고, 쿼리 생성 방식만 수정해도 전체 리스크가 해소된다고 보기 어려웠습니다. 같은 유형의 사고가 반복될 가능성이 남아 있었기 때문에, 레거시 개선과 재구축의 비용·리스크를 비교한 뒤 2주 내 재구축이 가능하다고 제안하고 Next.js 15·Prisma 기반의 새 아키텍처로 전환했습니다.

AS-IS: PHP 프론트엔드와 PHP 서버사이드(CodeIgniter 2.x)가 같은 스택을 공유하며 사용자 입력을 문자열 병합으로 SQL에 직접 합쳐 쿼리 구조가 변형되어 인젝션이 성공한 구조에서, TO-BE: 프론트엔드는 그대로 두고 서버사이드만 Next.js 15 · Prisma로 교체해 입력이 파라미터로 분리된 채 prepared statement로 DB에 전송되어 쿼리 구조가 보존되는 구조로 전환

주요 구현

  • 의사결정 주도: 레거시 개선 vs 재구축 비용·리스크 분석 후 경영진에 2주 재구축안 제안 및 승인
  • 영향 범위 확인: 인증/인가 시스템을 사용하는 서비스 담당자들과 현재 연동 방식 파악
  • 단독 개발: Next.js 15 + Prisma 기반 독립 API 서비스 설계, 타입 안전성 확보
  • 다층 보안 아키텍처: JWT 인증, SQL Prepared Statement, XSS 방지, HTTPS 강제
  • 무중단 전환: Blue-Green 배포, 데이터 정합성 자동 검증, 롤백 플랜 수립

성과

  • 2주 내 교체 완료로 추가 공격 차단·법적 리스크 해소
  • 기존 서비스 무중단 전환 완료

EBS 영어학습 플랫폼이 CentOS 6 기반의 단일 베어메탈 서버 위에서 운영되고 있었습니다. 보안 패치와 재해 복구가 불가능했고, OpenSSL 버전 문제로 외부 서비스와의 HTTPS 핸드셰이크가 막혀 신규 기능 개발 자체가 어려운 상태였습니다. 사업 배경상 NCP를 써야 했고, NCP 환경은 네트워크부터 새로 잡아야 하는 상황이었습니다. 개발팀이 없던 조직에서 팀장으로서 이 문제를 직접 발견하고, NCP 환경에 인프라를 네트워크부터 직접 설계·구축해 점진적으로 이관했습니다.

주요 구현

  • NCP 인프라 설계·구축: VPC public/private 서브넷 분리, DB private 격리, ACG 규칙으로 접근 통제 직접 구성
  • 배포 구조 설계: 레지스트리 기반 체계 검토 후 규모 대비 운영 부담 초과 판단, 인스턴스 내 빌드(pull→build→교체) 방식 채택·내부 CLI 롤백 확보
  • OS 전환: 새 인스턴스 기동 후 서비스 이관 방식으로 CentOS 6 → Ubuntu 24.04 LTS 전환
  • 스토리지 분리: 로컬 디스크 파일을 NCP Object Storage로 이전, 인스턴스 교체·다중화 시 파일 유실 없는 구조로 전환

결과

  • 베어메탈 단일 서버의 구조적 한계(패치 불가·재해복구 불가) 해소, EOL OS를 Ubuntu 24.04 LTS로 전환
  • HTTPS 핸드셰이크 문제로 미뤄져 있던 외부 연동 기반 기능 이관 후 개발·적용
  • 개발팀 없는 조직의 방치된 레거시 직접 정리, EOL 서버 제약사항·DR 대응을 인수인계 항목에서 제거

기존 Flutter 기반 구버전 앱 4개를 개별 관리하는 구조에서 동일한 버그 수정을 각각 반영하다 일부 앱에만 적용되는 휴먼 에러가 반복 발생했습니다. 개발팀원들과 배포 과정을 리뷰한 결과, 개별 관리 구조 자체가 문제임을 확인. Flutter 앱의 사이닝 키를 Expo로 이관하여 React Native 기반 단일 프로젝트로 전환하고, 인증 파일을 모두 Expo에 등록하여 Google Play/App Store 실제 출시까지 완료했습니다.

As-Is(배포 4시간): 개발자가 4개 Flutter 저장소에 같은 수정을 4번 반복 반영하다 일부 앱에만 패치가 도달하는 휴먼 에러가 발생하던 구조. To-Be(배포 40분, 70%↓): 단일 RN 프로젝트가 app.config.ts 테넌트 매트릭스(OAuth 키·브랜딩·리소스·번들 ID)로 분기되고 EAS Build & Submit이 4개 프로필을 일괄 출시하며 OTA 업데이트로 긴급 패치를 스토어 심사 없이 즉시 배포

주요 구현

  • 현황 파악: 각 테넌트별 실제 차이점(OAuth 키, 브랜딩, 리소스) 전수 조사, 공통 로직과 분기점 식별
  • 단계적 통합: 공통 모듈부터 통합 시작, 한 테넌트씩 검증 후 순차 확장
  • Expo Config 활용: 테넌트별 차별화 요소를 환경변수로 추상화
  • 빌드 자동화: npm 스크립트 기반 원터치 빌드 (npm run build:tenant-a)
  • EAS 파이프라인 통합: OTA 업데이트, 스토어 배포 자동화

성과

  • 배포 시간: 4시간 → 40분 (70% 단축)
  • EAS Update로 긴급 패치 즉시 배포 (스토어 심사 대기 불필요)
  • Flutter→React Native 전환 후 Google Play/App Store 4개 앱 실제 출시 완료

기존 쿠폰 시스템은 200건씩 통째로 외부에 전달하는 방식으로, 개별 판매 추적이 불가능하고 정산 신뢰성 문제가 예상되었습니다. KB스타뱅킹 이벤트 페이지 판매 연동 기회가 생겨 사업 담당자에게 먼저 '현재 방식으로 정산이 가능한가' 질문했고, 실시간 판매 추적과 환불 처리가 필요하다는 것을 확인했습니다.

AS-IS: 내부 시스템이 쿠폰 200건을 외부 판매처에 통째로 전달하던 구조에서 누가·언제·취소했는지 개별 추적이 불가능해 정산이 무너졌던 형태에서, TO-BE: 단일 쿠폰 API(POST /coupon, GET /coupon/{id}, PUT .../deactivate, PUT .../cancel)가 KB 스타뱅킹·네이버 스토어 등 여러 판매처를 API 키 단위로 분리해 동일 API를 재사용하고 신규 판매처는 키 발급만으로 추가되며 발급·사용·취소 전 단계가 추적되어 실시간 정산·환불이 가능한 구조로 전환

주요 구현

  • 정산 신뢰성 문제를 선제적으로 예측하고 사업 담당자와 대화로 검증
  • 연동하는 KB 개발자 입장에서 '쿠폰을 비활성화한다'처럼 자연스러운 문장으로 읽히는 REST API 설계
  • POST /coupon(생성), GET /coupon/{id}(상태 확인), PUT /coupon/{id}/deactivate(비활성화), PUT /coupon/{id}/cancel(취소) 등 엔티티와 행위가 명확한 엔드포인트 구성
  • 스토어 단위 API 키 생성·구분 기능으로 여러 판매처 대응

성과

  • 외부 개발자(KB)가 문서만으로 연동 완료
  • 정산 신뢰성 확보 (실시간 판매 추적, 환불 정책 지원)

영어 듣기 학습 플랫폼에서 사용자 동기부여를 위해 현금성 이벤트를 운영했지만, 기프티콘을 직접 전달하거나 개별 연락을 주고받는 수기 방식으로 진행해야 했습니다. 운영팀은 기프티콘을 일일이 확인하고 전달하는 반복 작업에 시달렸고, 이벤트 처리에 며칠씩 소요되었습니다. 심지어 기프티콘의 중복 지급, 경품을 받지 못했다는 컴플레인, 누락과 같은 오류도 발생했습니다. 빠르고 유연한 이벤트 운영을 도입하기 위해 사용자가 직접 포인트를 관리하고 원하는 타사 포인트로 전환할 수 있는 자동화 시스템이 필요했습니다.

AS-IS(이벤트당 며칠): 운영팀이 매 이벤트마다 수동 확인과 기프티콘 직접 전달을 반복하며 MMS 1:1로 사용자에게 보냈고 중복 지급과 미지급이 동시 발생해 정산 오류·컴플레인이 누적되던 구조. TO-BE(안정적으로 즉시 처리): 사용자가 적립 요청과 전환 요청을 직접 시작하면 책임이 분리된 포인트 시스템(적립 이벤트 핸들러, 잔액 원장—트랜잭션+행 락으로 동시 적립/차감 정합성, Welcome Payments 어댑터—멱등 호출+실패 시 보상 적립, 포인트 히스토리—append-only 감사 추적)이 처리하고, 운영팀은 관리자 페이지에서 정책 변경과 잔액 조정을 실시간 수행하며 모든 변동이 감사 가능하게 기록되는 구조로 전환

주요 구현

  • DB 트랜잭션·락으로 동시 적립/차감 시 중복 처리·초과 사용 차단, 포인트 정합성 보장
  • Welcome Payments 연동: 실패 시 자동 롤백·재시도로 부분 차감 등 비일관 상태 차단
  • 관리자 페이지·API 제공: 운영팀이 적립 정책·개별 포인트를 실시간 조정
  • Vercel v0로 복잡한 폼·상태 관리 UI를 검증된 패턴 기반 빠르게 프로토타이핑
  • 포인트 히스토리 테이블: 적립·차감·전환을 모두 기록해 감사 가능

성과

  • 수기 기프티콘 운영을 자동화 — 운영팀 이벤트 관리 부담 감소, 처리 속도 향상
  • 트랜잭션·롤백으로 정산 오류 차단, 히스토리 추적으로 모든 거래 감사 가능
  • 월 약 9,000건 포인트 트랜잭션 안정 처리, 사용자 자체 타사 포인트 전환 가능
  • 관리자 페이지로 운영팀이 정책을 실시간 조정 — 비즈니스 변화에 빠른 대응

영어 듣기 콘텐츠가 재생되지 않거나 이상하게 표시되는 오류가 반복 발생했습니다. 콘텐츠 운영팀이 SFTP로 파일 업로드 → URL 확인 → DBeaver로 JSON 데이터 입력하는 구조로 작업 중이었습니다. 전체 업로드 매뉴얼을 분석한 결과, 비개발자가 이 구조를 따라하는 것 자체가 문제임을 발견했습니다. 담당자들은 이 불편함을 당연하게 여기고 있었습니다.

AS-IS: 운영팀(비개발자)이 SFTP로 파일을 업로드하고 URL을 수기로 확인한 뒤 DBeaver로 JSON을 DB에 직접 입력하다 재생 오류가 나면 개발팀에 검증·수정을 요청해 재반영까지 약 1주일이 걸리던 흐름에서, TO-BE: 통합 CMS(Next.js)에서 CSV 템플릿 다운로드·미디어 업로드·데이터 입력을 한 화면에서 처리하고 입력 시점 스키마 검증·한글 에러 메시지로 즉각 피드백을 받아 검증 통과 시 자동으로 DB에 반영되는 운영팀 자립 흐름으로 전환

주요 구현

  • 콘텐츠 담당자가 인식하지 못한 구조적 문제를 파악하고 개선안 제안
  • 담당자들이 익숙한 엑셀 기반 작업 방식 유지, 100개 이상 대량 처리 패턴 고려
  • Next.js 기반 CMS 구현: CSV 템플릿 다운로드 → 미디어 업로드 → 데이터 입력 → 실시간 검증 → DB 반영
  • 에러 메시지 한글화, 입력 시점에 스키마 검증으로 학습 곡선 최소화

성과

  • 운영 업무 부담 약 80% 감소
  • SFTP/DBeaver 완전 제거, 업로드 전 즉각 피드백으로 오류 사전 차단

운영팀에서 결제 취소와 라이선스 회수 요청이 반복적으로 개발팀에 전달되었습니다. 운영팀에 미팅을 요청해 실제 업무 화면을 함께 본 결과, 결제 취소 후에도 사용자가 서비스에 접근할 수 있는 구조적 문제를 발견했습니다. 결제 시스템, 라이선스 시스템, 구독 시스템이 분리되어 있어 결제 취소 처리가 연동되지 않았습니다.

AS-IS: 운영팀이 PG 사이트에서 결제를 취소한 뒤 개발팀에 라이선스 회수를 수기로 안내하면 개발팀이 라이선스 시스템에 수동 반영하고, 그동안 구독 시스템은 자동 갱신을 계속해 결제 취소된 사용자가 여전히 서비스에 접근 가능하던 분리된 구조에서, TO-BE: 운영팀이 통합 관리자 페이지에서 취소·회수를 한 번에 처리하면 결제(PG)·라이선스·구독 시스템이 모두 연동 호출로 즉시 일관 처리되어 접근이 차단되고 개발팀 개입 없이 자립 운영되는 통합 구조로 전환

주요 구현

  • 반복 요청 패턴을 발견하고 직접 운영팀 미팅을 요청하여 결제사 사이트에서 취소 후 개발팀에 라이선스 회수를 요청하는 실제 워크플로우 확인
  • 표면적 '취소 자동화' 요청이 아닌 시스템 간 연동 부재가 근본 원인임을 파악
  • 결제/라이선스 시스템 먼저 이관 후 단위 테스트로 검증
  • 구독 시스템은 며칠간 수동 갱신으로 모니터링한 후 자동화 범위 확장

성과

  • 반복 발생하던 취소/환불/구독 변경 요청을 운영팀이 직접 처리하도록 전환
  • 운영팀이 개발팀 개입 없이 취소·환불·구독 관리 자체 처리 가능
  • 결제 취소 후 서비스 접근 가능했던 보안 리스크 해소

20년 경과한 PHP 5.3 교육 플랫폼이 유료/테스트/무료 3개 버전 × 학생/모바일/관리자/선생님/공통 5개 모듈로 분리되어 총 15개 SVN 저장소로 관리되고 있었습니다. 형상별 SFTP 파일 배포와 DB 마이그레이션을 사람이 수동 처리해 배포가 하루 단위 작업이 되었고, 마지막 업로드가 이전 작업을 덮어쓰거나 마이그레이션 순서가 어긋나는 리스크가 반복되었습니다.

AS-IS: 유료·테스트·무료 3개 버전에 student·mobile·admin·teacher·common 5개 모듈이 각각 분리되어 총 15개 SVN 저장소로 관리되었고, 형상별 SFTP 파일 배포와 DB 마이그레이션을 수동 처리해 하루 단위 배포와 누락·순서 오류 위험이 발생하던 구조에서, TO-BE: 단일 Git 저장소와 공통 추상화 모듈을 기반으로 GitHub Actions가 파일 배포와 DB 마이그레이션을 하나의 워크플로우로 실행해 개발·패치 속도와 배포 추적성을 개선한 구조로 전환

주요 구현

  • 15개 분산 SVN 저장소를 분석하여 단일 Git 저장소로 통합하고, 도메인별 분기 로직을 추상화
  • 형상별 SFTP 수동 배포를 차단하고 GitHub Actions로 파일 배포와 DB 마이그레이션을 단일 워크플로우화
  • PHP 5.3과 5.6 양쪽에서 동작 가능한 코드 상태를 유지하면서 점진적 마이그레이션 수행
  • 성능 개선을 위해 PHP 5.3/Apache2에서 PHP 5.6/Nginx+PHP-FPM으로 전환
  • 현대화된 스택으로 개발 서버를 구축하고 실제 복구 시나리오 테스트로 재해복구 가능성 검증

성과

  • 코드 중복 70% 제거: 15개 저장소에 분산된 중복 코드를 단일 추상화 모듈로 통합
  • 신규 기능 개발 시간 66% 단축: 3가지 버전에 각각 적용하던 작업을 하나의 모듈로 처리
  • 수동 배포·DB 마이그레이션 자동화: 하루 단위 배포 작업과 누락·순서 오류 위험 감소
  • 1시간 내 재해 복구 체계 확립: 복구 불가능했던 서비스를 복구 가능한 상태로 전환
  • 긴급 패치 대응 시간 90% 단축: 전체 버전 동시 배포 가능해져 빠른 대응 가능

주식회사비엔제트 (BnZ)

2024-03 ~ 2025-03

학원에서 시험 후 틀린 문제를 조교가 수기로 관리하면서 학생별 진행 상황을 파악하기 어렵고, 오답노트를 하지 않는 학생을 조기에 발견하기 어려운 문제가 있었습니다. 이를 해결하기 위해 학생들이 마치 일감 관리하듯 오답 문제를 체계적으로 정리하고, 교사가 SSE를 통해 실시간으로 학생들의 문제 풀이 상황을 확인하며 피드백을 주고받을 수 있는 시스템을 개발했습니다.

주요 구현

  • 교사가 실시간으로 학생들의 문제 풀이 상황을 확인하고 피드백을 주고받아야 했으므로, SSE(Server-Sent Events)를 활용한 실시간 통신 기능을 구현하고 이벤트 핸들러를 독립적인 모듈로 추출하여 관심사를 분리했습니다.
  • 프로덕션 데이터에 직접 접근할 수 없고 테스트 환경을 분리해야 했으므로, 저장소 인터페이스를 추상화하여 운영 환경과 테스트 환경을 독립적으로 관리하고 단위 테스트를 용이하게 했습니다.
  • 학생, 교사, 관리자별로 접근 권한과 기능이 달라야 했으므로, 역할별 맞춤형 인터페이스와 권한 관리 시스템을 구현했습니다.
  • 복잡한 데이터 관계(학생-문제-진행상황)를 효율적으로 관리해야 했으므로, Prisma ORM을 활용한 타입 안전한 데이터베이스 설계와 마이그레이션 시스템을 구축했습니다.
  • 코드 품질을 보장하고 리팩토링을 안전하게 수행해야 했으므로, Vitest 기반 자동화 테스트 환경을 구축했습니다.

성과

  • 수기 관리에서 시스템 관리로 전환하여 조교의 관리 부담을 줄이고, 학생별 진행 상황을 한눈에 파악할 수 있게 되었습니다.
  • 오답노트를 하지 않는 학생을 조기에 발견하고 적시에 피드백을 제공할 수 있게 되어 학습 관리 효율성이 향상되었습니다.
  • 모듈화된 설계로 새로운 기능 추가와 유지보수가 용이한 시스템을 구축했습니다.

사내 서비스에서 제공하는 기능 중 문제를 받아서 유사한 문제를 생성하는 기능이 있습니다. 생성한 문제를 LaTeX와 마크다운 형식으로 제공했으나, 주 사용자인 학원 선생님들의 익숙하지 않은 형식으로 인해 활용도가 낮았습니다. 이를 해결하기 위해 한글 문서 형식으로 자동 변환하여 사용자가 익숙한 환경에서 문제를 수정하고 활용할 수 있도록 소프트웨어를 개발했습니다.

주요 구현

  • 학원 환경에서 한글 문서가 표준이었고, 선생님들이 마크다운 테이블 문법을 이해하지 못해 생성된 문제를 그대로 활용하기 어려웠습니다. 이를 해결하기 위해 마크다운 테이블을 한글과컴퓨터의 XML 데이터 구조에 맞춰 자동 변환하는 파서 모듈을 개발했습니다.
  • 선생님들이 LaTeX 수식을 이해하지 못해 수식을 캡처 후 이미지로 붙여넣는 방식을 했습니다. 이 방식은 수식 수정이 불가능하여 불편했으므로, LaTeX 수식을 한글 문서의 자체 수식 형식으로 변환하는 엔진을 구현하여 문서 내에서 직접 수정 가능하도록 했습니다.
  • 지속적으로 발견되는 새로운 수식 패턴에 대응하기 위해 변환 알고리즘을 모듈화하고, 단위 테스트를 통해 안정성과 유지보수성을 확보했습니다.

성과

  • 정의된 지원 수식 범위 내 변환 검증 100% 통과를 달성했습니다.
  • 주 고객층인 선생님의 문제 제작 워크플로우가 '캡처 후 붙여넣기'에서 '문서 내에서 직접 수정'으로 개선하여, AI 생성 콘텐츠의 편집 가능성 확보로 서비스 실사용 전환율을 향상했습니다.
  • 사용자 교육 필요성을 제거하고 즉시 활용 가능한 hwpx 파일 형식을 제공함으로써 서비스 진입 장벽을 낮추고, LLM 출력물을 사용자 워크플로우에 자연스럽게 통합하는 UX 개선 사례를 확립했습니다.

스크린샷

hwpx 파일로 변환한 화면

LaTex와 수식을 렌더링 한 화면

수학 문제 풀이를 제공하는 LLM 기반 서비스에서 LaTeX 수식 구분자($)가 누락되거나 짝이 맞지 않는 오류가 새로운 패턴이 등장할 때마다 발생했습니다. 수식이 텍스트로 보이거나 레이아웃이 크게 망가지는 문제가 지속되어, 해설 모듈을 검토 없이는 제품으로 내보낼 수 없는 상황이었습니다. LLM 재생성으로 해결하려 했으나 규칙 추가마다 OCR 성능이 떨어지고 비용이 감당하기 어려웠으므로, 오류 패턴을 자동으로 수정하는 파서를 개발했습니다.

주요 구현

  • 새로운 패턴 발견 시 즉시 대응 가능하도록 문서 요소를 인라인 수식, 블록 수식, 마크다운으로 분류하고, 각 요소의 문맥을 분석하여 잠재적 오류 패턴을 자동으로 식별하는 파서를 구현했습니다.
  • 오류 패턴별 변환 로직을 모듈화하여 새로운 패턴 발견 시 기존 코드 수정 없이 규칙만 추가할 수 있도록 설계했습니다.
  • 검토 없이 제품에 적용 가능한 수준의 안정성을 확보하기 위해 개별 변환 모듈의 단위 테스트와 전체 파이프라인의 통합 테스트를 구축했습니다.

성과

  • 500건 테스트 케이스 100% 성공률로 UI 오류 해결, 사용자 경험 개선
  • 검토 없이 제품에 적용 가능한 수준의 안정성을 확보하여, 새로운 패턴 발견 시마다 긴급 대응하던 상황에서 벗어나 안정적으로 해설 모듈을 서비스에 배포할 수 있게 되었습니다.
  • 모듈화된 설계로 새로운 오류 패턴 발견 시 기존 기능에 영향을 주지 않고 확장이 가능해졌습니다.

스크린샷

올바르게 수정된 LaTeX 구문

사용자에게 잘못 표시되는 LaTeX 구문

학생의 오답노트나 질문에 대한 이해도를 확인하기 위해 유사한 문제를 제공하는 기능이 필요했습니다. 기존 키워드 기반 검색은 키워드가 비슷해도 전혀 다른 문제가 검색되는 한계가 있었고, 키워드 분류 방식은 수동 라벨링 작업이 필요해 인력 부족으로 실현이 어려웠습니다. 데이터 가공 없이 LLM 리소스만으로 문제의 의미를 이해하는 임베딩 기반 검색 시스템을 구축했습니다.

주요 구현

  • 키워드가 비슷해도 전혀 다른 문제가 검색되는 한계를 극복하기 위해 임베딩 모델을 활용한 벡터 검색을 구현하여 문제의 의미를 기반으로 유사도를 판단하도록 했습니다.
  • 키워드 검색과 벡터 검색을 결합한 하이브리드 검색 시스템을 Elastic Search로 구축하여 검색 정확도를 향상했습니다.
  • 개발 환경의 접근성을 높이기 위해 Elastic Search 환경을 컨테이너화하여 로컬 개발 설정을 간소화했습니다.

성과

  • 수동 라벨링 없이 임베딩으로 문제의 의미를 자동 분석하여, 인력 부족 상황에서도 유사 문제 검색 시스템을 구축할 수 있었습니다.
  • 키워드 유사성이 아닌 의미 기반 검색으로 전환하여, 학생의 이해도 확인에 적합한 유사 문제를 정확히 제공할 수 있게 되었습니다.
  • 검색 서비스와 임베딩 로직을 모듈화하여 임베딩 서비스 전환이 용이한 아키텍처를 설계했습니다.

매 프로젝트마다 학원, 질문, 답변 등 유사한 도메인 설정을 반복하는 문제가 발생했습니다. 프로젝트마다 다른 구조로 구현하여 유지보수가 어려웠습니다. 이를 해결하기 위해 교육 도메인의 표준 구현체와 자동화된 배포 환경을 포함한 보일러플레이트를 제작했습니다.

주요 구현

  • 여러 프로젝트에서 재사용 가능하도록 도메인 위주로 설계하여, 학원/질문/답변 등 핵심 도메인의 비즈니스 규칙을 명확히 분리했습니다.
  • 보일러플레이트를 사용하는 개발자의 경험이 좋지 않으면 사용 가치가 떨어지므로, OpenAPI 문서 자동화와 구조화된 로깅 시스템을 구축했습니다.
  • 개발자가 배포 과정(DB 마이그레이션, 빌드, 배포)에 신경쓰지 않아도 되도록 GitHub Actions 기반 자동화를 구현했습니다.

성과

  • 교육 도메인의 표준 구현체를 문서화하여 프로젝트 간 일관된 이해와 참조가 가능하도록 했습니다.
  • 자동화된 배포 파이프라인으로 개발자가 배포 과정에 관여하지 않아도 되어, 소프트웨어 개발 복잡도 감소 및 핵심 기능 개발에 집중 가능해졌습니다.

교육 질의응답 플랫폼 '하이큐썸'에서 간단한 서비스 로직 변경만으로도 연쇄적으로 다른 기능이 고장나는 문제가 지속적으로 발생했습니다. 예를 들어, 질문 형식을 수정하면 리터럴 값을 읽는 기능이 깨지고, 그것이 트리거를 호출하지 않아 또 다른 기능까지 동작하지 않는 등, 팀이 이슈 해결에만 매달려야 했습니다. 신규 개발이 불가능했고, 서비스 안정성이 급격히 저하되어 근본적인 구조 개선이 필요했습니다.

주요 구현

  • 기능들을 회원, 문제, 푸시 알림 등 도메인 단위로 분리하여 모듈화했습니다.
  • 핵심 기능 간의 의존성을 분석하고 서비스 레이어를 재구성하여 유지보수성을 향상했습니다.
  • 중복 코드를 제거하고 공통 기능을 추출하여 코드베이스를 최적화했습니다.
  • 핵심 도메인(회원, 문제, 알림)에 대한 테스트를 우선 구축하고, 추가 테스트는 필요에 따라 점진적으로 추가하는 실용주의 전략을 선택했습니다. 완벽한 커버리지보다 팀이 감당 가능한 범위에서 핵심 기능의 안정성을 먼저 확보하여 테스트 커버리지를 0%에서 50%까지 증가시켰습니다.
  • GCP, Sentry, Slack 기반의 실시간 오류 모니터링 시스템을 구축하여 장애 대응 체계를 강화했습니다.

성과

  • 작업 시간 1-3주에서 1-3일로 단축, 이슈 감지 개선
  • 테스트 커버리지를 0%에서 50%까지 개선했습니다.
  • 도메인 분리로 변경 범위가 명확해져 연쇄 버그 없이 안전하게 개발할 수 있게 되었고, 이슈 대응에만 매달리던 팀이 신규 기능 개발에 집중할 수 있게 되었습니다.
  • 사전 모니터링 체계 구축으로 잠재적 문제를 조기에 발견하고 대응할 수 있게 되었습니다.

버터소프트

2024-01 ~ 2024-03

카본몬스터는 탄소 배출권을 NFT로 거래하는 플랫폼입니다. 실시간 거래량이 많아질 수 있는 구조였고, 블록체인과 거래소 간 데이터 불일치로 인한 거래 지연 문제가 발생했습니다. 블록체인 원장은 초당 약 20건의 트랜잭션 처리 제약이 있었으므로, 거래소 엔진 자체를 최적화하여 블록체인이 병목이 되더라도 거래소 측 처리는 빠르게 동작하도록 시스템을 설계했습니다.

주요 구현

  • 실시간 거래량 증가에 대응하기 위해 Red-Black Tree 기반 주문 매칭 엔진을 선택하여 효율적인 주문 처리를 구현했습니다.
  • 블록체인과 앱 간 통신은 메시지 큐로 처리하고, 앱 내부의 트랜잭션 작업은 NestJS EventEmitter로 처리하는 이중 레이어 이벤트 아키텍처를 설계했습니다.
  • 이벤트 손실 방지를 위해 상태 커밋(체크포인트) 패턴을 적용하여 처리 완료 시점을 명시적으로 기록했습니다.
  • 종목별로 독립적으로 확장 가능한 아키텍처를 설계하여, 특정 종목의 거래량 증가 시 해당 종목만 스케일 아웃 가능하도록 했습니다.

성과

  • 거래소 엔진 처리 속도를 최적화하여 블록체인 원장의 초당 20건 제약 상황에서도 거래소 측은 빠르게 동작 가능하도록 구현했습니다.
  • 메시지 큐와 내부 EventEmitter의 역할 분리로 블록체인 장애 시에도 앱 내부 트랜잭션 정합성을 유지했습니다.
  • 상태 커밋 패턴으로 이벤트 손실 없이 블록체인-거래소 간 상태 동기화를 보장했습니다.
  • 종목별 독립 실행 가능한 구조로 특정 종목의 트래픽 급증 시에도 다른 종목 거래에 영향을 주지 않도록 격리했습니다.

비트맥스(맥스트) 주식회사

2023-04 ~ 2024-03

"틀로나"는 현실 세계를 기반으로 한 메타버스 플랫폼으로, 사용자가 가상 공간과 토지를 소유하고 다른 사용자들과 소통할 수 있습니다. 초기 개발 단계에서 각 기능이 분리되지 않아 작은 기능 수정에도 시간이 오래 걸렸고, 한 기능을 수정하면 다른 기능에 영향을 주어 개발 속도가 저하되는 문제가 있었습니다. 파트장으로서 이 문제를 해결하기 위해 도메인 중심 설계를 도입하여 회원 관리, 가상 아이템 상점, 토지 소유권 관리 등의 핵심 시스템을 독립적인 모듈로 개발하고 API로 제공했습니다.

주요 구현

  • 기획 요구사항이 자주 변경되어 개발 방향이 불명확해지는 문제가 있었으므로, 파트장으로서 기획팀과 긴밀히 소통하며 개발 방향을 정립하고 팀원들에게 명확하게 전달하여 혼선을 줄였습니다.
  • 기능 간 의존성이 높아 한 기능 수정 시 다른 기능에 영향을 주었으므로, 상점, 우편함, 인벤토리, 지갑, 토지 관리 등 핵심 기능을 도메인 중심으로 분리하여 독립적으로 개발 및 배포할 수 있도록 설계했습니다.
  • 기능 변경 시 예상치 못한 버그가 발생하여 안정성을 보장하기 어려웠으므로, 핵심 기능에 대한 단위 테스트를 구축하여 변경 영향을 사전에 감지할 수 있도록 했습니다.
  • 운영 중 발생하는 이슈를 늦게 발견하여 대응이 지연되었으므로, 실시간 모니터링 시스템을 도입하여 팀원들이 이슈를 신속하게 감지하고 대응할 수 있도록 했습니다.

성과

  • 도메인 설계 도입 후, 팀원들의 작업 브랜치 병합 주기가 7일 이상에서 1-2일로 단축되었습니다.
  • 전체 개발팀 중 가장 느린 파트에서 가장 빠른 파트로 전환되었습니다.
  • 테스트 용이한 구조를 확보하여 2주간의 클로즈 베타 테스트 동안 웹 서버 로직 관련 버그 리포트가 0건으로 유지되었습니다.

개발 과정에서 기획자들의 잦은 데이터 수정 요청으로 인해 개발 서버가 불안정해지는 문제가 발생했습니다. 이를 해결하기 위해 다른 팀 개발자가 CSV 파일을 통한 데이터 수정 기능을 구현했고, 저는 각 팀원이 독립적으로 개발 서버를 운영할 수 있도록 컨테이너화를 진행했습니다.

주요 구현

  • 기획자들이 개발 서버에서 직접 데이터를 수정하면서 다른 개발자의 테스트 환경이 영향을 받았으므로, 실시간 멀티플레이어 동기화 서버, 비동기 웹서버, 데이터베이스, 캐시 시스템을 컨테이너화하여 각자 독립된 환경에서 작업할 수 있도록 했습니다.
  • 기획자가 데이터를 수정할 때마다 개발팀에 요청해야 하는 번거로움이 있었으므로, 컨테이너 실행 시 로컬 CSV 파일을 읽어 독립적인 서버 환경을 자동으로 구성하는 스크립트를 개발하여 기획자가 직접 데이터를 수정하고 테스트할 수 있도록 했습니다.
  • 새로운 도구의 사용법을 모르면 활용도가 떨어지므로, 팀 내에 '로컬 서버' 기능의 도입 목적을 공유하고 상세한 사용 매뉴얼을 작성하여 즉시 활용 가능하도록 했습니다.

성과

  • 기획자들이 독립된 환경에서 자유롭게 데이터를 수정하고 테스트할 수 있게 되었습니다.
  • 개발팀이 기획팀의 데이터 수정 요청 처리에 투입되는 시간을 절감했습니다.

(주) 웨어밸리

2020-01 ~ 2023-04

[2인 프로젝트] 대기업 고객사가 타사 솔루션에서 자사 제품으로 전환하면서, 약 2천대의 데이터베이스에 적용된 5천여 개의 보안 정책을 이관해야 하는 상황이 발생했습니다. 정책의 규모가 수동 이관이 불가능한 수준이었기 때문에, 데이터 분석을 통한 자동화된 정책 생성 솔루션이 필요했습니다.

주요 구현

  • 타사 솔루션 정책 분석 및 자사 솔루션 정책 매핑 로직 개발
  • 정책 무결성 검증 보고용 데이터 쿼리 작성 (100% 검증)

성과

  • 5,000개 정책 100% 이관 및 무결성 검증 완료
  • 타사 솔루션 마이그레이션 선례 확립

[개발팀 전체 약 20명 참여] 보안 제품을 공공기관에 납품하려면 CC 인증이 필요합니다. 이에 따라 새로운 제품의 개발 마지막 단계에서 CC 인증을 진행했습니다. 인증 평가 항목에는 프로그램 덤프 생성 시 비밀 정보가 평문으로 남아있는지, 검증된 암호화 알고리즘을 사용하는지, OS 의존성을 최소화한 상태에서 동작할 수 있는지, 키 관리를 안전하게 수행하는지 등이 포함되며, 다양한 측면에서 평가가 이루어졌습니다.

주요 구현

  • Jenkins 기반 빌드-설치 자동화 스크립트 개발 및 팀에 공유
  • 인증 심사자와 지속적으로 소통하며 CC 요건 이해 및 기술 구현 방식 설명
  • 서버/엔진 개발자, QA팀과 협업하여 자동화 환경 구축
  • OS 독립적 데몬 컨트롤러 설계 및 개발 (C/C++)
  • CI/CD 파이프라인 개선으로 개발 속도 향상

성과

  • 빌드 후 무인 설치 환경 구축으로 하루 5-20분 작업 시간 제거
  • 자동화 스크립트가 기술지원팀 도구로 확장되어 고객사 기술지원에 활용
  • 메모리 보안 루틴 및 OS 독립적 데몬 관리로 CC 인증을 획득해 공공기관 납품 요건을 충족
  • 내부망에 최신 빌드 자동 배포로 개발 프로세스 효율화

[3~4인 팀(주 개발자 + 부 개발자 + 엔지니어)] 고객사의 인사 정보를 자사 제품의 사용자 계정과 연동하는 커스터마이징 프로그램을 개발했습니다. 각 고객사별로 특정 부서 사용자 동기화, 휴직자 계정 비활성화 등 다양한 요구사항이 있었습니다. 고객사에 따라 수백~수천 명 규모의 인력이 있어, 입·퇴사·발령마다 DB 접근 권한을 수작업으로 관리하기엔 운영 부담과 권한 누락 위험이 컸습니다. 이를 위해 요건 분석부터 개발, 배포, 운영까지 전체 프로세스를 담당했습니다.

주요 구현

  • 고객사 DB 접근 관리자와 직접 인터뷰하여 사용자 라이프사이클 관리 요구사항 파악 (계정 추가/비활성화/제거 시점)
  • 대화를 통해 단순 기능 요청 이면의 보안 감사 요건과 내부 규정 발견 및 이해
  • 고객사별 차별화된 정책 구현 (예: A사 - 퇴사자 즉시 삭제, B사 - 임시 그룹 이동 후 수동 처리)
  • 고객사별 코드베이스 개발 및 형상 관리를 통한 맞춤형 솔루션 제공
  • 연동 프로그램 유지보수 및 기술 지원 지속 제공

성과

  • 고객사별 보안 정책과 규정을 충족하는 안정적인 인사 연동 시스템 구축
  • 안정적인 운영으로 고객사 신뢰 확보
  • 맞춤형 솔루션 제공을 통한 추가 수익 창출 기여
  • 고객사 요구사항 대응 역량 확보