김형동

김형동

풀스택 개발자 (Node.js, NestJS)

교육 플랫폼 회사의 유일한 개발자로 백엔드, 웹, 주문 사이트를 운영하고 있습니다. 구현에는 AI 코딩 에이전트를 활용하고, 설계와 코드 리뷰, 배포는 직접 합니다. 인수한 시스템을 감사해 보안 문제들을 찾아 조치했습니다.

개인 작업으로는 AI 에이전트와 함께 Unity 게임을 만듭니다. 퇴근 직전 "한 장만 더"를 반복하는 회사원을 그린 인크리멘털 게임 Just One More Sheet의 Steam 출시를 준비하고 있습니다(상점 페이지).

1,027건
입사 후 회사에서 머지한 PR
396개
직접 감사한 API 라우트
1,200여 건
실제 DB로 도는 통합 테스트
6년+
개발과 네트워크 실무

프로젝트

현 직장에서 한 일 2개, 개인 프로젝트 3개, 이전 직장 서비스 2개입니다. 흐름도의 파란 상자는 직접 확인하는 단계, 굵은 테두리 상자(중심)는 핵심 구성 요소입니다.

AI 에이전트와 혼자 개발하기

현 직장2026.07 –

혼자 여러 서비스를 운영하기 위해 만든 개발 흐름입니다. 에이전트가 브랜치에서 코드를 작성하고, 자동 리뷰와 테스트를 통과한 PR을 제가 리뷰한 뒤 머지합니다.

입사 후 주별 머지 PR

아래: 회사 저장소 1,027건위: 개인 프로젝트 1,155건
입사 후 주별 머지 PR 2026-07-15부터 2026-11-08까지 주별 머지 PR. 회사 저장소 1,027건, 개인 프로젝트 1,155건. 100 200 300 400 7월 7/27–8/2: 회사 5, 개인 0 8월 8/3–8/9: 회사 6, 개인 0 8/10–8/16: 회사 8, 개인 29 8/10–8/16: 회사 8, 개인 29 8/17–8/23: 회사 81, 개인 108 8/17–8/23: 회사 81, 개인 108 8/24–8/30: 회사 64, 개인 56 8/24–8/30: 회사 64, 개인 56 8/31–9/6: 회사 86, 개인 77 8/31–9/6: 회사 86, 개인 77 9월 9/7–9/13: 회사 100, 개인 293 9/7–9/13: 회사 100, 개인 293 9/14–9/20: 회사 203, 개인 74 9/14–9/20: 회사 203, 개인 74 9/21–9/27: 회사 59, 개인 68 9/21–9/27: 회사 59, 개인 68 9/28–10/4: 회사 78, 개인 61 9/28–10/4: 회사 78, 개인 61 10월 10/5–10/11: 회사 105, 개인 65 10/5–10/11: 회사 105, 개인 65 10/12–10/18: 회사 87, 개인 101 10/12–10/18: 회사 87, 개인 101 10/19–10/25: 회사 49, 개인 74 10/19–10/25: 회사 49, 개인 74 10/26–11/1: 회사 59, 개인 75 10/26–11/1: 회사 59, 개인 75 11월 11/2–11/8: 회사 37, 개인 74 11/2–11/8: 회사 37, 개인 74 8월 중순 개발 방식 도입 회사 203
표로 보기
주회사개인
7/15–7/1900
7/20–7/2600
7/27–8/250
8/3–8/960
8/10–8/16829
8/17–8/2381108
8/24–8/306456
8/31–9/68677
9/7–9/13100293
9/14–9/2020374
9/21–9/275968
9/28–10/47861
10/5–10/1110565
10/12–10/1887101
10/19–10/254974
10/26–11/15975
11/2–11/83774

8월 중순 이 방식이 자리 잡은 뒤로 회사 저장소에서만 주당 37건에서 203건을 머지했습니다. GitHub 검색으로 센 값입니다(2026-07-15 ~ 2026-11-08).

에이전트가 작성브랜치와 PR 단위로
자동 리뷰고친 뒤 다시, 최대 4회
테스트와 CI실제 DB 통합 테스트
제가 확인읽고 머지설계와 위험을 판단
dev 자동 배포운영은 제가 올림
387 → 278
물려받은 일감 정리
6개
그 감사에 쓴 에이전트
문제
비공개 저장소의 CI가 GitHub 호스팅 러너의 과금 한도를 다 써서, 작업이 러너를 받지 못하고 멈췄습니다.
해결
10여 개 저장소의 CI를 직접 관리하는 러너로 옮기고, 슬롯 격리와 디스크 정리를 붙였습니다.

