From f0b2622e87eff82fb39a92216dcc7f922cb6b18a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=ED=98=84=EC=A1=B0?= Date: Sat, 4 Nov 2023 14:40:47 +0900 Subject: [PATCH 1/3] =?UTF-8?q?Feat:=20Id=20=ED=95=84=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20=20-=20=EA=B0=9D=EC=B2=B4=EC=9D=98=20?= =?UTF-8?q?=EC=BB=A8=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EB=82=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8A=94=20"id"=EB=A5=BC=20=EC=82=AC=EC=9A=A9=20=20-?= =?UTF-8?q?=20=EC=99=B8=EB=B6=80=20=EC=BB=A8=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=EC=84=9C=EB=8A=94=20"classNameId"=EC=99=80=20?= =?UTF-8?q?=EA=B0=99=EC=9D=B4=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20=EC=A0=91=EB=91=90=EC=82=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/com/spring/sad/album/domain/Album.java | 2 +- .../src/main/java/com/spring/sad/album/domain/AlbumImage.java | 2 +- backend/src/main/java/com/spring/sad/band/domain/Band.java | 2 +- backend/src/main/java/com/spring/sad/band/domain/Category.java | 2 +- backend/src/main/java/com/spring/sad/image/domain/Image.java | 2 +- backend/src/main/java/com/spring/sad/member/domain/Member.java | 2 +- .../java/com/spring/sad/notification/domain/Notification.java | 2 +- backend/src/main/java/com/spring/sad/post/domain/Comment.java | 2 +- backend/src/main/java/com/spring/sad/post/domain/Post.java | 2 +- backend/src/main/java/com/spring/sad/post/domain/PostImage.java | 2 +- backend/src/main/java/com/spring/sad/post/domain/Tag.java | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/com/spring/sad/album/domain/Album.java b/backend/src/main/java/com/spring/sad/album/domain/Album.java index a7cdb6e..e1a5641 100644 --- a/backend/src/main/java/com/spring/sad/album/domain/Album.java +++ b/backend/src/main/java/com/spring/sad/album/domain/Album.java @@ -16,7 +16,7 @@ public class Album { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long albumId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "band_id") diff --git a/backend/src/main/java/com/spring/sad/album/domain/AlbumImage.java b/backend/src/main/java/com/spring/sad/album/domain/AlbumImage.java index 5ebe9f6..e18c12b 100644 --- a/backend/src/main/java/com/spring/sad/album/domain/AlbumImage.java +++ b/backend/src/main/java/com/spring/sad/album/domain/AlbumImage.java @@ -13,7 +13,7 @@ public class AlbumImage { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long albumImgId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "album_id") diff --git a/backend/src/main/java/com/spring/sad/band/domain/Band.java b/backend/src/main/java/com/spring/sad/band/domain/Band.java index 7937a8c..a4de1b1 100644 --- a/backend/src/main/java/com/spring/sad/band/domain/Band.java +++ b/backend/src/main/java/com/spring/sad/band/domain/Band.java @@ -19,7 +19,7 @@ public class Band { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long bandId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "category_id") diff --git a/backend/src/main/java/com/spring/sad/band/domain/Category.java b/backend/src/main/java/com/spring/sad/band/domain/Category.java index 2284c33..a06da51 100644 --- a/backend/src/main/java/com/spring/sad/band/domain/Category.java +++ b/backend/src/main/java/com/spring/sad/band/domain/Category.java @@ -15,7 +15,7 @@ public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long categoryId; + private long id; private String categoryName; diff --git a/backend/src/main/java/com/spring/sad/image/domain/Image.java b/backend/src/main/java/com/spring/sad/image/domain/Image.java index b5816b4..2e8beeb 100644 --- a/backend/src/main/java/com/spring/sad/image/domain/Image.java +++ b/backend/src/main/java/com/spring/sad/image/domain/Image.java @@ -17,7 +17,7 @@ public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long imgId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "band_id") diff --git a/backend/src/main/java/com/spring/sad/member/domain/Member.java b/backend/src/main/java/com/spring/sad/member/domain/Member.java index d1db63e..a3e74f7 100644 --- a/backend/src/main/java/com/spring/sad/member/domain/Member.java +++ b/backend/src/main/java/com/spring/sad/member/domain/Member.java @@ -22,7 +22,7 @@ public class Member extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long memberId; + private long id; private String name; diff --git a/backend/src/main/java/com/spring/sad/notification/domain/Notification.java b/backend/src/main/java/com/spring/sad/notification/domain/Notification.java index 65d691a..a562638 100644 --- a/backend/src/main/java/com/spring/sad/notification/domain/Notification.java +++ b/backend/src/main/java/com/spring/sad/notification/domain/Notification.java @@ -12,7 +12,7 @@ public class Notification { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long notificationId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") diff --git a/backend/src/main/java/com/spring/sad/post/domain/Comment.java b/backend/src/main/java/com/spring/sad/post/domain/Comment.java index 63e920e..4abc1c3 100644 --- a/backend/src/main/java/com/spring/sad/post/domain/Comment.java +++ b/backend/src/main/java/com/spring/sad/post/domain/Comment.java @@ -14,7 +14,7 @@ public class Comment extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long commentId; + private long id; private String commentContent; diff --git a/backend/src/main/java/com/spring/sad/post/domain/Post.java b/backend/src/main/java/com/spring/sad/post/domain/Post.java index 08568b3..7d06c14 100644 --- a/backend/src/main/java/com/spring/sad/post/domain/Post.java +++ b/backend/src/main/java/com/spring/sad/post/domain/Post.java @@ -18,7 +18,7 @@ public class Post extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long postId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "band_id") diff --git a/backend/src/main/java/com/spring/sad/post/domain/PostImage.java b/backend/src/main/java/com/spring/sad/post/domain/PostImage.java index 56dc2f7..c6c406d 100644 --- a/backend/src/main/java/com/spring/sad/post/domain/PostImage.java +++ b/backend/src/main/java/com/spring/sad/post/domain/PostImage.java @@ -13,7 +13,7 @@ public class PostImage { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long postImageId; + private long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") diff --git a/backend/src/main/java/com/spring/sad/post/domain/Tag.java b/backend/src/main/java/com/spring/sad/post/domain/Tag.java index fafa6a1..a0e2d6f 100644 --- a/backend/src/main/java/com/spring/sad/post/domain/Tag.java +++ b/backend/src/main/java/com/spring/sad/post/domain/Tag.java @@ -15,7 +15,7 @@ public class Tag { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private long tagId; + private long id; private String name; From d6f6cff582739bf030aaa37e0edd60cc29cc04a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=ED=98=84=EC=A1=B0?= Date: Sat, 4 Nov 2023 14:42:24 +0900 Subject: [PATCH 2/3] =?UTF-8?q?Feat:=20Profile=20=EA=B4=80=EB=A0=A8=20Resp?= =?UTF-8?q?onse,=20Request=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=20-=20Response=EC=99=80=20Request=EC=9D=98=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9D=B4=20=EB=98=91=EA=B0=99=EC=9D=8C=20=20?= =?UTF-8?q?-=20=EA=B3=B5=ED=86=B5=20=EB=B6=80=EB=B6=84=EC=9D=80=20?= =?UTF-8?q?=EC=B6=94=EC=83=81=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EC=BD=94=EB=93=9C=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=20=20=20=20-=20=ED=99=95=EC=9E=A5=EC=84=B1?= =?UTF-8?q?=20=EB=8C=80=EB=B9=84=20=20=20=20-=20SRP=20=EC=A4=80=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/sad/band/service/BandService.java | 19 ++++++++++++ .../member/controller/MemberController.java | 11 ++++--- .../data/dto/common/MemberProfileBody.java | 15 ++++++++++ .../MemberProfileDetails.java | 2 +- .../ProfileBandDetails.java | 4 +-- .../dto/request/MemberProfileRequest.java | 26 ++++++++++++++++ .../dto/response/MemberLoginResponse.java | 2 +- .../dto/response/MemberProfileResponse.java | 26 ++++++++++++++++ .../dto/response/ProfileSettingResponse.java | 30 ------------------- .../sad/member/service/MemberService.java | 6 ++-- 10 files changed, 100 insertions(+), 41 deletions(-) create mode 100644 backend/src/main/java/com/spring/sad/band/service/BandService.java create mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java rename backend/src/main/java/com/spring/sad/member/data/dto/{response => common}/MemberProfileDetails.java (95%) rename backend/src/main/java/com/spring/sad/member/data/dto/{response => common}/ProfileBandDetails.java (84%) create mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java create mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java delete mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileSettingResponse.java diff --git a/backend/src/main/java/com/spring/sad/band/service/BandService.java b/backend/src/main/java/com/spring/sad/band/service/BandService.java new file mode 100644 index 0000000..cd052ad --- /dev/null +++ b/backend/src/main/java/com/spring/sad/band/service/BandService.java @@ -0,0 +1,19 @@ +package com.spring.sad.band.service; + +import com.spring.sad.band.domain.Band; +import com.spring.sad.band.repository.BandRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class BandService { + private final BandRepository bandRepository; + public Optional findById(long bandId) { + return bandRepository.findById(bandId); + } +} diff --git a/backend/src/main/java/com/spring/sad/member/controller/MemberController.java b/backend/src/main/java/com/spring/sad/member/controller/MemberController.java index ab27b56..9e462fe 100644 --- a/backend/src/main/java/com/spring/sad/member/controller/MemberController.java +++ b/backend/src/main/java/com/spring/sad/member/controller/MemberController.java @@ -1,8 +1,11 @@ package com.spring.sad.member.controller; -import com.spring.sad.member.data.dto.request.*; +import com.spring.sad.member.data.dto.request.MemberLoginByEmailRequest; +import com.spring.sad.member.data.dto.request.MemberLoginByPhoneNumberRequest; +import com.spring.sad.member.data.dto.request.MemberSignupByEmailRequest; +import com.spring.sad.member.data.dto.request.MemberSignupByPhoneNumberRequest; import com.spring.sad.member.data.dto.response.MemberLoginResponse; -import com.spring.sad.member.data.dto.response.ProfileSettingResponse; +import com.spring.sad.member.data.dto.response.MemberProfileResponse; import com.spring.sad.member.service.MemberService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -75,8 +78,8 @@ public ResponseEntity login(@RequestBody MemberLoginByPhone }) @Operation(summary = "프로필 조회", description = "프로필 관리 화면에서 프로필을 조회하는 API입니다.") @GetMapping("profile/setting") - public ResponseEntity getProfiles(long memberId) { - ProfileSettingResponse response = memberService.getProfileSetting(memberId); + public ResponseEntity getProfiles(long memberId) { + MemberProfileResponse response = memberService.getProfileSetting(memberId); return ResponseEntity.ok(response); } } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java new file mode 100644 index 0000000..17919ef --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java @@ -0,0 +1,15 @@ +package com.spring.sad.member.data.dto.common; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public abstract class MemberProfileBody { + protected long memberId; + @JsonProperty("profiles") + protected List memberProfileDetailsList = new ArrayList<>(); +} + diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileDetails.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java similarity index 95% rename from backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileDetails.java rename to backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java index 0e804c0..738dca0 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileDetails.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java @@ -1,4 +1,4 @@ -package com.spring.sad.member.data.dto.response; +package com.spring.sad.member.data.dto.common; import com.spring.sad.member.domain.MemberBand; import com.spring.sad.member.domain.Profile; diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileBandDetails.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java similarity index 84% rename from backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileBandDetails.java rename to backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java index de711a0..d981b51 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileBandDetails.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java @@ -1,4 +1,4 @@ -package com.spring.sad.member.data.dto.response; +package com.spring.sad.member.data.dto.common; import com.spring.sad.band.domain.Band; import lombok.*; @@ -13,7 +13,7 @@ public class ProfileBandDetails { private String bandImg; public static ProfileBandDetails from(Band band) { return ProfileBandDetails.builder() - .bandId(band.getBandId()) + .bandId(band.getId()) .bandName(band.getBandName()) .bandImg(band.getBandCover()) .build(); diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java b/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java new file mode 100644 index 0000000..79efac8 --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java @@ -0,0 +1,26 @@ +package com.spring.sad.member.data.dto.request; + +import com.spring.sad.member.data.dto.common.MemberProfileBody; +import com.spring.sad.member.data.dto.common.MemberProfileDetails; +import com.spring.sad.member.domain.Member; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class MemberProfileRequest extends MemberProfileBody { + + public static MemberProfileRequest toRequest(Member member) { + return new MemberProfileRequest(member.getId(), member.getProfiles().stream() + .map(MemberProfileDetails::from) + .toList()); + } + + private MemberProfileRequest(long memberId, List memberProfileDetailsList) { + this.memberId = memberId; + this.memberProfileDetailsList = memberProfileDetailsList; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java index 44a0cea..9b1dca8 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java @@ -11,7 +11,7 @@ public class MemberLoginResponse { private long memberId; private String name; private MemberLoginResponse(Member member) { - this.memberId = member.getMemberId(); + this.memberId = member.getId(); this.name = member.getName(); } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java new file mode 100644 index 0000000..3f8668d --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java @@ -0,0 +1,26 @@ +package com.spring.sad.member.data.dto.response; + +import com.spring.sad.member.data.dto.common.MemberProfileBody; +import com.spring.sad.member.data.dto.common.MemberProfileDetails; +import com.spring.sad.member.domain.Member; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class MemberProfileResponse extends MemberProfileBody { + + public static MemberProfileResponse toResponse(Member member) { + return new MemberProfileResponse(member.getId(), member.getProfiles().stream() + .map(MemberProfileDetails::from) + .toList()); + } + + private MemberProfileResponse(long memberId, List memberProfileDetailsList) { + this.memberId = memberId; + this.memberProfileDetailsList = memberProfileDetailsList; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileSettingResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileSettingResponse.java deleted file mode 100644 index 777fdd7..0000000 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileSettingResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.spring.sad.member.data.dto.response; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.spring.sad.member.domain.Member; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.ArrayList; -import java.util.List; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -public class ProfileSettingResponse { - private long memberId; - @JsonProperty("profiles") - private List memberProfileDetailsList = new ArrayList<>(); - - private ProfileSettingResponse(long memberId) { - this.memberId = memberId; - } - public static ProfileSettingResponse toResponse(Member member) { - ProfileSettingResponse response = new ProfileSettingResponse(member.getMemberId()); - member.getProfiles().stream() - .map(MemberProfileDetails::from) - .forEach(response.memberProfileDetailsList::add); - return response; - } -} - diff --git a/backend/src/main/java/com/spring/sad/member/service/MemberService.java b/backend/src/main/java/com/spring/sad/member/service/MemberService.java index 97a087a..2874545 100644 --- a/backend/src/main/java/com/spring/sad/member/service/MemberService.java +++ b/backend/src/main/java/com/spring/sad/member/service/MemberService.java @@ -5,7 +5,7 @@ import com.spring.sad.member.data.dto.request.MemberSignupByPhoneNumberRequest; import com.spring.sad.member.data.dto.request.MemberSignupByEmailRequest; import com.spring.sad.member.data.dto.response.MemberLoginResponse; -import com.spring.sad.member.data.dto.response.ProfileSettingResponse; +import com.spring.sad.member.data.dto.response.MemberProfileResponse; import com.spring.sad.member.domain.Member; import com.spring.sad.member.domain.Profile; import com.spring.sad.member.exception.MemberErrorCode; @@ -73,10 +73,10 @@ public MemberLoginResponse loginByPhoneNumber(MemberLoginByPhoneNumberRequest re return MemberLoginResponse.of(member); } - public ProfileSettingResponse getProfileSetting(long memberId) { + public MemberProfileResponse getProfileSetting(long memberId) { Member member = memberRepository.findById(memberId) .orElseThrow(() -> new MemberException(MemberErrorCode.MEMBER_DOES_NOT_EXISTS)); - return ProfileSettingResponse.toResponse(member); + return MemberProfileResponse.toResponse(member); } } From 59e765d4268d7c932998bb0858be684525adb3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=ED=98=84=EC=A1=B0?= Date: Sun, 5 Nov 2023 00:41:55 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Feat:=20Profile=20Update=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=20-=20Update=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D:=20Dirty=20Checking=20=20-=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A0=84=EB=B6=80=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=ED=9B=84=20=EC=83=88=EB=A1=9C=EC=9A=B4=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EA=B5=AC=EC=84=B1=20=20-=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EC=A1=B0=EA=B1=B4=20=20=20=201.=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=EC=9D=B4=20=EB=8C=80=ED=91=9C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=20=20=202.?= =?UTF-8?q?=20=ED=95=98=EB=82=98=20=EC=9D=B4=EC=83=81=EC=9D=98=20=EB=B0=B4?= =?UTF-8?q?=EB=93=9C=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=20-=20MemberBand=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=98=88=EC=99=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=20-=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=A3=BC=EC=84=9D=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 25 +++-- ...ofileBandDetails.java => BandDetails.java} | 6 +- ...rofileDetails.java => ProfileDetails.java} | 24 +++-- ...ofileBody.java => ProfileListDetails.java} | 4 +- .../dto/request/MemberProfileRequest.java | 26 ----- .../dto/request/ProfileUpdateRequest.java | 11 +++ .../dto/response/MemberLoginResponse.java | 2 +- .../dto/response/MemberProfileResponse.java | 26 ----- .../dto/response/ProfileListResponse.java | 26 +++++ .../spring/sad/member/domain/MemberBand.java | 10 ++ .../member/exception/MemberBandErrorCode.java | 19 ++++ .../member/exception/MemberBandException.java | 10 ++ .../sad/member/exception/MemberErrorCode.java | 2 +- .../repository/MemberBandRepository.java | 16 ++++ .../sad/member/service/MemberService.java | 95 ++++++++++++++++--- 15 files changed, 216 insertions(+), 86 deletions(-) rename backend/src/main/java/com/spring/sad/member/data/dto/common/{ProfileBandDetails.java => BandDetails.java} (76%) rename backend/src/main/java/com/spring/sad/member/data/dto/common/{MemberProfileDetails.java => ProfileDetails.java} (53%) rename backend/src/main/java/com/spring/sad/member/data/dto/common/{MemberProfileBody.java => ProfileListDetails.java} (65%) delete mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java create mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/request/ProfileUpdateRequest.java delete mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java create mode 100644 backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileListResponse.java create mode 100644 backend/src/main/java/com/spring/sad/member/exception/MemberBandErrorCode.java create mode 100644 backend/src/main/java/com/spring/sad/member/exception/MemberBandException.java diff --git a/backend/src/main/java/com/spring/sad/member/controller/MemberController.java b/backend/src/main/java/com/spring/sad/member/controller/MemberController.java index 9e462fe..96da1a6 100644 --- a/backend/src/main/java/com/spring/sad/member/controller/MemberController.java +++ b/backend/src/main/java/com/spring/sad/member/controller/MemberController.java @@ -1,11 +1,8 @@ package com.spring.sad.member.controller; -import com.spring.sad.member.data.dto.request.MemberLoginByEmailRequest; -import com.spring.sad.member.data.dto.request.MemberLoginByPhoneNumberRequest; -import com.spring.sad.member.data.dto.request.MemberSignupByEmailRequest; -import com.spring.sad.member.data.dto.request.MemberSignupByPhoneNumberRequest; +import com.spring.sad.member.data.dto.request.*; import com.spring.sad.member.data.dto.response.MemberLoginResponse; -import com.spring.sad.member.data.dto.response.MemberProfileResponse; +import com.spring.sad.member.data.dto.response.ProfileListResponse; import com.spring.sad.member.service.MemberService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -76,10 +73,22 @@ public ResponseEntity login(@RequestBody MemberLoginByPhone @ApiResponse(responseCode = "200", description = "프로필 조회 성공"), @ApiResponse(responseCode = "400", description = "사용자 조회 실패(MEMBER_07)") }) - @Operation(summary = "프로필 조회", description = "프로필 관리 화면에서 프로필을 조회하는 API입니다.") + @Operation(summary = "프로필 조회", description = "프로필 관리 화면에서 프로필을 조회하는 API") @GetMapping("profile/setting") - public ResponseEntity getProfiles(long memberId) { - MemberProfileResponse response = memberService.getProfileSetting(memberId); + public ResponseEntity getProfiles(long memberId) { + ProfileListResponse response = memberService.getProfileSetting(memberId); return ResponseEntity.ok(response); } + + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "프로필 수정 성공"), + @ApiResponse(responseCode = "400", description = "사용자 조회 실패(MEMBER_07)"), + @ApiResponse(responseCode = "400", description = "MEMBER-BAND 연관관계 불일치(MEMBER-BAND_01)") + }) + @Operation(summary = "프로필 수정", description = "프로필 관리 화면에서 프로필을 수정하는 API") + @PostMapping("profile/setting") + public ResponseEntity setProfiles(@RequestBody ProfileUpdateRequest request) { + memberService.updateProfile(request); + return ResponseEntity.status(HttpStatus.OK).build(); + } } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/BandDetails.java similarity index 76% rename from backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java rename to backend/src/main/java/com/spring/sad/member/data/dto/common/BandDetails.java index d981b51..4d09d6e 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileBandDetails.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/BandDetails.java @@ -7,12 +7,12 @@ @AllArgsConstructor @Builder @Getter -public class ProfileBandDetails { +public class BandDetails { private long bandId; private String bandName; private String bandImg; - public static ProfileBandDetails from(Band band) { - return ProfileBandDetails.builder() + public static BandDetails from(Band band) { + return BandDetails.builder() .bandId(band.getId()) .bandName(band.getBandName()) .bandImg(band.getBandCover()) diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileDetails.java similarity index 53% rename from backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java rename to backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileDetails.java index 738dca0..48afe72 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileDetails.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileDetails.java @@ -1,5 +1,6 @@ package com.spring.sad.member.data.dto.common; +import com.spring.sad.member.domain.Member; import com.spring.sad.member.domain.MemberBand; import com.spring.sad.member.domain.Profile; import lombok.*; @@ -11,15 +12,15 @@ @AllArgsConstructor @Builder @Getter -public class MemberProfileDetails { +public class ProfileDetails { private long profileId; private String profileName; private String profileImg; private boolean isPrimaryProfile; - private List profileBandDetailsList = new ArrayList<>(); + private List bandDetailsList = new ArrayList<>(); - public static MemberProfileDetails from(Profile profile) { - MemberProfileDetails memberProfileDetails = MemberProfileDetails.builder() + public static ProfileDetails from(Profile profile) { + ProfileDetails profileDetails = ProfileDetails.builder() .profileId(profile.getId()) .profileName(profile.getProfileName()) .profileImg(profile.getProfileImg()) @@ -28,9 +29,18 @@ public static MemberProfileDetails from(Profile profile) { profile.getMemberBands().stream() .map(MemberBand::getBand) - .map(ProfileBandDetails::from) - .forEach(memberProfileDetails.profileBandDetailsList::add); + .map(BandDetails::from) + .forEach(profileDetails.bandDetailsList::add); - return memberProfileDetails; + return profileDetails; + } + + public Profile toProfile(Member member) { + return Profile.builder() + .member(member) + .profileName(profileName) + .profileImg(profileImg) + .isPrimaryProfile(isPrimaryProfile) + .build(); } } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileListDetails.java similarity index 65% rename from backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java rename to backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileListDetails.java index 17919ef..29545cf 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/common/MemberProfileBody.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/common/ProfileListDetails.java @@ -7,9 +7,9 @@ import java.util.List; @Getter -public abstract class MemberProfileBody { +public abstract class ProfileListDetails { protected long memberId; @JsonProperty("profiles") - protected List memberProfileDetailsList = new ArrayList<>(); + protected List profileDetailsList = new ArrayList<>(); } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java b/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java deleted file mode 100644 index 79efac8..0000000 --- a/backend/src/main/java/com/spring/sad/member/data/dto/request/MemberProfileRequest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spring.sad.member.data.dto.request; - -import com.spring.sad.member.data.dto.common.MemberProfileBody; -import com.spring.sad.member.data.dto.common.MemberProfileDetails; -import com.spring.sad.member.domain.Member; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -public class MemberProfileRequest extends MemberProfileBody { - - public static MemberProfileRequest toRequest(Member member) { - return new MemberProfileRequest(member.getId(), member.getProfiles().stream() - .map(MemberProfileDetails::from) - .toList()); - } - - private MemberProfileRequest(long memberId, List memberProfileDetailsList) { - this.memberId = memberId; - this.memberProfileDetailsList = memberProfileDetailsList; - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/request/ProfileUpdateRequest.java b/backend/src/main/java/com/spring/sad/member/data/dto/request/ProfileUpdateRequest.java new file mode 100644 index 0000000..90388a8 --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/data/dto/request/ProfileUpdateRequest.java @@ -0,0 +1,11 @@ +package com.spring.sad.member.data.dto.request; + +import com.spring.sad.member.data.dto.common.ProfileListDetails; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class ProfileUpdateRequest extends ProfileListDetails { +} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java index 9b1dca8..82a72ae 100644 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java +++ b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberLoginResponse.java @@ -15,7 +15,7 @@ private MemberLoginResponse(Member member) { this.name = member.getName(); } - public static MemberLoginResponse of(Member member) { + public static MemberLoginResponse toResponse(Member member) { return new MemberLoginResponse(member); } } diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java deleted file mode 100644 index 3f8668d..0000000 --- a/backend/src/main/java/com/spring/sad/member/data/dto/response/MemberProfileResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spring.sad.member.data.dto.response; - -import com.spring.sad.member.data.dto.common.MemberProfileBody; -import com.spring.sad.member.data.dto.common.MemberProfileDetails; -import com.spring.sad.member.domain.Member; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.List; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -public class MemberProfileResponse extends MemberProfileBody { - - public static MemberProfileResponse toResponse(Member member) { - return new MemberProfileResponse(member.getId(), member.getProfiles().stream() - .map(MemberProfileDetails::from) - .toList()); - } - - private MemberProfileResponse(long memberId, List memberProfileDetailsList) { - this.memberId = memberId; - this.memberProfileDetailsList = memberProfileDetailsList; - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileListResponse.java b/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileListResponse.java new file mode 100644 index 0000000..72ae229 --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/data/dto/response/ProfileListResponse.java @@ -0,0 +1,26 @@ +package com.spring.sad.member.data.dto.response; + +import com.spring.sad.member.data.dto.common.ProfileListDetails; +import com.spring.sad.member.data.dto.common.ProfileDetails; +import com.spring.sad.member.domain.Member; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class ProfileListResponse extends ProfileListDetails { + + public static ProfileListResponse toResponse(Member member) { + return new ProfileListResponse(member.getId(), member.getProfiles().stream() + .map(ProfileDetails::from) + .toList()); + } + + private ProfileListResponse(long memberId, List profileDetailsList) { + this.memberId = memberId; + this.profileDetailsList = profileDetailsList; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/domain/MemberBand.java b/backend/src/main/java/com/spring/sad/member/domain/MemberBand.java index ae2c134..ba9c9f1 100644 --- a/backend/src/main/java/com/spring/sad/member/domain/MemberBand.java +++ b/backend/src/main/java/com/spring/sad/member/domain/MemberBand.java @@ -48,4 +48,14 @@ private void addRelateProfile(Profile profile) { this.profile = profile; profile.getMemberBands().add(this); } + + private void removeRelateProfile() { + if (this.profile != null) + this.profile.getMemberBands().remove(this); + } + + public void changeProfile(Profile profile) { + removeRelateProfile(); + addRelateProfile(profile); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/spring/sad/member/exception/MemberBandErrorCode.java b/backend/src/main/java/com/spring/sad/member/exception/MemberBandErrorCode.java new file mode 100644 index 0000000..213a8db --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/exception/MemberBandErrorCode.java @@ -0,0 +1,19 @@ +package com.spring.sad.member.exception; + +import com.spring.sad.global.exception.ErrorCode; +import lombok.Getter; + +@Getter +public enum MemberBandErrorCode implements ErrorCode { + INVALID_MEMBER_BAND_RELATIONSHIP(400, "MEMBER-BAND_01", "Member-Band 연관 관계가 유효하지 않습니다"); + + private final int statusCode; + private final String errorCode; + private final String message; + + MemberBandErrorCode(int statusCode, String errorCode, String message) { + this.statusCode = statusCode; + this.errorCode = errorCode; + this.message = message; + } +} diff --git a/backend/src/main/java/com/spring/sad/member/exception/MemberBandException.java b/backend/src/main/java/com/spring/sad/member/exception/MemberBandException.java new file mode 100644 index 0000000..1888316 --- /dev/null +++ b/backend/src/main/java/com/spring/sad/member/exception/MemberBandException.java @@ -0,0 +1,10 @@ +package com.spring.sad.member.exception; + +import com.spring.sad.global.exception.ErrorCode; +import com.spring.sad.global.exception.GlobalException; + +public class MemberBandException extends GlobalException { + public MemberBandException(ErrorCode errorCode) { + super(errorCode); + } +} diff --git a/backend/src/main/java/com/spring/sad/member/exception/MemberErrorCode.java b/backend/src/main/java/com/spring/sad/member/exception/MemberErrorCode.java index 90bc5b2..9f46059 100644 --- a/backend/src/main/java/com/spring/sad/member/exception/MemberErrorCode.java +++ b/backend/src/main/java/com/spring/sad/member/exception/MemberErrorCode.java @@ -14,7 +14,7 @@ public enum MemberErrorCode implements ErrorCode { LOGIN_FAILED(400, "MEMBER_06", "아이디가 존재하지 않거나 잘못된 비밀 번호 입니다."), - MEMBER_DOES_NOT_EXISTS(400, "MEBER_07", "존재하지 않는 회원입니다."); + MEMBER_DOES_NOT_EXISTS(400, "MEMBER_07", "존재하지 않는 회원입니다."); private final int statusCode; diff --git a/backend/src/main/java/com/spring/sad/member/repository/MemberBandRepository.java b/backend/src/main/java/com/spring/sad/member/repository/MemberBandRepository.java index 82271ea..e41a27c 100644 --- a/backend/src/main/java/com/spring/sad/member/repository/MemberBandRepository.java +++ b/backend/src/main/java/com/spring/sad/member/repository/MemberBandRepository.java @@ -2,6 +2,22 @@ import com.spring.sad.member.domain.MemberBand; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; public interface MemberBandRepository extends JpaRepository { + + @Query(""" + SELECT MemberBand + FROM MemberBand + WHERE member.id = :memberId + AND band.id = :bandId + """) + Optional findByMember_IdAndBand_Id( + @Param("memberId") final Long memberId, + @Param("bandId") final Long bandId + ); + } diff --git a/backend/src/main/java/com/spring/sad/member/service/MemberService.java b/backend/src/main/java/com/spring/sad/member/service/MemberService.java index 2874545..e9b808c 100644 --- a/backend/src/main/java/com/spring/sad/member/service/MemberService.java +++ b/backend/src/main/java/com/spring/sad/member/service/MemberService.java @@ -1,25 +1,33 @@ package com.spring.sad.member.service; -import com.spring.sad.member.data.dto.request.MemberLoginByEmailRequest; -import com.spring.sad.member.data.dto.request.MemberLoginByPhoneNumberRequest; -import com.spring.sad.member.data.dto.request.MemberSignupByPhoneNumberRequest; -import com.spring.sad.member.data.dto.request.MemberSignupByEmailRequest; +import com.spring.sad.member.data.dto.common.ProfileDetails; +import com.spring.sad.member.data.dto.common.BandDetails; +import com.spring.sad.member.data.dto.request.*; import com.spring.sad.member.data.dto.response.MemberLoginResponse; -import com.spring.sad.member.data.dto.response.MemberProfileResponse; +import com.spring.sad.member.data.dto.response.ProfileListResponse; import com.spring.sad.member.domain.Member; +import com.spring.sad.member.domain.MemberBand; import com.spring.sad.member.domain.Profile; +import com.spring.sad.member.exception.MemberBandErrorCode; +import com.spring.sad.member.exception.MemberBandException; import com.spring.sad.member.exception.MemberErrorCode; import com.spring.sad.member.exception.MemberException; +import com.spring.sad.member.repository.MemberBandRepository; import com.spring.sad.member.repository.MemberRepository; +import com.spring.sad.member.repository.ProfileRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Transactional(readOnly = true) @RequiredArgsConstructor @Service public class MemberService { private final MemberRepository memberRepository; + private final MemberBandRepository memberBandRepository; + private final ProfileRepository profileRepository; @Transactional public void signupByCellPhone(MemberSignupByPhoneNumberRequest request) { @@ -58,7 +66,7 @@ public MemberLoginResponse loginByEmail(MemberLoginByEmailRequest request) { if(!requestMember.getPassword().equals(member.getPassword())) throw new MemberException(MemberErrorCode.LOGIN_FAILED); - return MemberLoginResponse.of(member); + return MemberLoginResponse.toResponse(member); } public MemberLoginResponse loginByPhoneNumber(MemberLoginByPhoneNumberRequest request) { @@ -70,13 +78,76 @@ public MemberLoginResponse loginByPhoneNumber(MemberLoginByPhoneNumberRequest re if(!requestMember.getPassword().equals(member.getPassword())) throw new MemberException(MemberErrorCode.LOGIN_FAILED); - return MemberLoginResponse.of(member); + return MemberLoginResponse.toResponse(member); + } + + public ProfileListResponse getProfileSetting(long memberId) { + Member member = getMemberById(memberId); + return ProfileListResponse.toResponse(member); + } + + /** + * 프로필을 업데이트하는 메소드 + * 1. (요청 값으로 받은) MemberId 유효성 확인 + * 2. (요청 값으로 받은) 프로필 리스트 순회 + * 2-1. 기존 프로필 삭제 + * 2-2. 새로운 프로필이 유효한 경우, 저장 및 연관관계 설정 진행 + * + * @param request 요청으로 받은 정보 : 멤버의 프로필 리스트와, 각 프로필을 사용중인 밴드 리스트 + */ + public void updateProfile(ProfileUpdateRequest request) { + Member member = getMemberById(request.getMemberId()); + + for (ProfileDetails profileDetails : request.getProfileDetailsList()) { + deleteExistingProfile(profileDetails); + + if (isValidProfileDetails(profileDetails)) { + Profile profile = profileRepository.save(profileDetails.toProfile(member)); + updateMemberBand(request.getMemberId(), profileDetails.getBandDetailsList(), profile); + } + } + } + + private void deleteExistingProfile(ProfileDetails profileDetails) { + profileRepository.findById(profileDetails.getProfileId()) + .ifPresent(profileRepository::delete); + } + + private Member getMemberById(long memberId) { + return memberRepository.findById(memberId) + .orElseThrow(() -> new MemberException(MemberErrorCode.MEMBER_DOES_NOT_EXISTS)); } - public MemberProfileResponse getProfileSetting(long memberId) { - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> - new MemberException(MemberErrorCode.MEMBER_DOES_NOT_EXISTS)); - return MemberProfileResponse.toResponse(member); + /** + * 프로필이 유효한지 검증하는 메소드 + * 프로필이 유효한 경우란? + * 1. 프로필이 대표 프로필인 경우 + * 2. 하나 이상의 밴드에서 사용되는 경우 + * + * @param profileDetails (요청 값으로 받은) 프로필 + * @return (요청 값으로 받은) 프로필이 유효한지 검증한 결과 + */ + private boolean isValidProfileDetails(ProfileDetails profileDetails) { + return !profileDetails.getBandDetailsList().isEmpty() || profileDetails.isPrimaryProfile(); } + + /** + * 밴드가 사용하는 프로필을 저장하는 메소드 + * + * @param memberId 멤버 아이디 + * @param bandDetailsList (요청 값으로 받은) 밴드 리스트 + * @param profile 밴드가 사용할 프로필 + */ + private void updateMemberBand(Long memberId, List bandDetailsList, Profile profile) { + for (BandDetails bandDetails : bandDetailsList) { + MemberBand memberBand = getMemberBand(memberId, bandDetails.getBandId()); + memberBand.changeProfile(profile); + } + } + + private MemberBand getMemberBand(Long memberId, Long bandId) { + return memberBandRepository.findByMember_IdAndBand_Id(memberId, bandId) + .orElseThrow(() -> new MemberBandException(MemberBandErrorCode.INVALID_MEMBER_BAND_RELATIONSHIP)); + } + }