Wanna be Brilliant Full-Stack Developer
Spring Boot 회원정보수정 -Optional 처리하기 본문
목표
유저를 수정하려고 DB에 들어왔는데 그 유저가 없으면 문제가 생길수 있기떄문에 그것을 준비해야한다.
이문제를 해결하기 위해서는 get을쓰는것이 아니라 orElseThrow를사용해야한다!
package com.cos.photogramstart.service;
import java.util.function.Supplier;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.cos.photogramstart.domain.user.User;
import com.cos.photogramstart.domain.user.UserRepository;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
@Transactional
public User 회원수정(int id, User user ) {
//1. 영속화
//1. 무조건 찾았다. 걱정마 get() 2. 못찾았어 익섹션 발통시킬때 orElseThrow()
User userEntity = userRepository.findById(10).orElseThrow(new Supplier<IllegalArgumentException>() {
@Override
public IllegalArgumentException get() {
return new IllegalArgumentException("찾을 수 없는 id입니다.");
}
});
//2. 영속화된 오브젝트를 수정 - 수정이 완료되면 더티체킹 ( 업데이트 완료)
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;
}//더티체킹이 일어나서 업데이트가 완료됨.
}
이거를 블로거 익셉션을 해서 낚아채서 처리하는것이 좋다.
// (1) 회원정보 수정
function update(userId,event) {
event.preventDefault(); // form 태그 액션을 막기!
let data =$("#profileUpdate").serialize();
console.log(data);
$.ajax({
type: "put",
url: `/api/user/${userId}`,
data:data,
conentType:"application/x-www-form-urlencoded; charset=utf-8",
dataType:"json"
}).done(res=>{ // HttpStatus 상태코드 200번대
console.log("성공",res);
location.href=`/user/${userId}`;
}).fail(error=>{ // HttpStatus 상태코드 200번대가 이날때
if(error.date == null) {
alert(error.responseJSON.message);
}else {
alert(JSON.stringify(error.responseJSON.data));
}
});
}
UserSerive에서 CustomValidationApiExcepiton이 터졌으면 실제로 낚아챘는지 확인해보려고한다!
실행은 되는데 계속 null이 리턴이 되는 것은 update.js에서 fail이 떴는데 거기서는 응답할것이 없다는것이다 .
왜냐하면 errormap이 이 js에 없기 떄문이다.
이런 예외가 발생할 일은 별로 없다.
UserApiController에 있는 userUpdateDto에서 받을떄도 패스워드랑 유저네임을 무조건 받기로 REquired를 걸어놔서
안적어놓을수가 없는데 이상한 방법으로 누군가 던지거나 어떤 예외가 발생할수도있기 떄문에 지금
if(bindingResult.hasErrors()) {
Map<String, String> errorMap = new HashMap<>();
for(FieldError error: bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
System.out.println("==========================");
System.out.println(error.getDefaultMessage());
System.out.println("==========================");
}
throw new CustomValidationApiException("유효성 검사 실패함", errorMap);
}
이부분에서 막아주고 있고 , 로그인 인 된 사용자가 데이터베이스에서 자기 아이디로 DB에 있는지 확인해보면 없을수가 없기 떄문에 어떤 이상한거에 대한 예외가 발생해서 없는 유저를 찾게되는 경우는 서버에 문제가 생길수 있기 떄문에
UserSerive에서 orElseThrow로 막는것이다.
이렇게 하면 안전한 프로그램이 되는것이다!
포토그램 인증부분이 끝났다!
데이터를 한번 깔끔히 정리 한후 이제 다음단계로 넘어가려고한다!