운영 규칙

  • 수정을 되돌렸을 때 실패하는지 확인한 테스트만 인정합니다.
  • 비밀값 파일 읽기는 막고, DB 실행 같은 명령은 확인을 거치도록 에이전트 권한을 설정했습니다.
  • 여러 에이전트가 같은 저장소에서 동시에 작업할 때 충돌하지 않도록 규칙을 정했습니다.

성과

  • 인수한 일감 387건을 에이전트 6개로 나눠 소스와 대조해 278건으로 정리했고, 이 과정에서 보안 결함을 발견했습니다.
Claude CodeGitHub ActionsSelf-hosted RunnerNestJSPostgreSQL

물려받은 시스템 보안 감사

현 직장2026.07 –

인수한 백엔드와 인프라를 점검해 운영 중이던 보안 문제를 찾아 조치했습니다. API는 396개 라우트를 전수 감사했습니다.

발견로그인 없이 쓰는 가입 API가 역할 값을 검사 없이 받아 줌
제가 확인피해 여부 확인운영 관리자 계정이 어디서 생겼는지 전부 추적, 악용 없음
차단권한 검사를 한 곳으로 모으고, 빠뜨리면 컴파일이 안 되게
제가 확인차단 검증수정을 되돌리면 통합 테스트 19건 중 13건 실패

공개 가입 API의 권한 상승 결함을 처리한 과정입니다.

문제
주문 사이트의 공개 가입 API가 역할 값을 받아 내부 gRPC로 넘겼고, 백엔드는 호출자 정보가 없는 호출에서 권한 검사를 건너뛰었습니다.
해결
호출자 인자를 필수로 바꾸고, 주문 백엔드의 가입 요청 DTO에서도 역할(role) 필드를 없애 두 겹으로 막았습니다.

API 권한 검사 감사

검사 없던 라우트
69%
396개 라우트 중 69%에 권한 검사가 없었습니다. 인가 방식을 기본 거부로 바꿨습니다.
22개 차단
인증 없이 열린 쓰기 경로
157개
역할별 권한 회귀 테스트 경로
NestJSgRPCPostgreSQLAWS IAM / OIDCCloudTrail

그 외 조치

  • 운영 DB의 접근 범위를 실제 사용 서버 2곳으로 좁히고, 변경 전후 서비스 응답을 측정으로 확인했습니다.
  • CI/CD의 장기 배포 자격 증명을 걷어 내고 CloudTrail 기록으로 실제 쓰인 권한을 확인한 뒤 OIDC 기반 role로 바꿨습니다.
  • IDOR와 비공개 데이터 노출 10여 건, 인증 없이 열려 있던 API 명세 2벌, 오류 응답에 실리던 내부 정보를 막았습니다.

개인 지식 비서 meeting-memory

개인 프로젝트운영 중

회의 녹음, 메모, 개발 노트를 한 서버에 모아 여러 AI 에이전트 세션이 같은 업무 맥락을 검색해 쓰도록 만든 지식 서버입니다.

회의 녹음통화, 회의, 메모
로컬 전사whisper.cpp
LLM 요약결정, 사실, 할 일
중심지식 DB검색, 결정 사이 충돌 추적
에이전트 세션시작·질문마다 실리고, 바뀐 것은 먼저 알림
문제
검색 응답이 최대 44초까지 늦어졌습니다. 임베딩 모델이 요청을 한 번에 하나만 처리해, 질문이 일괄 작업 뒤에 줄을 섰습니다.
해결
검색 전용 임베딩 인스턴스를 따로 띄웠습니다.
  • 로컬 임베딩과 키워드 검색을 섞었고, 엉뚱한 문서가 붙는 비율을 시험 세트로 재면서 고칩니다.
  • 기록은 전부 메시지 큐를 거칩니다. 에이전트가 고친 내용은 폰 알림으로 제가 다시 봅니다.
  • 유료 API 호출에는 하루 비용 상한을 걸어 두었습니다.
  • Flutter 앱 하나를 안드로이드와 읽기 전용 웹판으로 함께 배포합니다.
