Skip to content

MacDungE/vibelist-backend

Repository files navigation

VibeList API Server

Java Spring Boot Spring Security Spring Data JPA JWT OAuth2 PostgreSQL Gradle Lombok Swagger Docker Redis Elasticsearch Logstash Kibana GitHub Actions

OAuth2 기반 소셜 로그인 & JWT 인증 백엔드

VibeList 백엔드는 음악 기반 감정 공유 소셜 플랫폼의 핵심 API 서버입니다. Spring Boot와 최신 보안/아키텍처 패턴을 적용하여 확장성과 유지보수성을 극대화했습니다.


🏗️ 프로젝트 개요

  • 목적: 사용자들이 음악과 감정을 공유하며 소통할 수 있는 안전하고 확장성 높은 RESTful API 제공
  • 주요 역할: 인증/인가, 사용자 관리, 소셜 로그인, 음악 서비스 연동, 예외 처리, 보안 강화

⚙️ 기술 스택

분류 기술
언어 Java 21
프레임워크 Spring Boot 3.5.3
ORM Spring Data JPA
DB PostgreSQL
인증 Spring Security, JWT, OAuth2
배포 Docker, AWS EC2, RDS
문서화 Swagger
빌드툴 Gradle
기타 Lombok

☁️ AWS 인프라 구성

VibeList 백엔드는 AWS 클라우드 환경에서 아래와 같이 구성되어 있습니다.

주요 서비스 구성

  • EC2
    • Spring Boot 애플리케이션을 호스팅하는 가상 서버

    • 배포 자동화(Docker, Github Actions 등) 및 보안 그룹 설정

      • EC2 세부 Spec
      인스턴스 타입 구성 요소 사양
      t3.medium Elasticsearch, Kibana 2 vCPU / 4 GB RAM
      t2.small Logstash, Redis 1 vCPU / 2 GB RAM
      t2.micro Spring Boot Backend 1 vCPU / 1 GB RAM
  • ECS (Elastic Container Service)
    • Docker 컨테이너 기반의 서비스 오케스트레이션
    • Blue/Green 배포, Auto Scaling, 롤링 업데이트 지원
    • EC2 또는 Fargate 런타임 선택 가능
  • RDS (Relational Database Service)
    • PostgreSQL 데이터베이스 운영
    • 백업, 장애 복구, 보안 그룹 및 파라미터 그룹 관리
  • CloudWatch
    • EC2/ECS/RDS의 로그 및 메트릭 모니터링
    • 애플리케이션 로그 수집 및 알람 설정
    • 장애 발생 시 자동 알림 및 대시보드 제공

아키텍처 흐름

full_arch.png

운영 특징

  • EC2/ECS에서 Spring Boot 서버를 실행하며, RDS와 연동
  • CloudWatch로 모든 인프라 및 애플리케이션 로그/메트릭 실시간 모니터링
  • 보안 그룹 및 IAM 역할로 서비스 간 접근 제어
  • 환경 변수 및 민감 정보는 AWS Secrets Manager 또는 Parameter Store로 관리

🗂️ 폴더 구조 및 아키텍처

VibeList 백엔드는 도메인 중심 설계와 계층 분리를 통해 유지보수성과 확장성을 높였습니다. 주요 폴더 구조와 각 역할은 아래와 같습니다.

