2026 Capstone · Graduation Project
WhereYouAd는 광고 성과 및 워크스페이스 관리를 효율적으로 지원하는 웹 서비스입니다.
본 레포지토리는 2026 캡스톤(졸업 프로젝트)을 위해 개발 중인 백엔드 애플리케이션으로,
다중 광고 플랫폼 통합과 안정적인 API 설계, 확장 가능한 도메인 아키텍처를 목표로 합니다.
- 프로젝트명: WhereYouAd
- 목적: 광고 및 워크스페이스 관리 서비스의 백엔드 구현
- 성격: 2026 캡스톤 디자인 · 졸업 프로젝트
- 소셜 로그인 & JWT 인증 — Naver / Google / Kakao OAuth2 로그인 및 JWT 세션 관리
- 광고 플랫폼 연동 — Google Ads, Meta Marketing API와 OAuth2 토큰 기반 연결, Naver Ads API와 Key/Secret 기반 API 연결
- 캠페인 / 광고 관리 — 다중 플랫폼 데이터를 통합 모델로 정규화하여 제공
- 광고 성과 대시보드 — 플랫폼별·기간별 지표 집계 및 커서 기반 페이지네이션
- 클릭 이벤트 수집 — Kafka를 통한 비동기 클릭 이벤트 처리
- AI 인사이트 — OpenAI 연동을 통한 광고 성과 분석 및 제안
- 워크스페이스 / 프로젝트 관리 — 다중 사용자·팀 단위로 광고 자산을 분리 관리
- 이미지 업로드 — AWS S3를 통한 광고 소재 저장
- 도메인 계층형 아키텍처로 관심사 분리 및 유지보수성 확보
- 외부 API(광고 플랫폼, AI)의 변경에 유연하게 대응할 수 있는 추상화 설계
- 팀 협업을 고려한 컨벤션 및 일관된 응답/예외 처리 구조
백엔드 |
백엔드 |
백엔드 |
- Language: Java 17
- Framework: Spring Boot 3.5.9, Spring Cloud 2024.0.1
- Build: Gradle
- Auth: Spring Security, OAuth2 Client
- Token: JWT (jjwt 0.11.5)
- Encryption: AES
- RDBMS: MySQL 8.0
- ORM: Spring Data JPA (Hibernate)
- Cache: Redis
- Event Streaming: Apache Kafka 3.7.0
- Ad Platforms: Google Ads SDK, Meta Marketing API, Naver Ads API
- AI: OpenAI API
- HTTP Client: OpenFeign, WebClient
- Storage: AWS S3 (Spring Cloud AWS)
- Verification: Gmail SMTP, CoolSMS (계정 찾기 · 비밀번호 재설정 인증 코드 발송)
- Container: Docker, Docker Compose
- API 문서: Springdoc OpenAPI (Swagger UI)
- JDK: 17 (LTS 권장)
- 빌드 도구: Gradle
- 인프라: Docker / Docker Compose (MySQL 8.0 · Redis · Kafka 로컬 구동)
팀 내 개발 환경 차이를 최소화하기 위해 JDK 17 기준으로 개발합니다.
로컬 실행 전에 .env.example을 복사하여 .env 파일을 생성하고 값을 채워야 합니다.
cp .env.example .env필요한 환경 변수 그룹:
- DB / Redis / Kafka 접속 정보
- OAuth2 클라이언트 자격증명 (Naver / Google / Kakao)
- 광고 플랫폼 자격증명 (Meta Marketing, Google Ads, Naver Ads)
- JWT / AES 시크릿
- AWS S3, OpenAI, CoolSMS, Gmail 자격증명
| Script | 설명 |
|---|---|
./gradlew build |
테스트 포함 전체 빌드 |
./gradlew clean build -x test |
테스트 제외 빌드 |
./gradlew test |
테스트만 실행 (MySQL + Redis 필요) |
./gradlew bootRun |
로컬 서버 실행 (.env 필요) |
docker-compose up -d |
전체 스택 실행 (App + MySQL + Redis + Kafka) |
앱이 뜨면 http://localhost:8080/swagger-ui/index.html 에서 API 문서를 확인할 수 있습니다.
현재 프로젝트는 도메인 단위 및 계층형 패턴을 중심으로 구성되어 있습니다.
src/main/java/com/whereyouad/WhereYouAd/
├── domains/ # 핵심 비즈니스 도메인
│ └── {domain}/
│ ├── application/ # Service 계층 (DTO, Mapper 포함)
│ ├── domain/ # 비즈니스 로직 (Service, Constant)
│ ├── persistence/ # JPA Entity, Repository
│ ├── presentation/ # Controller + Swagger 문서 인터페이스
│ └── exception/ # 도메인 예외 + ErrorCode
├── global/ # 전역 공통 설정 및 유틸
│ ├── common/ # 공용 베이스 클래스 (BaseEntity 등)
│ ├── security/ # JWT, OAuth2 필터/핸들러
│ ├── config/ # Swagger, Redis, OpenAI, WebClient 설정
│ ├── response/ # 응답 래퍼 (BaseResponse, DataResponse)
│ ├── exception/ # 전역 예외 핸들러
│ ├── adapi/ # 광고 플랫폼 API 인증 (Factory + Strategy 패턴)
│ ├── sse/ # SSE Emitter (실시간 이벤트 전송)
│ └── utils/ # AESUtil, RedisUtil, CursorUtil 등
└── infrastructure/ # 외부 시스템 연동
├── meta/ # Meta Marketing API 클라이언트
├── naver/ # Naver Ads API 클라이언트
├── google/ # Google Ads API 클라이언트
├── openai/ # OpenAI Feign 클라이언트
├── s3/ # AWS S3 이미지 업로드
└── kafka/ # Kafka Producer / Consumer핵심 도메인: user · advertisement · organization · platform · dashboard · click · ai
- CI —
.github/workflows/ci.yml:main,develop브랜치에 push / PR 시 MySQL · Redis 서비스 컨테이너를 띄우고./gradlew build실행 - CD —
.github/workflows/cd.yml:develop브랜치 push 시 Docker 이미지 빌드 → Docker Hub 푸시 → Bastion host 경유 EC2 SSH 배포
- develop: 배포 가능한 상태의 브랜치 (Production)
- feature/#[이슈번호]: 새로운 기능 개발 브랜치 (예:
feature/#1)
Angular Commit Convention을 따릅니다.
:gitmoji: type: subject
| Gitmoji | Type | 설명 |
|---|---|---|
✨ :sparkles: |
feat |
새로운 기능 추가 |
🐛 :bug: |
fix |
버그 수정 |
📝 :memo: |
docs |
문서 수정 (README, Swagger Docs 등) |
🎨 :art: |
style |
코드 포맷팅, 세미콜론 누락, 공백 등 (코드 변경 없음) |
♻️ :recycle: |
refactor |
코드 리팩토링 (기능 변화 없음) |
✅ :white_check_mark: |
test |
테스트 코드 추가/수정 |
🔧 :wrench: |
chore |
빌드, 설정, 패키지 매니저 등 기타 변경사항 |
💚 :green_heart: |
ci |
CI 관련 설정 변경 |
🚀 :rocket: |
deploy |
배포 관련 수정(Dockerfile, docker-compose.yml 등) |
팀 전체의 코드 스타일 일관성을 위해 다음 규칙을 적용합니다.
- 패키지 구조: 도메인 단위 계층형 패키지 (
application/domain/persistence/presentation/exception) - 응답 형식: 모든 API 응답은
BaseResponse계열 래퍼(DataResponse<T>,ErrorResponse)로 통일 - 에러 처리: 도메인별
BaseErrorCode구현체로 에러 코드 정의 → 도메인 예외 throw → 전역 핸들러 매핑 - API 문서: Controller 코드와 Swagger 어노테이션을
presentation/docs/인터페이스로 분리
PR 템플릿에 따라 작성하며, 리뷰어 가이드를 준수합니다.
- Title:
[Type/#이슈번호] 작업 요약(예:[Feat/#1] 소셜 로그인 API 구현) - Review Labels:
P1: 필수 반영 (Critical) - 버그/컨벤션 위반 (머지 불가)P2: 적극 권장 (Recommended) - 더 나은 대안 (반영 권장)P3: 제안 (Suggestion) - 아이디어 공유 (자율)P4: 단순 확인 (Nit) - 오타/칭찬 등