정보 조회와 정보 수정은 같은 URI를 사용하고 Get요청인지, Put요청인지에따라 구분
/** 회원 정보 페이지 */
@GetMapping("/user")
public ResponseEntity<ResponseUser> my_page(HttpServletRequest request){
User user = (User) request.getAttribute("user");
ResponseUser responseUser = ResponseUser.builder().user(user).build();
return ResponseEntity.status(HttpStatus.OK).body(responseUser);
}
앞의 Filter에서 JWT에서 추출한 아이디로 User 객체를 조회해 함께 넘겨줬기때문에 HttpServletRequest 에서 유저 객체를 가져 올 수 있다.
해당 객체의 정보로 Response DTO를 만들어 status code와 함께 반환
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class ResponseUser {
private String username;
private String nickname;
private String telephone;
private String email;
private String address;
private String authority;
@Builder
public ResponseUser(User user){
this.username = user.getUsername();
this.nickname = user.getNickname();
this.telephone = user.getTelephone();
this.email = user.getEmail();
this.address = user.getAddress();
this.authority = user.getAuthority();
}
}
@PutMapping("/user")
public ResponseEntity<ResponseUser> update(HttpServletRequest request, @Valid @RequestBody RequestModify requestModify) {
ResponseUser responseUser = userService.updateUser(requestModify, (User) request.getAttribute("user"));
return (responseUser != null) ?
ResponseEntity.status(HttpStatus.OK).body(responseUser) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
프론트엔드에서 넘겨준 수정 요청한 값이 담긴 DTO와 JWT에서 추출한 유저 객체를 Service Layer로 넘김
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RequestModify {
@NotEmpty(message = "닉네임 입력은 필수 입니다.")
private String nickname;
@NotEmpty(message = "전화번호 입력은 필수 입니다.")
private String telephone;
@NotEmpty(message = "이메일 입력은 필수 입니다.")
@Pattern(regexp = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}$", message = "이메일 형식에 맞지 않습니다.")
private String email;
@NotEmpty(message = "주소 입력은 필수 입니다.")
private String address;
public void toEntity(User user) {
user.updateUser(nickname, telephone, e_mail, address);
}
}
회원가입때와 마찬가지로 @Valid 어노테이션으로 유효성 검사
@Override
public ResponseUser updateUser(RequestModify requestModify, User user) {
boolean check_telephone = checkTelephone(requestModify.getTelephone());
boolean check_email = checkEmail(requestModify.getEmail());
if ((check_telephone && !user.getTelephone().equals(requestModify.getTelephone()))
|| (check_email && !user.getEmail().equals(requestModify.getEmail()))
|| ~~!requestModify.getUsername().equals(user.getUsername()~~)) {
return null;
}
requestModify.toEntity(user);
User modified_user = userRepository.save(user);
return ResponseUser.builder().user(modified_user).build();
}
요청온 RequestModify DTO의 값으로 User Entity 업데이트 후 영속화
영속화된 객체로 다시 응답 ResponseUser DTO 생성 후 반환