메인 콘텐츠로 이동하기

Portfolio

백엔드 중심 풀스택 개발자 · 라이브 서비스 운영 도구와 외부 연동 자동화

Introduction #

약 5년간 게임, 금융, AI, 광고 서비스에서 운영 도구와 사용자 대면 서비스를 API 백엔드부터 운영자 화면까지 풀스택으로 만들어 왔습니다. 라이브 게임 운영 어드민에서는 권한·대용량 조회·예약 작업을 한 도구로 모았고, 광고 서비스에서는 운영부서와 개발팀이 콘솔과 DB를 오가며 처리하던 매체 연동 수작업을 자동화해 인계 자체를 없앴습니다. 그러면서 서비스는 대체로 코드가 틀려서가 아니라 사람과 시스템 사이의 인계가 끊기는 지점에서 흔들린다는 것을 배웠습니다.

그래서 반복해서 해 온 일은 세 가지입니다. 첫째, 참여자와 변경 가능한 시점이 서로 다른 업무를 하나의 상태 흐름으로 잇는 일. 둘째, 외부 API와 내부 DB를 한 트랜잭션으로 묶을 수 없을 때 부분 실패와 보상, 사람이 개입할 경계를 명시하는 일. 셋째, 애플리케이션 바깥의 DB·네트워크·인프라 지표까지 함께 놓고 장애 가설을 좁히는 일입니다.

새로운 기술은 PoC로 지금 환경에 맞는지 먼저 확인하고, 선택 근거와 검증 결과, 롤백 기준을 문서로 남겨 다음 사람이 같은 맥락에서 이어가도록 합니다. 최근에는 AI 에이전트를 단순 코드 생성기가 아니라 얇은 공통 규칙, 저장소별 맥락, branch 작업 로그와 사람의 리뷰를 결합한 개발 시스템으로 사용하고 있습니다.

주력 언어는 Node.js와 TypeScript이며, Java/Spring과 Python으로도 서비스를 설계하고 운영했습니다. 오래 이어져 온 라이브 서비스의 웹·운영 도구에서 기능뿐 아니라 운영 맥락과 실패 복구 기준까지 함께 설계하는 역할을 하고 싶습니다. 기능 구현과 운영 유지에 머무르지 않고 시스템 설계와 확장성 결정에 더 깊이 관여하는 환경을 다음 단계로 보고 있습니다.


Tech Stack #

사용해 본 기술을 한 줄에 나열하는 대신 숙련도로 구분했습니다. 직접 설계하고 장애를 추적해 본 기술과 사용 경험만 있는 기술은 채용 판단에서 다르게 읽혀야 한다고 생각하기 때문입니다.

구분 기술
주력 · 3년 이상, 실무 설계·트러블슈팅 TypeScript · JavaScript · Node.js · NestJS · Java · Spring · PostgreSQL
실무 경험 · 프로젝트 투입 수준 Python · FastAPI · Redis · MariaDB · MikroORM · Kysely · MyBatis · AWS (EC2 · S3 · ELB · Route53 · CloudFront) · Docker · GitHub Actions · GitLab CI/CD
보조 경험 · 사용 경험 있음 Nuxt.js · Vue.js · React · Next.js · Hono.js · Cloudflare Workers · Flask · BullMQ · InfluxDB · Telegraf · Grafana · Prometheus · Jenkins
AI · 협업 도구 AGENTS 문서 규칙 · Git Hooks 작업 로그 · 에이전트 스킬 · MCP 플러그인 · dry-run/승인/검증 가드레일

Career Highlights #

(주)퍼포먼스바이티비더블유에이 #

