Skip to content

Commit 7036d01

Browse files
rladmstnhwangjokim
authored andcommitted
feat: 소셜 로그인 회원 탈퇴 (#365)
* feat: 소셜 로그인 회원 탈퇴 시 비밀번호 검증 제거 * feat: 회원 정보 조회 시 github 닉네임 응답 추가
1 parent 098eec6 commit 7036d01

File tree

6 files changed

+36
-13
lines changed

6 files changed

+36
-13
lines changed

src/main/java/com/gamzabat/algohub/feature/user/controller/UserController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public ResponseEntity<Void> updateInfo(@AuthedUser User user, @RequestPart @Vali
141141
}
142142

143143
@DeleteMapping(value = "/users/me")
144-
@Operation(summary = "회원 정보 삭제 API")
144+
@Operation(summary = "회원 탈퇴 API")
145145
public ResponseEntity<Void> deleteUser(@AuthedUser User user, @Valid @RequestBody DeleteUserRequest request,
146146
Errors errors) {
147147
if (errors.hasErrors()) {
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.gamzabat.algohub.feature.user.dto;
22

3-
import jakarta.validation.constraints.NotBlank;
3+
import jakarta.validation.constraints.NotNull;
44

5-
public record DeleteUserRequest(@NotBlank(message = "비밀번호는 필수 입력입니다.") String password) {
6-
}
5+
public record DeleteUserRequest(@NotNull(message = "소셜 로그인 여부는 필수 입력입니다.") Boolean isOAuthAccount,
6+
String password) {
7+
}

src/main/java/com/gamzabat/algohub/feature/user/dto/UserInfoResponse.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@ public class UserInfoResponse {
1212
private String nickname;
1313
private String profileImage;
1414
private String bjNickname;
15+
private String githubName;
1516
private String description;
1617
}

src/main/java/com/gamzabat/algohub/feature/user/service/UserService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,12 @@ public TokenResponse signIn(SignInRequest request) {
119119

120120
@Transactional(readOnly = true)
121121
public UserInfoResponse userInfo(User user) {
122-
return new UserInfoResponse(user.getEmail(), user.getNickname(), user.getProfileImage(), user.getBjNickname(),
122+
return new UserInfoResponse(
123+
user.getEmail(),
124+
user.getNickname(),
125+
user.getProfileImage(),
126+
user.getBjNickname(),
127+
user.getGithubName(),
123128
user.getDescription());
124129
}
125130

@@ -166,6 +171,10 @@ private void handleNullInputImage(User user) {
166171

167172
@Transactional
168173
public void deleteUser(User user, DeleteUserRequest deleteUserRequest) {
174+
if (deleteUserRequest.isOAuthAccount()) {
175+
userRepository.delete(user);
176+
return;
177+
}
169178
if (!passwordEncoder.matches(deleteUserRequest.password(), user.getPassword())) {
170179
throw new UncorrectedPasswordException("비밀번호가 틀렸습니다.");
171180
}
@@ -244,6 +253,7 @@ public UserInfoResponse otherUserInfo(String userNickname) {
244253

245254
return new UserInfoResponse(targetUser.getEmail(), targetUser.getNickname(), targetUser.getProfileImage(),
246255
targetUser.getBjNickname(),
256+
targetUser.getGithubName(),
247257
targetUser.getDescription());
248258
}
249259

src/test/java/com/gamzabat/algohub/feature/user/controller/UserControllerTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ void updateUser() throws Exception {
280280
@DisplayName("회원 정보 조회 성공")
281281
void getUserInfo() throws Exception {
282282
// given
283-
UserInfoResponse response = new UserInfoResponse("email", "nickname", "profileImage", "bjNickname", "");
283+
UserInfoResponse response = new UserInfoResponse("email", "nickname", "profileImage", "bjNickname", "", "");
284284
when(userService.userInfo(user)).thenReturn(response);
285285
// when, then
286286
mockMvc.perform(get("/api/users/me")
@@ -299,7 +299,7 @@ void getUserInfo() throws Exception {
299299
@DisplayName("회원 탈퇴 성공")
300300
void deleteUser() throws Exception {
301301
// given
302-
DeleteUserRequest request = new DeleteUserRequest("password");
302+
DeleteUserRequest request = new DeleteUserRequest(false, "password");
303303
// when, then
304304
mockMvc.perform(delete("/api/users/me")
305305
.header("Authorization", token)
@@ -314,22 +314,22 @@ void deleteUser() throws Exception {
314314
@DisplayName("회원 탈퇴 실패 : 잘못된 요청")
315315
void deleteUserFailed_1() throws Exception {
316316
// given
317-
DeleteUserRequest request = new DeleteUserRequest("");
317+
DeleteUserRequest request = new DeleteUserRequest(null, "");
318318
// when, then
319319
mockMvc.perform(delete("/api/users/me")
320320
.header("Authorization", token)
321321
.contentType(MediaType.APPLICATION_JSON)
322322
.content(objectMapper.writeValueAsString(request)))
323323
.andExpect(status().isBadRequest())
324324
.andExpect(jsonPath("$.error").value("올바르지 않은 요청입니다."))
325-
.andExpect(jsonPath("$.messages", hasItem("password : 비밀번호는 필수 입력입니다.")));
325+
.andExpect(jsonPath("$.messages", hasItem("isOAuthAccount : 소셜 로그인 여부는 필수 입력입니다.")));
326326
}
327327

328328
@Test
329329
@DisplayName("회원 탈퇴 실패 : 틀린 비밀번호")
330330
void deleteUserFailed_2() throws Exception {
331331
// given
332-
DeleteUserRequest request = new DeleteUserRequest("invalidPassword");
332+
DeleteUserRequest request = new DeleteUserRequest(false, "invalidPassword");
333333
doThrow(new UncorrectedPasswordException("비밀번호가 틀렸습니다.")).when(userService).deleteUser(user, request);
334334
// when, then
335335
mockMvc.perform(delete("/api/users/me")
@@ -559,4 +559,4 @@ void deleteBjNickname_2() throws Exception {
559559
.andExpect(status().isBadRequest())
560560
.andExpect(jsonPath("$.error").value("백준 아이디가 등록되어 있지 않습니다."));
561561
}
562-
}
562+
}

src/test/java/com/gamzabat/algohub/feature/user/service/UserServiceTest.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,19 +260,30 @@ void userUpdateWithoutImage() {
260260
@DisplayName("회원 탈퇴 성공")
261261
void deleteUser() {
262262
// given
263-
DeleteUserRequest request = new DeleteUserRequest(password);
263+
DeleteUserRequest request = new DeleteUserRequest(false, password);
264264
when(passwordEncoder.matches(password, user.getPassword())).thenReturn(true);
265265
// when
266266
userService.deleteUser(user, request);
267267
// then
268268
verify(userRepository, times(1)).delete(user);
269269
}
270270

271+
@Test
272+
@DisplayName("소셜 로그인 회원 탈퇴 성공")
273+
void deleteOAuthUser() {
274+
// given
275+
DeleteUserRequest request = new DeleteUserRequest(true, null);
276+
// when
277+
userService.deleteUser(user, request);
278+
// then
279+
verify(userRepository, times(1)).delete(user);
280+
}
281+
271282
@Test
272283
@DisplayName("회원 탈퇴 실패 : 틀린 비밀번호")
273284
void deleteUserFailed() {
274285
// given
275-
DeleteUserRequest request = new DeleteUserRequest(password);
286+
DeleteUserRequest request = new DeleteUserRequest(false, password);
276287
when(passwordEncoder.matches(password, user.getPassword())).thenReturn(false);
277288
// when, then
278289
assertThatThrownBy(() -> userService.deleteUser(user, request))

0 commit comments

Comments
 (0)