Skip to content

Commit 2534429

Browse files
committed
feat(editUserProfile) : 회원정보(닉네임, 비밀번호, 소개글, 프로필사진) 변경 기능 구현
1 parent 2e413c7 commit 2534429

8 files changed

Lines changed: 162 additions & 4 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.example.FixLog.controller;
2+
3+
import com.example.FixLog.dto.Response;
4+
import com.example.FixLog.dto.member.edit.EditNicknameRequestDto;
5+
import com.example.FixLog.dto.member.edit.EditPasswordRequestDto;
6+
import com.example.FixLog.dto.member.edit.EditProfileImageRequestDto;
7+
import com.example.FixLog.dto.member.edit.EditBioRequestDto;
8+
import com.example.FixLog.service.MemberService;
9+
import com.example.FixLog.domain.member.Member;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
13+
import org.springframework.security.core.userdetails.UserDetails;
14+
import org.springframework.web.bind.annotation.PatchMapping;
15+
import org.springframework.web.bind.annotation.RequestBody;
16+
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.RestController;
18+
19+
@RestController
20+
@RequiredArgsConstructor
21+
@RequestMapping("/mypage")
22+
public class MypageMemberController {
23+
24+
private final MemberService memberService;
25+
26+
@PatchMapping("/members/nickname")
27+
public ResponseEntity<Response<String>> editNickname(
28+
@RequestBody EditNicknameRequestDto requestDto
29+
) {
30+
Member member = memberService.getCurrentMemberInfo();
31+
memberService.editNickname(member, requestDto.getNickname());
32+
return ResponseEntity.ok(Response.success("닉네임 수정 성공", null));
33+
}
34+
35+
@PatchMapping("/members/password")
36+
public ResponseEntity<Response<Void>> editPassword(
37+
@AuthenticationPrincipal UserDetails userDetails,
38+
@RequestBody EditPasswordRequestDto requestDto
39+
) {
40+
Member member = memberService.getCurrentMemberInfo();
41+
memberService.editPassword(member, requestDto);
42+
return ResponseEntity.ok(Response.success("비밀번호 변경 성공", null));
43+
}
44+
45+
@PatchMapping("/members/profile-image")
46+
public ResponseEntity<Response<String>> editProfileImage(
47+
@RequestBody EditProfileImageRequestDto requestDto
48+
) {
49+
Member member = memberService.getCurrentMemberInfo();
50+
memberService.editProfileImage(member, requestDto.getProfileImageUrl());
51+
return ResponseEntity.ok(Response.success("프로필 이미지 수정 성공", null));
52+
}
53+
54+
@PatchMapping("/members/bio")
55+
public ResponseEntity<Response<String>> editBio(
56+
@RequestBody EditBioRequestDto requestDto
57+
) {
58+
Member member = memberService.getCurrentMemberInfo();
59+
memberService.editBio(member, requestDto.getBio());
60+
return ResponseEntity.ok(Response.success("소개글 수정 성공", null));
61+
}
62+
}

src/main/java/com/example/FixLog/domain/member/Member.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import lombok.AccessLevel;
77
import lombok.Getter;
88
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
910
import org.springframework.data.annotation.CreatedDate;
1011
import org.springframework.data.annotation.LastModifiedDate;
1112
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@@ -20,6 +21,7 @@
2021