vibelist-backend/
├── .github/                # Github Actions 등 CI/CD 워크플로우
│   └── workflows/
├── .task/                  # 개발 작업 관리(TODO.md 등)
├── config/                 # 추가 환경설정, 감정/로그 등 서브 설정
│   ├── emotion/            # 감정 분석 관련 설정 파일
│   └── logstash/           # local test용 Logstash 파이프라인 설정
├── docs/                   # 설계/보안/배포 등 문서
├── ecs/                    # AWS ECS 관련 설정 및 배포 스크립트
├── src/
│   ├── main/
│   │   ├── java/org/example/vibelist/
│   │   │   ├── global/
│   │   │   │   ├── auth/           # 인증(JWT, OAuth2)
│   │   │   │   ├── config/         # 보안, 환경, CORS 설정
│   │   │   │   ├── constants/      # 전역 상수
│   │   │   │   ├── exception/      # 글로벌 예외 처리
│   │   │   │   ├── jpa/            # JPA 기본 엔티티
│   │   │   │   ├── oauth2/         # 소셜 로그인 및 OAuth2 핸들러
│   │   │   │   ├── security/       # 인증/인가 필터, 보안 유틸리티
│   │   │   │   ├── user/           # 사용자 도메인 및 서비스
│   │   │   │   └── util/           # 공통 유틸리티
│   │   │   ├── domain/             # 게시글, 댓글, 추천, 플레이리스트 등 주요 도메인
│   │   │   │   ├── post/           # 게시글 관련 엔티티/컨트롤러/서비스/리포지토리
│   │   │   │   ├── comment/        # 댓글 관련
│   │   │   │   ├── like/           # 좋아요 관련
│   │   │   │   ├── playlist/       # 플레이리스트 및 트랙 추천
│   │   │   │   ├── explore/        # 검색/트렌드/피드
│   │   │   │   ├── batch/          # 배치 작업 및 데이터 처리
│   │   │   │   └── ...             # 기타 도메인
│   │   │   └── VibeListApplication.java # 메인 엔트리포인트
│   ├── resources/
│       ├── application.properties       # 운영 환경 설정
│       ├── application-dev.properties   # 개발 환경 설정
│       
│                               
│   
├── build.gradle
├── Dockerfile
├── docker-compose.yml

아키텍처 개요

  • 계층 구조
    • Controller → Service → Repository → Domain(Entity)
    • 인증/인가, 사용자 관리, 소셜 로그인, 예외 처리 등 각 도메인별로 패키지 분리
  • 인증/인가
    • JWT 기반 인증 시스템 (Access/Refresh Token 분리)
    • OAuth2 소셜 로그인(Kakao, Google,Spotify) 지원
    • 토큰 발급/검증/갱신 로직 분리
  • 환경 설정
    • 운영/개발 환경 분리(application.properties, application-dev.properties)
    • 환경 변수 및 민감 정보는 .env 또는 AWS Secrets Manager로 관리
  • 예외 처리
    • 글로벌 예외 핸들러(@ControllerAdvice)로 모든 예외를 표준화된 JSON 응답으로 반환
    • 커스텀 예외 및 에러 코드 관리
  • CORS 및 보안
    • SecurityConfig에서 CORS 허용 오리진, 인증/인가 필터, 세션 정책 등 통합 관리
    • 프론트엔드와의 연동을 위한 리디렉션 URL 환경 변수화
  • 배포/운영
    • AWS EC2, RDS, S3, Secrets Manager, CloudWatch 등 클라우드 인프라 활용
    • Dockerfile 및 CI/CD 스크립트로 자동화 지원

각 도메인은 독립적으로 관리되며, 확장 시 새로운 기능을 별도 패키지로 추가할 수 있도록


🔒 인증 및 보안

  • JWT 기반 인증: Access/Refresh Token 분리, HttpOnly 쿠키 사용
  • Refresh Token 암호화: DB에 암호화 저장, 탈취 방지
  • OAuth2 소셜 로그인: 카카오/구글/Spotify 지원, 신규 사용자명 서버사이드 설정 플로우
  • CORS/SameSite 정책: 프론트엔드와 안전한 통신 지원
  • 비밀번호 해싱: BCrypt 적용
  • API Rate Limiting: (옵션) IP/사용자별 요청 제한

🗄️ 데이터베이스 설계

  • User: 로그인에 필요한 기본 정보(ID, 비밀번호, 역할)를 관리합니다.
  • UserProfile: 이메일, 이름, 자기소개 등 사용자의 프로필 정보를 관리합니다. (User와 1:1 관계)
  • UserSocial (Integration): 소셜 로그인 및 외부 서비스 연동 정보를 통합 관리합니다. provider (e.g., 'kakao', 'spotify'), providerUserId, 그리고 API 접근에 필요한 accessToken, refreshToken 등을 저장합니다. 이를 통해 Spotify 같은 음악 서비스와의 데이터 연동을 지원합니다. (User와 1:N 관계)
  • Post: 사용자가 작성하는 게시물입니다. 내용, 태그 등을 포함하며, 작성자인 User와 N:1 관계를 맺습니다.
  • Playlist: 사용자가 생성하는 음악 플레이리스트입니다. 플레이리스트 제목, 설명 등을 포함하며, 생성자인 User와 N:1 관계입니다. 각 플레이리스트는 여러 개의 음악 트랙 정보를 가질 수 있습니다.
  • Comment / Like: Post에 대한 댓글과 좋아요 정보를 관리하며, 각각 User 및 Post와 관계를 맺습니다.
  • 토큰 관리: VibeList 자체의 Refresh Token을 별도 테이블에서 암호화하여 관리합니다