플랫폼 개발자 (주임연구원) · 2025.06 - 재직 중

  • Spring/JSP 기반 B2C 광고 CM에서 광고 생성·결제·검수·송출·전환 추적으로 이어지는 상태 흐름과 외부 매체 연동, 결제·마일리지, 리포트·웹/앱 추적 화면 개선·개발
  • 운영부서와 개발팀이 수동으로 주고받던 YouTube Demand Gen 연동을 FastAPI 기반 백엔드에서 리소스 생성·DB 연결·전환 추적 생성까지 자동화하고 부분 실패의 보상·복구 경계 설계
  • B2B 광고 CM에서 Google Authorized Buyer API 연동으로 소재 승인 상태·정책 위반 사유를 서비스 안에서 조회하도록 연결하고, S3 presigned URL 기반 파일 다운로드 전환과 MyBatis 레이어 리팩토링 수행
  • NestJS·BullMQ 기반 광고 예산 소진 알림 백엔드를 신규 설계·구축하고 GitHub Actions 배포 자동화 구성
  • 사내 NestJS 백엔드 표준 템플릿을 DDD·모노레포 구조로 설계하고, AI·에이전트 개발 가이드 문서화 및 GTM 에이전트 플러그인 개발

(주)알타바그룹 #

백엔드 개발자 · 2025.04 - 2025.06

  • AI 기반 3D 패션 플랫폼의 Node.js/Cloudflare Serverless 백엔드 개발
  • SSE 실시간 스트림과 주간 랭킹·보상 배치 분리, Kysely 기반 쿼리 최적화와 JavaScript → TypeScript 점진적 마이그레이션
  • 주간 디자인·유저 랭킹 배치 스케줄러의 실행 조건을 dev/live 환경별로 분리하고 수동 실행 플래그와 Slack 알림을 추가해 배치 운영 제어 세분화

(주)웹젠 #

백엔드 개발자 (선임) · 2021.04 - 2023.05

  • Nuxt.js 기반 라이브 게임 운영 어드민의 세션·권한, 대용량 CSV 스트리밍 다운로드, 우편·공지 예약 작업 스케줄러·워커 분리 개발 및 Docker/GitLab CI/CD 배포 자동화
  • 라이브 게임 서비스의 서버 메트릭 수집·시각화 모니터링 시스템 설계·구축과 FastAPI 기반 채널별 알림 백엔드 개발

알파브릿지 #

백엔드 개발자 · 2020.03 - 2021.03

  • Flask 기반 투자 아이디어 플랫폼(탱고픽) RESTful API 설계·구축과 Express.js/GraphQL 어드민 서버 개발
  • AWS 인프라와 Jenkins/Docker 배포 자동화, Grafana/Prometheus 대시보드 구성

1. 라이브 게임 운영 어드민 #

(주)웹젠 · 2021.05 - 2023.05 · Nuxt.js 기반 게임 운영툴 및 예약 작업 스케줄러
Nuxt.js Vuex Node.js Redis Docker Nginx

라이브 게임 운영 조직은 게임 서버 데이터 조회, 권한별 운영 작업, 우편·공지 예약처럼 성격이 다른 작업을 하루에도 여러 번 반복합니다. 기존에는 이런 기능이 여러 도구에 흩어져 있어 운영자가 작업마다 다른 화면을 오가야 했고, 어떤 담당자가 어떤 서비스의 데이터를 볼 수 있는지가 도구 수준에서 명확히 관리되지 않았습니다. 서비스와 담당자가 늘어날수록 권한 경계와 성능 문제가 함께 커지는 구조였습니다.

모든 기능을 한 프로세스에 모으는 대신 작업의 성격에 따라 실행 경계를 나눴습니다. 게임 서비스별·역할별 권한 로직을 구현하고 인증·인가는 Redis 세션 저장소로 통합했습니다. 컴포넌트와 페이지 구성을 세분화하고 Vuex의 중앙 상태와 화면별 상태 사용 범위를 구분했으며, API 통신 대상은 Nuxt proxy 계층에서 분리해 화면이 서비스별 백엔드 주소 차이를 직접 다루지 않도록 정리했습니다.

대용량 CSV 다운로드는 백엔드가 행 데이터를 순차 생성해 스트리밍으로 응답하고 프론트엔드는 브라우저 기본 다운로드를 트리거하도록 전환했습니다. 전체 파일이 완성될 때까지 서버 메모리와 요청을 붙잡던 구조를 생성·전송이 이어지는 흐름으로 바꾸면서 운영자의 다운로드 인터페이스는 유지했습니다. 프로젝트 기록 기준으로 요청 처리 시간은 평균 5초에서 1초로, 평균 메모리 사용량은 40% 이상 줄었습니다.