457건
혼자 머지한 PR
NestJSPrismaPostgreSQLRabbitMQClaude APIOllamaFlutter

폰으로 에이전트 다루기 cc-bridge

개인 프로젝트운영 중

맥에서 실행 중인 AI 에이전트 세션을 폰에서 확인하고 권한 요청을 승인하는 안드로이드 앱입니다.

폰 앱 (Flutter)SSH 키는 Android Keystore 안에만
중심SSH 허용 목록맥은 정해 둔 명령만 실행
에이전트 세션실시간으로 보고 승인
문제
에이전트가 띄운 서브에이전트의 승인 요청은 맥 화면에만 떠서 폰에서 답할 수 없었습니다.
해결
서브에이전트의 요청은 거절하고, 같은 요청을 메인 대화로 넘겨 폰에서 승인하게 했습니다.
  • 원격으로 할 수 있는 일의 범위를 정해 둔 명령으로만 한정했습니다.
  • 맥 쪽 Node 서버는 외부 패키지를 WebSocket 하나만 씁니다.
266건
혼자 머지한 PR
FlutterNode.jsSSHWebSocket

알림 릴레이 dev-noti

개인 프로젝트2026.08 – 운영 중

모든 저장소의 CI 결과와 서버 에러를 웹훅으로 받아 폰 푸시로 보내는 알림 서버입니다.

저장소와 서버CI, 에러, cron
웹훅 URL저장소마다 비밀값 하나
중심릴레이토큰 갱신, 중복 제거, 재시도
폰전용 앱으로 푸시
97건
혼자 머지한 PR
문제
FCM은 메시지가 4KB를 넘으면 요청을 거절하는데, 이 실패가 재시도 없이 굳어 긴 알림이 통째로 사라졌습니다. 운영 알림 1,532건 중 본문이 3KB를 넘는 것이 7건이었습니다.
해결
FCM으로 보낼 때도 채널 한도에 맞춰 본문을 잘라 보내도록 고쳤습니다.
Node.jsPrismaPostgreSQLFCMFlutterDocker

젤라뷰 Jellavue

이전 직장서비스 중

작가 캐릭터를 키우고 방을 꾸미는 모바일 게임입니다. 작가가 캐릭터를 입점시키고 판매 수익을 나눠 받는 구조여서, 캐릭터가 계속 추가되는 것을 고려해 설계했습니다.

1만+
Google Play 다운로드
60종
입점한 작가 캐릭터
5종
미니게임과 랭킹
문제
캐릭터가 계속 추가되면서 앱 초기 설치 용량이 커지고, 저사양 기기에서 구동이 불안정했습니다.
해결
Unity Addressable Assets로 바꿔 필요한 리소스만 받게 했습니다.
젤라뷰 메인 화면, 캐릭터와 놀이공원 배경 젤라뷰 미니게임, 상자를 쌓아 올라가는 화면 젤라뷰 홍보 이미지

담당: 서버 설계, Unity 클라이언트 일부

  • 이벤트 때 몰리는 트래픽은 Docker Swarm으로 서버를 늘려서 받았습니다.
  • 캐릭터가 늘어도 설치 용량이 커지지 않게, Unity Addressable Assets로 필요한 리소스만 내려받게 했습니다.
  • 재화와 아이템은 서버에서만 바꿀 수 있게 해서 클라이언트 변조를 막았습니다.
Node.js / ExpressUnity / C#Docker SwarmMySQLPrisma

포카위키 Pocawiki

이전 직장2023.03 – 2024.02, 서비스 종료

포토카드 컬렉션, 초동 판매량, 단체 채팅, 컴백 캘린더를 제공한 아이돌 팬 정보 서비스입니다. 백엔드 2명 중 아키텍처와 핵심 로직을 담당했습니다.

