[Spotify Web API 6편] Band 서비스 구현

2026. 6. 10. 03:33·개인 프로젝트

이번 편에서는 본 프로젝트의 핵심 서비스 중 하나인 Band 서비스를 구현하고, 기능 동작을 Postman으로 확인했다.

 

또한 사용자가 사이트에 들어오는 것부터 사이트의 기능들을 하나씩 이용하는 사용자 요청 시나리오를 알아보자.
그 과정에서  이 프로젝트에서  Band서비스가 하는 역할이 무엇인지 구현은 어떤 식으로 했는지에 대해 정리했다.

사용자 요청 시나리오

먼저 사용자가 우리 사이트에 접속하고 기능들을 이용하려면 회원가입 후 로그인부터 해야 할 것이다.
회원가입을 할 때, 본인이 속한 밴드를 적어야 한다. (혹은 밴드장으로부터 초대를 받으면 자동으로 기입됨)

소속된 밴드가 없다면, 개인으로 활동하거나 밴드를 새로 생성해야 한다.

회원가입 과정

밴드를 새로 생성하는 경우

유저 회원가입 전에 밴드생성부터 하게 된다.
밴드 생성 Form에 밴드 정보를 입력하고, 밴드 생성이 완료되면 다시 회원가입 페이지로 가서
밴드 정보와 함께 회원가입을 진행한다.

 

이때 생성된 밴드 정보는 Band 서비스에서 관리한다.

밴드장으로부터 초대를 받는 경우

밴드 입력란이 밴드장이 속한 밴드명으로 자동으로 채워져 있다.
이때 밴드명은 중복될 수 없다.
나머지 유저 정보를 입력하여 회원가입을 진행한다.

밴드명을 알고 있는 경우

입력란에 밴드명을 입력한 후 인증절차를 가진다.
인증이 완료되면 나머지 유저 정보를 입력하여 회원가입을 진행한다.

개인(무소속)으로 회원가입 하는 경우

밴드 입력란에 '개인'을 체크하고 회원가입을 진행한다.

로그인 이후

이후 로그인이 완료되면 그때부터 Band와 Wiki 서비스의 기능을 이용할 수 있다.
자신이 속한 밴드와 멤버들의 정보를 확인할 수 있고,
밴드로 새로운 멤버를 초대할 수 있다.

그리고 멤버들만 열람할 수 있는 글을 작성하고 일정을 관리할 수 있다.

Wiki 서비스의 기능으로는 개인 or 밴드멤버로서 밴드곡을 검색하고, 검색된 곡 아래로 글을 작성할 수 있다.
다른 사람의 글을 조회하고 댓글을 달 수 있다.

그리고 글에 대한 궁금증이 생긴다면 글 작성자와 1대 1로 채팅을 할 수 있는데
그 기능은 Chat 서비스에서 담당한다.

사이트를 이용하는 유저들끼리 Follow를 할 수도 있는데 이 기능은 User 서비스에서 담당한다.

따라서, 모든 서비스의 시작은 회원가입으로부터 시작된다.
회원가입을 위해 소속된 밴드정보가 필요하기 때문에
밴드 서비스를 제일 먼저 개발하기로 결정!

Band 서비스

1. 역할

밴드 데이터를 생성 및 관리하며 ( Band 도메인 )
밴드에 멤버를 추가 및 관리할 수 있도록 한다.  ( BandMember 도메인 )

밴드 멤버들끼리 사용할 수 있는 일정표가 있고, 그 일정표에 글을 작성할 수 있다. (TimeLinePost 도메인)
타임라인글에는 멤버들이 자유롭게 댓글을 달 수 있다. (TimeLinePostComment 도메인)

2. 구현 과정

먼저 Band 서비스엔 루트 애그리거트가 2개이다.

 

  • Band — 밴드와 멤버를 관리하는 애그리거트
  • TimelinePost — 타임라인 글과 댓글을 관리하는 애그리거트