우편과 공지처럼 예약 실행이 필요한 작업은 Node.js 스케줄러 데몬으로 분리했습니다. 예약 요청과 실행 상태를 Redis에 기록하고, 스케줄러는 실행 시점 판단만 담당하며 워커가 실제 비즈니스 로직을 수행하도록 나눴습니다. 같은 기록 기준으로 스케줄링 작업 시간은 평균 10초에서 3초로 단축됐습니다. 운영 도구를 CRUD 화면의 모음이 아니라 라이브 서비스의 권한·데이터량·실행 시점을 통제하는 시스템으로 설계하고, 프론트엔드 상태 관리부터 백엔드 스트리밍과 배치 실행까지 풀스택으로 담당했습니다.

2. 해외 라이브 게임 간헐적 끊김 원인 분석 #

(주)웹젠 · 2021.04 - 2023.05 · 라이브 서비스 모니터링 시스템 설계 및 구축
Telegraf InfluxDB Grafana Docker Python Bash

해외 클라우드 환경에서 서비스한 게임에 간헐적인 연결 끊김이 보고됐지만 재현되지 않고 특정 요청에 몰리지도 않아 애플리케이션 로그만으로는 원인 구간을 특정하기 어려웠습니다. 단발성 재현에 매달리는 대신 애플리케이션과 인프라 구간을 데이터로 분리하는 쪽을 택했습니다.

후보 스택을 PoC로 비교하고 실제 사용자인 서버 담당자의 피드백을 받아 Telegraf, InfluxDB, Grafana 조합을 선정했습니다. 중앙에서 Agent를 일괄 배포하는 대신 Windows/Linux 환경별 수집 Agent 빌드와 설치·운영 가이드를 제공해 서버 담당자가 직접 배포하고 동일한 수집 기준을 적용할 수 있게 했습니다. 국가별 독립 구축이 가능하도록 Docker 기반 논리 서버를 구성하고 Grafana 이미지 렌더러와 알림 서버를 연동해 채널별 알림 라우팅까지 연결했습니다.

수집한 시스템 메트릭에서 DB 서버의 네트워크 계층 지연이 간헐적으로 튀는 구간을 확인해 원인 범위를 애플리케이션이 아니라 클라우드 제공자 구간으로 좁혔습니다. 이 데이터는 게임 운영·개발 조직이 인프라 변경을 판단하는 근거가 됐고, 제공자를 변경한 뒤 같은 대시보드에서 현상이 해소된 것을 확인했습니다.

3. B2C 광고 CM 개선·개발 #

(주)퍼포먼스바이티비더블유에이 · 2025.06 - 진행 중 · Spring/JSP 기반 광고 캠페인 매니저
Java Spring JSP MyBatis MariaDB RESTful API

광고 하나가 실제 성과로 이어지기까지는 생성, 결제, 운영 검수, 승인, 송출, 전환 추적 단계를 지납니다. 각 단계의 주체와 변경 가능한 시점이 달라 화면·테이블·연동별로 상태를 따로 관리하면 같은 광고를 두고 광고주 화면과 운영 화면의 상태가 달라지고 후속 작업의 시작 기준도 불명확해집니다.

광고 승인은 운영자의 판단이 필요한 업무이므로 이를 없애는 대신, 사람이 판단해야 하는 단계와 시스템이 일관되게 이어야 하는 단계를 구분했습니다. 광고 작성 중에는 단계별 입력을 검증하면서 수정 가능성을 보장하고, 결제 이후에는 승인 정보와 이력을 기준으로 상태를 전환하도록 광고의 생명주기 중심으로 분기를 정리했습니다.

광고 생성 화면을 생성·수정 모드와 단계별 입력 구조로 재구성하고 카테고리·매체·채널, 지역, 요일·시간, 예산, 브랜드 정보, 소재 파일과 링크를 단계별로 검증했습니다. 결제 영역은 결제 유형별 처리, 마일리지와 보류 마일리지 계산, 부족 금액 추가 결제, 관리자 결제 조회·콜백으로 분리하고, 결제 성공 시 소재 승인 맵과 승인 요청 메일, 승인·반려·재심사 이력이 운영 화면으로 이어지도록 구성했습니다.

