Skip to content

Commit d6dd2b3

Browse files
VloeiolzlrKim DongMin
andauthored
#95 [feat] 닉네임, 비밀번호 변경 구현
Co-authored-by: Kim DongMin <vloeiolzlr@gmail.com>
1 parent 4eecce4 commit d6dd2b3

6 files changed

Lines changed: 97 additions & 5 deletions

File tree

src/main/java/com/bigpicture/moonrabbit/domain/user/controller/UserController.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package com.bigpicture.moonrabbit.domain.user.controller;
22

33

4-
import com.bigpicture.moonrabbit.domain.user.dto.LoginRequestDTO;
5-
import com.bigpicture.moonrabbit.domain.user.dto.UserRankingDTO;
6-
import com.bigpicture.moonrabbit.domain.user.dto.UserRequestDTO;
4+
import com.bigpicture.moonrabbit.domain.user.dto.*;
75
import com.bigpicture.moonrabbit.domain.user.entity.User;
8-
import com.bigpicture.moonrabbit.domain.user.dto.UserResponseDTO;
96
import com.bigpicture.moonrabbit.domain.user.service.UserService;
107
import com.bigpicture.moonrabbit.global.auth.jwt.dto.JwtDTO;
118
import io.swagger.v3.oas.annotations.Operation;
@@ -115,4 +112,25 @@ public Page<UserRankingDTO> getTrustPointRanking(
115112
@RequestParam(defaultValue = "10") int size) {
116113
return userService.getTrustPointRanking(page, size);
117114
}
115+
@Operation(summary = "닉네임 변경", description = "로그인된 사용자의 닉네임을 변경합니다.")
116+
@PatchMapping("/profile/nickname")
117+
public ResponseEntity<UserResponseDTO> updateNickname(@Valid @RequestBody UpdateNicknameRequestDTO requestDTO) {
118+
String email = SecurityContextHolder.getContext().getAuthentication().getName();
119+
UserResponseDTO responseDTO = userService.updateNickname(email, requestDTO.getNewNickname());
120+
return new ResponseEntity<>(responseDTO, HttpStatus.OK);
121+
}
122+
123+
@Operation(summary = "비밀번호 변경", description = "로그인된 사용자의 비밀번호를 변경합니다.")
124+
@PatchMapping("/profile/password")
125+
public ResponseEntity<Void> updatePassword(@Valid @RequestBody UpdatePasswordRequestDTO requestDTO) {
126+
String email = SecurityContextHolder.getContext().getAuthentication().getName();
127+
userService.updatePassword(
128+
email,
129+
requestDTO.getCurrentPassword(),
130+
requestDTO.getNewPassword(),
131+
requestDTO.getNewPasswordConfirm()
132+
);
133+
return new ResponseEntity<>(HttpStatus.OK);
134+
}
135+
118136
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.bigpicture.moonrabbit.domain.user.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class UpdateNicknameRequestDTO {
11+
@NotBlank(message = "새로운 닉네임을 입력해주세요.")
12+
@Schema(description = "새로운 닉네임", example = "새로운달토끼")
13+
private String newNickname;
14+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.bigpicture.moonrabbit.domain.user.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.Pattern;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
@Getter
10+
@NoArgsConstructor
11+
public class UpdatePasswordRequestDTO {
12+
@NotBlank(message = "현재 비밀번호를 입력해주세요.")
13+
@Schema(description = "현재 비밀번호", example = "asdf1234!")
14+
private String currentPassword;
15+
16+
@NotBlank(message = "새 비밀번호를 입력해주세요.")
17+
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,}$",
18+
message = "비밀번호는 최소 8자 이상이어야 하며, 적어도 하나의 영문자와 하나의 특수 문자를 포함해야 합니다.")
19+
@Schema(description = "새 비밀번호", example = "newPassword123!")
20+
private String newPassword;
21+
22+
@NotBlank(message = "새 비밀번호 확인을 입력해주세요.")
23+
@Schema(description = "새 비밀번호 확인", example = "newPassword123!")
24+
private String newPasswordConfirm;
25+
26+
}

src/main/java/com/bigpicture/moonrabbit/domain/user/service/UserService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,9 @@ public interface UserService {
2828
Page<UserRankingDTO> getTotalPointRanking(int page, int size);
2929

3030
Page<UserRankingDTO> getTrustPointRanking(int page, int size);
31+
32+
// 추가된 메서드
33+
UserResponseDTO updateNickname(String email, String newNickname);
34+
35+
void updatePassword(String email, String currentPassword, String newPassword, String newPasswordConfirm);
3136
}

src/main/java/com/bigpicture/moonrabbit/domain/user/service/UserServiceImpl.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springframework.data.domain.Pageable;
1919
import org.springframework.security.crypto.password.PasswordEncoder;
2020
import com.bigpicture.moonrabbit.global.exception.CustomException;
21+
import org.springframework.transaction.annotation.Transactional;
2122

2223
import java.util.List;
2324
import java.util.Objects;
@@ -136,5 +137,33 @@ public Page<UserRankingDTO> getTrustPointRanking(int page, int size) {
136137
});
137138
}
138139

140+
@Override
141+
@Transactional
142+
public UserResponseDTO updateNickname(String email, String newNickname) {
143+
User user = getUserByEmail(email);
144+
user.setNickname(newNickname);
145+
User savedUser = userRepository.save(user);
146+
return new UserResponseDTO(savedUser);
147+
}
148+
149+
@Override
150+
@Transactional
151+
public void updatePassword(String email, String currentPassword, String newPassword, String newPasswordConfirm) {
152+
User user = getUserByEmail(email);
153+
154+
// 1. 현재 비밀번호가 맞는지 확인
155+
if (!passwordEncoder.matches(currentPassword, user.getPassword())) {
156+
throw new CustomException(ErrorCode.INVALID_PASSWORD);
157+
}
158+
159+
// 2. 새 비밀번호와 비밀번호 확인이 일치하는지 확인
160+
if (!Objects.equals(newPassword, newPasswordConfirm)) {
161+
throw new CustomException(ErrorCode.PASSWORD_COFIRM_ERROR);
162+
}
163+
164+
// 3. 새 비밀번호를 암호화하여 저장
165+
user.setPassword(passwordEncoder.encode(newPassword));
166+
userRepository.save(user);
167+
}
139168

140169
}

src/main/java/com/bigpicture/moonrabbit/global/exception/ErrorCode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public enum ErrorCode {
4444

4545
// 입력값 검증 에러
4646
INVALID_INPUT_VALUE(HttpStatus.BAD_REQUEST, "V001", "잘못된 입력 값입니다."),
47-
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "V002", "이메일 혹은 비밀번호가 유효하지 않습니다."),
47+
INVALID_PASSWORD(HttpStatus.BAD_REQUEST, "V002", "비밀번호가 유효하지 않습니다."),
4848

4949
// 서버 오류
5050
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "S001", "서버 오류가 발생했습니다."),

0 commit comments

Comments
 (0)