김캐디, Software Engineer

● 예약 서버 (2020.08 ~ 2022.01)
메인 앱 API 서버에서 들어오는 예약을 처리하고, 해당 예약을 사장님 솔루션으로 전달하며 알림 서버로 관련 알림을 발송하는 역할을 합니다. 저 혼자 단독 개발 및 유지 보수를 진행하였고, 1년 정도 운영 후 새로 들어오신 후임 백엔드 팀원 분과 함께 프로젝트를 진행했습니다.
기술 스택 : Node.js(Express -> NestJS), WebSocket(Socket.IO), Redis, AWS(ECS, ECR, RDS, SQS)

  • 기존 모놀리틱 서버에서 예약 도메인을 분리하여 단독 개발
  • 문제
    회원 수가 늘어나면서 예약 관련 트래픽이 증가했고, 예약 기능의 에러가 전체 서비스에 영향을 줌, 또한, 예약 기능이 자주 변경되는데 변경될 때마다 모놀리틱 서버가 통째로 배포되어야 함
  • 해결 방법과 이유
    위 문제를 해결하려면 모놀리틱 서버에서 예약 도메인의 의존성이 분리되어야 하며, 따로 확장이 가능해야 한다고 판단함, 그에 따라 MSA를 도입했고 예약 기능에 에러가 생기거나 트래픽이 급상승하는 주말에도 다른 서비스에는 영향 없는 고가용성과 확장성을 확보함

  • Message Queue(SQS)를 이용한 AWS 기반 인프라 아키텍처 설계
  • 문제
    예약 서버를 MSA로 분리했기에 생기는 문제가 발생함 앱 API 서버에서 예약 서버로 예약 데이터를 전송 시 만약 서버가 다운되어 있으면 데이터가 도중에 유실이 됨
  • 해결 방법과 이유
    예약 서버 앞단에 메시지 큐를 배치함으로써 Consumer 역할을 하는 예약 서비스가 다운될지라도 서비스 특성상 중요한 예약 데이터들은 안전하게 보관되도록 설계함

  • 실시간 예약 구현을 위한 WebSocket 도입
  • 문제
    예약을 확정하는 사장님 쪽 B2B 클라이언트에서 들어온 예약 확인을 위해 10초 주기의 Polling 방식을 채택 중이었음, 이로 인해 실제 유저가 예약을 한 시각과 사장님이 예약을 전달받은 시각의 딜레이가 있는 것을 발견했고, 이는 빠른 예약 결과를 원하는 유저 경험을 해친다고 판단함
  • 해결 방법과 이유
    양방향 통신이 필요한 기능이라 판단하여 기존의 Polling 방식 대신 Socket 방식을 고민했고, Node.js 기반의 웹 프레임워크를 사용 중이었기에 Socket.IO 라이브러리를 적용한 웹소켓 방식으로 실시간 예약을 구현함

  • 프레임워크 마이그레이션을 통한 응답 속도 90% 개선 및 서버 비용 50% 감소
  • 문제
    회사가 성장하면서 새로운 백엔드 팀원들이 합류했고, 그에 따라 기존 예약 서버를 온보딩 하는 시간이 많아짐 컨벤션과 아키텍처가 정립되어 있지 않은 Express 웹 프레임워크로 개발을 하다 보니 다수의 팀원이 협업하며 개발하는데 의사소통 비용이 늘어남
  • 해결 방법과 이유
    기존 프레임워크가 Node.js 기반의 Express였기에 같은 Node.js 기반의 프레임워크 중 컨벤션과 아키텍처가 정립되어 있는 NestJS를 선택했고, 리팩토링과 함께 마이그레이션 함으로써 유지 보수 및 협업하기 좋은 코드 작성이 편리해짐

  • 멀티 모듈 구성 및 CI/CD 파이프라인 구축
  • 문제
    서비스에 밀린 예약 수 일정 수준 초과 경고 등과 같은 배치, 크론 작업들이 추가됨에 따라 Scale-Out을 할 수 없는 문제가 발생함
  • 해결 방법과 이유
    예약 서버 내에서 도메인 별로 모듈을 분리하였고, 도커 이미지 빌드 시 환경 변수를 통해 필요한 모듈만 빌드 타임에 불러오도록 구성함 결과적으로 Application, Scheduler, Worker의 형태로 서비스를 나누어 배포함으로써 Scale-Out이 가능해졌지만 배포 과정이 복잡해져 수동 배포가 불편해졌고 그에 따라 Jenkins를 도입해 CI/CD 파이프라인을 구축함


  • ● 푸시 서버 (2020.12 ~ 2022.01)
    MSA로 구성된 여러 서버들에서 제각기 푸시 발송 로직이 파편화되어 있는 문제를 발견하여 CTO님께 건의해 시작한 프로젝트입니다. 단독 개발을 진행했으며, 후에 푸시뿐 아니라 카카오 알림톡, 메시지 발송 기능까지 처리하게 되었습니다. 추가로 마케터 분들이 알림을 GUI 상에서 편하게 발송하고 발송 로그를 확인할 수 있는 어드민 사이트를 React로 개발했습니다.
    기술 스택 : Node.js(Express), gRPC, AWS(ECS, ECR, DynamoDB), React

  • MSA된 각 서버들에서 푸시 및 알림(알림톡, 메시지 등) 도메인을 분리하여 단독 개발
  • 문제
    MSA 환경에서 각기 다른 언어와 프레임워크로 분리된 서버들에 푸시 발송 로직이 파편화되어 있었고, 로직이 변경되거나 추가될 때마다 해당 서버를 재배포 해야 함
  • 해결 방법과 이유
    위 문제를 해결하려면 각 서버에서 푸시 관련 로직을 제거하고 푸시 도메인을 별도로 담당할 인터널 서버를 개발해야겠다고 판단함

  • NoSQL Database(DynamoDB)를 이용한 AWS 기반 인프라 아키텍처 설계
  • 문제
    푸시 및 알림의 제목, 내용이 기록된 템플릿들과 푸시가 발송된 로그 데이터를 저장해야 함
  • 해결 방법과 이유
    단순 문자열인 템플릿과 로그 성 데이터들은 레코드 간의 관계가 없기 때문에 문서 데이터 모델이 적합하다 판단되어 기존에 사용하던 AWS의 RDBMS 서비스인 RDS를 사용하지 않고 NoSQL 서비스인 DynamoDB를 선택함 또한 트래픽이 많은 푸시 서버의 로그를 분리 저장 함으로써 Master RDS의 쓰기 부하를 줄일 수 있었음

  • gRPC 도입 및 IDL 관리
  • 문제
    인프라 내에서 인터널로 동작하는 푸시 서버 특성상 REST API보다 효율적인 방법을 적용하고 싶었고, 전체 푸시를 발송하면 FCM 토큰의 길이가 길기에 페이로드의 크기가 매우 커질 것으로 예상됨
  • 해결 방법과 이유
    마이크로 서비스로 구성된 아키텍처를 연결하는 데 유용한 통신 방식을 찾아보다 HTTP/2 프로토콜 기반의 Protocol Buffers를 주고받는 gRPC를 도입하였고, 기존 REST API에서 주고받는 JSON 대비 페이로드 크기가 줄어들어 효율적인 통신이 가능해짐

  • 어드민 사이트 개발
  • 문제
    푸시 관련 마케팅이 활성화되면서 마케팅 팀에서 직접 템플릿을 수정, 추가하거나 개별적으로 유저에게 푸시를 발송하고 싶은 니즈가 생김
  • 해결 방법과 이유
    기술 스택을 일치시키기 위해 프론트엔드 팀에서 사용하는 React로 푸시 발송과 템플릿 CRUD 기능 등 백오피스 업무를 위한 어드민 사이트를 개발함


  • ● 웹/앱 서버 (2020.12 ~ 2022.01)
    김캐디 웹사이트와 모바일 앱 API들을 담당하는 서버입니다. 이미 운영 중인 서버를 CTO님에게 인계받아 유지 보수 및 리팩토링했습니다.
    기술 스택 : Django(DRF), Celery, AWS(ECS, ECR, RDS, ElastiCache)

  • 주간 정산 Batch 시스템 개발
  • 문제
    서비스가 성장하며 계약한 매장이 점점 많아지자 영업 팀이 어드민 사이트에서 수동으로 정산을 처리하던 플로우를 개선할 필요성이 생김
  • 해결 방법과 이유
    기존의 수동 정산 플로우를 자동화하여 영업 팀의 업무 부담을 줄이는 것을 목표로 했으며, 지급 대행 Saas를 연동해 특정일 주기로 자동 정산되는 Batch 시스템을 개발하여 문제를 해결함

  • 레거시 API들의 ORM 최적화 및 캐싱 적용
  • 문제
    비용 절감을 위해 큰 부분을 차지하던 RDS Read Replica 개수를 줄이고 싶었고, 기술 부채로 남아있던 레거시 API 들에서 N+1 문제 및 Slow Query가 발견됨
  • 해결 방법과 이유
    테이블 조인이 일어나는 ORM에는 Eager Loading을 적용하여 N+1 문제를 해결하였고, Slow Query는 인덱스를 걸어 해결함 또한 데이터가 자주 바뀌지 않거나 헤비한 API들에는 캐싱을 적용해 응답 속도를 개선함


  • ● 김캐디 사장님 솔루션 (2020.08 ~ 2020.12)
    https://owner.kimcaddie.com
    스크린 골프장의 예약 접수 및 스케줄 관리를 사장님들이 편하게 하실 수 있도록 도와주는 어드민 사이트입니다. 실시간 예약 플로우를 구현하기 위해 WebSocket을 적용했으며, 카운터의 포스기 및 키오스크 환경에서도 원활한 경험을 제공하기 위해 Electron을 사용해 데스크톱 앱을 개발했습니다.
    기술 스택 : React, Electron

  • 기존 레거시 사이트를 React로 마이그레이션
  • 데스크톱 앱 개발을 위해 Electron 도입
  • 매장현황, 매장정보, 회원관리, 매출관리, 근무자관리 뷰 개발


  • ● 김캐디 웹사이트 (2021.02 ~ 2021.03)
    https://kimcaddie.com
    김캐디의 메인 웹사이트입니다. 유지 보수를 담당하던 기존 프론트엔드 팀원이 이직하여, 새로운 프론트엔드 팀원을 구할 때까지 대신 개발을 맡았습니다.
    기술 스택 : Next.js

  • 골프레슨 뷰 개발
  • 광고 배너 컴포넌트 리팩토링
  • 모바일 반응형 최적화