- 이번 시간에는 데이터를 전달받고 해당 데이터로 데이터베이스에 저장되어 있는 데이터를 변경하는 UPDATE 작업을 수행해보겠습니다.
- 우선 다음과 같이 함수를 구현해주었습니다.
- Update 작업을 수행할 것이므로 @PutMapping 어노테이션을 작성해주었습니다.
- 또한 Insert 작업을 수행할 때 사용했던 save 함수를 사용하고 있는데, save 함수는 경우에 따라 다음과 같이 동작합니다.
- id를 전달하지 않을 경우 Insert 수행
- id를 전달할 경우 해당 id에 대한 데이터가 있다면 Update 수행
- id를 전달할 경우 해당 id에 대한 데이터가 없다면 Insert 수행
- 즉, 위에서 id 값으로 이미 데이터베이스에 저장되어 있는 값을 전달받는다면 데이터베이스에서 해당 id 값을 갖고 있는 데이터의 값이 수정될 것이며, 만약 데이터베이스에 저장되어 있지 않은 id 값을 전달받는다면 새로운 데이터를 추가할 것입니다.
- 테스트하기 위해 Postman을 통해 Put 요청을 수행한 뒤, 데이터베이스를 살펴보면 다음과 같이 데이터가 수정된 것을 확인할 수 있습니다. 참고로 요청할 시 JSON 형식의 MIME 타입을 갖도록 해야합니다.
- save 함수를 사용하지 않고 어노테이션을 활용하는 방법도 있습니다.
- 우선 코드를 다음과 같이 수정해주었습니다.
- 기존 save 함수 구문을 주석처리 해주었으며 함수 위에 @Transactional 어노테이션을 작성해주었습니다. 위 함수도 똑같이 Update를 수행할 수 있습니다.
- 이것이 가능한 이유는 더티 체킹(Dirty Checking) 덕분인데, 여기에서 Dirty란 상태의 변화가 생긴 정도로 이해하시면 됩니다. 즉, Dirty Checking이란 상태 변경 검사입니다.JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해줍니다.
- 이때 변화가 있다의 기준은 최초 조회 상태입니다.
- JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷을 만들어놓습니다.
- 그리고 트랜잭션이 끝나는 시점에는 이 스냅샷과 비교해서 다른점이 있다면 Update Query를 데이터베이스로 전달합니다.
- 당연히 이런 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만적용 됩니다.
- detach된 엔티티 (준영속), DB에 반영되기 전 처음 생성된 엔티티 (비영속) 등 준영속/비영속 상태의 엔티티는 Dirty Checking 대상에 포함되지 않습니다.
- 즉, 값을 변경해도 데이터베이스에 반영되지 않는다는 것이죠.
📌 References
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 12. 메인화면 만들기 (0) | 2022.05.05 |
---|---|
[스프링부트 게시판] 11. DELETE 테스트 (0) | 2022.05.05 |
[스프링부트 게시판] 9. SELECT 테스트 (0) | 2022.05.03 |
[스프링부트 게시판] 8. 회원가입을 위한 insert 테스트 (0) | 2022.05.02 |
[스프링부트 게시판] 7. 테이블 생성 (0) | 2022.05.02 |