미리보기
기본 정보
3년차 백엔드 개발자 입니다. 주로 node.js 기반의 백엔드 경험을 가지고있고 Nest.js와 Typescript를 주로 다룹니다. 클라우드, 온프레미스 인프라에 관련 경험을 가지고 있고 새로운 기술을 익혀 적용하는것에 익숙합니다. 반복되는 코드나 실수할수 있는 부분들을 확인하여 구조화하고 문제를 예방하는것을 좋아합니다. 빠른 구현과 견고한 테스트를 지향합니다. 단순 반복이 아닌 효율적인 테스트코드를 중요하게 생각하고 남들이 보기쉽고 이해하기 쉬운 코드를 지향합니다. 사소하지만 사소하지않은 기술적 디테일을 챙기는것을 좋아합니다.
기술 스택
NestJS, TypeScript, devops, Docker, MySQL
경력
주식회사너디스타
팀원 | 서버개발팀 | 재직 중
2023.01. ~ 재직 중 (2년)
진행 프로젝트
모바일 게임 신작 프로젝트 4ground9 백엔드 api game server, admin, platform 서버 개발
모바일 게임 jm 프로젝트 결제/인증 서버 설계 및 개발
개발팀 구성
서버 4명, 클라이언트 8명, 데브옵스 1명
사용 기술
Typescript, Nest.js, Typeorm, mysql, redis(sentinel)
kubernetes , argoCD, ELK
개발 기간
(2023.01~ 현재, 약 2년)
개발 내역
1) 주요 게임 컨텐츠 개발
캐시 상점
등록 캐쉬상점 물품에 따라 실시간 품목 제어 가능하도록 캐시상점 설계 및 개발
외부 플랫폼에 캐쉬 재화 연동, transaction outbox pattern을 사용하여 외부 api (결제)를 트랜잭션에서 분리, 성능 최적화 및 정합성 처리
배치서버를 통해 미처리 되는 이벤트를 처리. 내부 로직오류로 지급 실패하는경우, 인게임 메일 발송 처리하여 해당 결제 건에 대한 처리가 쉽게 이루어 질수 있게 개발
컨텐츠 상점
오픈조건 따라 순차적으로 컨텐츠별 상점 오픈, 클리어 상황에 따라 상점 물품내역이 변하는 컨텐츠 상점을 개발, 상점 type별로 전략패턴을 활용하여 상점별 다양한 조건에 대해 쉽게 확장 가능하도록 설계
상점에 변경이 일어나는 부분에 대해 최소한의 DB쿼리를 사용하도록 upsert를 기반으로 하여 조회시점에 상점을 업데이트 하도록 구현
게임 뽑기 시스템
인게임 내 캐시 재화를 통해 확률에 따라 뽑기 보상을 지급하는 시스템 개발. 픽업 / 상시 / 소셜 뽑기 타입별 특징에 맞도록 세부 기획에 맞게 구성, 관련 데이터 변경을 즉시 적용해 확인 가능한 시뮬레이션 페이지 구성
의사난수생성 방식인 Math.random()기반의 뽑기 => 결과의 예측 불가능성과 공정성을 강화하기 위해 crypto 모듈을 활용한 암호학적으로 안전한 난수 생성기로 변경하였습니다.
장비
장비 관련 시스템, 데이터 설계 및 마법부여(확률형 인챈트) 기능 개발
덱 편성
다른 유저 정보 - 스냅샷과 연계되는 컨텐츠별 덱 편성 / 변경 시스템 개발
게임패스
다양한 미션을 진행하면 보상을 얻을수 있는 시스템, 유료 업그레이드시 더 많은 미션과 보상이 추가되는 시스템 설계 및 개발
유저간 소셜관련 기능
친구, 차단,포스팅 ,팔로잉, 추천친구 목록, 친구간 소셜 포인트 교환
플러피 타운 (내부 하우징 육성 미니게임)
건물, 가게등을 확장, 가게에서 다양한 자원을 생산하고 순환시키는 컨셉의 방치형 육성 미니게임(game-in-game)
그외에도 다양한 세부컨텐츠에 대한 개발을 담당했습니다.
2) 플랫폼 / 운영툴 개발
jm게임 프로젝트의 결제 및 인증 서버 개발
과거 게임을 재런칭 하는 프로젝트에서, 기존 플랫폼(라인게임즈)의 결제 SDK 부분을 대신하는 결제 서버 개발
google/apple in-app-purchase 영수증 google signature 인증을 비롯하여 게임내 인앱 결제 플로우 설계. 미처리 결제 재처리 및 멱등성을 보장하도록 설계 및 개발
전반적인 결제 플로우 설계 및 적용, 기존 로직을 보완하여 중복지급 방지처리
apple login OAuth인증 로직 개발 및 개별적으로 개발되어진 OAuth 인터페이스 통합작업 진행, 비슷하게 쓰고 있던 로직 대부분을 한곳에서만 수정하도록 변경, 개별적으로 다르게 진행하던 테스트 통합 검증
front-end / admin backend 운영툴 마이그레이션 제안, 관련 검토 및 설계
Ruby On Rails 기반의 기존 운영툴(Active-Admin)을 Typescript 기반 AdminJS로 마이그레이션(1차), Refine 으로 마이그레이션(2차) 주도
sharding datasource(샤딩 DB), entity, nestjsx/crud(dataProvider), repository 관련 코드 생성 자동화
기본 CRUD, React 기반 UI 구축, Custom Component 베이스코드 작성, zustand를 통한 상태관리 도입 등
플랫폼 운영서버 아키텍처 설계 및 구축
국가(리전)별 admin 서버 통합 관리를 위한 게이트웨이 플랫폼 서버 구축
각 리전의 admin서버로 릴레이 요청 처리
컨텐츠 카테고리별 role 기반 read/edit/approve 개별 권한 관리를 통한 통합 인증구축
권한에 따라 운영 데이터 변경 관련 요청 후 승인, 혹은 즉시 실행 시스템 개발
3) 내부 인프라 관리/개선 사항
redis-sentinel , mysql replication 개발환경 구성
퍼블리셔와 적극적으로 커뮤니케이션을 통해 redis-sentinel 및 mysql replication 관련 비동기 복제 관련 대응방안 수립 및 typeorm, io-redis등 애플리케이션 연관 기능 사전 리서치, 내부 개발 서버에 helm chart등을 활용해 개발환경 구축
promethus-stack 을 통해 on-premise k8s 모니터링 시스템 구성
부하테스트중 promethus-stack을 적용하여 서버 스펙 산정에 활용을 위해 클러스터 모니터링 환경 구축
prom-client 기반 nestjs-promethues, mysql-exporter 등을 통해 grafana-dashboard로 지표수집, WAS, DB 병목 식별 및 특정 로직(뽑기시스템등)에 대한 부하 검증등을 수행하였습니다.
k8s Network 이슈 대응 및 수정
wireshark, tshark등을 활용해 네트워크 패킷 캡쳐를 통한 분석 진행
k8s 인프라 구성과 네트워크 설정을 재점검하며 의심사항을 하나씩 소거하고 ipvs 의 tcp 설정을 수정하여 해결
불필요하게 cloud DB를 이용하던 리소스를 on-premise cluster로 내재화
4) 시스템(코드베이스, 아키텍처등) 도입 및 개선 사항
확률형 보상 관련 데이터 설계 및 시스템 구현
장비, 재화, 아이템 등 다양한 GoodsType을 확률에 따른 랜덤 지급이 가능하도록 데이터 구조 고도화
관련 application code를 전략패턴 기반으로 확장이 쉽게 가능하고 단일 인터페이스로 제어가능하도록 구현
ClsModule 도입, 관련 시스템 개발 및 개선
user-level lock과 transaction 처리를 asyncLocalStrorage 기반으로, sharding DB를 포함해 multi-dataSource를 처리 가능한 구조로 customize 하여 적용
만약 user-level lock, transaction에 대한 커넥션이 다른 커넥션을 쓰게 될 경우 고 부하 상태에서는 connection 부족으로 인해 dead-lock 현상이 생길수 있는데, 부하테스트중 이 부분을 발견하여 개선하였습니다.
redis multi 기반으로 redis 트랜잭션 처리도 이를 기반으로 적용하였습니다.
다른 유저 정보 스냅샷 시스템 설계 및 개발
각종 컨텐츠에서 사용되는 다른 유저의 정보를 보여주는 정보 처리를 효율적으로 가능하도록 스냅샷 데이터 관리 시스템 개발
다수 테이블의 조회가 필요한 다른 유저의 정보 및 덱 전투력계산등을 이벤트및 전략 패턴을 활용하여 스냅샷 정보 저장
로그 관련 기본 설계 및 시스템 고도화 및 모듈화
k8s 환경하에 pv에 file write -> logbus(filebeat+logstash와 유사)를 helm chart 이용하여 로그 시스템 구축
관련 로깅 sdk 구조를 파악하여 로그모듈 래핑, 인터페이스 구성 및 bulk logging 방식을 적용
통합 테스트 코드 실행시간 개선
모듈 공유를 통한 방식으로 개별 테스트 모듈 구성방식 => 전체모듈 1회 로드후 재사용 방식으로 개선 및 swc 빌드 적용을 통해
전체 테스트 시간 150초 =>35초 개선
부하테스트 및 K6 도입
open-api-generator, swagger 파일을 이용한 부하테스트 api 호출 코드 생성 자동화 및 프로젝트 구조화
mysql named lock을 실행하는 커넥션과 다른 커넥션을 가져오면서 생긴 커넥션 starvation으로 인한 데드락 현상 수정
Http client 모듈 관련 고도화
외부 통신 client 모듈에 cockatiel 을 적용하여 api별 Retry, Circuit-breaker pattern 적용
error Logging, response validation등, 문제가 생겼을때 쉽게 파악가능하도록 구조화
Promise.all 처리 트러블슈팅 및 고도화
multi - datasource 기반 로직중, 일부만 롤백되는 현상을 파악하여 수정
=>
Promise.all에서 발생한 비동기 작업중 하나에서 에러가 발생해 먼저 롤백을 진행하게 되면서 context에 저장해둔 커넥션을 릴리즈 하게 되는데, 이때 Promise.all에서 실행중이던 비동기 로직은 context의 커넥션을 가져오지 못하고, 커넥션풀에서 다시 새로운 커넥션을 가져와 처리하게 되어, 롤백이 수행되지 않습니다.
Promise.allsettled를 통해, 에러가 발생해도 모든 비동기 로직이 다 수행되길 기다리도록 처리하는 prototype 함수를 만들어 처리하였습니다.
키친스탠다드
팀원 | 개발팀
2021.11. ~ 2022.08. (10개월)
진행 프로젝트
SKOS(스마트 주방관리 시스템) 개발
플랫폼 연동 서버 및 배달서버 운영 및 통합
개발팀 구성
서버 2명, 프론트 2명
사용 기술
Typescript, Nest.js, Typeorm, graphql mysql, redis, React
Aws ecs, cloudfront, s3
개발 기간
10개월
배달의 민족, 쿠팡이츠, 요기요 주문접수 자동화
주문 접수를 매크로 기반 접수 작동 방식을 직접 api 접수 방식으로 변경, 로그인 토큰을 이용, 다수의 계정을 한번에 관리
가맹점의 평균 주문접수시간 지표 1초미만으로 개선
주문 관리 관련 기능 개발
접수→조리시작→포장→배차대기→배달대기→배달진행→배달완료 사이클 추적 및 관리 기능 개발
실시간으로 변하는 주문, 조리상태를 정확히 모니터링하고 관련 정보를 활용한 다양한 파생 서비스, 분석에 기여
실시간으로 계속 업데이트되는 주문관련 정보와 상태를 관리하는 페이지 개발
주방 밖에서도 실시간으로 주방의 상황을 알 수 있도록 해서 관리인력과 주방인력이 각자의 영역을 명확히 구분하도록하여 보다 효율적으로 일할수 있도록 개선
자동 및 수동 배달대행사 배차 시스템 연동
조리 완료 시점에 배달기사 호출 자동화
웹훅을 이용해 api 연동, 배달상태등 연동 콜백 및 주기적인 스케쥴링 조회를 통해 누락 없도록 구성
시스템 리팩토링 및 개선작업
polling 방식의 업데이트 ⇒ websocket 기반의 graphql subscription방식으로 개선
Redis 기반 PubSubEngine 사용하여 서버간 publish 이벤트 동기화
dataLoader 을 통해 graphql에서 발생하는 N+1 문제 해결
FrontEnd에 recoil을 도입, global websocket 연결 상태 관리 콜백 hook 구성
플랫폼 및 브랜드 관리 서버 구축 및 고도화
배달관련 플랫폼(배민,요기요,쿠팡등)에 따라 개별 브랜드를 관리하는 시스템을 구축
주방에서 재료가 떨어져서 품절이 되거나, 주문 폭주로 인해 가게를 임시적으로 닫는등의 조치를 쉽고 빠르게 만들어서 안정적인 운영에 기여
새로운 가게 브랜드 관련 정보 등록 자동화
새로운 가게 브랜드가 들어올때 마다 메뉴, 옵션, 가게정보등을 내부 시스템에 입력하는 절차 자동화
하나의 플랫폼(배민)을 기준으로하여 내부시스템과 다른 플랫폼(쿠팡, 요기요)들의 메뉴/옵션 입력을 자동화를 통해
기존에 일어나던 휴먼에러등을 개선하고 보다 빠르게 새로운 가게를 등록하는 프로세스를 진행할수 있게 만들었습니다.
자체 영수증 편집/출력 구현
외부 솔루션이 아닌 자체적으로 주문 영수증을 원하는 형태로 출력가능하도록 하는 기능을 개발
html => image 변환 작업을 bull Queue 를 이용한 fork process로 처리, CPU blocking 방지
내부 시스템의 값인 캐비넷 번호, 주문번호등의 값을 영수증에 표시하여 카운터 작업자의 효율성, 배달기사 편의성 개선
AWS 인프라 구축 및 설계
초기 인프라 구성 전담, IAM, VPC, Route53, RDS, elastiCache, ECS 운영환경 및 개발환경 구축 및 설정/리소스 관리
pm2 파일 배포 => docker-compose 기반 배포=> ECS 마이그레이션 작업 진행
AWS CDK를 통해 dev 및 prod 환경의 인프라(ECS) 관리, GithubAction을 통해 deploy 자동화
교육
건국대학교
대학교(학사) | 소프트웨어공학과
2009.03. ~ 2021.09. | 졸업
자기소개
안녕하세요. 3년차 백엔드 개발자 박지민입니다.
저는 1년정도는 스타트업 백엔드에서 일했고, 지금은 2년정도 게임회사에서 일하며 주로 node.js 를 사용한 백엔드 개발을 담당하였습니다.
좋은 동료가 있는 스타트업에서 일하면서, 현재 저에게 주어진 시간을 고려하여 실용적인 레벨에서 우선순위를 잘 잡고 일하는것의 중요성을 많이 배웠고, 일의 병목을 인식하고, 임팩트를 내는 일에 집중하는것을 배웠습니다.
또 게임회사에서 시간적 여유가 주어진 상황에서, 기획단계부터 개발까지 복잡한 도메인을 모델링해보고, 다양한 테스트 코드를 통해 견고한 구조와 로직을 만들어 내는 경험을 하며, 코드리뷰를 통해 좋은 코드에 대해서도 많은 고민을 해보았습니다. 또한 플랫폼에서 고려해야할 요소들에 대한 고민들도 많이 해볼수 있었습니다.
기본적인 인프라를 바닥부터 구축해본 경험이 있고, 단순히 한번 실행해 보는 레벨이 아니라 production-level 로 사용가능하도록 개별 인프라 설정 레벨부터 디테일한 부분을 챙기는것을 좋아합니다.
제 강점은 기술적 디테일이지만, 너무 이 디테일에 매몰되어 커뮤니케이션을 소홀히 하지 않고, 우선순위를 계속 되짚어서, 최종적으로 일의 성과를 중요시 하는것이 장점이라고 생각합니다.
저는 진심으로 개발과 제가하는 일을 좋아합니다. 더 좋은 방법에 대해 습관적으로 계속 고민하고 탐색하고, 떠오른 아이디어를 같이 부담없이 즐겁게 이야기 할 수 있는 팀을 선호합니다.