해당 id값을 가진 사용자의 이메일과 비밀번호 수정하기
@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;
}
위 코드는 db에 변동 내용을 반영하지는 않고 Postman에 Body (raw)에 json 타입으로 내용 입력 시 spring boot에서 내용을 전달 받아 출력한다.
@Transactional // save를 하지 않아도 update가 된다.
@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());
// 영속화 시키기
User user=userRepository.findById(id).orElseThrow(()-> {
return new IllegalArgumentException("수정에 실패하였습니다");
});
// 변경 시키기
// 더티 체킹: @Transaction이 변경을 감지한다
user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());
return user;
}
Transactional 어노테이션을 사용해서 변경 내용을 db에 반영한다.
결과적으로 userRepository.save(requestUser); 코드를 사용할 필요가 없어진다.
위에 put 내용을 동일하게 적으면 아래 get을 통해 변경된 내용을 확인 가능하다.
엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
정의: 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것을 의미한다.
flush가 발생하면 쓰기 지연 저장소에 저장된 SQL (INSERT / UPDATE / DELETE)이 DB로 전송.