From 70c3579bd82e6bf3869e093371db20d6c2282ed4 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:36:23 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[#14]=20feat:=20login=20=ED=95=9C=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/annotation/member/Login.java | 11 ++++++ .../member/LoginArgumentResolver.java | 35 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/run/backend/global/annotation/member/Login.java create mode 100644 src/main/java/run/backend/global/annotation/member/LoginArgumentResolver.java diff --git a/src/main/java/run/backend/global/annotation/member/Login.java b/src/main/java/run/backend/global/annotation/member/Login.java new file mode 100644 index 0000000..03ce2b7 --- /dev/null +++ b/src/main/java/run/backend/global/annotation/member/Login.java @@ -0,0 +1,11 @@ +package run.backend.global.annotation.member; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface Login { +} diff --git a/src/main/java/run/backend/global/annotation/member/LoginArgumentResolver.java b/src/main/java/run/backend/global/annotation/member/LoginArgumentResolver.java new file mode 100644 index 0000000..c381ec4 --- /dev/null +++ b/src/main/java/run/backend/global/annotation/member/LoginArgumentResolver.java @@ -0,0 +1,35 @@ +package run.backend.global.annotation.member; + +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; +import run.backend.domain.member.entity.Member; +import run.backend.global.security.CustomUserDetails; + +@Component +@RequiredArgsConstructor +public class LoginArgumentResolver implements HandlerMethodArgumentResolver { + + @Override + public boolean supportsParameter(MethodParameter parameter) { + + boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); + boolean isMemberType = parameter.getParameterType().equals(Member.class); + return hasLoginAnnotation && isMemberType; + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + CustomUserDetails principal = (CustomUserDetails) authentication.getPrincipal(); + return principal.getMember(); + } +} From 736033234f4cc904f18624576e44cb0495a22512 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:37:07 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[#14]=20feat:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5,=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/run/backend/domain/member/controller/MemberController.java diff --git a/src/main/java/run/backend/domain/member/controller/MemberController.java b/src/main/java/run/backend/domain/member/controller/MemberController.java new file mode 100644 index 0000000..945a2e0 --- /dev/null +++ b/src/main/java/run/backend/domain/member/controller/MemberController.java @@ -0,0 +1,37 @@ +package run.backend.domain.member.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import run.backend.domain.member.dto.request.MemberInfoRequest; +import run.backend.domain.member.dto.response.MemberInfoResponse; +import run.backend.domain.member.entity.Member; +import run.backend.domain.member.service.MemberServiceImpl; +import run.backend.global.annotation.member.Login; +import run.backend.global.common.response.CommonResponse; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/members") +@Tag(name = "Members", description = "Member 관련 API") +public class MemberController { + + private final MemberServiceImpl memberService; + + @Operation(summary = "유저 정보 저장", description = "온보딩에서 유저 정보를 저장하는 API 입니다.") + @PostMapping("/onboarding") + public CommonResponse saveMemberInfo(@Login Member member, MemberInfoRequest request) { + + memberService.saveMember(member, request); + return new CommonResponse<>("유저의 기본 정보 저장 완료"); + } + + @Operation(summary = "유저 정보 조회", description = "마이페이지 상단 유저 정보를 조회하는 API 입니다.") + @GetMapping + public CommonResponse getMemberInfo(@Login Member member) { + + MemberInfoResponse response = memberService.getMemberInfo(member); + return new CommonResponse<>("유저 정보 조회 성공", response); + } +} From e5b03012d90219643e8240fd99a99990aa24a33c Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:37:22 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[#14]=20feat:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5,=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/service/MemberService.java | 15 ++++--- .../member/service/MemberServiceImpl.java | 40 +++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 src/main/java/run/backend/domain/member/service/MemberServiceImpl.java diff --git a/src/main/java/run/backend/domain/member/service/MemberService.java b/src/main/java/run/backend/domain/member/service/MemberService.java index ecdd34b..c1ab4a4 100644 --- a/src/main/java/run/backend/domain/member/service/MemberService.java +++ b/src/main/java/run/backend/domain/member/service/MemberService.java @@ -2,16 +2,19 @@ import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; +import run.backend.domain.member.entity.Member; public interface MemberService { - void updateMember(Long memberId, MemberInfoRequest memberInfoRequest); + void saveMember(Member member, MemberInfoRequest memberInfoRequest); - MemberInfoResponse getMemberInfo(Long memberId); + MemberInfoResponse getMemberInfo(Member member); - void deleteMember(Long memberId); +// void updateMember(); - void leaveCrew(Long memberId, Long crewId); - - void joinCrew(String crewCode); +// void deleteMember(Member member); +// +// void leaveCrew(Member member, Long crewId); +// +// void joinCrew(String crewCode); } diff --git a/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java new file mode 100644 index 0000000..a849364 --- /dev/null +++ b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java @@ -0,0 +1,40 @@ +package run.backend.domain.member.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import run.backend.domain.crew.entity.Crew; +import run.backend.domain.member.dto.request.MemberInfoRequest; +import run.backend.domain.member.dto.response.MemberInfoResponse; +import run.backend.domain.member.entity.Member; +import run.backend.domain.member.exception.MemberException; +import run.backend.domain.member.repository.MemberRepository; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberServiceImpl implements MemberService { + + private final MemberRepository memberRepository; + + @Override + @Transactional + public void saveMember(Member member, MemberInfoRequest memberInfoRequest) { + + member.setMemberDefaultInfo( + memberInfoRequest.gender(), + memberInfoRequest.age(), + memberInfoRequest.nickname() + ); + memberRepository.save(member); + } + + @Override + public MemberInfoResponse getMemberInfo(Member member) { + + Crew crew = memberRepository.findCrewByMemberId(member.getId()) + .orElseThrow(MemberException.MemberNotJoinedCrew::new); + + return new MemberInfoResponse(member.getProfileImage(), member.getNickname(), crew.getName()); + } +} From 581a62d86d4f8298210a47cd25b908757fe393ff Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:37:44 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[#14]=20feat:=20=EA=B0=80=EC=9E=85?= =?UTF-8?q?=ED=95=9C=20=ED=81=AC=EB=A3=A8=EA=B0=80=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B0=9C=EC=83=9D=ED=95=A0=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/exception/MemberErrorCode.java | 15 +++++++++++++++ .../domain/member/exception/MemberException.java | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/run/backend/domain/member/exception/MemberErrorCode.java create mode 100644 src/main/java/run/backend/domain/member/exception/MemberException.java diff --git a/src/main/java/run/backend/domain/member/exception/MemberErrorCode.java b/src/main/java/run/backend/domain/member/exception/MemberErrorCode.java new file mode 100644 index 0000000..87b68ee --- /dev/null +++ b/src/main/java/run/backend/domain/member/exception/MemberErrorCode.java @@ -0,0 +1,15 @@ +package run.backend.domain.member.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import run.backend.global.exception.ErrorCode; + +@Getter +@AllArgsConstructor +public enum MemberErrorCode implements ErrorCode { + + MEMBER_NOT_JOINED_CREW(5001, "가입한 크루가 없습니다."); + + private final int errorCode; + private final String errorMessage; +} diff --git a/src/main/java/run/backend/domain/member/exception/MemberException.java b/src/main/java/run/backend/domain/member/exception/MemberException.java new file mode 100644 index 0000000..fed1333 --- /dev/null +++ b/src/main/java/run/backend/domain/member/exception/MemberException.java @@ -0,0 +1,16 @@ +package run.backend.domain.member.exception; + +import run.backend.global.exception.CustomException; + +public class MemberException extends CustomException { + + public MemberException(final MemberErrorCode memberErrorCode) { + super(memberErrorCode); + } + + public static class MemberNotJoinedCrew extends MemberException { + public MemberNotJoinedCrew() { + super(MemberErrorCode.MEMBER_NOT_JOINED_CREW); + } + } +} From fe2f24f2930240f2982b4bf2d1debe0507ac11fd Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:38:02 +0900 Subject: [PATCH 05/13] =?UTF-8?q?[#14]=20feat:=20=EA=B0=80=EC=9E=85?= =?UTF-8?q?=ED=95=9C=20=ED=81=AC=EB=A3=A8=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/repository/MemberRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/run/backend/domain/member/repository/MemberRepository.java b/src/main/java/run/backend/domain/member/repository/MemberRepository.java index 333559d..cd46a02 100644 --- a/src/main/java/run/backend/domain/member/repository/MemberRepository.java +++ b/src/main/java/run/backend/domain/member/repository/MemberRepository.java @@ -2,8 +2,18 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import run.backend.domain.crew.entity.Crew; import run.backend.domain.member.entity.Member; public interface MemberRepository extends JpaRepository { Optional findByOauthId(String oauthId); + + @Query(""" + SELECT jc.crew + FROM JoinCrew jc + WHERE jc.member.id = :memberId + """) + Optional findCrewByMemberId(@Param("memberId") Long memberId); } From 8b0d9cf8556811a1b6cbabd0ea01fcbe1ba5a13d Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:38:12 +0900 Subject: [PATCH 06/13] =?UTF-8?q?[#14]=20feat:=20member=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20dto=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/dto/request/MemberInfoRequest.java | 8 +++++++- .../domain/member/dto/response/MemberInfoResponse.java | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/run/backend/domain/member/dto/request/MemberInfoRequest.java b/src/main/java/run/backend/domain/member/dto/request/MemberInfoRequest.java index 2aa4798..854e3b2 100644 --- a/src/main/java/run/backend/domain/member/dto/request/MemberInfoRequest.java +++ b/src/main/java/run/backend/domain/member/dto/request/MemberInfoRequest.java @@ -1,4 +1,10 @@ package run.backend.domain.member.dto.request; -public record MemberInfoRequest() { +import run.backend.domain.member.enums.Gender; + +public record MemberInfoRequest( + Gender gender, + int age, + String nickname +) { } diff --git a/src/main/java/run/backend/domain/member/dto/response/MemberInfoResponse.java b/src/main/java/run/backend/domain/member/dto/response/MemberInfoResponse.java index b39a408..8b9fafb 100644 --- a/src/main/java/run/backend/domain/member/dto/response/MemberInfoResponse.java +++ b/src/main/java/run/backend/domain/member/dto/response/MemberInfoResponse.java @@ -1,4 +1,8 @@ package run.backend.domain.member.dto.response; -public record MemberInfoResponse() { +public record MemberInfoResponse( + String profileImageUrl, + String nickName, + String crewName +) { } From 59e47f465d320cb8234912a64053212470a7fb34 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:38:29 +0900 Subject: [PATCH 07/13] =?UTF-8?q?[#14]=20feat:=20member=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=84=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/run/backend/domain/member/entity/Member.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/run/backend/domain/member/entity/Member.java b/src/main/java/run/backend/domain/member/entity/Member.java index 962995b..a94ad15 100644 --- a/src/main/java/run/backend/domain/member/entity/Member.java +++ b/src/main/java/run/backend/domain/member/entity/Member.java @@ -47,6 +47,12 @@ public class Member extends BaseEntity { private boolean pushEnabled; + public void setMemberDefaultInfo(Gender gender, int age, String nickname) { + this.gender = gender; + this.age = age; + this.nickname = nickname; + } + @Builder public Member(String username, String nickname, Gender gender, int age, String oauthId, OAuthType oauthType, String profileImage) { this.username = username; From d4db35ad0eb40c435cd08ff0ca9426f6e9d91642 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 13:38:58 +0900 Subject: [PATCH 08/13] =?UTF-8?q?[#14]=20feat:=20=EC=A0=84=EC=97=AD=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=EA=B8=B0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20MemberNotJoinedCrew=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../run/backend/global/exception/GlobalExceptionHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/run/backend/global/exception/GlobalExceptionHandler.java b/src/main/java/run/backend/global/exception/GlobalExceptionHandler.java index f569aa4..aba91ea 100644 --- a/src/main/java/run/backend/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/run/backend/global/exception/GlobalExceptionHandler.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import run.backend.domain.auth.exception.AuthException; import run.backend.domain.file.exception.FileException; +import run.backend.domain.member.exception.MemberException; import run.backend.global.common.response.CommonResponse; import run.backend.global.exception.httpError.HttpErrorCode; @@ -18,7 +19,8 @@ public class GlobalExceptionHandler { @ExceptionHandler({ AuthException.RefreshTokenNotFound.class, - FileException.FileNotFound.class + FileException.FileNotFound.class, + MemberException.MemberNotJoinedCrew.class }) public ResponseEntity> handleNotFound(final CustomException e) { From e19eec9cac17c806d0db0110f0fe6e5804f7944d Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 14:55:28 +0900 Subject: [PATCH 09/13] =?UTF-8?q?[#14]=20test:=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5,=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/service/MemberServiceTest.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/test/java/run/backend/domain/member/service/MemberServiceTest.java diff --git a/src/test/java/run/backend/domain/member/service/MemberServiceTest.java b/src/test/java/run/backend/domain/member/service/MemberServiceTest.java new file mode 100644 index 0000000..3de0e72 --- /dev/null +++ b/src/test/java/run/backend/domain/member/service/MemberServiceTest.java @@ -0,0 +1,90 @@ +package run.backend.domain.member.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import run.backend.domain.crew.entity.Crew; +import run.backend.domain.crew.enums.JoinStatus; +import run.backend.domain.member.dto.request.MemberInfoRequest; +import run.backend.domain.member.dto.response.MemberInfoResponse; +import run.backend.domain.member.entity.Member; +import run.backend.domain.member.enums.Gender; +import run.backend.domain.member.enums.OAuthType; +import run.backend.domain.member.repository.MemberRepository; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class MemberServiceTest { + + @Mock + private MemberRepository memberRepository; + + @InjectMocks + private MemberServiceImpl memberService; + + private Member testMember; + private Crew testCrew; + + @BeforeEach + public void setUp() { + + // member + testMember = Member.builder() + .username("test username") + .oauthId("test id") + .oauthType(OAuthType.GOOGLE) + .profileImage("test image") + .build(); + + // crew + testCrew = Crew.builder() + .name("test crew name") + .description("크루 소개 테스트") + .image("test image url") + .build(); + } + + @Test + @DisplayName("회원 정보가 올바르게 변경 되었는지 확인") + public void saveMemberInfoTest() { + + // given + MemberInfoRequest request = new MemberInfoRequest( + Gender.FEMALE, + 24, + "test nickname" + ); + + // when + memberService.saveMember(testMember, request); + + // then + assertEquals(Gender.FEMALE, testMember.getGender()); + assertEquals(24, testMember.getAge()); + assertEquals("test nickname", testMember.getNickname()); + } + + @Test + @DisplayName("회원 정보가 올바르게 조회 되는지 확인") + public void getMemberInfoTest() { + + // given + when(memberRepository.findCrewByMemberIdAndStatus(testMember.getId(), JoinStatus.APPROVED)) + .thenReturn(Optional.of(testCrew)); + + // when + MemberInfoResponse response = memberService.getMemberInfo(testMember); + + // then + assertEquals(testMember.getNickname(), response.nickName()); + assertEquals(testCrew.getName(), response.crewName()); + } +} From fe5b392269debb321228adbad41d86a6dfc06235 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 14:55:49 +0900 Subject: [PATCH 10/13] =?UTF-8?q?[#14]=20feat:=20approveJoin=20=EC=97=90?= =?UTF-8?q?=20public=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/run/backend/domain/crew/entity/JoinCrew.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/run/backend/domain/crew/entity/JoinCrew.java b/src/main/java/run/backend/domain/crew/entity/JoinCrew.java index 2ef434a..de00b68 100644 --- a/src/main/java/run/backend/domain/crew/entity/JoinCrew.java +++ b/src/main/java/run/backend/domain/crew/entity/JoinCrew.java @@ -42,7 +42,7 @@ public class JoinCrew extends BaseEntity { @JoinColumn(name = "crew_id") private Crew crew; - void approveJoin() { + public void approveJoin() { this.role = Role.MEMBER; this.joinedDate = LocalDate.now(); this.joinStatus = JoinStatus.APPROVED; From b1dc9cc4950b2bef964b7f0d6198a695f1aa7b0a Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 14:56:17 +0900 Subject: [PATCH 11/13] =?UTF-8?q?[#14]=20feat:=20approved=20=EB=90=9C=20jo?= =?UTF-8?q?inCrew=EC=97=90=EC=84=9C=20crew=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/member/repository/MemberRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/run/backend/domain/member/repository/MemberRepository.java b/src/main/java/run/backend/domain/member/repository/MemberRepository.java index cd46a02..c49c9d1 100644 --- a/src/main/java/run/backend/domain/member/repository/MemberRepository.java +++ b/src/main/java/run/backend/domain/member/repository/MemberRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import run.backend.domain.crew.entity.Crew; +import run.backend.domain.crew.enums.JoinStatus; import run.backend.domain.member.entity.Member; public interface MemberRepository extends JpaRepository { @@ -14,6 +15,7 @@ public interface MemberRepository extends JpaRepository { SELECT jc.crew FROM JoinCrew jc WHERE jc.member.id = :memberId + AND jc.joinStatus = :status """) - Optional findCrewByMemberId(@Param("memberId") Long memberId); + Optional findCrewByMemberIdAndStatus(@Param("memberId") Long memberId, @Param("status") JoinStatus status); } From 1210549e5e7adefdfd41a2243e267a1906224485 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 14:56:56 +0900 Subject: [PATCH 12/13] =?UTF-8?q?[#14]=20feat:=20=ED=81=AC=EB=A3=A8=20?= =?UTF-8?q?=EC=97=86=EC=9C=BC=EB=A9=B4=20"N/A"=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/member/service/MemberServiceImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java index a849364..663fbe8 100644 --- a/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java +++ b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java @@ -4,10 +4,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import run.backend.domain.crew.entity.Crew; +import run.backend.domain.crew.enums.JoinStatus; import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; import run.backend.domain.member.entity.Member; -import run.backend.domain.member.exception.MemberException; import run.backend.domain.member.repository.MemberRepository; @Service @@ -32,9 +32,10 @@ public void saveMember(Member member, MemberInfoRequest memberInfoRequest) { @Override public MemberInfoResponse getMemberInfo(Member member) { - Crew crew = memberRepository.findCrewByMemberId(member.getId()) - .orElseThrow(MemberException.MemberNotJoinedCrew::new); + String crewName = memberRepository.findCrewByMemberIdAndStatus(member.getId(), JoinStatus.APPROVED) + .map(Crew::getName) + .orElse("N/A"); - return new MemberInfoResponse(member.getProfileImage(), member.getNickname(), crew.getName()); + return new MemberInfoResponse(member.getProfileImage(), member.getNickname(), crewName); } } From 7d945cd796aa95ae00878e9a6fa83194e6a193f9 Mon Sep 17 00:00:00 2001 From: choiseoji Date: Mon, 14 Jul 2025 18:00:36 +0900 Subject: [PATCH 13/13] =?UTF-8?q?[#14]=20delete:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20API=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 9 -------- .../domain/member/service/MemberService.java | 3 --- .../member/service/MemberServiceImpl.java | 13 ----------- .../member/service/MemberServiceTest.java | 22 ------------------- 4 files changed, 47 deletions(-) diff --git a/src/main/java/run/backend/domain/member/controller/MemberController.java b/src/main/java/run/backend/domain/member/controller/MemberController.java index 945a2e0..bff7acd 100644 --- a/src/main/java/run/backend/domain/member/controller/MemberController.java +++ b/src/main/java/run/backend/domain/member/controller/MemberController.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; -import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; import run.backend.domain.member.entity.Member; import run.backend.domain.member.service.MemberServiceImpl; @@ -19,14 +18,6 @@ public class MemberController { private final MemberServiceImpl memberService; - @Operation(summary = "유저 정보 저장", description = "온보딩에서 유저 정보를 저장하는 API 입니다.") - @PostMapping("/onboarding") - public CommonResponse saveMemberInfo(@Login Member member, MemberInfoRequest request) { - - memberService.saveMember(member, request); - return new CommonResponse<>("유저의 기본 정보 저장 완료"); - } - @Operation(summary = "유저 정보 조회", description = "마이페이지 상단 유저 정보를 조회하는 API 입니다.") @GetMapping public CommonResponse getMemberInfo(@Login Member member) { diff --git a/src/main/java/run/backend/domain/member/service/MemberService.java b/src/main/java/run/backend/domain/member/service/MemberService.java index c1ab4a4..ec19efd 100644 --- a/src/main/java/run/backend/domain/member/service/MemberService.java +++ b/src/main/java/run/backend/domain/member/service/MemberService.java @@ -1,13 +1,10 @@ package run.backend.domain.member.service; -import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; import run.backend.domain.member.entity.Member; public interface MemberService { - void saveMember(Member member, MemberInfoRequest memberInfoRequest); - MemberInfoResponse getMemberInfo(Member member); // void updateMember(); diff --git a/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java index 663fbe8..fa4a1f1 100644 --- a/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java +++ b/src/main/java/run/backend/domain/member/service/MemberServiceImpl.java @@ -5,7 +5,6 @@ import org.springframework.transaction.annotation.Transactional; import run.backend.domain.crew.entity.Crew; import run.backend.domain.crew.enums.JoinStatus; -import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; import run.backend.domain.member.entity.Member; import run.backend.domain.member.repository.MemberRepository; @@ -17,18 +16,6 @@ public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; - @Override - @Transactional - public void saveMember(Member member, MemberInfoRequest memberInfoRequest) { - - member.setMemberDefaultInfo( - memberInfoRequest.gender(), - memberInfoRequest.age(), - memberInfoRequest.nickname() - ); - memberRepository.save(member); - } - @Override public MemberInfoResponse getMemberInfo(Member member) { diff --git a/src/test/java/run/backend/domain/member/service/MemberServiceTest.java b/src/test/java/run/backend/domain/member/service/MemberServiceTest.java index 3de0e72..f62b6e5 100644 --- a/src/test/java/run/backend/domain/member/service/MemberServiceTest.java +++ b/src/test/java/run/backend/domain/member/service/MemberServiceTest.java @@ -9,10 +9,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import run.backend.domain.crew.entity.Crew; import run.backend.domain.crew.enums.JoinStatus; -import run.backend.domain.member.dto.request.MemberInfoRequest; import run.backend.domain.member.dto.response.MemberInfoResponse; import run.backend.domain.member.entity.Member; -import run.backend.domain.member.enums.Gender; import run.backend.domain.member.enums.OAuthType; import run.backend.domain.member.repository.MemberRepository; @@ -52,26 +50,6 @@ public void setUp() { .build(); } - @Test - @DisplayName("회원 정보가 올바르게 변경 되었는지 확인") - public void saveMemberInfoTest() { - - // given - MemberInfoRequest request = new MemberInfoRequest( - Gender.FEMALE, - 24, - "test nickname" - ); - - // when - memberService.saveMember(testMember, request); - - // then - assertEquals(Gender.FEMALE, testMember.getGender()); - assertEquals(24, testMember.getAge()); - assertEquals("test nickname", testMember.getNickname()); - } - @Test @DisplayName("회원 정보가 올바르게 조회 되는지 확인") public void getMemberInfoTest() {