Solo-led Fullstack Project

PopupMoah

팝업스토어·이벤트 정보를 모아 공유하는 플랫폼. Spring Boot 헥사고날 멀티모듈 백엔드부터 Vue3 프론트, Prometheus·Grafana 모니터링까지 풀스택으로 구성. 325커밋 중 97%를 직접 작성한 사실상 단독 프로젝트.

Java 17Spring Boot 3.5PostgreSQL · FlywayRedisVue 3 · PiniaAWS S3Prometheus · Grafana

핵심 기술 구현

헥사고날 멀티모듈, 스키마 버저닝, 모니터링까지 — 혼자서도 운영 가능한 시스템을 목표로 한 풀스택 구성

헥사고날 멀티모듈 설계

domain · api · adapter-persistence · common · core 5개 모듈로 분리. 도메인은 순수 자바로 유지하고 웹·영속성은 어댑터로 격리해 MSA 전환에 대비한 경계 설계.

계층형 카테고리 시스템

팝업스토어 분류를 계층 구조로 관리. 상위/하위 카테고리 트리 탐색과 CRUD를 도메인 서비스로 구현.

S3 파일 업로드 · 이미지 처리

파일 스토리지를 포트로 추상화하고 AWS S3 어댑터로 구현. 팝업스토어 이미지 업로드·다운로드와 이미지 최적화 처리.

Flyway 스키마 버저닝

DDL 변경을 전부 마이그레이션 파일로 관리. 로컬·CI·운영 어디서든 같은 순서로 스키마가 재현되도록 데이터베이스 형상 관리.

Prometheus · Grafana 모니터링

개인 프로젝트에도 운영 관점을 적용 — 메트릭 수집과 대시보드를 docker-compose로 함께 띄워 로컬에서도 운영과 같은 관측 환경을 재현.

Vue3 + TypeScript 프론트

Vue3 · Pinia · Tailwind CSS v4 · Vite 조합의 프론트엔드를 같은 저장소에서 개발. 백엔드 API와 함께 E2E로 굴러가는 풀스택 구성.

아키텍처 하이라이트

01

모듈 경계 = 아키텍처 규칙

의존성 방향을 Gradle 모듈 경계로 강제. 도메인 모듈은 스프링·JPA를 모르는 순수 자바, API·영속성 모듈이 포트를 구현하는 어댑터.

adapter → port → domain
02

MSA 대비 모놀리스

처음부터 서비스를 쪼개는 대신 모듈 경계만 MSA 수준으로 유지. 트래픽이 늘면 모듈 단위로 떼어낼 수 있도록 결합도를 관리하는 현실적 선택.

modular monolith → future MSA
03

인프라 애즈 컴포즈

PostgreSQL · Redis · Prometheus · Grafana를 docker-compose 하나로 기동. 온보딩과 재현이 명령 한 줄로 끝나는 개발 환경.

docker-compose up -d
04

GitHub Actions CI

테스트·빌드를 CI로 자동화. 단위·통합 테스트 태스크를 분리(test / integrationTest)해 파이프라인 단계별로 실행.

test · integrationTest · check
325
Commits
5
Backend Modules
18
Test Files
97%
Own Commits

기술적 의사결정

DECISION 01

왜 멀티모듈 모놀리스인가

1인 규모에서 MSA는 운영 비용이 편익을 초과. 대신 모듈 경계를 서비스 경계처럼 설계해 배포는 하나로, 코드 결합도는 MSA 수준으로 관리. 규모가 커지면 모듈 단위 분리가 가능.

DECISION 02

왜 Flyway인가

JPA ddl-auto는 운영에서 스키마 이력을 남기지 않음. 마이그레이션 파일 기반 버저닝으로 스키마 변경을 코드 리뷰 대상으로 만들고, 환경 간 드리프트를 차단.

DECISION 03

왜 처음부터 모니터링인가

관측 수단은 장애가 난 뒤에 붙이면 늦음. 개발 초기부터 Prometheus 메트릭과 Grafana 대시보드를 컴포즈에 포함해, 기능을 붙일 때마다 지표를 함께 확인하는 습관을 구조화.

DECISION 04

왜 스토리지를 포트로 추상화했나

파일 저장은 로컬 디스크 → S3 → CDN으로 진화하는 대표 인프라. 도메인이 S3 SDK를 직접 알지 못하게 포트로 격리해, 스토리지 교체가 어댑터 구현 교체로 끝나도록 설계.