외부 매체의 승인 상태와 정책 위반 사유는 CM 캠페인·소재 화면에서 직접 확인하고 수정할 수 있도록 외부 API와 연결했습니다. 송출 이후에는 전환 대시보드와 웹·앱 트래킹 픽셀 관리 화면을 구축하고, 리포트에는 다중 시트와 이중 헤더를 지원하는 재사용 엑셀 유틸을 적용해 화면 조회와 다운로드가 같은 기준을 사용하도록 했습니다. 레거시 서비스는 전면 재작성하지 않고 작업이 닿는 범위에서 상태 흐름과 구조를 정리했습니다.

4. 광고 매체 연동 자동화 (YouTube Demand Gen) #

(주)퍼포먼스바이티비더블유에이 · 2026.02 - 진행 중 · 외부 매체 연동 API
Python FastAPI Google Ads API MariaDB Slack

기존 YouTube Demand Gen 연동은 운영부서가 외부 콘솔에서 리소스를 만들고 생성 ID를 개발팀에 전달하면 개발팀이 DB 연동 데이터와 리포트용 전환 추적 데이터를 설정하는 수동 릴레이에 의존했습니다. 중간 오류가 발생하면 양쪽 시스템의 상태를 대조해 사람이 정리해야 했고, 리소스 삭제도 콘솔에서 하나씩 처리했습니다.

광고 승인 자체는 자동화 대상에서 제외하고 B2C CM의 운영 검수 절차로 유지했습니다. 운영자가 광고를 승인해 매체가 YouTube로 확정되고 더 이상 변경할 수 없는 시점부터 FastAPI 기반 연동 백엔드가 동작하도록 경계를 설정했습니다.

정상 흐름에서는 에셋 → 잠재고객 → 예산 → 캠페인 순서로 외부 리소스를 생성하고 각 단계에서 반환된 ID를 다음 요청과 내부 DB 연동에 사용했습니다. 캠페인 생성 후 보고서에 필요한 전환 추적 데이터도 함께 생성했습니다. 외부 API 리소스와 내부 DB를 하나의 트랜잭션으로 묶을 수 없기 때문에 중간 실패 시 캠페인 → 예산 → 잠재고객 → 에셋의 역순으로 삭제하는 compensating transaction을 적용했습니다.

보상 트랜잭션까지 실패한 경우 무리한 재시도 대신 DB에 실패 상태를 기록하고 Slack으로 통지해 사람이 외부 콘솔에서 복구하도록 했습니다. 그 결과 외부 리소스 생성부터 DB 연동과 전환 추적 데이터 생성까지 이어지고, 운영부서와 개발팀 사이의 콘솔 작업·ID 전달·DB 수동 세팅 인계가 사라졌습니다.

5. AI 개발 가드레일과 협업 맥락 전승 #

(주)퍼포먼스바이티비더블유에이 · 2025.12 - 진행 중 · AI·에이전트 개발 가이드 및 플러그인
AGENTS 문서 규칙 Git Hooks 에이전트 스킬 MCP 플러그인 GTM API

팀에서 AI 코딩 도구를 쓰는 방식은 사람과 프로젝트마다 달랐습니다. 강한 단일 규칙은 각자의 작업 방식을 해치고, 규칙이 없으면 에이전트가 만든 코드의 판단 근거가 남지 않습니다. 그래서 특정 에이전트 플랫폼을 강제하지 않고 어떤 도구·플러그인과도 얇게 결합하는 공통 가드레일을 설계했습니다.

공통 계층에는 Git commit·PR 지침처럼 도구와 무관한 최소 규칙을 두고, 서비스·저장소 계층에는 프로젝트 구조와 특성 문서를 코드 가까이에 배치했습니다. Bash·PowerShell 설치 스크립트에는 복구 모드와 dry-run을 넣고 JSON 기반 에이전트 맵, Git Hooks 설치와 설정 파일 관리를 포함했습니다.

오케스트레이션 에이전트가 worktree나 feature branch에서 작업하는 동안 변경 파일, 선택 근거, 필요 시 흐름 다이어그램과 롤백 가이드를 branch 작업 로그에 기록하도록 했습니다. 로그는 코드와 함께 커밋되어 다른 팀원과 그 팀원의 에이전트가 이전 작업의 맥락과 의도를 확인하고 이어갈 수 있습니다.

