From ed1c5b673363eee795a01a1324b77ea4214b0172 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:23:41 +0900 Subject: [PATCH 01/13] [DELETE] delete auth service dto --- .../domain/auth/SignInServiceRequest.java | 22 ------------------- .../domain/auth/SignInServiceResponse.java | 22 ------------------- 2 files changed, 44 deletions(-) delete mode 100644 src/main/java/com/soptie/server/domain/auth/SignInServiceRequest.java delete mode 100644 src/main/java/com/soptie/server/domain/auth/SignInServiceResponse.java diff --git a/src/main/java/com/soptie/server/domain/auth/SignInServiceRequest.java b/src/main/java/com/soptie/server/domain/auth/SignInServiceRequest.java deleted file mode 100644 index d4cb71a4..00000000 --- a/src/main/java/com/soptie/server/domain/auth/SignInServiceRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.soptie.server.domain.auth; - -import static lombok.AccessLevel.*; - -import com.soptie.server.api.controller.dto.request.auth.SignInRequest; - -import lombok.Builder; -import lombok.NonNull; - -@Builder(access = PRIVATE) -public record SignInServiceRequest( - @NonNull String socialAccessToken, - @NonNull SocialType socialType -) { - - public static SignInServiceRequest of(String socialAccessToken, SignInRequest request) { - return SignInServiceRequest.builder() - .socialAccessToken(socialAccessToken) - .socialType(request.socialType()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/domain/auth/SignInServiceResponse.java b/src/main/java/com/soptie/server/domain/auth/SignInServiceResponse.java deleted file mode 100644 index 124dc3c1..00000000 --- a/src/main/java/com/soptie/server/domain/auth/SignInServiceResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.soptie.server.domain.auth; - -import static lombok.AccessLevel.*; - -import lombok.Builder; -import lombok.NonNull; - -@Builder(access = PRIVATE) -public record SignInServiceResponse( - @NonNull String accessToken, - @NonNull String refreshToken, - boolean isMemberDollExist -) { - - public static SignInServiceResponse of(Token token, boolean isMemberDollExist) { - return SignInServiceResponse.builder() - .accessToken(token.getAccessToken()) - .refreshToken(token.getRefreshToken()) - .isMemberDollExist(isMemberDollExist) - .build(); - } -} From da7be66733d839e4913ab8e405630d414659422f Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:25:58 +0900 Subject: [PATCH 02/13] [REFACTOR] refactor auth api --- .../soptie/server/api/controller/AuthApi.java | 37 ++++++++++--------- .../api/controller/docs/AuthApiDocs.java | 11 +++--- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/soptie/server/api/controller/AuthApi.java b/src/main/java/com/soptie/server/api/controller/AuthApi.java index de64adb6..e7b8008a 100644 --- a/src/main/java/com/soptie/server/api/controller/AuthApi.java +++ b/src/main/java/com/soptie/server/api/controller/AuthApi.java @@ -1,27 +1,24 @@ package com.soptie.server.api.controller; -import static com.soptie.server.common.message.AuthMessage.*; -import static com.soptie.server.api.controller.dto.response.SuccessResponse.*; - import java.security.Principal; -import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.soptie.server.api.controller.docs.AuthApiDocs; -import com.soptie.server.domain.usecase.AuthService; -import com.soptie.server.domain.auth.SignInServiceRequest; -import com.soptie.server.domain.auth.TokenGetServiceRequest; +import com.soptie.server.api.controller.dto.request.auth.SignInRequest; import com.soptie.server.api.controller.dto.response.BaseResponse; import com.soptie.server.api.controller.dto.response.SuccessResponse; -import com.soptie.server.api.controller.dto.request.auth.SignInRequest; import com.soptie.server.api.controller.dto.response.auth.SignInResponse; import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse; +import com.soptie.server.api.controller.generic.SuccessMessage; +import com.soptie.server.domain.auth.AuthService; import lombok.RequiredArgsConstructor; import lombok.val; @@ -34,33 +31,37 @@ public class AuthApi implements AuthApiDocs { private final AuthService authService; @PostMapping - public ResponseEntity> signIn( + @ResponseStatus(HttpStatus.OK) + public SuccessResponse signIn( @RequestHeader("Authorization") String socialAccessToken, @RequestBody SignInRequest request ) { - val response = SignInResponse.of(authService.signIn(SignInServiceRequest.of(socialAccessToken, request))); - return ResponseEntity.ok(success(SUCCESS_SIGN_IN.getMessage(), response)); + val response = authService.signIn(socialAccessToken, request); + return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_IN.getMessage(), response); } @PostMapping("/token") - public ResponseEntity> reissueToken( + @ResponseStatus(HttpStatus.OK) + public SuccessResponse reissueToken( @RequestHeader("Authorization") String refreshToken ) { - val response = TokenGetResponse.of(authService.reissueToken(TokenGetServiceRequest.of(refreshToken))); - return ResponseEntity.ok(success(SUCCESS_RECREATE_TOKEN.getMessage(), response)); + val response = authService.reissueToken(refreshToken); + return SuccessResponse.success(SuccessMessage.SUCCESS_RECREATE_TOKEN.getMessage(), response); } @PostMapping("/logout") - public ResponseEntity signOut(Principal principal) { + @ResponseStatus(HttpStatus.OK) + public BaseResponse signOut(Principal principal) { val memberId = Long.parseLong(principal.getName()); authService.signOut(memberId); - return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage())); + return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_OUT.getMessage()); } @DeleteMapping - public ResponseEntity withdrawal(Principal principal) { + @ResponseStatus(HttpStatus.OK) + public BaseResponse withdrawal(Principal principal) { val memberId = Long.parseLong(principal.getName()); authService.withdraw(memberId); - return ResponseEntity.ok(success(SUCCESS_WITHDRAWAL.getMessage())); + return SuccessResponse.success(SuccessMessage.SUCCESS_WITHDRAWAL.getMessage()); } } diff --git a/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java b/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java index e02ef8e8..fffe3f33 100644 --- a/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java +++ b/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java @@ -2,14 +2,13 @@ import java.security.Principal; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; +import com.soptie.server.api.controller.dto.request.auth.SignInRequest; import com.soptie.server.api.controller.dto.response.BaseResponse; import com.soptie.server.api.controller.dto.response.ErrorResponse; import com.soptie.server.api.controller.dto.response.SuccessResponse; -import com.soptie.server.api.controller.dto.request.auth.SignInRequest; import com.soptie.server.api.controller.dto.response.auth.SignInResponse; import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse; @@ -37,7 +36,7 @@ public interface AuthApiDocs { description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - ResponseEntity> signIn( + SuccessResponse signIn( @RequestHeader("Authorization") String socialAccessToken, @RequestBody SignInRequest request ); @@ -64,7 +63,7 @@ ResponseEntity> signIn( description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - ResponseEntity> reissueToken( + SuccessResponse reissueToken( @RequestHeader("Authorization") String refreshToken ); @@ -89,7 +88,7 @@ ResponseEntity> reissueToken( description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - ResponseEntity signOut(@Parameter(hidden = true) Principal principal); + BaseResponse signOut(@Parameter(hidden = true) Principal principal); @Operation( summary = "회원 탈퇴", @@ -112,5 +111,5 @@ ResponseEntity> reissueToken( description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - ResponseEntity withdrawal(@Parameter(hidden = true) Principal principal); + BaseResponse withdrawal(@Parameter(hidden = true) Principal principal); } From 9e31e0cc231c789b9b4a10c7d658ce972acc1c95 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:26:32 +0900 Subject: [PATCH 03/13] [REFACTOR] refactor adapter --- .../com/soptie/server/persistence/adapter/MemberAdapter.java | 5 +++++ .../soptie/server/persistence/adapter/MemberDollAdapter.java | 4 ++++ .../server/persistence/adapter/MemberMissionAdapter.java | 4 ++++ .../server/persistence/adapter/MemberRoutineAdapter.java | 5 +++++ .../server/persistence/repository/MemberDollRepository.java | 2 ++ .../persistence/repository/MemberMissionRepository.java | 2 ++ .../persistence/repository/MemberRoutineRepository.java | 2 ++ 7 files changed, 24 insertions(+) diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java index 08de9c37..79b5d651 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java @@ -13,8 +13,13 @@ @RepositoryAdapter @RequiredArgsConstructor public class MemberAdapter { + private final MemberRepository memberRepository; + public void delete(long memberId) { + memberRepository.deleteById(memberId); + } + public void deleteById(long memberId) { val member = find(memberId); //TODO: delete with 연관관계 (auth) diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberDollAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberDollAdapter.java index 5a585851..e1853781 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberDollAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberDollAdapter.java @@ -36,6 +36,10 @@ public void update(MemberDoll memberDoll) { memberDollEntity.update(memberDoll); } + public void deleteByMember(long memberId) { + memberDollRepository.deleteByMemberId(memberId); + } + private MemberDollEntity find(long id) { return memberDollRepository.findById(id) .orElseThrow(() -> new SoftieException(ExceptionCode.NOT_FOUND, "MemberDoll ID: " + id)); diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberMissionAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberMissionAdapter.java index 28d31e10..3fbb184d 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberMissionAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberMissionAdapter.java @@ -19,4 +19,8 @@ public List findByMemberIdAndMissionIds(long memberId, List .stream().map(MemberMissionEntity::toDomain) .toList(); } + + public void deleteAllByMemberId(long memberId) { + memberMissionRepository.deleteAllByMemberId(memberId); + } } diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberRoutineAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberRoutineAdapter.java index 0f13d321..9aa47c0b 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberRoutineAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberRoutineAdapter.java @@ -18,6 +18,7 @@ @RepositoryAdapter @RequiredArgsConstructor public class MemberRoutineAdapter { + private final MemberRoutineRepository memberRoutineRepository; public List saveAll(Member member, List routines) { @@ -46,6 +47,10 @@ public void deleteAll(List memberRoutines) { memberRoutineRepository.deleteAllByIdInBatch(memberRoutineIds); } + public void deleteAllByMemberId(long memberId) { + memberRoutineRepository.deleteAllByMemberId(memberId); + } + public MemberRoutine findById(long memberRoutineId) { return find(memberRoutineId).toDomain(); } diff --git a/src/main/java/com/soptie/server/persistence/repository/MemberDollRepository.java b/src/main/java/com/soptie/server/persistence/repository/MemberDollRepository.java index 7b2872c3..86390830 100644 --- a/src/main/java/com/soptie/server/persistence/repository/MemberDollRepository.java +++ b/src/main/java/com/soptie/server/persistence/repository/MemberDollRepository.java @@ -10,4 +10,6 @@ public interface MemberDollRepository extends JpaRepository findByMemberId(long memberId); + + void deleteByMemberId(long memberId); } diff --git a/src/main/java/com/soptie/server/persistence/repository/MemberMissionRepository.java b/src/main/java/com/soptie/server/persistence/repository/MemberMissionRepository.java index 3abc44f7..63609706 100644 --- a/src/main/java/com/soptie/server/persistence/repository/MemberMissionRepository.java +++ b/src/main/java/com/soptie/server/persistence/repository/MemberMissionRepository.java @@ -8,4 +8,6 @@ public interface MemberMissionRepository extends JpaRepository { List findByMemberIdAndMissionIdIn(long memberId, List missionIds); + + void deleteAllByMemberId(long memberId); } diff --git a/src/main/java/com/soptie/server/persistence/repository/MemberRoutineRepository.java b/src/main/java/com/soptie/server/persistence/repository/MemberRoutineRepository.java index 980e5ce9..808d3cbc 100644 --- a/src/main/java/com/soptie/server/persistence/repository/MemberRoutineRepository.java +++ b/src/main/java/com/soptie/server/persistence/repository/MemberRoutineRepository.java @@ -19,4 +19,6 @@ public interface MemberRoutineRepository extends JpaRepository findByIdIn(List ids); List findByAchieved(boolean isAchieved); + + void deleteAllByMemberId(long memberId); } From ec0827da834678f14629c23f8f5b5a071385db09 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:26:51 +0900 Subject: [PATCH 04/13] [ADD] add auth successmessage --- .../server/api/controller/generic/SuccessMessage.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/soptie/server/api/controller/generic/SuccessMessage.java b/src/main/java/com/soptie/server/api/controller/generic/SuccessMessage.java index 407afddc..364b3676 100644 --- a/src/main/java/com/soptie/server/api/controller/generic/SuccessMessage.java +++ b/src/main/java/com/soptie/server/api/controller/generic/SuccessMessage.java @@ -6,6 +6,12 @@ @RequiredArgsConstructor @Getter public enum SuccessMessage { + /* auth */ + SUCCESS_SIGN_IN("로그인 성공"), + SUCCESS_RECREATE_TOKEN("토큰 재발급 성공"), + SUCCESS_SIGN_OUT("로그아웃 성공"), + SUCCESS_WITHDRAWAL("회원 탈퇴 성공"), + /* member */ CREATE_MEMBER_PROFILE("회원 프로필 등록 성공"), GIVE_COTTON("솜뭉치 주기 성공"), From b572577f5142a9d97e19a6d4070f32618fdc4b05 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:27:09 +0900 Subject: [PATCH 05/13] [REFACTOR] refactor auth dto --- .../controller/dto/request/auth/SignInRequest.java | 2 ++ .../controller/dto/response/auth/SignInResponse.java | 12 ++++++------ .../dto/response/auth/TokenGetResponse.java | 8 +++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java b/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java index 0170717f..bd7c8bd1 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java +++ b/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java @@ -1,5 +1,7 @@ package com.soptie.server.api.controller.dto.request.auth; +import com.soptie.server.domain.member.SocialType; + import lombok.NonNull; public record SignInRequest( diff --git a/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java b/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java index 8f998329..9ea444ea 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java +++ b/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java @@ -1,8 +1,8 @@ package com.soptie.server.api.controller.dto.response.auth; -import static lombok.AccessLevel.*; +import static lombok.AccessLevel.PRIVATE; -import com.soptie.server.domain.auth.SignInServiceResponse; +import com.soptie.server.domain.auth.Token; import lombok.Builder; import lombok.NonNull; @@ -14,11 +14,11 @@ public record SignInResponse( boolean isMemberDollExist ) { - public static SignInResponse of(SignInServiceResponse response) { + public static SignInResponse of(Token token, boolean isMemberDollExist) { return SignInResponse.builder() - .accessToken(response.accessToken()) - .refreshToken(response.refreshToken()) - .isMemberDollExist(response.isMemberDollExist()) + .accessToken(token.getAccessToken()) + .refreshToken(token.getRefreshToken()) + .isMemberDollExist(isMemberDollExist) .build(); } } diff --git a/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java b/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java index cb05d421..f43a219c 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java +++ b/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java @@ -1,8 +1,6 @@ package com.soptie.server.api.controller.dto.response.auth; -import static lombok.AccessLevel.*; - -import com.soptie.server.domain.auth.TokenGetServiceResponse; +import static lombok.AccessLevel.PRIVATE; import lombok.Builder; import lombok.NonNull; @@ -12,9 +10,9 @@ public record TokenGetResponse( @NonNull String accessToken ) { - public static TokenGetResponse of(TokenGetServiceResponse response) { + public static TokenGetResponse from(String accessToken) { return TokenGetResponse.builder() - .accessToken(response.accessToken()) + .accessToken(accessToken) .build(); } } From 57b13203a4ab57f10d65a23daddf03f9713488af Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 14:27:20 +0900 Subject: [PATCH 06/13] [REFACTOR] refactor auth service --- ...{AuthServiceImpl.java => AuthService.java} | 62 ++++++++++--------- .../soptie/server/domain/member/Member.java | 8 +++ 2 files changed, 40 insertions(+), 30 deletions(-) rename src/main/java/com/soptie/server/domain/auth/{AuthServiceImpl.java => AuthService.java} (67%) diff --git a/src/main/java/com/soptie/server/domain/auth/AuthServiceImpl.java b/src/main/java/com/soptie/server/domain/auth/AuthService.java similarity index 67% rename from src/main/java/com/soptie/server/domain/auth/AuthServiceImpl.java rename to src/main/java/com/soptie/server/domain/auth/AuthService.java index 8f38e8ab..52f33982 100644 --- a/src/main/java/com/soptie/server/domain/auth/AuthServiceImpl.java +++ b/src/main/java/com/soptie/server/domain/auth/AuthService.java @@ -1,19 +1,24 @@ package com.soptie.server.domain.auth; -import static com.soptie.server.common.message.MemberErrorCode.*; - -import java.util.Objects; - import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.soptie.server.api.controller.dto.request.auth.SignInRequest; +import com.soptie.server.api.controller.dto.response.auth.SignInResponse; +import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse; import com.soptie.server.api.web.jwt.JwtTokenProvider; import com.soptie.server.api.web.jwt.UserAuthentication; import com.soptie.server.common.support.ValueConfig; -import com.soptie.server.domain.usecase.AuthService; +import com.soptie.server.domain.member.Member; +import com.soptie.server.domain.member.MemberService; +import com.soptie.server.domain.member.SocialType; import com.soptie.server.external.oauth.AppleService; import com.soptie.server.external.oauth.KakaoService; +import com.soptie.server.persistence.adapter.MemberAdapter; +import com.soptie.server.persistence.adapter.MemberDollAdapter; +import com.soptie.server.persistence.adapter.MemberMissionAdapter; +import com.soptie.server.persistence.adapter.MemberRoutineAdapter; import com.soptie.server.persistence.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -22,48 +27,47 @@ @Service @RequiredArgsConstructor @Transactional(readOnly = true) -public class AuthServiceImpl implements AuthService { +public class AuthService { private final JwtTokenProvider jwtTokenProvider; private final MemberRepository memberRepository; private final KakaoService kakaoService; private final AppleService appleService; private final MemberService memberService; - private final MemberDollService memberDollService; private final ValueConfig valueConfig; - private final MemberRoutineDeleter memberRoutineDeleter; + private final MemberDollAdapter memberDollAdapter; + private final MemberRoutineAdapter memberRoutineAdapter; + private final MemberMissionAdapter memberMissionAdapter; + private final MemberAdapter memberAdapter; - @Override @Transactional - public SignInServiceResponse signIn(SignInServiceRequest request) { - val member = getMember(request.socialAccessToken(), request.socialType()); + public SignInResponse signIn(String socialAccessToken, SignInRequest request) { + val member = getMember(socialAccessToken, request.socialType()); val token = getToken(member); - val isMemberDollExist = member.isMemberDollExist(); - return SignInServiceResponse.of(token, isMemberDollExist); + val isMemberDollExist = isMemberDollExist(member.getId()); + return SignInResponse.of(token, isMemberDollExist); } - @Override - public TokenGetServiceResponse reissueToken(TokenGetServiceRequest request) { - val member = findMember(request.refreshToken()); + public TokenGetResponse reissueToken(String refreshToken) { + val member = findMember(refreshToken); val token = generateAccessToken(member.getId()); - return TokenGetServiceResponse.of(token); + return TokenGetResponse.from(token); } - @Override @Transactional public void signOut(long memberId) { val member = findMember(memberId); member.resetRefreshToken(); } - @Override @Transactional public void withdraw(long memberId) { - val member = findMember(memberId); - deleteMemberDoll(member.getMemberDoll()); - memberRoutineDeleter.deleteByMember(member); - deleteMember(member); + findMember(memberId); + memberRoutineAdapter.deleteAllByMemberId(memberId); + memberMissionAdapter.deleteAllByMemberId(memberId); + memberDollAdapter.deleteByMember(memberId); + memberAdapter.delete(memberId); } private Member getMember(String socialAccessToken, SocialType socialType) { @@ -101,6 +105,10 @@ private Token generateToken(Authentication authentication) { .build(); } + private boolean isMemberDollExist(long memberId) { + return memberDollAdapter.isExistByMember(memberId); + } + private Member findMember(long id) { return memberRepository.findById(id).orElseThrow(() -> new MemberException(INVALID_MEMBER)); } @@ -117,13 +125,7 @@ private String getTokenFromBearerString(String token) { private String generateAccessToken(long memberId) { val authentication = new UserAuthentication(memberId, null, null); return jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired()); - } - - private void deleteMemberDoll(MemberDoll memberDoll) { - if (Objects.nonNull(memberDoll)) { - memberDollService.deleteMemberDoll(memberDoll); //TODO: using adapter - } - } + }- private void deleteMember(Member member) { memberService.deleteMember(member); diff --git a/src/main/java/com/soptie/server/domain/member/Member.java b/src/main/java/com/soptie/server/domain/member/Member.java index bde7c5e7..f7877f9d 100644 --- a/src/main/java/com/soptie/server/domain/member/Member.java +++ b/src/main/java/com/soptie/server/domain/member/Member.java @@ -10,4 +10,12 @@ public class Member { private Social socialInfo; private String refreshToken; private MemberCotton cottonInfo; + + public void resetRefreshToken() { + this.refreshToken = null; + } + + public void updateRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } } From d238f4736ac39f3d9dd9fd4fe94875e48e6c1de1 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 15:14:53 +0900 Subject: [PATCH 07/13] [ADD] add unauthorized exception --- .../java/com/soptie/server/common/exception/ExceptionCode.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/soptie/server/common/exception/ExceptionCode.java b/src/main/java/com/soptie/server/common/exception/ExceptionCode.java index 63c269af..0c28a7fd 100644 --- a/src/main/java/com/soptie/server/common/exception/ExceptionCode.java +++ b/src/main/java/com/soptie/server/common/exception/ExceptionCode.java @@ -11,6 +11,7 @@ public enum ExceptionCode { /* 4xx */ BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청"), + UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "권한 없음"), NOT_FOUND(HttpStatus.NOT_FOUND, "찾을 수 없는 리소스"), NOT_AVAILABLE(HttpStatus.NOT_ACCEPTABLE, "접근할 수 없는 리소스"); From 0cfcdbd920203501bba8a9cdaa9bba19cf5f9114 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 15:15:11 +0900 Subject: [PATCH 08/13] [REFACTOR] refactor external api --- .../soptie/server/external/oauth/AppleServiceImpl.java | 8 ++++---- .../soptie/server/external/oauth/KakaoServiceImpl.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/soptie/server/external/oauth/AppleServiceImpl.java b/src/main/java/com/soptie/server/external/oauth/AppleServiceImpl.java index 8b6cc9b4..1c37464c 100644 --- a/src/main/java/com/soptie/server/external/oauth/AppleServiceImpl.java +++ b/src/main/java/com/soptie/server/external/oauth/AppleServiceImpl.java @@ -1,7 +1,5 @@ package com.soptie.server.external.oauth; -import static com.soptie.server.common.message.AuthErrorCode.*; - import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -25,6 +23,8 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.soptie.server.common.exception.ExceptionCode; +import com.soptie.server.common.exception.SoftieException; import com.soptie.server.common.support.ValueConfig; import io.jsonwebtoken.Jwts; @@ -105,7 +105,7 @@ private PublicKey makePublicKey(String accessToken, JsonArray publicKeyList) { val matchingPublicKey = findMatchingPublicKey(publicKeyList, kid, alg); if (Objects.isNull(matchingPublicKey)) { - throw new AuthException(INVALID_KEY); + throw new SoftieException(ExceptionCode.UNAUTHORIZED); } return getPublicKey(matchingPublicKey); @@ -147,7 +147,7 @@ private PublicKey getPublicKey(JsonObject object) { return keyFactory.generatePublic(publicKeySpec); } catch (InvalidKeySpecException | NoSuchAlgorithmException exception) { - throw new AuthException(INVALID_KEY); + throw new SoftieException(ExceptionCode.UNAUTHORIZED); } } } diff --git a/src/main/java/com/soptie/server/external/oauth/KakaoServiceImpl.java b/src/main/java/com/soptie/server/external/oauth/KakaoServiceImpl.java index c8e88d36..652abe59 100644 --- a/src/main/java/com/soptie/server/external/oauth/KakaoServiceImpl.java +++ b/src/main/java/com/soptie/server/external/oauth/KakaoServiceImpl.java @@ -1,7 +1,5 @@ package com.soptie.server.external.oauth; -import static com.soptie.server.common.message.AuthErrorCode.*; - import java.util.Map; import org.springframework.http.HttpEntity; @@ -11,6 +9,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonArray; +import com.soptie.server.common.exception.ExceptionCode; +import com.soptie.server.common.exception.SoftieException; import com.soptie.server.common.support.ValueConfig; import lombok.RequiredArgsConstructor; @@ -33,7 +33,7 @@ public String getKakaoData(String socialAccessToken) { val responseData = restTemplate.postForEntity(valueConfig.getKakaoUri(), httpEntity, Object.class); return objectMapper.convertValue(responseData.getBody(), Map.class).get("id").toString(); } catch (Exception exception) { - throw new AuthException(INVALID_TOKEN); + throw new SoftieException(ExceptionCode.UNAUTHORIZED); } } } From a7408ad063b3b77bcceb512548633025df016899 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 15:15:32 +0900 Subject: [PATCH 09/13] [REFACTOR] refactor auth service --- .../server/domain/auth/AuthService.java | 19 +++++-------------- .../persistence/adapter/MemberAdapter.java | 18 ++++++++++++++++++ .../persistence/entity/MemberEntity.java | 10 ++++++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/soptie/server/domain/auth/AuthService.java b/src/main/java/com/soptie/server/domain/auth/AuthService.java index 52f33982..1a32ee18 100644 --- a/src/main/java/com/soptie/server/domain/auth/AuthService.java +++ b/src/main/java/com/soptie/server/domain/auth/AuthService.java @@ -11,7 +11,6 @@ import com.soptie.server.api.web.jwt.UserAuthentication; import com.soptie.server.common.support.ValueConfig; import com.soptie.server.domain.member.Member; -import com.soptie.server.domain.member.MemberService; import com.soptie.server.domain.member.SocialType; import com.soptie.server.external.oauth.AppleService; import com.soptie.server.external.oauth.KakaoService; @@ -19,7 +18,6 @@ import com.soptie.server.persistence.adapter.MemberDollAdapter; import com.soptie.server.persistence.adapter.MemberMissionAdapter; import com.soptie.server.persistence.adapter.MemberRoutineAdapter; -import com.soptie.server.persistence.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.val; @@ -30,10 +28,8 @@ public class AuthService { private final JwtTokenProvider jwtTokenProvider; - private final MemberRepository memberRepository; private final KakaoService kakaoService; private final AppleService appleService; - private final MemberService memberService; private final ValueConfig valueConfig; private final MemberDollAdapter memberDollAdapter; @@ -46,6 +42,7 @@ public SignInResponse signIn(String socialAccessToken, SignInRequest request) { val member = getMember(socialAccessToken, request.socialType()); val token = getToken(member); val isMemberDollExist = isMemberDollExist(member.getId()); + memberAdapter.update(member); return SignInResponse.of(token, isMemberDollExist); } @@ -83,13 +80,12 @@ private String getSocialId(String socialAccessToken, SocialType socialType) { } private Member signUp(SocialType socialType, String socialId) { - return memberRepository.findBySocialTypeAndSocialId(socialType, socialId) + return memberAdapter.findBySocialTypeAndSocialId(socialType, socialId) .orElseGet(() -> saveMember(socialType, socialId)); } private Member saveMember(SocialType socialType, String socialId) { - val member = Member.builder().socialType(socialType).socialId(socialId).build(); - return memberRepository.save(member); + return memberAdapter.save(socialType, socialId); } private Token getToken(Member member) { @@ -110,12 +106,11 @@ private boolean isMemberDollExist(long memberId) { } private Member findMember(long id) { - return memberRepository.findById(id).orElseThrow(() -> new MemberException(INVALID_MEMBER)); + return memberAdapter.findById(id); } private Member findMember(String refreshToken) { - return memberRepository.findByRefreshToken(getTokenFromBearerString(refreshToken)) - .orElseThrow(() -> new MemberException(INVALID_MEMBER)); + return memberAdapter.findByRefreshToken(getTokenFromBearerString(refreshToken)); } private String getTokenFromBearerString(String token) { @@ -125,9 +120,5 @@ private String getTokenFromBearerString(String token) { private String generateAccessToken(long memberId) { val authentication = new UserAuthentication(memberId, null, null); return jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired()); - }- - - private void deleteMember(Member member) { - memberService.deleteMember(member); } } diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java index 79b5d651..bf646a90 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java @@ -1,9 +1,12 @@ package com.soptie.server.persistence.adapter; +import java.util.Optional; + import com.soptie.server.common.exception.ExceptionCode; import com.soptie.server.common.exception.SoftieException; import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.domain.member.Member; +import com.soptie.server.domain.member.SocialType; import com.soptie.server.persistence.entity.MemberEntity; import com.soptie.server.persistence.repository.MemberRepository; @@ -16,6 +19,21 @@ public class MemberAdapter { private final MemberRepository memberRepository; + public Optional findBySocialTypeAndSocialId(SocialType socialType, String socialId) { + return memberRepository.findBySocialTypeAndSocialId(socialType, socialId) + .map(MemberEntity::toDomain); + } + + public Member save(SocialType socialType, String socialId) { + return memberRepository.save(new MemberEntity(socialType, socialId)).toDomain(); + } + + public Member findByRefreshToken(String refreshToken) { + return memberRepository.findByRefreshToken(refreshToken) + .map(MemberEntity::toDomain) + .orElseThrow(() -> new SoftieException(ExceptionCode.NOT_FOUND)); + } + public void delete(long memberId) { memberRepository.deleteById(memberId); } diff --git a/src/main/java/com/soptie/server/persistence/entity/MemberEntity.java b/src/main/java/com/soptie/server/persistence/entity/MemberEntity.java index 80ab17b3..c13ff89a 100644 --- a/src/main/java/com/soptie/server/persistence/entity/MemberEntity.java +++ b/src/main/java/com/soptie/server/persistence/entity/MemberEntity.java @@ -10,8 +10,11 @@ import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; @Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "member", schema = "softie") public class MemberEntity extends BaseEntity { @Enumerated(value = EnumType.STRING) @@ -25,6 +28,13 @@ public class MemberEntity extends BaseEntity { @Column(nullable = false) private int rainbowCottonCount; + public MemberEntity(SocialType socialType, String socialId) { + this.socialType = socialType; + this.socialId = socialId; + this.basicCottonCount = 0; + this.rainbowCottonCount = 0; + } + public void update(Member member) { this.refreshToken = member.getRefreshToken(); this.basicCottonCount = member.getCottonInfo().getBasicCottonCount(); From 08200d33cf969b1bf1af42dae0e7fcfed2efb8f7 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 17:37:50 +0900 Subject: [PATCH 10/13] [CHORE] apply convention --- .../com/soptie/server/api/controller/AuthApi.java | 13 ++++++------- .../server/api/controller/docs/AuthApiDocs.java | 5 ++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/soptie/server/api/controller/AuthApi.java b/src/main/java/com/soptie/server/api/controller/AuthApi.java index e7b8008a..c5000c27 100644 --- a/src/main/java/com/soptie/server/api/controller/AuthApi.java +++ b/src/main/java/com/soptie/server/api/controller/AuthApi.java @@ -13,7 +13,6 @@ import com.soptie.server.api.controller.docs.AuthApiDocs; import com.soptie.server.api.controller.dto.request.auth.SignInRequest; -import com.soptie.server.api.controller.dto.response.BaseResponse; import com.soptie.server.api.controller.dto.response.SuccessResponse; import com.soptie.server.api.controller.dto.response.auth.SignInResponse; import com.soptie.server.api.controller.dto.response.auth.TokenGetResponse; @@ -30,8 +29,8 @@ public class AuthApi implements AuthApiDocs { private final AuthService authService; - @PostMapping @ResponseStatus(HttpStatus.OK) + @PostMapping public SuccessResponse signIn( @RequestHeader("Authorization") String socialAccessToken, @RequestBody SignInRequest request @@ -40,8 +39,8 @@ public SuccessResponse signIn( return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_IN.getMessage(), response); } - @PostMapping("/token") @ResponseStatus(HttpStatus.OK) + @PostMapping("/token") public SuccessResponse reissueToken( @RequestHeader("Authorization") String refreshToken ) { @@ -49,17 +48,17 @@ public SuccessResponse reissueToken( return SuccessResponse.success(SuccessMessage.SUCCESS_RECREATE_TOKEN.getMessage(), response); } - @PostMapping("/logout") @ResponseStatus(HttpStatus.OK) - public BaseResponse signOut(Principal principal) { + @PostMapping("/logout") + public SuccessResponse signOut(Principal principal) { val memberId = Long.parseLong(principal.getName()); authService.signOut(memberId); return SuccessResponse.success(SuccessMessage.SUCCESS_SIGN_OUT.getMessage()); } - @DeleteMapping @ResponseStatus(HttpStatus.OK) - public BaseResponse withdrawal(Principal principal) { + @DeleteMapping + public SuccessResponse withdrawal(Principal principal) { val memberId = Long.parseLong(principal.getName()); authService.withdraw(memberId); return SuccessResponse.success(SuccessMessage.SUCCESS_WITHDRAWAL.getMessage()); diff --git a/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java b/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java index fffe3f33..20071cb9 100644 --- a/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java +++ b/src/main/java/com/soptie/server/api/controller/docs/AuthApiDocs.java @@ -6,7 +6,6 @@ import org.springframework.web.bind.annotation.RequestHeader; import com.soptie.server.api.controller.dto.request.auth.SignInRequest; -import com.soptie.server.api.controller.dto.response.BaseResponse; import com.soptie.server.api.controller.dto.response.ErrorResponse; import com.soptie.server.api.controller.dto.response.SuccessResponse; import com.soptie.server.api.controller.dto.response.auth.SignInResponse; @@ -88,7 +87,7 @@ SuccessResponse reissueToken( description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - BaseResponse signOut(@Parameter(hidden = true) Principal principal); + SuccessResponse signOut(@Parameter(hidden = true) Principal principal); @Operation( summary = "회원 탈퇴", @@ -111,5 +110,5 @@ SuccessResponse reissueToken( description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - BaseResponse withdrawal(@Parameter(hidden = true) Principal principal); + SuccessResponse withdrawal(@Parameter(hidden = true) Principal principal); } From e796212203324ba4cc30b1ad623abd3bae9d6888 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 17:41:46 +0900 Subject: [PATCH 11/13] [REFACTOR] apply dto convention --- .../api/controller/dto/request/auth/SignInRequest.java | 4 ++-- .../controller/dto/response/auth/SignInResponse.java | 10 +++++++--- .../controller/dto/response/auth/TokenGetResponse.java | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java b/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java index bd7c8bd1..a9e530df 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java +++ b/src/main/java/com/soptie/server/api/controller/dto/request/auth/SignInRequest.java @@ -2,10 +2,10 @@ import com.soptie.server.domain.member.SocialType; -import lombok.NonNull; +import jakarta.validation.constraints.NotNull; public record SignInRequest( - @NonNull SocialType socialType + @NotNull SocialType socialType ) { public static SignInRequest of(SocialType socialType) { diff --git a/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java b/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java index 9ea444ea..1b74bed4 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java +++ b/src/main/java/com/soptie/server/api/controller/dto/response/auth/SignInResponse.java @@ -4,13 +4,17 @@ import com.soptie.server.domain.auth.Token; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Builder; -import lombok.NonNull; @Builder(access = PRIVATE) public record SignInResponse( - @NonNull String accessToken, - @NonNull String refreshToken, + @Schema(description = "액세스 토큰") + @NotNull String accessToken, + @Schema(description = "리프레시 토큰") + @NotNull String refreshToken, + @Schema(description = "멤버 인형 존재 여부", example = "true") boolean isMemberDollExist ) { diff --git a/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java b/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java index f43a219c..613d3b52 100644 --- a/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java +++ b/src/main/java/com/soptie/server/api/controller/dto/response/auth/TokenGetResponse.java @@ -2,12 +2,12 @@ import static lombok.AccessLevel.PRIVATE; +import jakarta.validation.constraints.NotNull; import lombok.Builder; -import lombok.NonNull; @Builder(access = PRIVATE) public record TokenGetResponse( - @NonNull String accessToken + @NotNull String accessToken ) { public static TokenGetResponse from(String accessToken) { From dc94c229dbb507b6d45a81d126f39c87f3e9973f Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 17:51:48 +0900 Subject: [PATCH 12/13] [CHORE] delete unused method --- .../soptie/server/persistence/adapter/MemberAdapter.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java index bf646a90..2b86454c 100644 --- a/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java +++ b/src/main/java/com/soptie/server/persistence/adapter/MemberAdapter.java @@ -38,12 +38,6 @@ public void delete(long memberId) { memberRepository.deleteById(memberId); } - public void deleteById(long memberId) { - val member = find(memberId); - //TODO: delete with 연관관계 (auth) - memberRepository.delete(member); - } - public Member findById(long memberId) { return find(memberId).toDomain(); } From fa3c9871bf4b83c42dad5782404269715c2ee647 Mon Sep 17 00:00:00 2001 From: Chan531 Date: Wed, 21 Aug 2024 19:57:26 +0900 Subject: [PATCH 13/13] [REFACTOR] refactor auth method --- .../server/domain/auth/AuthService.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/soptie/server/domain/auth/AuthService.java b/src/main/java/com/soptie/server/domain/auth/AuthService.java index 1a32ee18..e52d5e88 100644 --- a/src/main/java/com/soptie/server/domain/auth/AuthService.java +++ b/src/main/java/com/soptie/server/domain/auth/AuthService.java @@ -41,26 +41,27 @@ public class AuthService { public SignInResponse signIn(String socialAccessToken, SignInRequest request) { val member = getMember(socialAccessToken, request.socialType()); val token = getToken(member); - val isMemberDollExist = isMemberDollExist(member.getId()); + val isMemberDollExist = memberDollAdapter.isExistByMember(member.getId()); + ; memberAdapter.update(member); return SignInResponse.of(token, isMemberDollExist); } public TokenGetResponse reissueToken(String refreshToken) { - val member = findMember(refreshToken); + val member = memberAdapter.findByRefreshToken(getTokenFromBearerString(refreshToken)); val token = generateAccessToken(member.getId()); return TokenGetResponse.from(token); } @Transactional public void signOut(long memberId) { - val member = findMember(memberId); + val member = memberAdapter.findById(memberId); member.resetRefreshToken(); } @Transactional public void withdraw(long memberId) { - findMember(memberId); + memberAdapter.findById(memberId); memberRoutineAdapter.deleteAllByMemberId(memberId); memberMissionAdapter.deleteAllByMemberId(memberId); memberDollAdapter.deleteByMember(memberId); @@ -101,18 +102,6 @@ private Token generateToken(Authentication authentication) { .build(); } - private boolean isMemberDollExist(long memberId) { - return memberDollAdapter.isExistByMember(memberId); - } - - private Member findMember(long id) { - return memberAdapter.findById(id); - } - - private Member findMember(String refreshToken) { - return memberAdapter.findByRefreshToken(getTokenFromBearerString(refreshToken)); - } - private String getTokenFromBearerString(String token) { return token.replaceFirst(ValueConfig.BEARER_HEADER, ValueConfig.BLANK); }