3 + 30
API 게이트웨이와 마이크로서비스
5명
팀 (백엔드 2, 프런트 3)
문제
서비스가 30개로 늘면서 하나씩 손으로 빌드하고 배포하는 시간이 계속 늘었습니다.
해결
Jenkins 파이프라인을 만들고, 바뀐 서비스만 골라 AWS ECS에 배포하도록 다듬었습니다.
포카위키 앱 소개 화면
  • API 게이트웨이 3개와 마이크로서비스 30개로 나눴고, 서비스끼리는 RabbitMQ로만 주고받게 했습니다. AWS에서는 Amazon MQ를 썼습니다.
  • 관리자 API는 게이트웨이부터 따로 두어 사용자 경로와 섞이지 않게 했습니다.
  • 인증, 소셜 로그인, Socket.io 채팅, FCM 알림, 배치, 로깅을 만들었습니다.
  • Flutter WebView로 iOS와 Android에 함께 출시했습니다.
NestJSMSA / CQRSRabbitMQGraphQLMongoDBRedisJenkinsAWS ECS
포카위키 백엔드 아키텍처 구조도, 게이트웨이와 서비스, 메시지 큐, DB
백엔드 구조도입니다. 게이트웨이와 서비스가 메시지 큐로만 연결됩니다.
서버의 pm2 프로세스 목록, 게이트웨이와 서비스가 모두 online 상태
서버 한 대에 pm2로 띄운 게이트웨이와 서비스 목록의 위쪽 일부입니다.

경력

네트워크 엔지니어로 시작해 백엔드, 풀스택 개발자로 일하고 있습니다.

2026.07 – 재직 중

도원이앤아이

개발자, 교육 플랫폼 단독 개발 (백엔드, 웹 프런트, 교재 주문 사이트 인수 및 운영)
  • AI 에이전트 기반 개발 흐름을 구축해 입사 후 회사 저장소에 PR 1,027건을 머지했습니다.
  • 권한 상승 같은 보안 결함을 막고, 장기 배포 자격 증명을 OIDC 기반 role로 바꿨습니다.
  • 서비스 6개의 배포를 dev와 운영으로 나누고, CI를 직접 관리하는 러너로 옮겼습니다.
  • 스키마 배포를 migration 이력 기반으로 바꾸고, 실제 DB 통합 테스트 1,200여 건을 CI에 넣었습니다.
  • NestJS 백엔드를 PR 95건에 걸쳐 단계적으로 리팩터링했고, 소셜 로그인 3사와 신규 과목을 출시했습니다.
2022.05 – 2025.12

코멧

개발팀 웹개발, 앱과 게임 서비스 스타트업 (백엔드 중심)
  • NestJS와 Express로 백엔드를 설계하고, MSA와 API 게이트웨이 구조를 주도했습니다.
  • Jenkins로 배포를 자동화했고 AWS ECS와 Docker Swarm 인프라를 운영했습니다.
  • Flutter, Unity 클라이언트 개발에도 참여했습니다.
2019.07 – 2021.10

유니콤넷

네트워크 엔지니어, 아산시청 자가 통신망 유지보수
  • L3 스위치 설정을 전부 검토하고 RSTP를 조정해 장애 발생 비율을 10분의 1로 줄였습니다.
  • CCTV망 L2 장비 700여 대의 장애 보고율을 1% 아래로 유지했습니다.

기술

주력 분야 다섯 가지와, 그 아래 분야별 전체 목록입니다(최근 많이 쓴 순서).

TypeScript, NestJS현 직장 백엔드 2개, 개인 프로젝트 서버
PostgreSQL, Prismamigration 관리, 실제 DB 통합 테스트
Docker, CI/CDGitHub Actions, self-hosted 러너, Jenkins
AWSIAM과 OIDC 배포 권한 정리, 이전 직장 ECS 배포
Claude CodeAI 에이전트로 코드를 쓰고 직접 리뷰

AI

  • AI 에이전트 협업 개발
  • Claude Code
  • Claude / OpenAI API
  • LLM 파이프라인
  • 임베딩 검색

백엔드

  • Node.js
  • NestJS
  • Express
  • gRPC
  • WebSocket
  • MSA / API Gateway
  • GraphQL

데이터

  • PostgreSQL
  • Prisma
  • MySQL
  • MongoDB
  • Redis
  • RabbitMQ

인프라

  • GitHub Actions
  • Docker / Swarm
  • AWS ECS / IAM
  • Jenkins
  • Linux / Ubuntu

클라이언트

  • TypeScript
  • React
  • Flutter
  • Unity / C#

자격 정보처리기사(2016), 리눅스마스터 2급(2015), 정보통신기술자 중급(2021), 멘사코리아 입회 테스트 합격(2015)