반복되는 GTM 설정 작업은 개발팀용 에이전트 플러그인으로 구성했습니다. 요청·스캔·입력 대기·계획 준비·승인·정책 차단·적용·검증·검토 필요 상태를 정의하고, 승인 바인딩과 allowlist·승인된 템플릿·소유 리소스 검증을 통과해야 다음 단계로 진행하도록 했습니다. 적용 전 dry-run과 적용 후 검증을 거치되 실제 배포는 사람이 Preview에서 확인 후 결정합니다. 현재 개발팀이 사용하며 계속 업데이트하고 있습니다.

6. 광고 예산 알림 백엔드 #

(주)퍼포먼스바이티비더블유에이 · 2025.08 - 2026.02 · NestJS 기반 알림 서버
NestJS TypeScript BullMQ Redis MikroORM GitHub Actions

광고는 예산이 소진되면 송출이 멈추기 때문에 운영팀이 소진 시점을 늦게 알수록 손실이 커집니다. 초기 구조는 스케줄러가 Slack 발송까지 직접 처리해서 발송이 실패해도 재시도가 없었고, 알림이 늘어나면 스케줄러 실행 자체가 지연될 수 있었습니다.

실행 시점 판단과 발송 처리를 분리했습니다. 스케줄러는 이벤트를 발행하고 BullMQ 이벤트 리스너와 processor가 실제 발송을 담당하도록 전환하면서 실패 재시도와 로깅을 붙였습니다. Slack 메시지 포맷터, 채널 판단, 블록 구성은 별도 모듈로 나눠 이후 알림 채널이 추가되어도 발송 흐름 자체는 바뀌지 않도록 했습니다.

예산 리포트는 Redis pipeline으로 광고그룹·광고 단위 집계를 조회하고, 데이터 이상으로 NaN이나 null이 들어오면 0을 반환하는 방어 로직을 넣어 운영 화면에 계산 불능 값이 노출되지 않도록 했습니다. ABI·Addirect 기준으로 DB가 나뉘어 있어 MikroORM 다중 연결과 RequestContext 수동 관리를 적용했습니다. 배포는 GitHub Actions에서 PM2 재시작과 SSH 접근 제어, AWS Security Group 동적 추가·삭제까지 자동화해 수동 배포 절차를 없앴습니다.

7. 사내 백엔드 표준 템플릿 #

(주)퍼포먼스바이티비더블유에이 · 2026.01 - 2026.03 · NestJS 기반 사내 표준 템플릿
NestJS TypeScript Fastify MikroORM Redis pnpm workspace

새 서비스를 시작할 때마다 설정, 로깅, 예외 처리, 응답 규격을 매번 다시 정하고 있었습니다. 프로젝트마다 구조가 달라지면 팀원이 서비스를 옮겨 다닐 때 코드보다 구조를 먼저 파악해야 하고, 그 비용은 서비스가 늘어날수록 커집니다.

문서로 규칙을 정하는 대신 실행 가능한 골격을 만들었습니다. ConfigModule, Fastify, Swagger, MikroORM, Redis, pino 로깅, 공통 응답·예외 처리를 하나의 동작하는 프로젝트로 구성하고, pnpm workspace 기반 apps/packages 구조로 전환해 api와 worker 런타임을 분리할 수 있게 했습니다.

이후 shared-kernel, contracts, messaging, persistence 패키지와 ordering bounded context를 조합해 DDD 기반 단일 서비스 템플릿으로 발전시키고, 외부 시스템과의 메시지 정합성이 필요한 경우를 위해 outbox/inbox 예시 흐름을 포함했습니다. README와 extension guide는 구현 진행에 맞춰 갱신해서, 템플릿을 그대로 쓰는 경우와 확장하는 경우의 기준을 팀이 같은 문서에서 확인하도록 했습니다.

8. 개인 일정 공유 플랫폼 (Wydt) #

개인 프로젝트 · 2024.08 - 2024.11 · Next.js/React 기반 풀스택 웹 서비스
React Next.js React Query Zustand Supabase TypeScript Jest

