Skip to content

Commit 1a0ede7

Browse files
authored
Merge pull request #54 from rhkr8521/fix/#apple-login-logic
[FIX] 애플 로그인 로직 수정
2 parents eb50aad + fca63da commit 1a0ede7

File tree

5 files changed

+67
-54
lines changed

5 files changed

+67
-54
lines changed

src/main/java/com/rhkr8521/mapping/api/member/controller/MemberController.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public class MemberController {
3535

3636
private final MemberService memberService;
3737
private final OAuthService oauthService;
38-
private final AppleService appleService;
3938
private final JwtService jwtService;
4039

4140
@Hidden
@@ -70,36 +69,23 @@ public ResponseEntity<ApiResponse<Map<String, Object>>> loginWithKakao(@RequestB
7069
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
7170
}
7271

72+
@Hidden
7373
@Operation(
7474
summary = "Apple 로그인 API",
75-
description = "Apple OAuth authorization code를 통해 사용자의 정보를 등록 및 토큰을 발급합니다."
75+
description = "Apple Authorization Code를 통해 사용자의 정보를 등록 및 토큰을 발급합니다."
7676
)
7777
@ApiResponses({
7878
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
79-
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Apple authorization code가 입력되지 않았습니다."),
79+
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "Apple Authorization Code가 입력되지 않았습니다."),
8080
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "Apple 소셜 로그인 중 오류 발생")
8181
})
8282
@PostMapping("/apple-login")
8383
public ResponseEntity<ApiResponse<Map<String, Object>>> loginWithApple(@RequestParam("code") String code) {
8484
if (code == null || code.isEmpty()) {
85-
throw new BadRequestException("Apple authorization code가 입력되지 않았습니다.");
86-
}
87-
AppleDTO appleInfo;
88-
try {
89-
appleInfo = appleService.getAppleInfo(code);
90-
} catch (Exception e) {
91-
throw new InternalServerException("Apple 소셜 로그인 중 오류 발생: " + e.getMessage());
85+
throw new BadRequestException(ErrorStatus.MISSING_APPLE_AUTHORIZATION_CODE_EXCEPTION.getMessage());
9286
}
93-
// Apple 사용자 정보를 통해 회원가입 또는 로그인 처리
94-
var member = memberService.registerOrLoginAppleUser(appleInfo);
95-
// 토큰 발급
96-
Map<String, String> tokens = jwtService.createAccessAndRefreshToken(member.getEmail());
97-
Map<String, Object> response = new HashMap<>();
98-
response.put("tokens", tokens);
99-
response.put("role", member.getRole());
100-
response.put("nickname", member.getNickname());
101-
response.put("profileImage", member.getImageUrl());
102-
response.put("socialId", member.getSocialId());
87+
88+
Map<String, Object> response = memberService.loginWithApple(code);
10389
return ApiResponse.success(SuccessStatus.SEND_LOGIN_SUCCESS, response);
10490
}
10591