2122
@Entity
2223
@Getter
24+
@Setter
2325
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2426
@EntityListeners(AuditingEntityListener.class)
2527
public class Member implements UserDetails {
@@ -88,9 +90,6 @@ public static Member of(String email, String password, String nickname, SocialTy
8890
return member;
8991
}
9092

91-
public void setProfileImageUrl(String profileImageUrl) {
92-
this.profileImageUrl = profileImageUrl;
93-
}
9493

9594
@Override
9695
public Collection<? extends GrantedAuthority> getAuthorities() {
@@ -121,4 +120,6 @@ public boolean isCredentialsNonExpired() {
121120
public boolean isEnabled() {
122121
return !this.isDeleted; // 탈퇴 여부 기반 활성 상태
123122
}
123+
124+
124125
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.FixLog.dto.member.edit;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@NoArgsConstructor
10+
public class EditBioRequestDto {
11+
private String bio;
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.FixLog.dto.member.edit;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@NoArgsConstructor
10+
public class EditNicknameRequestDto {
11+
private String nickname;
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.example.FixLog.dto.member.edit;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@NoArgsConstructor
10+
public class EditPasswordRequestDto {
11+
private String currentPassword;
12+
private String newPassword;
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.example.FixLog.dto.member.edit;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
import lombok.Setter;
6+
7+
@Getter
8+
@Setter
9+
@NoArgsConstructor
10+
public class EditProfileImageRequestDto {
11+
private String profileImageUrl;
12+
}

src/main/java/com/example/FixLog/exception/ErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ public enum ErrorCode {
2424
SORT_NOT_EXIST(HttpStatus.BAD_REQUEST, "사용할 수 없는 정렬입니다."),
2525
INVALID_PASSWORD(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다."),
2626
REQUIRED_TAGS_MISSING(HttpStatus.BAD_REQUEST, "태그를 선택해주세요."),
27-
REQUIRED_CONTENT_MISSING(HttpStatus.BAD_REQUEST, "필수 본문이 입력되지 않았습니다.");
27+
REQUIRED_CONTENT_MISSING(HttpStatus.BAD_REQUEST, "필수 본문이 입력되지 않았습니다."),
28+
SAME_AS_OLD_PASSWORD(HttpStatus.BAD_REQUEST, "다른 비밀번호 입력 바랍니다.");
2829

2930
private final HttpStatus status;
3031
private final String message;

src/main/java/com/example/FixLog/service/MemberService.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.example.FixLog.domain.member.Member;
55
import com.example.FixLog.domain.member.SocialType;
66
import com.example.FixLog.dto.member.SignupRequestDto;
7+
import com.example.FixLog.dto.member.edit.EditPasswordRequestDto;
78
import com.example.FixLog.exception.CustomException;
89
import com.example.FixLog.exception.ErrorCode;
910
import com.example.FixLog.repository.MemberRepository;
@@ -74,4 +75,48 @@ public void withdraw(Member member, String password) {
7475
member.setIsDeleted(true);
7576
memberRepository.save(member);
7677
}
78+
79+
80+
public void editNickname(Member member, String newNickname) {
81+
if (isNicknameDuplicated(newNickname)) {
82+
throw new CustomException(ErrorCode.NICKNAME_DUPLICATED);
83+
}
84+
member.setNickname(newNickname);
85+
memberRepository.save(member);
86+
}
87+
88+
public void editPassword(Member member, EditPasswordRequestDto dto) {
89+
String currentPassword = dto.getCurrentPassword();
90+
String newPassword = dto.getNewPassword();
91+
92+
// 1. 현재 비밀번호 일치 확인
93+
if (!passwordEncoder.matches(currentPassword, member.getPassword())) {
94+
throw new CustomException(ErrorCode.INVALID_PASSWORD); // 기존 비밀번호 불일치
95+
}
96+
97+
// 2. 새 비밀번호가 기존과 동일한 경우
98+
if (passwordEncoder.matches(newPassword, member.getPassword())) {
99+
throw new CustomException(ErrorCode.SAME_AS_OLD_PASSWORD); // 동일한 비밀번호
100+
}
101+
102+
// 3. 새 비밀번호로 변경
103+
member.setPassword(passwordEncoder.encode(newPassword));
104+
memberRepository.save(member);
105+
}
106+
107+
public void editProfileImage(Member member, String newProfileImageUrl) {
108+
member.setProfileImageUrl(newProfileImageUrl);
109+
memberRepository.save(member);
110+
}
111+
112+
public void editBio(Member member, String newBio) {
113+
member.setBio(newBio);
114+
memberRepository.save(member);
115+
}
116+
117+
private void validateNickname(String nickname) {
118+
if (isNicknameDuplicated(nickname)) {
119+
throw new CustomException(ErrorCode.NICKNAME_DUPLICATED);
120+
}
121+
}
77122
}

0 commit comments

Comments
 (0)