초기 UI 목업을 실제 일정 공유 서비스로 발전시키기 위해 로그인한 사용자 식별, 사용자별 일정 조회, 필터·태그 탐색, 생성·수정·삭제 결과의 일관된 화면 반영, 외부 공유 페이지의 메타데이터 경로가 필요했습니다.

기능을 한꺼번에 늘리지 않고 인증과 사용자 조회를 먼저 구성한 뒤 일정 조회·필터·태그, 생성·수정·삭제 상호작용 순서로 확장했습니다. 서버에서 가져오는 원격 데이터와 모달·필터 같은 클라이언트 화면 상태는 변화의 성격이 다르다고 보고 React Query의 query logic과 Zustand 상태 관리를 역할별로 분리했습니다.

Next.js App Router와 Supabase 기반 인증 라이브러리 및 OAuth callback route를 구성했습니다. 공유 페이지는 화면 렌더링 결과에 의존하지 않고 사용자 요약 정보를 조회하는 별도 API route에서 OG 메타데이터를 생성하도록 분리했습니다. ESLint·Prettier, Jest 테스트 환경과 commit message validation도 설정해 기능이 늘어나도 코드 형식과 변경 기록이 일관되도록 했습니다.

9. AI 3D 패션 플랫폼 백엔드 #

(주)알타바그룹 · 2025.04 - 2025.06 · Cloudflare Serverless 기반 플랫폼 API
Hono.js Cloudflare Workers Cloudflare D1 Kysely TypeScript Zod

AI로 3D 패션 디자인을 만들고 공유하는 플랫폼의 기존 백엔드는 JavaScript로 작성되어 있었고, 서비스가 커지면서 타입 안전성과 쿼리 최적화 요구가 함께 높아졌습니다. 전체를 한 번에 전환하는 대신 새 코드는 TypeScript로 작성하고 기존 코드는 작업이 닿는 범위에서 순차 전환했습니다.

Cloudflare Workers와 D1 환경에서 Kysely 쿼리 빌더를 도입하고 D1 Batch API로 쿼리 실행을 최적화했습니다. 사용자·디자인 랭킹과 세션 기반 포인트 계산, 다국어(i18n) DB 구조와 API, 뉴스 콘텐츠 API를 개발하고 SSE 기반 실시간 스트림 엔드포인트를 구현했습니다.

실시간 이벤트와 주기적 집계는 서비스 자체를 분리했습니다. 별도 스케줄러 서비스에서 주간 디자인·사용자 랭킹 배치를 처리하고 Slack 알림과 dev/live 환경별 메시지 라우팅을 구성해 배치 결과를 운영자가 바로 확인할 수 있도록 했습니다.


Open Source & Side Projects #

업무 외에 직접 만들어 공개한 프로젝트입니다. 자세한 기록은 Projects에 있습니다.

프로젝트 설명 기술
beerjoa/skills npx skills add beerjoa/skills로 배포되는 에이전트 스킬 오버레이 팩. PR 리뷰, 커밋 작성, 프로젝트 기여도 추출, Bruno API 컬렉션 생성 등 7개 스킬 Node.js · TypeScript
express-sequelize-ts Passport JWT 인증, refresh token, routing-controllers, TypeDI, E2E 테스트를 포함한 백엔드 보일러플레이트 Node.js · TypeScript · Express · Sequelize
fastapi-postgresql-boilerplate async DB session, 토큰 인증, x-request-id 요청 추적을 포함한 FastAPI 보일러플레이트 Python · FastAPI · PostgreSQL
udemy-custom-api cron/axios 기반 Udemy 강의 조회, Passport/JWT 인증, 할인 상태 조회 API NestJS · MongoDB · TypeScript
wydt 개인 일정 공유 플랫폼 Next.js · Supabase
plgd 개인 프로젝트 쇼케이스

Education #

한국외국어대학교(용인) · 정보통신공학과 · 2010.03 - 2020.02

인공지능 자연어처리 기반 기업 데이터 분석 과정 · 2019.05 - 2019.11 · 920시간

Jaeyong Shim
글쓴이
Jaeyong Shim
라이브 서비스 운영 도구와 외부 시스템 연동 👨‍💻