728x90
Spring Boot에서 비밀번호 변경 기능을 구현하려고 한다. 구현 전에 먼저 알아둘 것을 정리해본다.
회원 정보 수정 과정
1. 회원가입이 되어 있는 상태여야 한다.
2. 로그인 상태여야 한다.
3. 회원정보 수정 가능한 정보는 닉네임과 프로필 이미지 뿐이다.
4. 사용자에게 닉네임 또는 프로필 이미지를 입력받는다.
5. 닉네임이 변경 됐다면 닉네임 중복체크를 진행한다.
6. 프로필 이미지가 변경됐다면 기존 이미지 파일을 서버에서 삭제 한다.
UpdateMemberReq
@Getter
public class UpdateMemberReq {
@NotBlank
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-z0-9-_]{2,10}$", message = "닉네임은 특수문자를 제외한 2~10자리여야 합니다.")
private String username;
private String image;
}
- 회원 정보 수정 에 필요한 request 객체
Member
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Entity
@Getter
public class Member extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
private String password;
private String image;
public void updateMemberInfo(String newUsername, String image) {
this.username = newUsername;
this.image = image;
}
}
- Member 엔티티는 위와 같다. updateMemberInfo() 메서드가 구현되어 있다.
MemberController
@RestController
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService; \
@Operation(summary = "회원정보 수정", description = "로그인한 회원의 닉네임, 프로필 사진 변경 요청")
@PutMapping("/me")
public void updateMember(@Validated @RequestBody UpdateMemberReq updateMemberReq) {
String email = MemberUtils.getAuthMember().getUsername(); //현재 로그인한 사용자의 email
memberService.updateMemberInfo(email, updateMemberReq.getUsername(), updateMemberReq.getImage());
}
}
- 현재 로그인 한 회원이 변경할 닉네임 또는 이미지를 받아 memberService로 넘긴다.
MemberService
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
@Transactional
public void updateMemberInfo(String email, String username, String image) {
Member member = memberRepository.findByEmail(email)
.orElseThrow(NonExistentMemberException::new);
//닉네임이 변경됐다면 닉네임 중복 체크
if (!member.getUsername().equals(username)) {
checkDuplicateUsername(username);
}
//기존 프로필 image
String oldImage = member.getImage();
member.updateMemberInfo(username, image);
//프로필 image가 변경되었다면 서버에서 기존 프로필 image 삭제
if (StringUtils.hasText(oldImage) && !oldImage.equals(image)) {
FileUtils.deleteFile(props.getImageDir(), oldImage);
}
}
private void checkDuplicateUsername(String username) {
//닉네임 중복 체크
memberRepository.findByUsername(username).ifPresent(member -> {
throw new DuplicateUsernameException();
});
}
}
- 회원의 email로 일치하는 회원을 먼저 조회한다.
- 닉네임이 변경 됐다면 닉네임 중복체크를 진행한다.
- 기존 이미지 파일을 oldImage로 저장한다.
- member의 회원 정보를 updateMemberInfo()를 통해 수정한다.
- 프로필 이미지가 변경됐다면 기존 이미지 파일을 서버에서 삭제 한다.
- 조회하는 회원이 존재하지 않거나 닉네임이 중복이면 아래의 Exception을 throw 한다.
NonExistMemberException
public class NonExistentMemberException extends RuntimeException {
public NonExistentMemberException() {
super(ExceptionCodeMessage.NON_EXISTENT_MEMBER_EXCEPTION.message());
}
public NonExistentMemberException(String message) {
super(message);
}
public NonExistentMemberException(String message, Throwable cause) {
super(message, cause);
}
public NonExistentMemberException(Throwable cause) {
super(cause);
}
public NonExistentMemberException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
DuplicateUsernameException
public class DuplicateUsernameException extends RuntimeException {
public DuplicateUsernameException() {
super(ExceptionCodeMessage.DUPLICATE_USERNAME_EXCEPTION.message());
}
public DuplicateUsernameException(String message) {
super(message);
}
public DuplicateUsernameException(String message, Throwable cause) {
super(message, cause);
}
public DuplicateUsernameException(Throwable cause) {
super(cause);
}
public DuplicateUsernameException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
Spring | @Annotation 어노테이션은 어떻게 동작할까? (0) | 2023.10.29 |
---|---|
Spring Security | 비밀번호 변경 기능 구현 하기 (0) | 2023.08.11 |
Spring Security | PasswordEncoder를 사용하여 회원가입시 비밀번호 암호화 하기 (0) | 2023.08.11 |
Spring | @ConfigurationProperties와 @ConfigurationPropertiesScan (0) | 2023.08.11 |
Spring | RESTful API - DTO를 Page로 반환하기 (0) | 2023.08.11 |