🔗 주요 API 엔드포인트

인증/인가

  • POST /v1/auth/signup : 회원가입
  • POST /v1/auth/login : 로그인
  • POST /v1/auth/refresh : 토큰 갱신
  • POST /v1/auth/kakao : 카카오 로그인
  • POST /v1/auth/google : 구글 로그인

사용자 관리

  • GET /v1/users/me : 내 정보 조회
  • PUT /v1/users/me/profile : 프로필 수정
  • DELETE /v1/users/me : 회원 탈퇴
  • GET /v1/users/search : 사용자 검색

관리자

  • GET /v1/users : 전체 사용자 조회
  • GET /v1/users/{userId} : 특정 사용자 조회

음악 서비스 연동

  • GET /v1/integration/status : 연동 상태 조회
  • POST /v1/integration/spotify : Spotify 연동

📑 API 문서화

  • Swagger UI: /swagger-ui/index.html에서 실시간 API 테스트 및 문서 확인
  • OpenAPI Spec: 자동 생성, 프론트엔드와 연동

🧑‍💻 예외 처리 및 응답 구조

  • 글로벌 예외 핸들러: 모든 예외를 표준 JSON 응답으로 반환
  • 응답 예시:
{
  "success": false,
  "code": "USER_404",
  "message": "존재하지 않는 사용자입니다.",
  "data": null,
  "timestamp": "2025-07-28T15:10:00"
}
  • 커스텀 예외: 비즈니스 로직별 상세 에러 코드 관리

🧪 테스트 및 품질 관리

  • API 테스트: Swagger, Postman Collection 제공
  • CI/CD: Github Actions 기반 자동 빌드/테스트

📝사용자 로그 분석: Logstash → Kibana 연동

VibeList 백엔드는 AWS EC2/ECS에서 발생하는 애플리케이션 로그를 실시간으로 분석하기 위해 ELK(Elasticsearch, Logstash, Kibana) 스택을 활용합니다.

로그 흐름 아키텍처

log_arch.png

주요 구성 및 분석 절차

  1. 로그 수집
    • EC2/ECS에서 애플리케이션 로그를 파일 또는 stdout/stderr로 출력
    • 로그 포맷: JSON 또는 패턴 기반 텍스트
  2. Logstash 설정
    • Logstash가 EC2/ECS의 로그 파일을 실시간으로 수집
    • Json 형식으로 로그를 구조화
    • 필요한 필드(예: 사용자ID, 요청URL, 응답코드, 에러코드 등) 추출
  3. Elasticsearch 저장
    • Logstash가 구조화된 로그를 Elasticsearch 인덱스에 저장
    • 시간, 사용자, API별로 검색 및 집계 가능
  4. Kibana 시각화
    • Kibana에서 대시보드 생성
    • 주요 지표: 사용자별 활동, 에러 발생 빈도, API 응답 시간, 트래픽 추이 등
    • 필터링 및 Drill-down 분석 지원

예시: 사용자 에러 로그 분석

  • 특정 사용자/기간/엔드포인트별 호출 건수

    userlog.png

운영 효과

  • 장애 및 이상 징후 조기 탐지
  • 사용자 행동 및 서비스 품질 모니터링
  • API 성능 및 트래픽 분석을 통한 인프라 최적화

Logstash와 Kibana를 활용해 VibeList의 사용자 로그를 실시간으로 분석·시각화하여 운영

🚀 개발 및 실행 방법

환경 변수 설정

  • src/main/resources/application.properties 또는 .env에서 DB/JWT/OAuth2 설정

실행

./gradlew build
./gradlew bootRun

DB 마이그레이션

  • Aws RDS로 스키마 자동 관리

🛡️ 배포 및 운영

  • Docker 지원: Dockerfile 및 docker-compose.yml 제공
  • 프로덕션 환경: HTTPS, 환경 변수 분리, 보안 강화
  • 모니터링: K6

📚 참고 문서

  • OAuth2 신규 사용자명 설정 가이드
  • 토큰 보안 리팩토링
  • Integration 연동 패키지 설명
  • Swagger 사용법

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages