[Spotify Web API 4편] MSA 프로젝트 초기 세팅

2026. 6. 7. 01:45·개인 프로젝트

이번 4편부터는 드디어 구현을 시작하는데, 먼저 개발 로드맵 다시 살펴보자.

개발 로드맵

[1단계] MSA 인프라 및 핵심 비즈니스 구축 (Base MVP)

  1. API, 테이블, 인프라 설계서 작성
  2. Eureka Server(디스커버리) 및 Config Server(설정 관리) 구축
  3. User 서비스, Band 서비스, Post 서비스 생성 및 유레카 등록
    [핵심 기능] Spotify API 연동 및 Post/Song 위키형 게시판 CRUD 완성 (인증 없이 우선 개발)
    [장애 격리] Post 서비스 내에 Resilience4j 서킷 브레이커 및 @Retryable 재시도 로직 적용 및 검증

[2단계] 게이트웨이 라우팅/보안 필터 및 커뮤니티 확장 (Feature MVP)

  1. Gateway 서비스 구축 및 각 서비스로의 패스 라우팅(Routing) 적용
    [인증/인가 빌드업] User 서비스에서 로그인 검증 후, Gateway에서 JWT 토큰을 발급·검증하는 흐름 완성
    [인증 기반 개발] 게이트웨이가 넘겨준 헤더(X-User-Id)를 활용해 BandMember 매핑 및 프라이빗 타임라인(접근 제어) 구현
  2. Chat 서비스 추가 분리 및 WebSocket + STOMP 기반 1:1 DM 구축

[3단계] 인프라 고도화 및 아키텍처 검증 (Architecture MVP)

  1. GitHub Actions와 Docker를 이용한 AWS 멀티 컨테이너 배포 파이프라인 구축
  2. Prometheus + Grafana를 연동하여 서버 메트릭 모니터링 환경 구축
  3. JMeter / k6 부하테스트를 통해 외부 API 지연 발생 시 서킷 브레이커 동작(Fallback) 검증 및 Redis 캐싱 적용 전후 TPS 비교
  4. 실사용자 배포 및 피드백 수집

맞다. 지금까지 딱 1줄 했다.

갈 길이 멀다... 얼른 MSA 환경부터 구성해 보자.

MSA 환경 구성

- 유레카 서버 프로젝트 생성

- 프로메테우스와 액츄에이터(모니터링용) 
- 컨피그 클라이언트(yml 설정을 받아오기 위해)
- 유레카 서버

 

 

 

 

 

 

 

 

 

 

- 컨피그 서버 프로젝트 생성

- 프로메테우스, 액츄에이터
- 컨피그 서버
- 스프링 웹 ( 이후 공통 모듈로부터 주입받을 예정 )
(다른 서비스에 yml 파일을 전달할 때, HTTP REST API 방식으로 전달한다.
이때 필요한 내장 TomCat을 스프링 웹 의존성으로 지원받기 때문이다.)

 

 

 

 

- 게이트웨이 프로젝트 생성

- 프로메테우스, 액츄에이터
- 유레카 클라이언트
- 컨피그 클라이언트
- 롬복

- 스프링 시큐리티
- R4j
- 스프링 클라우드 게이트웨이
- Validation

+) Jwt 의존성 추가
(외부 라이브러리라서 수동으로 추가해야 한다.)

 

공통 모듈

공통 모듈에 어느 의존성까지 주입해야 하는지 고민해봐야 할 것 같다.
지금은 아래와 같이 설정했다.

plugins {
    id 'java-library'
    id 'io.spring.dependency-management'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.boot:spring-boot-dependencies:3.5.14"
    }
}

dependencies {
    // 모니터링 의존성 추가 예정
    // jpa
    api 'org.springframework.boot:spring-boot-starter-data-jpa'

    // querydsl
    implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
    
    // Srping Web
    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta'
    annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
    annotationProcessor 'jakarta.persistence:jakarta.persistence-api'

    // lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

롬복은 api로 설정해도 annotationProcessor까지는 전파가 안된다고 해서
어차피 각 서비스에서도 의존성을 추가해줘야 해서 나중에 제거할 수도 있을 것 같다.

그리고 이후 prometheus나 actuator를 추가할 것 같다.

또, 루트 폴더 아래에 build.gradle에서도 의존성을 주입할 수 있다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.14'
    id 'io.spring.dependency-management' version '1.1.7'
}

