Team Lead · 8명 · 인프라팀장 겸 백엔드 — LG CNS AM Inspire 4기 최종 프로젝트
결제하는 순간, 보유 카드 중 혜택·실적에 가장 유리한 카드 조합을 자동 추천하는 간편결제 플랫폼. 3개 클라이언트(사용자 앱 · PG 어드민 웹 · 가맹점 웹)와 13개 마이크로서비스를 AWS EKS 위에 설계·개발·배포·운영했습니다.
OVERVIEW
결제 시점에 가맹점 MCC · 결제 금액 · 보유 카드 혜택 · 전월 실적을 분석해 4가지 전략(혜택 단일/분할 · 실적 단일/분할)의 최적 카드 조합을 추천
앱 → PG → 카드사로 이어지는 실제 결제 흐름을 카드사 단계까지 직접 구현 — 오프라인(QR)·온라인 결제가 거치는 과정과 교환 정보·암호화 방식의 차이를 반영해 설계
대표자 한 명이 전부 결제하면 나머지는 혜택·실적을 못 챙기는 문제를 그룹 더치페이(가승인 → 참여자 분할 결제 → Void)로 해소
외부 가맹점 연동용 Open SDK와, 이를 재활용한 MCP 서버(가맹점 자연어 질의)까지 확장
3개 클라이언트 + 13개 백엔드 마이크로서비스로 구성된 MSA 기반 간편결제 시스템을 설계·개발·배포·운영
ARCHITECTURE · OPERATIONS
전체 시스템 아키텍처 — Client / Gateway / PAY·PG / Data Layer서비스 구성 — 사용자 앱 · 가맹점 포털 · PG 관리자 웹CI/CD — Jenkins(CI) → ArgoCD(CD) GitOps 파이프라인LitmusChaos 장애 주입 — Zipkin · Grafana로 회복력 검증
MY ROLE
인프라 / DevOps / SRE — 인프라팀장
Terraform 모듈(vpc · eks · rds · ecr · security) 직접 구현 — AWS 인프라 자동 프로비저닝, 수동 생성돼 있던 ECR 리포지토리 14개를 import해 IaC로 일원화, 서비스 증가에 맞춰 EKS 노드그룹 증설 · ALB Controller IRSA 구성
Helm Chart 템플릿화로 13개 마이크로서비스 배포 표준화 (dev/stg 환경 분리)
Jenkins(CI) → ArgoCD(CD) GitOps 파이프라인 구축을 리드 — Git Flow를 적용해 main 머지 시에만 배포되도록 기준을 세우고, 13개 서비스 수동 배포를 자동화로 전환
이전 프로젝트에서 겪은 이미지 캐싱 문제를 반복하지 않도록 시작부터 빌드 번호 기반 동적 이미지 태깅 적용
관측성 구축 — Prometheus + Grafana(RED 메트릭) · Zipkin(분산 트레이싱)으로 결제→추천→알림 전체 흐름을 가시화
LitmusChaos 카오스 엔지니어링 4종 실험(파드 삭제 · 메모리 부하 · 네트워크 지연 · 네트워크 로스)으로 실패 시나리오 검증
백엔드 — Payment 서비스 (더치페이 · 원격결제)
더치페이 결제 흐름 설계·구현 — 대표자 Auth-only 가승인으로 결제 보증 → 참여자별 병렬 Auth+Capture → 전원 완료 시 가승인 Void(한도 홀드 해제)
참여자 전원에게 결제 진행 상황 실시간 공유 — SSE + Redis Pub/Sub으로 다중 파드 환경에서도 세션 상태 브로드캐스트, SSE 구독자 제거 동시성 문제 직접 수정
참여자 한 명이 실패하는 경우 등 실패 시나리오를 팀과 치열하게 설계 — 보상 트랜잭션 · 상태 전이 · 미완료 세션 타임아웃 배치(참여자 금액 초기화, 배치 실패 격리·경고 순서 보장) 구현
원격결제 전체 흐름 구현 — 요청 생성(DRAFT) → 수락/수행 → 완료·만료 배치까지, 원본 주문 취소 경합 구간은 락으로 정합성 확보
Saga 패턴(Choreography) 기반 분산 트랜잭션 — 멱등성 키로 중복 결제 차단, 동시 접근 구간은 비관적 락으로 정합성 확보
Open SDK & MCP 서버
외부 가맹점 연동용 TypeScript Open SDK 설계·구현 — API Key 인증·멱등키 자동 처리 클라이언트, 결제 생성/조회/취소 메서드, 내부 정보는 숨기고 필요한 에러만 공개 코드로 변환하는 에러 계약 문서화, 단위 테스트·가맹점 연동 가이드까지 패키지(ESM/CJS 듀얼 빌드) 형태로 완성
SDK를 재활용해 MCP 서버 구현·E2E 통합 테스트 작성 — PG 관리자가 가맹점 데이터를 자연어로 질의하면 AI가 답하는 운영 도구. API Key 원문·카드번호 등 민감정보 조회는 제한해 편의성과 보안을 함께 고려
TROUBLESHOOTING
01카오스 실험이 드러낸 숨은 결함 — 서비스 간 AES 키 해석 불일치
네트워크 로스 실험 중 card-simulator가 재시작 후에도 뜨지 않는 현상을 추적했습니다. 원인은 시크릿 구성이었습니다 — auth와 card-simulator가 시크릿 매니저의 같은 AES 키를 공유하는데, auth는 raw 바이트로, card-simulator는 base64로 해석해 32바이트 검증에서 실패하고 있었습니다. 이미 시드된 auth 데이터가 깨지지 않도록 card-simulator의 해석 방식을 통일하는 쪽을 선택해(영향 범위 최소화) 복원력을 개선했습니다. 장애의 원인이 '각 서비스의 암호화 계약'에 있을 수 있음을 배운 경험입니다.
02'지나친 자동화'의 실패 — Litmus infra와 GitOps의 충돌
LitmusChaos infra까지 ArgoCD로 자동 배포하려 했는데, ChaosCenter UI에서 Infra를 생성할 때마다 INFRA_ID·ACCESS_KEY가 새로 발급되는 반면 ArgoCD는 Git의 옛 manifest를 바라보다 보니 키가 충돌해 MongoDB가 뜨지 않았습니다. infra(subscriber)가 ChaosCenter DB에 종속된 stateful 컴포넌트라 선언적 GitOps 모델과 근본적으로 맞지 않는다고 진단하고, ChaosCenter 본체(Helm chart)만 ArgoCD로 관리하고 infra는 kubectl 수동 배포로 분리해 해결했습니다. 모든 것을 자동화하는 게 항상 정답은 아니라는 걸 배웠습니다.
협업에서 어려웠던 점과 극복 방법
가장 큰 난관은 결제 도메인 자체의 이해였습니다. 간편결제를 써보기만 했지, 앱 뒤에서 PG사·카드사를 거치며 어떤 정보가 오가고 어떻게 암호화되며 어디에 무엇이 저장되는지 전혀 몰랐습니다. 오프라인 결제와 온라인 결제의 처리 과정이 다르다는 사실부터 바닥까지 공부해야 했고, 팀 전체가 같은 그림을 보도록 기획에 충분한 시간을 들였습니다. 그 덕분에 개발은 오히려 빠르게 끝났습니다.
팀 OS가 맥과 윈도우로 섞여 있어 "내 컴퓨터에선 되는데 왜 안 돼?"가 생기기 쉬운 환경이었습니다. 그래서 각자 서비스 개발 후 반드시 Dockerfile로 이미지를 만들어 컨테이너로 띄워 통신을 검증한 뒤 배포하도록 지침을 정했고, 환경 차이로 인한 에러 없이 수월하게 배포할 수 있었습니다.
협업 진행 방식
13개 마이크로서비스를 도메인별 담당자로 나누고, 팀장으로서 전체 아키텍처 방향과 일정을 정리해 팀이 큰 그림을 보게 했습니다. Jira 칸반과 Git을 연동해 브랜치·커밋·PR에 이슈 키만 넣으면 진척이 자동 추적되게 했고, 에러 코드·주석·API/Kafka 명세서 컨벤션을 표준화해 MSA에서도 어디서 무슨 일이 있었는지 추적할 수 있게 했습니다. 개발 중반부터 CI/CD를 미리 구축해 둔 덕분에 이후 배포가 정말 편했습니다.
무엇보다 "몰라서 못 하는 상황"을 막는 데 집중했습니다. 제가 개발을 처음 시작할 때 이런 것도 질문해도 되나 싶은 무지함 때문에 질문을 잘 못 했던 경험이 있어서, 막힘없이 질문하는 분위기를 만들고 싶었습니다. MSA 온보딩 가이드와 환경 구축 문서를 먼저 작성해 공유했더니 팀원들도 각자 공부한 내용을 문서로 남기기 시작했고, 우려와 달리 이해가 안 되면 교육이 끝난 후에도 남아서 끝까지 이해하고 가는 문화가 만들어졌습니다.
프로젝트를 진행한 이유
단순 기능 구현을 넘어, 결제라는 복잡한 도메인을 깊이 이해하고 MSA 기반 분산 시스템의 설계·배포·운영 전 과정을 직접 경험하고 싶었습니다. 모놀리식이었다면 고민하지 않았을 분산 트랜잭션, 상태 일관성, 데이터 소유권을 실제로 부딪히며 풀어보고, IaC·GitOps·관측성·카오스 엔지니어링까지 운영 안정성을 끝까지 검증하는 것이 목표였습니다.
자동차 생산 공장의 주문부터 출고까지 전 공정을 실시간 모니터링하는 MSA 기반 스마트 팩토리 시스템. 6개 마이크로서비스를 2.5주 만에 설계·개발·AWS EKS 배포까지 완료했습니다.
OVERVIEW
주문이 등록되면 시뮬레이터가 차체 → 도장 → 조립 → 품질검사 → 출고 공정을 자동으로 진행
SSE(Server-Sent Events)로 차량 공정 흐름과 라인 장애·재고 부족 알림을 대시보드에 실시간 전달
즉시 응답이 필요한 통신은 OpenFeign(동기), 결과를 기다릴 필요 없는 통신은 Kafka(비동기)로 분리 설계
AWS EKS에 전체 마이크로서비스를 배포하고 Nginx Ingress Controller로 트래픽 라우팅
SCREENS
생산 현황 대시보드 — 공정별 차량 상태 보드 (실시간)라인 관리 — 라인별 가동 현황 · 장애 시뮬레이션
MY ROLE
설계 및 리드 (팀장)
전체 도메인 및 6개 마이크로서비스 구조 설계 — 동기(OpenFeign)/비동기(Kafka) 통신 분리 설계, 요구사항 명세서 작성
4개 도메인 DB 스키마(line · order · inventory · shipping) 전체 설계·작성 — 초기 시드 데이터 구성, MySQL 인코딩(utf8mb4)·예약어 충돌 등 공통 DB 이슈 직접 해결
MSA 개념(도메인 설계 · 통신 판단 기준 · Docker/K8s · CI/CD 흐름)을 정리한 팀 온보딩 가이드 문서 작성·공유
노션에 전체 일정·To-do를 관리하며 팀 개발 방향을 조율하고, API Gateway·BFF·서비스 책임 분리 등 주요 아키텍처 의사결정을 주도
백엔드 (line-service) · 프론트엔드 (client)
line-service 단독 구현 (Spring Boot) — 엔티티/리포지토리/서비스/컨트롤러 계층 설계, 라인 조회·차량 위치 업데이트·장애 처리 API 8종 + 차량 공정 타임라인·공정별 차량 현황 API, Kafka 라인 장애 이벤트 발행(line.fault 토픽), GitHub Actions CI 워크플로우 구성
Claude 에이전트를 활용해 React/TypeScript/Tailwind 기반 프론트엔드 전체 구현 — SSE 실시간 대시보드, 서비스별 API 연동 레이어, Nginx 프록시 + Docker 멀티스테이지 빌드 구성
인프라 및 배포
전체 서비스 K8s 매니페스트 작성 및 AWS EKS 배포 설정 주도 — ECR 이미지 · RDS 엔드포인트 · Nginx Ingress 전환
Docker Compose로 6개 서비스 로컬 통합 테스트 환경 구성 — 환경 차이 문제 사전 축소
Rolling Update · Pod 자가치유 테스트 수행 및 영상 제작
TROUBLESHOOTING
01CrashLoopBackOff — 원인은 보안 그룹
EKS 배포 과정에서 Pod가 CrashLoopBackOff 상태로 반복 재시작됐습니다. 원인을 추적한 결과 RDS 연결 실패였고, AWS 시큐리티그룹 인바운드 규칙에 EKS 노드와 로컬 환경 양쪽 허용 설정이 빠져 있던 것이 원인이었습니다. 규칙을 올바르게 설정한 후 정상 배포를 확인했습니다.
협업에서 어려웠던 점과 극복 방법
개발 기간이 약 2.5주로 매우 짧은 상황에서, MSA에 익숙하지 않은 팀원들이 각자의 서비스를 빠르게 이해하고 개발해야 했습니다. MSA 개념부터 도메인 설계, 동기/비동기 통신 판단 기준, Docker/Kubernetes 운영 방식까지 개발하면서 바로 참고할 수 있는 온보딩 가이드 문서를 직접 작성해 공유했고, 개인 메시지로도 자유롭게 질문할 수 있는 분위기를 만들어 기술적 막힘을 최소화했습니다. 이후 팀원들로부터 실질적인 도움이 됐다는 피드백을 받았습니다.
개발 지식과 프로젝트 자료를 정리한 NotebookLM 세션을 팀에 공유해 스스로 질문하며 이해하도록 돕고, React 클라이언트 구현에는 Claude 에이전트를 활용해 프론트-백 연결 작업을 자동화하는 등 AI 도구를 온보딩과 생산성에 적극 활용했습니다.
협업 진행 방식
서비스 도메인별로 담당자를 지정하고, 매일 회의로 진행 상황을 공유하며 회의록을 노션에 기록했습니다. MSA 구조에서는 서비스 간 통신 테스트를 하려면 상대 서비스가 어디까지 완성됐는지 알아야 하기 때문에, 진행 상황을 수시로 공유하는 문화에 특히 신경 썼습니다. 오류가 장기간 해결되지 않으면 함께 디버깅했고, Docker Compose로 전체를 로컬 통합 테스트한 뒤 EKS에 배포해 환경 차이 문제를 사전에 줄였습니다.
프로젝트를 진행한 이유
MSA와 클라우드 네이티브 환경에서의 실전 개발·배포 경험을 쌓기 위해 진행했습니다. 서비스 간 통신 방식 설계(동기/비동기 분리), Database per Service 패턴, AWS EKS 기반 오케스트레이션 운영까지 전체 MSA 라이프사이클을 직접 경험하는 것이 목표였습니다.
OUTCOME
2.5주 만에 6개 MSA 설계·개발·배포 완료 — LG CNS AM Inspire 미니프로젝트2 최우수 팀 선정
GKE 클러스터 인증·kubectl 배포 자동화 — Liveness/Readiness Probe 적용으로 신규 Pod 준비 완료 후 트래픽 전환, 백엔드 Graceful Shutdown 구현으로 배포 중 요청 유실 방지
빌드 번호 기반 이미지 태그 동적 치환으로 K8s 이미지 캐싱 문제 해결
GKE Ingress 도입 및 경로 기반 라우팅 설계 — Nginx 리버스 프록시와의 트레이드오프 직접 비교 검증
TROUBLESHOOTING
01병렬 빌드 OOM — 컨테이너 강제 종료
프론트와 백엔드를 동시에 빌드할 때 메모리가 부족해 컨테이너가 강제 종료됐습니다. 한정된 자원에서 병렬 빌드를 한 것이 원인이었고, 파이프라인 구조를 병렬에서 순차 실행으로 바꿔 빌드 안정성을 확보했습니다.
02배포했는데 옛날 화면 — K8s 이미지 캐싱
:latest 태그를 쓰면 내용이 바뀌어도 GKE가 기존 이미지를 재사용해 배포가 반영되지 않았습니다. Jenkins 빌드 번호 기반 동적 태깅과 sed를 이용한 YAML 자동 치환으로 해결했고, 이 교훈은 이룸페이에서 시작부터 동적 태깅을 적용하는 설계로 이어졌습니다.
03LoadBalancer 직노출 → Ingress 고도화
처음엔 프론트-백 통신 문제를 백엔드 서비스 타입을 LoadBalancer로 바꿔 외부 IP를 여는 방식으로 '일단 되게' 해결했습니다. 하지만 백엔드 서버가 그대로 노출되는 보안 문제를 인지하고, ClusterIP 전환 + GKE Ingress 단일 진입점으로 아키텍처를 고도화했습니다. 이때부터 동작하는 것에 만족하지 않고 왜 이 방식이 더 나은지 검증하는 습관이 생겼습니다.
협업 진행 방식
팀원 각자가 동일한 E-ON 레포를 Fork해 개인 환경에서 독립적으로 CI/CD를 구축하는 방식으로 진행했습니다. 팀장으로서 전체 파이프라인의 방향성과 아키텍처를 설계했고, Jenkins 설정부터 GitHub Webhook 연동, 배포 절차까지 따라 할 수 있는 CI/CD 구축 가이드라인을 작성해 공통 기준을 마련했습니다. 매주 진행 상황을 공유하며 특정 이슈가 오래 해결되지 않으면 함께 디버깅했고, 제가 먼저 해결한 이슈(OOM · 이미지 캐싱 · Ingress 라우팅)를 정리해 공유해 팀이 같은 문제를 반복하지 않도록 했습니다.
프로젝트를 진행한 이유
실제 서비스에 CI/CD 파이프라인을 직접 설계·구축하며 코드 변경부터 자동 배포까지의 전체 DevOps 흐름을 경험하고, VM 기반 배포에서 쿠버네티스 오케스트레이션까지 인프라를 단계적으로 발전시키는 과정을 학습하고자 했습니다.
OUTCOME
무중단 배포 파이프라인 완성 — 여기서 얻은 교훈(동적 태깅 · 가이드 문서화)이 이룸페이 인프라 설계에 선반영
미래의 나에게 편지를 쓰고 정해진 날짜에 개봉하는 자기 성찰 서비스. 모놀리식으로 완성된 웹 서비스를 마이크로서비스 아키텍처로 분리해 GKE에 배포했습니다.
OVERVIEW
편지를 작성하면 AI가 감정을 분석하고, 감정 흐름 시각화와 콘텐츠 추천을 제공
편지 루틴을 설정하면 정해진 날짜·시간에 메일 알림 발송
도메인 기준으로 서비스를 분리해 12개 레포지토리(10개 서비스 + api-gateway + web-client)로 구성, GKE 배포
SCREENS
편지 루틴 설정 — 내가 맡은 루틴 도메인 (등록 → 스케줄링 → 메일 알림)
MY ROLE
루틴 도메인 마이크로서비스 분리
routine-service — 사용자 루틴 등록/삭제/조회
scheduler-service — 루틴 기반 이메일 예약 스케줄러 (Celery Beat/Worker)
notification-service — 알림 메일 전송 (RabbitMQ 소비, Direct Exchange 라우팅)
설계 · 인프라
도메인/마이크로서비스 전체 설계 참여
k8s-configs 메타 레포 주도 — 전 서비스 Deployment/Service/ConfigMap/Secret 매니페스트 작성, PostgreSQL 단일 파드 + 서비스별 논리 DB 분리 구성과 초기 DB 자동 생성 스크립트, 전 서비스 헬스체크 표준화, Docker/K8s 가이드 문서화
백엔드 — 루틴 등록/삭제 구현, 등록된 루틴의 날짜·시간대로 이메일 알림 발송 구현 (Celery Beat 주기 예약 → RabbitMQ Direct Exchange 라우팅 → notification 워커 소비)
TROUBLESHOOTING
01MSA 분리 후 헬스체크 500 — DRF 인증의 함정
쿠버네티스 헬스체크 엔드포인트가 500을 반환하며 파드가 Ready 상태가 되지 않았습니다. 모놀리식에서는 자연스럽게 동작하던 DRF 인증이, auth가 별도 서비스로 분리되면서 @api_view가 request.user에 접근하는 순간 인증 시도 오류로 이어진 것이 원인이었습니다. 인증이 필요 없는 헬스체크는 Django 기본 @require_GET 뷰로 교체해 해결하고, 같은 패턴을 전 서비스에 표준화했습니다.
02Celery task unregistered — 서비스가 분리되면 task 이름도 계약이 된다
scheduler가 예약한 작업을 notification 워커가 Task unregistered로 거부했습니다. 서비스 분리로 더 이상 코드를 공유하지 않게 되면서 양쪽이 인식하는 task 이름이 어긋난 것이 원인이었고, @shared_task(name=...)로 이름을 명시하고 함수 import 대신 app.send_task 호출로 전환해 서비스 간 코드 결합 없이 이름 계약만으로 통신하도록 정리했습니다.
협업에서 어려웠던 점과 극복 방법
팀원들이 서로 무엇을 알고 무엇을 모르는지 파악하기 어려웠고, 질문을 주저하는 분위기도 있었습니다. 단톡방뿐 아니라 개인 메시지로도 자유롭게 물어볼 수 있도록 장려해 질문 장벽을 낮췄습니다. 기술적으로는 마이크로서비스 간 통신에서 어려움이 많았는데, Docker Compose로 로컬에서 컨테이너 간 통신을 먼저 검증하는 방식을 적용해 문제 원인을 환경 설정이 아닌 애플리케이션 로직으로 좁힐 수 있게 했습니다.
user 도메인을 user/auth 서비스로 분리하며 JWT 인증을 도입했는데, 일부 서비스는 쿠키로, 일부는 헤더로 토큰을 전달하고 있었습니다. MSA의 stateless 원칙을 근거로 헤더 기반 전달 방식으로 통일할 것을 제안했고, 쿠키와 헤더 방식이 얽혀 있던 코드를 직접 디버깅하며 수정했습니다.
협업 진행 방식
도메인별로 소규모 세부 팀을 구성하고, 단기 목표(도커파일 작성 → 서비스 단독 실행 → 도메인 내 통신 확인)를 주차별로 설정했습니다. 매주 회의로 진행 상황을 공유하고 노션에 기록했으며, 특정 팀에서 오류가 오래 해결되지 않으면 다른 팀이 지원하는 교차 협력으로 함께 성장하는 환경을 만들었습니다.
프로젝트를 진행한 이유
기존 모놀리식 애플리케이션을 MSA로 분리하는 실습을 통해, 단일 서버 구조와는 다른 분산 환경에서의 서비스 설계·배포·운영을 직접 경험하고자 했습니다. 이때 겪은 분산 장애 추적의 어려움이 이후 카오스 엔지니어링(LitmusChaos)에 관심을 갖게 된 계기가 됐습니다.
OUTCOME
루틴 도메인 3개 서비스 분리·GKE 배포 성공 — 이후 MSA 프로젝트를 주도하는 기반이 된 경험
화장품·식품·의약품 등 개봉 후 소비기한을 계산·관리해주는 서비스. 학기 중 미완성으로 끝난 프로젝트를 방학 동안 리팩토링해 교내 SW경진대회 동상으로 완성했습니다.
OVERVIEW
개봉일과 제품 종류만 입력하면 기준 소비기간 DB를 바탕으로 예상 소비기한을 자동 계산 — 바코드 없이도 조회 가능
구글/네이버 소셜 로그인 후 계정별 캘린더에 제품 소비기한 등록·관리
식품·화장품에 한정된 기존 서비스와 달리 소비기한이 존재하는 모든 제품군 지원
SCREENS
메인 — 개봉일 · 제품 종류 입력으로 소비기한 자동 계산계정별 캘린더 — 제품 소비기한 일정 관리
MY ROLE
Passport.js 기반 구글/네이버 OAuth 2.0 소셜 로그인·로그아웃 구현 — 초기 JWT 방식에서 세션 기반 인증으로 전환을 결정하고 MySQL 세션 스토어(express-mysql-session)를 구성, 로그인 플랫폼별 사용자·캘린더 구분 처리
계정별 캘린더 기능 전체 구현 — iframe 방식을 FullCalendar로 교체하고 일정 추가/삭제 이벤트·소비기한 등록 모달을 구현, Sequelize User·Calendar 모델과 연동해 캘린더-DB 흐름을 처음부터 끝까지 담당
방학 리팩토링 — REST API 및 DB 구조 개선, 프로젝트 구조 재정비, Postman 기반 API 검증
TROUBLESHOOTING
01Sequelize Validation Error — calendars.userId cannot be null
캘린더 이벤트 생성 시 userId가 null로 들어와 저장이 실패했습니다. Passport의 serialize/deserialize 단계에 로그를 추가해 로그인 후 req.user가 라우트까지 제대로 전달되는지부터 검증했고, 컨트롤러가 req.user.id로 접근하고 있었지만 실제 User 모델의 PK는 userId라는 필드명 불일치를 찾아 수정했습니다. 세션 → deserialize → req.user로 이어지는 인증 흐름 전체를 따라가며 디버깅한 첫 경험이었습니다.
협업에서 어려웠던 점과 극복 방법
초기에는 GCP 환경에서 팀 개발을 진행하며 IAM 권한을 부여했지만, 네트워크 환경 차이로 로컬호스트 접근이 원활하지 않아 테스트가 반복적으로 실패했습니다. SSH 터널링을 시도했고, 이후에는 공통 개발 환경을 로컬로 맞추어 문제를 극복했습니다.
또한 GitHub 사용에 미숙해 충돌이 자주 발생했는데, 레포 관리자를 지정해 무분별한 push를 제한하고 PR 기반 협업과 브랜치 전략을 도입했습니다. 그 결과 코드 충돌이 크게 줄고 버전 관리가 체계화되었습니다.
협업 진행 방식
프론트엔드/백엔드로 나누어 개발했고, 매주 대면 회의로 진행 상황을 공유하며 기능 우선순위를 조율했습니다. 개발 중 발생한 오류나 질문은 디스코드 채널에서 실시간으로 공유하며 빠르게 대응했습니다.
프로젝트를 진행한 이유
일상 속 다양한 제품의 소비기한 관리 불편에서 출발했습니다. 식품뿐 아니라 화장품에도 소비기한이 존재한다는 점에서, 이를 한 번에 관리할 수 있는 서비스가 있으면 편리하겠다고 생각했습니다. 학기가 끝난 뒤에도 그대로 끝내기 아쉬워 방학 동안 리팩토링해 대회에 다시 도전했고, '실패 → 회고 → 재도전'을 처음 경험한 프로젝트가 됐습니다.
기술 스택 선정 주도 — 팀 숙련도와 대회 일정상 생산성을 기준으로 React Native + Node.js/Express + MySQL을 제안, 러닝커브·커뮤니티를 근거로 채택을 이끎
캘린더 백엔드 (2023 대회 버전) — 날짜 선택 시 해당 일기에 접근하는 DB 스키마·조회 API 구현
2025년 단독 리팩토링 (new-FOTD) — 대회가 끝난 뒤에도 아쉬움이 남아 프로젝트를 새 레포로 옮겨 다시 시작. 백엔드는 DB 스키마 전면 리팩토링 · RESTful 라우팅 재설계 · 컨트롤러/서비스 계층 분리로 구조를 다시 세우고, 프론트는 '오늘의 식탁' 타임라인 · 일기 평점 · 먹킷리스트-일기 연동 · 카카오맵 JS SDK 커스텀 지도를 추가하며 Expo SDK 53까지 업그레이드 — 첫 프로젝트를 성장한 눈으로 다시 만든 기록
협업에서 어려웠던 점과 극복 방법
프로젝트 초반에는 GitHub를 제대로 활용하지 못해 메신저로 소스 코드를 주고받는 비효율적인 방식을 썼습니다. 파일이 덮어 써지거나 버전이 달라 충돌이 잦았고, 백엔드-프론트 간 API 통신 기준이 없어 같은 기능을 두고도 해석이 달라 혼란이 있었습니다.
GitHub의 Pull/Push 개념을 처음 배우고 적용하면서 각자의 코드를 한 저장소에 통합할 수 있게 됐습니다. 브랜치 전략이나 코드 리뷰 같은 체계는 아직 없었지만, 최소한의 협업 도구를 익혔다는 점에서 의미가 컸습니다. API 명세서도 직접 찾아보며 처음 작성해봤는데, 요청/응답 형식·필수 파라미터·에러 코드 같은 기본 요소를 정리해야 한다는 걸 배웠고, 덕분에 다음 프로젝트부터 문서화를 자연스럽게 이어갈 수 있었습니다.
프로젝트를 진행한 이유
2023 소프트웨어 경진대회 참가를 위해 팀을 구성했고, 당시 식사 기록 공유 트렌드를 앱으로 확장해 일반 SNS의 잡음 없이 식사 기록·회고에 집중하는 경험을 제공하고자 했습니다.
OUTCOME
2023 컴퓨터공학과 소프트웨어 경진대회 동상 — 이때의 습관이 이후 모든 프로젝트의 '문서화부터 챙기는' 태도로 이어짐
JavaScriptReact NativeExpoNode.jsExpressSequelizeMySQLKakao Map API
05
AWARDS & CERTIFICATES
2026.06.18
LG CNS AM Inspire 4기 최종 프로젝트ErumPay
대상 (1위)
2026.06.18
LG CNS AM Inspire Camp 4기
개인 우수 수료생 · 3위
2024.09.04
컴퓨터공학과 소프트웨어 경진대회성신여자대학교
동상
2023.09.07
컴퓨터공학과 소프트웨어 경진대회성신여자대학교
동상
2025.12.24
정보처리기사한국산업인력공단
취득
06
OPEN SOURCE
2026.04 — 06
LitmusChaos 문서 기여OSSCA (NIPA) 체험형
8개 node experiment 문서에 공통 누락된 ENV를 litmus-go 소스에서 기본값까지 확인해 근거를 확보하고 Issue 제안·PR 제출 — litmuschaos/litmus PR #5533 메인 브랜치 merge 완료. 여기서 배운 도구를 이룸페이 카오스 실험에 곧바로 실전 적용했습니다.
2025.09 — 10
Git 활용 및 Ubuntu 한국어 번역OSSCA (NIPA) 체험형
Launchpad ubuntu-l10n-ko 팀에서 git 패키지 미번역 문자열 번역·교정, 번역 내용 실제 릴리즈 반영. Ubuntu 다양성 정책 문서 번역 PR 제출·반영.
2026.07 — 진행 중
YorkieCRDT 기반 분산 동기화 · OSSCA 참여형 멘티
체험형 2회(번역 → 문서 기여)를 거쳐 참여형 멘티로 선정 — 코드 레벨 기여를 목표로 활동 중.