//email, password 수정
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) {
System.out.println("id: "+ id);
System.out.println("password: " + requestUser.getPassword());
System.out.println("email: "+ requestUser.getEmail());
return null;
}
이런 녀석을 만들고 postman에서 put 메서드를 사용해 JSON 형태로 요청을 하면
이렇게 콘솔에 정상적으로 응답이 온다.
이제 이것을 DB에 반영을 해줘야 하는데 먼저 save() 메서드를 활용하는 방법이 있다.
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) {//MessageConverter의 Jackson라이브러리가 알아서 파싱해줌.
System.out.println("id: "+ id);
System.out.println("password: " + requestUser.getPassword());
System.out.println("email: "+ requestUser.getEmail());
//이미 정보가 다 들어가 있는 녀석을 다시 select해서 가져와야 null이 들어가는 것을 피할 수 있다.
User user = userRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("수정에 실패했습니다...");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
userRepository.save(user); //save 메서드는 id를 전달하지 않으면 insert, id를 전달할 시에는 id에 해당하는 데이터가 있으면 update, 없으면 insert.
return null;
}
findById(id)를 사용하여 이미 저장되어 있는 DB의 값을 불러와서 수정할 값들만 set 메서드로 바꿔주고 save()하면 set하지 않은 값들이 DB에 null로 들어가는 것을 피할 수 있다.
하지만, 더티 체킹 기능을 사용하면 save()를 사용하지 않고도 update를 할 수 있다.
JPA의 영속성 컨텍스트라는 것이 있다.
컨트롤러에서 findById() 하면 영속성 컨텍스트에 영속화가 되어 1차 캐시에 User 객체의 해당 항목이 저장된다.
이 때, @Transactional이 있는 상태에서 user.setPassword, setEmail 하면 바뀐 채로 commit이 되고
영속성 컨텍스트에 있던 User 객체의 내용과 컨트롤러의 User 객체의 내용이 달라졌음을 인식하고 DB에 바뀐 부분을 update 해주게 된다.
//email, password 수정
@Transactional //함수 종료시 자동 commit
@PutMapping("/dummy/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User requestUser) {//MessageConverter의 Jackson라이브러리가 알아서 파싱해줌.
System.out.println("id: "+ id);
System.out.println("password: " + requestUser.getPassword());
System.out.println("email: "+ requestUser.getEmail());
//이미 정보가 다 들어가 있는 녀석을 다시 select해서 가져와야 null이 들어가는 것을 피할 수 있다.
User user = userRepository.findById(id).orElseThrow(() -> {
return new IllegalArgumentException("수정에 실패했습니다...");
});
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
//userRepository.save(user); //save 메서드는 id를 전달하지 않으면 insert, id를 전달할 시에는 id에 해당하는 데이터가 있으면 update, 없으면 insert.
//transactional --> 더티 체킹
return null;