Let's Eat는 아동급식카드를 활용한 마을 탐험 게임형 식사 예약 서비스입니다.
MSA(Microservices Architecture) 기반으로 서비스가 독립적으로 배포 및 확장 가능하도록 설계되었습니다.
SpringBoot 기반 백엔드 레포지토리입니다.

- 프로젝트 소개
- 기술 스택
- 팀원 소개
- 서비스 아키텍처
- 프로젝트 구조
- 쿠버네티스 설정
- 서비스 간 통신
- CI/CD 파이프라인
- MSA 아키텍처
Let's Eat는 아동급식카드 사용의 접근성을 높이고, 영양 균형 관리를 게임화하여 아이들이 즐겁게 식사할 수 있도록 돕는 서비스입니다.
주요 특징
- 게임형 마을 인터페이스로 직관적인 가게 탐색
- 디지털 초대장 시스템으로 오프라인 결제 간소화
- OpenFeign 기반 서비스 간 동기 통신
- Kubernetes 환경에서의 안정적인 MSA 운영
| 구분 |
기술 |
| Language |
Java |
| Framework |
Spring Boot, Spring Cloud |
| Database |
MySQL, Redis |
| Infra |
Docker, Kubernetes(NKS), Naver Cloud Platform |
| CI/CD |
NCP SourceCommit, SourceBuild, SourceDeploy, SourcePipeline |
| Auth |
JWT, Spring Security |
| Communication |
OpenFeign |
| 외부 API |
Google Vision API, NCP Object Storage |
| Team Member |
Team Member |
 |
 |
| 이지원 |
김이안 |
• User/Pay Service 개발 • Gateway Service/JWT 인증 구현 • NKS 클러스터 구성 및 K8S 리소스 관리 • CI/CD 파이프라인 구축 |
• Store/Review Service 개발 • OpenFeign 통신 구현 • NCP Object Storage 연동
|
pairmate_backend/
├── common-libs/ # 공통 라이브러리
├── config-server/ # Config Server
├── eureka-server/ # Eureka Server
├── gateway-service/ # API Gateway
├── user-service/ # User Service
├── store-service/ # Store Service
├── pay-service/ # Pay Service
├── review-service/ # Review Service
│
└── k8s/ # Kubernetes 리소스
├── namespace.yaml
├── cert/ # TLS 인증서
├── configmap/ # 환경 설정
├── secret/ # 민감 정보
├── db/ # MySQL
├── redis/ # Redis
├── deployment/ # 서비스 배포
├── frontend/ # Frontend
└── ingress/ # 라우팅
| 환경 |
네임스페이스 |
용도 |
| 테스트 |
pairmate-test |
개발/테스트 환경 |
| 운영 |
pairmate-prod |
프로덕션 환경 |
kubectl create namespace pairmate-test
kubectl create namespace pairmate-prod
| Secret 이름 |
내용 |
ncr-secret |
NCR 이미지 Pull 인증 |
config-git-secret |
Config Server Git 인증 |
redis-secret |
Redis 비밀번호 |
*-db-secret |
각 서비스 DB 계정 정보 |
pay-pg-secret |
결제 API 키 |
kubectl apply -f k8s/secret/ -n pairmate-prod
| ConfigMap 이름 |
내용 |
global-config |
Config Server URL, 공통 환경 변수 |
nginx-config |
Nginx 설정 (API 프록시) |
kubectl apply -f k8s/configmap/ -n pairmate-prod
| 항목 |
설정 |
| 인증서 |
Let's Encrypt (자동 갱신) |
| 운영 도메인 |
lets-eat.store |
| 테스트 도메인 |
test.lets-eat.store |
| TLS |
TLS 1.3 |
경로별 라우팅
| 경로 |
서비스 |
/ |
frontend-service |
/api/auth |
user-service |
/api/stores |
store-service |
/api/review |
review-service |
/api/pay |
pay-service |
| 구성 요소 |
설정 |
| 플랫폼 |
Naver Cloud Kubernetes Service (NKS) |
| 이미지 레지스트리 |
Naver Container Registry (NCR) |
| 스토리지 |
ncloud-block-storage |
| 로드밸런서 |
NCP Load Balancer |
| 전략 |
내용 |
| Rolling Update |
무중단 배포, 새 버전 기동 확인 후 전환 |
| Topology Spread |
Pod 노드 간 균등 분산 |
| Startup Probe |
초기 구동 시간 확보 |
| Readiness Probe |
트래픽 수신 준비 확인 |
| Liveness Probe |
비정상 Pod 자동 재시작 |
# DB 및 Redis 배포
kubectl apply -f k8s/db/ -n pairmate-prod
kubectl apply -f k8s/redis/ -n pairmate-prod
# 서비스 배포
kubectl apply -f k8s/deployment/ -n pairmate-prod
# 배포 상태 확인
kubectl rollout status deployment/<서비스명> -n pairmate-prod
| 순서 |
단계 |
설명 |
| 1 |
메서드 호출 |
A 서비스에서 FeignClient 인터페이스 메서드 호출 |
| 2 |
호출 가로채기 |
OpenFeign이 @FeignClient 정보 확인 |
| 3 |
서비스 탐색 |
Eureka Server에서 B 서비스 IP/포트 조회 |
| 4 |
HTTP 요청 생성 |
메서드 매핑 정보 기반 HTTP 요청 생성 |
| 5 |
요청 전송 |
B 서비스로 요청 전송 및 JSON 응답 수신 |
| 6 |
자동 변환 |
JSON → ResponseDto 객체 자동 변환 |
주요 특징
- 서비스명 기반 통신 (IP 하드코딩 불필요)
- 자동 로드 밸런싱
- Circuit Breaker 적용
- 선언적 HTTP 클라이언트
| 단계 |
도구 |
역할 |
| 1. 코드 관리 |
SourceCommit |
Git 저장소 관리, 브랜치 전략 |
| 2. 빌드 |
SourceBuild |
Docker 이미지 빌드, NCR 푸시 |
| 3. 배포 |
SourceDeploy |
NKS 클러스터 배포, Rolling Update |
| 4. 통합 |
SourcePipeline |
전체 과정 자동화 및 모니터링 |
코드 푸시 → Docker 빌드 → NCR 저장 → K8S 배포 → 헬스체크 → 서비스 반영
| 환경 |
네임스페이스 |
도메인 |
| 테스트 |
pairmate-test |
test.lets-eat.store |
| 운영 |
pairmate-prod |
lets-eat.store |
| 컴포넌트 |
역할 |
| Eureka Server |
서비스 등록/탐색, 동적 라우팅 |
| Config Server |
중앙 설정 관리, 환경별 설정 분리 |
| Gateway Service |
JWT 인증, CORS 처리, 라우팅, 로깅 |
| Common Libs |
공통 응답/예외 구조, JWT 유틸 |
| 서비스 |
주요 기능 |
| User Service |
회원가입, 로그인, JWT 발급, RefreshToken 관리 |
| Store Service |
가게 등록/수정/삭제, 카테고리 관리, 이미지 업로드 |
| Review Service |
리뷰 작성/수정/삭제, 별점 계산, 이미지 업로드 |
| Pay Service |
카드 등록/검증, 결제 처리, 한도 관리 |
| 항목 |
구현 |
| 인증 |
JWT 기반 무상태 인증 |
| 토큰 저장 |
RefreshToken → Redis |
| 통신 보안 |
TLS 1.3, Let's Encrypt |
| 민감 정보 |
Kubernetes Secret (Base64) |