Skip to content

Commit 6d45314

Browse files
authored
Merge pull request #61 from fullstack-dev-hub/feature/#60-my-page
[Feature] 마이페이지 조회 및 수정 기능 구현
2 parents 77b97c1 + 45fb248 commit 6d45314

8 files changed

Lines changed: 144 additions & 19 deletions

File tree

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package com.postdm.backend.domain.auth.api;
22

3+
import com.postdm.backend.domain.member.dto.MemberPrincipalDto;
34
import com.postdm.backend.global.template.ResponseTemplate;
45
import org.springframework.http.HttpStatus;
6+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
57
import org.springframework.security.core.context.SecurityContextHolder;
68
import org.springframework.web.bind.annotation.GetMapping;
79
import org.springframework.web.bind.annotation.RestController;
810

911
@RestController
1012
public class TestController { // 현재 사용자 세션 확인용 테스트 컨트롤러
1113
@GetMapping("/test")
12-
public ResponseTemplate<String> test() {
13-
String username = SecurityContextHolder.getContext().getAuthentication().getName();
14+
public ResponseTemplate<String> test(@AuthenticationPrincipal MemberPrincipalDto member) {
1415

16+
String nickname = member.getNickname();
1517
String role = SecurityContextHolder.getContext().getAuthentication().getAuthorities().iterator().next().getAuthority();
1618

17-
return new ResponseTemplate<>(HttpStatus.OK, "환영합니다, " + role + ", " + username + "님!", username);
19+
return new ResponseTemplate<>(HttpStatus.OK, "환영합니다, " + role + ", " + nickname + "님!", nickname);
1820
}
1921
}

backend/src/main/java/com/postdm/backend/domain/auth/application/AuthService.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,8 @@ public void signUp(SignUpRequestDto signUpRequestDto) { // 회원가입 서비
117117
public TokenInfo signIn(SignInRequestDto signInRequestDto, HttpServletResponse response) { // 로그인 서비스
118118
String username = signInRequestDto.getUsername();
119119

120-
Member member = memberRepository.findByUsername(username);
121-
if(member == null) {
122-
throw new CustomException(ErrorCode.MEMBER_NOT_FOUND);
123-
}
120+
Member member = memberRepository.findByUsername(username)
121+
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
124122

125123
String password = signInRequestDto.getPassword();
126124
String encodedPassword = member.getPassword();

backend/src/main/java/com/postdm/backend/domain/member/api/MemberController.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
import com.postdm.backend.domain.member.application.MemberService;
66
import com.postdm.backend.domain.member.domain.entity.Member;
77
import com.postdm.backend.domain.member.dto.FindUsernameRequestDto;
8+
import com.postdm.backend.domain.member.dto.MemberInfoDto;
9+
import com.postdm.backend.domain.member.dto.MemberPrincipalDto;
810
import com.postdm.backend.domain.member.dto.ResetPasswordRequestDto;
911
import com.postdm.backend.global.template.ResponseTemplate;
1012
import io.swagger.v3.oas.annotations.Operation;
1113
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1214
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1315
import jakarta.validation.Valid;
1416
import org.springframework.http.HttpStatus;
15-
import org.springframework.web.bind.annotation.PostMapping;
16-
import org.springframework.web.bind.annotation.RequestBody;
17-
import org.springframework.web.bind.annotation.RequestMapping;
18-
import org.springframework.web.bind.annotation.RestController;
17+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
18+
import org.springframework.web.bind.annotation.*;
1919

2020
@RestController
2121
@RequestMapping("/api/v1/member")
@@ -66,4 +66,28 @@ public ResponseTemplate<Member> resetPassword(@RequestBody @Valid ResetPasswordR
6666

6767
return new ResponseTemplate<>(HttpStatus.OK, "비밀번호 변경 성공", member);
6868
}
69+
70+
@Operation(summary = "마이페이지 조회 컨트롤러")
71+
@ApiResponses(value = {
72+
@ApiResponse(responseCode = "200", description = "성공"),
73+
})
74+
@GetMapping("/my-page")
75+
public ResponseTemplate<MemberInfoDto> memberInfo(@AuthenticationPrincipal MemberPrincipalDto memberPrincipalDto) {
76+
String username = memberPrincipalDto.getUsername();
77+
MemberInfoDto member = memberService.loadMemberInfo(username);
78+
return new ResponseTemplate<>(HttpStatus.OK, "조회 성공", member);
79+
}
80+
81+
@Operation(summary = "마이페이지 수정 컨트롤러")
82+
@ApiResponses(value = {
83+
@ApiResponse(responseCode = "200", description = "성공"),
84+
})
85+
@PatchMapping("/my-page/edit")
86+
public ResponseTemplate<?> editMemberInfo(@AuthenticationPrincipal MemberPrincipalDto memberPrincipalDto,
87+
@RequestBody @Valid MemberInfoDto memberInfoDto) {
88+
String username = memberPrincipalDto.getUsername();
89+
memberService.updateMemberInfo(username, memberInfoDto);
90+
91+
return new ResponseTemplate<>(HttpStatus.OK, "회원 정보 수정 성공");
92+
}
6993
}

backend/src/main/java/com/postdm/backend/domain/member/application/MemberService.java

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,19 @@
66
import com.postdm.backend.domain.member.dto.FindUsernameRequestDto;
77
import com.postdm.backend.domain.member.domain.entity.Member;
88
import com.postdm.backend.domain.member.domain.repository.MemberRepository;
9+
import com.postdm.backend.domain.member.dto.MemberInfoDto;
910
import com.postdm.backend.domain.member.dto.ResetPasswordRequestDto;
11+
import com.postdm.backend.global.common.exception.CustomException;
12+
import com.postdm.backend.global.common.response.ErrorCode;
13+
import jakarta.validation.Valid;
14+
import org.springframework.security.core.Authentication;
15+
import org.springframework.security.core.context.SecurityContextHolder;
1016
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1117
import org.springframework.stereotype.Service;
1218

19+
import java.util.ArrayList;
20+
import java.util.List;
21+
1322
@Service
1423
public class MemberService {
1524

@@ -51,12 +60,55 @@ public Member resetPassword(ResetPasswordRequestDto resetPasswordRequestDto) {
5160
throw new IllegalArgumentException();
5261
}
5362

54-
Member member = memberRepository.findByUsername(username);
63+
Member member = memberRepository.findByUsername(username)
64+
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
5565
member.setPassword(encodedPassword);
5666

5767
memberRepository.save(member);
5868
certificationRepository.delete(certificationEntity);
5969

6070
return member;
6171
}
72+
73+
public MemberInfoDto loadMemberInfo(String username) {
74+
Member member = memberRepository.findByUsername(username)
75+
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
76+
77+
return MemberInfoDto.builder().
78+
nickname(member.getNickname()).
79+
email(member.getEmail()).
80+
phone(member.getPhone()).
81+
build();
82+
}
83+
84+
public void updateMemberInfo(String username, @Valid MemberInfoDto memberInfoDto) {
85+
Member member = memberRepository.findByUsername(username)
86+
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
87+
88+
List<MemberInfoDto> list = new ArrayList<>();
89+
list.add(memberInfoDto);
90+
91+
for (MemberInfoDto infoDto : list) {
92+
if (infoDto.getNickname() != null) {
93+
if (infoDto.getNickname().isEmpty()) {
94+
throw new CustomException(ErrorCode.VALIDATION_FAIL);
95+
}
96+
member.setNickname(infoDto.getNickname());
97+
};
98+
if (infoDto.getEmail() != null) {
99+
if(infoDto.getEmail().isEmpty()) {
100+
throw new CustomException(ErrorCode.VALIDATION_FAIL);
101+
}
102+
member.setEmail(infoDto.getEmail());
103+
};
104+
if (infoDto.getPhone() != null) {
105+
if (infoDto.getPhone().isEmpty()) {
106+
throw new CustomException(ErrorCode.VALIDATION_FAIL);
107+
}
108+
member.setPhone(infoDto.getPhone());
109+
};
110+
}
111+
112+
memberRepository.save(member);
113+
}
62114
}

backend/src/main/java/com/postdm/backend/domain/member/domain/repository/MemberRepository.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import org.springframework.data.jpa.repository.JpaRepository;
55
import org.springframework.stereotype.Repository;
66

7+
import java.util.Optional;
8+
79
@Repository
810
public interface MemberRepository extends JpaRepository<Member, Long> {
911
boolean existsByEmail(String email);
1012
boolean existsByUsername(String username);
11-
Member findByUsername(String username);
13+
Optional<Member> findByUsername(String username);
1214
Member findByEmail(String email);
1315
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.postdm.backend.domain.member.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.Email;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
8+
@Schema(description = "마이페이지 정보 DTO")
9+
@Data
10+
@Builder
11+
public class MemberInfoDto {
12+
13+
@Schema(description = "사용자 이름", example = "홍길동")
14+
private String nickname;
15+
16+
@Schema(description = "사용자 이메일", example = "test1@test.com")
17+
@Email
18+
private String email;
19+
20+
@Schema(description = "사용자 전화번호", example = "01012345678")
21+
private String phone;
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.postdm.backend.domain.member.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
@Data
8+
@Builder
9+
public class MemberPrincipalDto {
10+
11+
private Long id;
12+
13+
@Schema(description = "사용자 이름", example = "홍길동")
14+
private String nickname;
15+
16+
@Schema(description = "사용자 아이디", example = "test123")
17+
private String username;
18+
19+
}

backend/src/main/java/com/postdm/backend/global/jwt/util/JwtProvider.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.postdm.backend.domain.member.domain.entity.Member;
44
import com.postdm.backend.domain.member.domain.repository.MemberRepository;
5+
import com.postdm.backend.domain.member.dto.MemberPrincipalDto;
6+
import com.postdm.backend.global.common.exception.CustomException;
7+
import com.postdm.backend.global.common.response.ErrorCode;
58
import com.postdm.backend.global.jwt.dto.TokenInfo;
69
import io.jsonwebtoken.*;
710
import io.jsonwebtoken.security.SecurityException;
@@ -94,7 +97,6 @@ public boolean validateToken(String token) { // 토큰 유효성 검사
9497
public TokenInfo generateToken(String username, String role) { // 토큰 생성
9598

9699
String accessToken = generateAccessToken(username, role);
97-
String refreshToken = generateRefreshToken(username, role);
98100

99101
return TokenInfo.builder()
100102
.grantType("Bearer")
@@ -110,15 +112,19 @@ public Authentication getAuthentication(String token) { // 토큰에서 사용
110112

111113
String role = claims.get("role", String.class); // role 추출
112114

113-
Member member = memberRepository.findByUsername(username);
114-
if (member == null) {
115-
throw new RuntimeException("해당 사용자 정보를 찾을 수 없습니다.");
116-
}
115+
Member member = memberRepository.findByUsername(username)
116+
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
117+
118+
MemberPrincipalDto memberPrincipalDto = MemberPrincipalDto.builder()
119+
.id(member.getId())
120+
.nickname(member.getNickname())
121+
.username(username)
122+
.build();
117123

118124
List<GrantedAuthority> authorities = Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + role));
119125

120126
// Spring Security에서 Authentication 객체의 principal을 Member 객체로 저장
121-
return new UsernamePasswordAuthenticationToken(member, "", authorities);
127+
return new UsernamePasswordAuthenticationToken(memberPrincipalDto, "", authorities);
122128
}
123129

124130
// JWT 토큰 만료 시간 반환

0 commit comments

Comments
 (0)