그에 맞춰 컨트롤러를 2개로 나눴다.

 

  • BandController
  • TimeLinePostController

서비스 레이어 또한 2개로 나눴다.

  • BandService
  • TimeLinePostService

도메인 계층을 구현할 때, 2가지를 신경 써서 개발했다.

  1. 도메인 객체와 엔티티 객체를 분리
  2. UUID타입의 PK값을 도메인에서 생성 후 Persistable <UUID>, isNew 패턴으로 신규/기존 엔티티 구분

먼저 도메인 계층에 도메인 객체를 두고 인프라 계층에 엔티티 객체를 두었다.

이때 도메인을 먼저 생성함으로써, 도메인 메서드의 검증 로직들이 엔티티 생성전에 동작할 수 있도록 했다.

이 과정에서 도메인 객체에서 UUID를 생성하게 되는데
UUID를 미리 생성하면 JPA가 신규 엔티티인지 기존 엔티티인지 구분하지 못하는 문제가 생긴다. 
이를 해결하기 위해 Persistable <UUID> 인터페이스를 구현하고 @Transient boolean isNew 플래그로 신규 여부를 명시했다.

이는 PK값 생성을 DB에 위임하지 않음으로써, 서비스 간 데이터를 합치거나 샤딩시에 ID 충돌이 없어 확장하기 유리하기 때문이다.

아래는 응용계층과 표현계층에 코드 작성 시, 필요한 API 목록이다.

BandController (/api/bands)
| POST 	| /api/bands | 밴드 생성 |
| GET 	| /api/bands/{bandId} | 밴드 단건 조회 |
| GET 	| /api/bands?page=&size= | 밴드 목록 조회 |
| PATCH | /api/bands/{bandId} | 밴드 정보 수정 |
| DELETE | /api/bands/{bandId} | 밴드 삭제 |
| POST 	| /api/bands/{bandId}/members | 멤버 초대 |
| GET 	| /api/bands/{bandId}/members | 멤버 목록 조회 |
| DELETE | /api/bands/{bandId}/members/{userId} | 멤버 강퇴 / 탈퇴 |
| PATCH | /api/bands/{bandId}/leader | 리더 양도 |

TimelinePostController (/api/timeline-posts)
| POST 	| /api/timeline-posts | 포스트 작성 |
| GET 	| /api/timeline-posts/{postId} | 포스트 단건 조회 |
| GET 	| /api/timeline-posts?bandId= | 밴드별 포스트 목록 조회 |
| PATCH | /api/timeline-posts/{postId} | 포스트 수정 |
| DELETE | /api/timeline-posts/{postId} | 포스트 삭제 |
| POST 	| /api/timeline-posts/{postId}/comments | 댓글 작성 |
| DELETE | /api/timeline-posts/{postId}/comments/{commentId} | 댓글 삭제 |

 

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

[Spotify Web API 7편] 배포 방법 구상  (0) 2026.06.15
[Spotify Web API 5편] Docker 및 공통모듈 세팅  (0) 2026.06.07
[Spotify Web API 4편] MSA 프로젝트 초기 세팅  (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 7편] 배포 방법 구상
  • [Spotify Web API 5편] Docker 및 공통모듈 세팅
  • [Spotify Web API 4편] MSA 프로젝트 초기 세팅
  • [Spotify Web API 3편] 애그리거트 경계 설정 및 SA 문서 작성
MvA
MvA
백엔드 개발자 김재현입니다. 주로 공부하면서 느낀점을 기록합니다.
  • MvA
    Man vs Ai
    MvA
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • Java (6)
      • Python (8)
        • 딥러닝 (1)
        • 머신러닝 (7)
      • JavaScript (2)
      • 내배캠 (60)
      • 개인 프로젝트 (11)
      • 책 후기 (5)
      • 기타 (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
MvA
[Spotify Web API 6편] Band 서비스 구현
상단으로

티스토리툴바