src/main/java/com/rhkr8521/mapping/api/member/dto/AppleDTO.java renamed to src/main/java/com/rhkr8521/mapping/api/member/dto/AppleLoginDTO.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
@Builder
77
@Data
8-
public class AppleDTO {
8+
public class AppleLoginDTO {
99
private String id;
1010
private String token;
1111
private String email;

src/main/java/com/rhkr8521/mapping/api/member/service/AppleService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.nimbusds.jose.crypto.ECDSASigner;
99
import com.nimbusds.jwt.JWTClaimsSet;
1010
import com.nimbusds.jwt.SignedJWT;
11-
import com.rhkr8521.mapping.api.member.dto.AppleDTO;
11+
import com.rhkr8521.mapping.api.member.dto.AppleLoginDTO;
1212
import lombok.RequiredArgsConstructor;
1313
import lombok.extern.slf4j.Slf4j;
1414
import net.minidev.json.JSONObject;
@@ -54,7 +54,7 @@ public class AppleService {
5454
/**
5555
* Apple authorization code를 받아 토큰 교환 후 사용자 정보를 파싱
5656
*/
57-
public AppleDTO getAppleInfo(String code) throws Exception {
57+
public AppleLoginDTO getAppleInfo(String code) throws Exception {
5858
if (code == null) throw new Exception("authorization code가 없습니다.");
5959

6060
String clientSecret = createClientSecret();
@@ -101,7 +101,7 @@ public AppleDTO getAppleInfo(String code) throws Exception {
101101
throw new Exception("Apple API 호출 실패", e);
102102
}
103103

104-
return AppleDTO.builder()
104+
return AppleLoginDTO.builder()
105105
.id(userId)
106106
.token(accessToken)
107107
.email(email)

src/main/java/com/rhkr8521/mapping/api/member/service/MemberService.java

Lines changed: 55 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.rhkr8521.mapping.api.member.service;
22

33
import com.rhkr8521.mapping.api.aws.s3.S3Service;
4-
import com.rhkr8521.mapping.api.member.dto.AppleDTO;
4+
import com.rhkr8521.mapping.api.member.dto.AppleLoginDTO;
55
import com.rhkr8521.mapping.api.member.dto.BlockedUserResponseDTO;
66
import com.rhkr8521.mapping.api.member.dto.KakaoUserInfoDTO;
77
import com.rhkr8521.mapping.api.member.dto.UserInfoResponseDTO;
@@ -33,6 +33,7 @@ public class MemberService {
3333
private final JwtService jwtService;
3434
private final OAuthService oAuthService;
3535
private final S3Service s3Service;
36+
private final AppleService appleService;
3637
private final MemberBlockRepository memberBlockRepository;
3738

3839
private static final List<String> FIRST_WORDS = Arrays.asList(
@@ -49,35 +50,6 @@ public class MemberService {
4950
"해파리", "코알라", "낙타", "아기돼지", "강치", "이구아나", "오징어", "문어", "갈매기", "오소리"
5051
);
5152

52-
@Transactional
53-
public Member registerOrLoginAppleUser(AppleDTO appleUserInfo) {
54-
Optional<Member> optionalMember = memberRepository.findBySocialId(appleUserInfo.getId());
55-
if (optionalMember.isPresent()) {
56-
Member member = optionalMember.get();
57-
// 탈퇴한 회원인 경우 복구 처리
58-
if (member.isDeleted()) {
59-
member = member.toBuilder()
60-
.deleted(false)
61-
.deletedAt(null)
62-
.build();
63-
memberRepository.save(member);
64-
}
65-
return member;
66-
} else {
67-
Member member = Member.builder()
68-
.socialId(appleUserInfo.getId())
69-
.email(appleUserInfo.getEmail() != null ? appleUserInfo.getEmail() : UUID.randomUUID() + "@socialUser.com")
70-
.nickname(generateRandomNickname())
71-
.imageUrl(null)
72-
.role(Role.USER)
73-
.deleted(false)
74-
.deletedAt(null)
75-
.build();
76-
memberRepository.save(member);
77-
return member;
78-
}
79-
}
80-
8153
private static String generateRandomNickname() {
8254
Random random = new Random();
8355

@@ -152,6 +124,59 @@ private Member registerNewKakaoUser(KakaoUserInfoDTO kakaoUserInfo) {
152124
return member;
153125
}
154126

127+
@Transactional
128+
public Map<String, Object> loginWithApple(String code) {
129+
if (code == null || code.isEmpty()) {
130+
throw new BadRequestException(ErrorStatus.MISSING_APPLE_AUTHORIZATION_CODE_EXCEPTION.getMessage());
131+
}
132+
AppleLoginDTO appleInfo;
133+
try {
134+
appleInfo = appleService.getAppleInfo(code);
135+
} catch (Exception e) {
136+
throw new BadRequestException(ErrorStatus.FAIL_ACCESS_APPLE_OAUTH_SERVICE.getMessage() + e.getMessage());
137+
}
138+
// Apple 사용자 정보를 통한 회원가입 또는 로그인 처리
139+
Member member = registerOrLoginAppleUser(appleInfo);
140+
// JWT 토큰 발급
141+
Map<String, String> tokens = jwtService.createAccessAndRefreshToken(member.getEmail());
142+
Map<String, Object> response = new HashMap<>();
143+
response.put("tokens", tokens);
144+
response.put("role", member.getRole());
145+
response.put("nickname", member.getNickname());
146+
response.put("profileImage", member.getImageUrl());
147+
return response;
148+
}
149+
150+
// 애플 사용자 정보를 사용해 회원가입 또는 로그인 처리
151+
@Transactional
152+
public Member registerOrLoginAppleUser(AppleLoginDTO appleUserInfo) {
153+
Optional<Member> optionalMember = memberRepository.findBySocialId(appleUserInfo.getId());
154+
if (optionalMember.isPresent()) {
155+
Member member = optionalMember.get();
156+
// 탈퇴한 회원 복구 처리
157+
if (member.isDeleted()) {
158+
member = member.toBuilder()
159+
.deleted(false)
160+
.deletedAt(null)
161+
.build();
162+
memberRepository.save(member);
163+
}
164+
return member;
165+
} else {
166+
Member member = Member.builder()
167+
.socialId(appleUserInfo.getId())
168+
.email(appleUserInfo.getEmail() != null ? appleUserInfo.getEmail() : UUID.randomUUID() + "@socialUser.com")
169+
.nickname(generateRandomNickname())
170+
.imageUrl(null)
171+
.role(Role.USER)
172+
.deleted(false)
173+
.deletedAt(null)
174+
.build();
175+
memberRepository.save(member);
176+
return member;
177+
}
178+
}
179+
155180
@Transactional(readOnly = true)
156181
public Long getUserIdByEmail(String email) {
157182
Member member = memberRepository.findByEmail(email)

src/main/java/com/rhkr8521/mapping/common/response/ErrorStatus.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public enum ErrorStatus {
3232
CANT_ACCESS_BLOCK_USER_MEMO_EXCEPTION(HttpStatus.BAD_REQUEST,"차단한 사용자의 메모는 조회할 수 없습니다."),
3333
ALREADY_BLOCK_USER_EXCEPTION(HttpStatus.BAD_REQUEST,"이미 차단한 사용자입니다."),
3434
NOT_BLOCK_USER_EXCEPTION(HttpStatus.BAD_REQUEST,"차단한 사용자가 아닙니다."),
35+
MISSING_APPLE_AUTHORIZATION_CODE_EXCEPTION(HttpStatus.BAD_REQUEST,"Apple Authorization Code가 입력되지 않았습니다."),
3536

3637
/**
3738
* 401 UNAUTHORIZED
@@ -57,6 +58,7 @@ public enum ErrorStatus {
5758
FAIL_UPLOAD_PROFILE_IMAGE(HttpStatus.INTERNAL_SERVER_ERROR, "프로필 사진이 변경되지 않았습니다."),
5859
FAIL_REQUEST_KAKAO_USER_INFO(HttpStatus.INTERNAL_SERVER_ERROR, "카카오 사용자 정보 요청 중 오류가 발생했습니다."),
5960
FAIL_PARSE_KAKAO_USER_INFO(HttpStatus.INTERNAL_SERVER_ERROR, "카카오 사용자 정보를 가져오지 못했습니다."),
61+
FAIL_ACCESS_APPLE_OAUTH_SERVICE(HttpStatus.INTERNAL_SERVER_ERROR,"Apple 소셜 로그인 중 오류 발생:"),
6062
SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 오류"),
6163

6264
;

0 commit comments

Comments
 (0)