회원정보 수정 4
이제는, Optional 처리를 해본다.
만약 서버에서 id =50 인 유저를 데이터베이스에서 찾으려고 하는데,
데이터베이스에 이 유저가 없을 때.
즉, UserService.java 페이지에서 회원수정 메서드에 보면
User userEntity = userRepository.findById(id).get();
이 부분이 있는데,
만약 여기에, id 대신 50을 넣고
@Transactional
public User 회원수정(int id, User user) {
User userEntity = userRepository.findById(50).get();
userEntity.setName(user.getName());
String rawPassword = user.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
userEntity.setPassword(encPassword);
userEntity.setBio(user.getBio());
userEntity.setWebsite(user.getWebsite());
userEntity.setPhone(user.getPhone());
userEntity.setGender(user.getGender());
return userEntity;
}
사이트에서 회원수정을 해보자. (위의 코드는 사용자가 회원수정 하려고 할 때 실행되는 코드)
그러면 아래 메서드가 실행되기 떄문에,
User userEntity = userRepository.findById(50).get();
이에 대한 결과가 sts(이클립스) 콘솔창에 나오게 된다.
get() 메서드에 문제가 있다는 에러가 나온다.
즉, 데이터베이스에 50번 유저가 없기 때문에 에러가 나오는 것이다.
그래서
get() -> orElseThrow() 변경
orElseThrow() 매개변수로, Supplier 타입을 넣어야 하며 또 그 내부에 IllegalArgumentException 넣음
(illegalArgumentexception)
아무튼, 그래서 이 부분 정리해서 나타내면
@Transactional
public User 회원수정(int id, User user) {
User userEntity = userRepository.findById(50).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("찾을 수 없는 id 입니다.");
}
});
(아래 코드는 생략했음)
이렇게 한 다음 회원수정페이지에서 회원정보 수정하면
sts(이클립스) 콘솔창에 에러가 나면서
아래 문구도 같이 나옴

이거를 람다식 이용해서 보기 좋게 하자면,
@Transactional
public User 회원수정(int id, User user) {
User userEntity = userRepository.findById(50).orElseThrow(() -> {return new IllegalArgumentException("찾을 수 없는 id 입니다.");});
이 오류를, 우리가 지금까지 했던 대로
ControllerExceptionHandler.java 에서 낚아 채서 처리하도록(기존에 만들었던 CustomValidationApiException 사용)
그런데, CustomValidationApiException.java 를 보면
생성자 매개변수로
public CustomValidationApiException(String message, Map<String, String> errorMap) {
super(message);
this.errorMap = errorMap;
}
String message, errorMap 을 받는데,
여기서는 그냥 "찾을 수 없는 id 입니다." 메세지만 보내면 되니깐
생성자를 하나 더 만듦
public CustomValidationApiException(String message) {
super(message);
}
그러고 나면, 저렇게 잘 받을 수 있고,
ControllerExceptionHandler.java 에서 CustomValiationApiException 을 낚아채는데, 그 부분을 보면
@ExceptionHandler(CustomValidationApiException.class)
public ResponseEntity<?> validationApiException(CustomValidationApiException e) {
return new ResponseEntity<>(new CMRespDto<>(-1, e.getMessage(), e.getErrorMap()), HttpStatus.BAD_REQUEST);
}
이런 식으로 ResponseEntity 로 리턴하니깐,
ajax 입장에서는 update.js 에서 fail 이 실행되고
<update.js> 파일
function update(userId, event) {
event.preventDefault();
let data = $("#profileUpdate").serialize();
console.log(data);
$.ajax({
type: "put",
url : `/api/user/${userId}`,
data: data,
contentType: "application/x-www-form-urlencoded; charset=utf-8",
dataType: "json"
}).done(res=>{
console.log("성공", res);
location.href = `/user/${userId}`;
}).fail(error=>{
alert(JSON.stringify(error.responseJSON.data));
});
}
그 때, 위의 e.getMessage()와 e.getErrorMap 이 같이 날아감
그런데 여기서 e.getErrorMap 이 없으니깐 null 값으로 날아감
그래서 약간 문제가 생기는데,
이 상태까지 마친 다음에
사이트에서 회원정보수정을 실시하면
null 이라는 에러메시지가 사이트화면에 뜨게 된다.
그 이유는 ErrorMap 값이 없어서 그러함.
그런데 update.js 에서는
fail 부분에
.fail(error=>{
alert(JSON.stringify(error.responseJSON.data));
이런식으로, error.responseJSON.data
즉, errorMap 부분을 메세지로 나타내도록 하고 있기 떄문.
null 값인데 화면에 나타내라고 하니 에러가 남
(message는 있음)
그래서
update.js 를 수정하면
.fail(error=>{
if(error.data == null){
alert(error.responseJSON.message);
}else{
alert(JSON.stringify(error.responseJSON.data));
}
});
이런식으로, 나눠서 처리.
여기서는 errorMap 이 없기 때문에,
(CMRespDto.java 파일에서 errorMap 이 들어가는 위치가 data라는 변수라서 저 코드에서 보면
errorMap 에 값이 없는 것을 error.data == null 이런식으로 표현)
<CMRespDto.java> 파일
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CMRespDto<T> {
private int code;
private String message;
private T data;
}
그래서 회원수정 페이지에서 수정한 다음 제출 버튼 누르면
아래와 같이 에러메세지가 잘 나옴

그러면 UserService.java 에서
다시 숫자 50 대신 id 로 변경해서 정리 끝
User userEntity = userRepository.findById(id).orElseThrow(() -> {return new CustomValidationApiException("찾을 수 없는 id 입니다.");});
참고 자료 : 이지업 강의 사이트 "스프링부트 SNS프로젝트 - 포토그램 만들기"