// root project 실행 가능 Jar 파일 생성기능 Off
bootJar.enabled = false

allprojects {
    group = 'com.bandfeed'
    version = '0.0.1-SNAPSHOT'
    description = 'bandfeed'

    repositories {
        mavenCentral()
    }
}

// 루트 모듈을 제외한 하위 프로젝트 공통 설정
subprojects {
    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    java {
        toolchain {
            languageVersion = JavaLanguageVersion.of(21)
        }
    }

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }
}

project(':common') {
    bootJar.enabled = false
    jar.enabled = true
}

project(':apps:gateway-server') {
    apply plugin: 'org.springframework.boot'
}

project(':apps:config-server') {
    apply plugin: 'org.springframework.boot'
}

project(':apps:eureka-server') {
    apply plugin: 'org.springframework.boot'
}

// 그 외 마이크로 서비스들 추가 예정

그래서 유레카 서버, 컨피그 서버, 게이트웨이 서버 같은 인프라 서버들과
비즈니스로직을 처리하는 각 마이크로 서비스들에게 의존성을 다르게 주입하는 전략을 고민 중이다.

  • 인프라 서버들은 루트 폴더 아래 build.gradle로부터만 의존성을 주입받는다.
  • 그 외 서비스들은 루트 폴더 아래 build.gradle 의존성 + 공통모듈 의존성을 모두 주입받는다.

- band-service 프로젝트 생성


오늘 한 것:
- 프로젝트 Repo 생성 및 모노레포 멀티모듈 구성
- 컨피그 Repo 생성 및 연동
- 유레카-컨피그-게이트웨이서버 동작 확인
- 공통모듈 추가 및 BaseEntity 동작 확인
- 밴드 서비스 추가

 

내일 할 것 :
- 루트 폴더 아래 build.gradle에 band-service 추가
- user-service, wiki-service, chat-service 프로젝트 생성
- band-service, wiki-service MVP 개발


Todo List :

- user-service 구현 및 게이트웨이 시큐리티 기능 추가

- R4j 적용 및 FeignClient, Kafka 연동
- chat-service에서 사용할 ws 개념 알아보기
- chat-service MVP 개발

- 이벤트 로직이 필요한 파트 구현
- 통합 시나리오 테스트용 .http 파일 작성
- 모니터링 설정 추가

- CI 코드 작성

- AWS 배포

- CD 구현
- 배포환경에서 부하테스트
- 프런트 개발
- 프런트 배포
- 프런트로 동작 테스트
- 버그 수정
- 실 사용자 피드백받기 및 반영

'개인 프로젝트' 카테고리의 다른 글

[Spotify Web API 6편] Band 서비스 구현  (0) 2026.06.10
[Spotify Web API 5편] Docker 및 공통모듈 세팅  (0) 2026.06.07
[Spotify Web API 3편] 애그리거트 경계 설정 및 SA 문서 작성  (0) 2026.06.06
[Spotify Web API 2편] API 분석  (0) 2026.06.05
[Spotify Web API 1편] 주제 및 기능 설계  (0) 2026.06.05
'개인 프로젝트' 카테고리의 다른 글
  • [Spotify Web API 6편] Band 서비스 구현
  • [Spotify Web API 5편] Docker 및 공통모듈 세팅
  • [Spotify Web API 3편] 애그리거트 경계 설정 및 SA 문서 작성
  • [Spotify Web API 2편] API 분석
MvA
MvA
백엔드 개발자 김재현입니다. 주로 공부하면서 느낀점을 기록합니다.
  • MvA
    Man vs Ai
    MvA
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • Java (6)
      • Python (8)
        • 딥러닝 (1)
        • 머신러닝 (7)
      • JavaScript (2)
      • 내배캠 (60)
      • 개인 프로젝트 (11)
      • 책 후기 (5)
      • 기타 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    딥러닝
    내일배움캠프
    머신러닝
    아키텍처
    Riot API
    TiL
    배포
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
MvA
[Spotify Web API 4편] MSA 프로젝트 초기 세팅
상단으로

티스토리툴바