광고주용 캠페인 성과·정산 웹 대시보드
본 프로젝트의 요구사항(캠페인 노출·참여·집행 금액 실시간 조회, 기간별 정산 내역과 엑셀 다운로드, 광고주별 인증과 데이터 격리)을 기반으로 직접 구현한 프로젝트입니다.
프로젝트 개요
본 프로젝트의 요구사항(캠페인 노출·참여·집행 금액 실시간 조회, 기간별 정산 내역과 엑셀 다운로드, 광고주별 인증과 데이터 격리)을 기반으로 직접 구현한 프로젝트입니다.
작업 범위
- 캠페인 현황 실시간 조회: 광고주가 캠페인별 노출·참여·집행 금액을 한 화면에서 확인하고 상태·기간으로 걸러 봅니다
- 정산 내역 조회: 정산 기간을 고르면 건별 내역과 상세를 보고 같은 조건의 엑셀 파일을 내려받습니다
- 광고주 인증·격리: 광고주별 계정으로 로그인하고 자신의 캠페인과 정산 데이터만 조회합니다
- 노출·참여 추이 분석: 기간별 노출·참여 추이와 집행 금액 비중을 차트와 표로 비교합니다
주요 업무
- 캠페인 현황 실시간 조회 화면: 캠페인 목록과 상세 지표를 폴링 기반으로 갱신하는 조회 API와 비대칭 타일 화면을 설계합니다
- 정산 내역 조회 화면: 기간 필터와 상세 패널, 서버 측 엑셀 생성 엔드포인트를 구현합니다
- 광고주 인증·격리 화면: JWT 세션과 광고주 식별자 기반 조회 범위 강제를 API 계층에서 구현합니다
- 노출·참여 추이 분석 화면: Recharts 기반 추이 차트, 도넛 비중, 상세 테이블을 같은 필터와 연동합니다



프로젝트 핵심 과제
노출·참여·집행 금액이 기존 서버에 이미 집계되어 있는지에 따라 조회 구조가 달라져
착수 시 기존 데이터 기준을 확정하는 범위 정의가 필요하며 스키마 설명을 먼저 받아 대응합니다
MySQL과 MongoDB에 나뉜 데이터를 캠페인 단위로 합칠 때 집계 시점 차이로 수치가 어긋날 수
기준 시각을 응답에 포함하는 방식으로 대응합니다
광고주별 데이터 격리가 일부 API에서 누락되면 타 광고주 정보가 노출되므로 공통 인터셉터와 격리 전용 테스트로 대응할 계획입니다
대용량 정산 목록의 엑셀 생성이 서버 메모리를 압박할 수
스트림 방식 생성과 행 수 상한 안내로 대응합니다
폴링 주기가 짧아지면 조회 부하가 커지므로 갱신 주기 설정화와 SSE 전환 경로를 함께 설계할 계획입니다
핵심 기능 상세
캠페인 현황 실시간 조회
광고주가 캠페인별 노출·참여·집행 금액을 한 화면에서 확인하고 상태·기간으로 걸러 봅니다. 캠페인 목록과 상세 지표를 폴링 기반으로 갱신하는 조회 API와 비대칭 타일 화면을 설계합니다.
- Next.js 클라이언트 훅으로 15초 주기 폴링을 구성하고 탭 비활성 시 일시 정지
- NestJS 조회 API에서 MySQL 캠페인 마스터와 MongoDB 이벤트 집계를 병합
- 정렬·상태·기간 필터 조건을 URL 쿼리와 동기화해 화면 공유를 지원
노출·참여·집행 금액을 캠페인 단위로 합산하는 조회 계층을 설계하고, 폴링 주기를 환경 설정으로 조정할 수 있게 구현합니다.


정산 내역 조회
정산 기간을 고르면 건별 내역과 상세를 보고 같은 조건의 엑셀 파일을 내려받습니다. 기간 필터와 상세 패널, 서버 측 엑셀 생성 엔드포인트를 구현합니다.
- 기간 선택기와 정산 상태 필터를 NestJS 쿼리 DTO로 검증
- 정산 건 상세를 우측 패널로 열어 캠페인별 집행 금액 내역을 표시
- 엑셀 파일을 서버에서 스트림 방식으로 생성해 대용량 목록도 메모리 부담 없이 내려받기
화면에 보이는 필터 조건과 다운로드 파일의 조건이 동일하도록 하나의 쿼리 정의를 공유하는 구조를 설계합니다.


광고주 인증·격리
광고주별 계정으로 로그인하고 자신의 캠페인과 정산 데이터만 조회합니다. JWT 세션과 광고주 식별자 기반 조회 범위 강제를 API 계층에서 구현합니다.
- NestJS 가드에서 액세스 토큰을 검증하고 리프레시 토큰은 HttpOnly 쿠키로 보관
- 모든 조회 쿼리에 광고주 식별자 조건을 공통 인터셉터로 강제
- 타 광고주 리소스 요청 시 404로 응답해 존재 여부를 노출하지 않음
개별 API가 아니라 공통 계층에서 조회 범위를 강제하는 구조로 데이터 격리 누락 가능성을 줄이도록 설계합니다.


노출·참여 추이 분석
기간별 노출·참여 추이와 집행 금액 비중을 차트와 표로 비교합니다. Recharts 기반 추이 차트, 도넛 비중, 상세 테이블을 같은 필터와 연동합니다.
- Recharts 영역·막대 차트에 일·주·월 집계 단위 전환을 적용
- 차트 구간을 선택하면 하단 테이블이 같은 기간으로 좁혀지는 연동 구조 설계
- 서버 집계 결과를 React Query로 캐싱하고 필터 변경 시 키 단위로 무효화
차트와 표가 하나의 필터 상태를 공유하도록 설계해 화면 간 수치 불일치를 막는 구조를 구현합니다.


프로젝트 진행 단계
데이터 구조 확인과 조회 모델 설계 · 2026.10
기존 캠페인·정산 데이터 전제 정리, MySQL 마스터와 MongoDB 이벤트 집계 구조 매핑
인증·격리 계층과 캠페인 현황 화면 개발 · 2026.10
JWT 가드, 광고주 식별자 인터셉터, 폴링 훅, 비대칭 타일 화면과 Recharts 차트 구현
정산 조회와 엑셀 내보내기 구현 · 2026.10
기간 필터, 상세 패널, 스트림 방식 엑셀 생성 엔드포인트 구현
컨테이너 배포 구성과 문서화 · 2026.10
Docker 이미지 빌드, ECR 푸시와 ECS 서비스 정의, 화면 설계서·결과보고서 정리
개발 결과
기술적 주안점
- 노출·참여·집행 금액을 캠페인 단위로 합산하는 조회 계층을 설계하고, 폴링 주기를 환경 설정으로 조정할 수 있게 구현합니다
- 화면에 보이는 필터 조건과 다운로드 파일의 조건이 동일하도록 하나의 쿼리 정의를 공유하는 구조를 설계합니다
- 개별 API가 아니라 공통 계층에서 조회 범위를 강제하는 구조로 데이터 격리 누락 가능성을 줄이도록 설계합니다