[Spring] 영속성 컨텍스트을 통한 데이터 수정

류재성's avatar
Mar 18, 2024
[Spring] 영속성 컨텍스트을 통한 데이터 수정
 

1.DTO 만들기

 
notion image
 
BoardRequest
@Data public static class UpdateDTO{ private String title; private String content ; private String username ; }
 
클라이언트의 데이터를 DTO 를 통해 받는다.
 
@NoArgsConstructor // 빈생성자가 필요 @Entity @Data @Table(name = "board_tb") public class Board { @Id @GeneratedValue (strategy = GenerationType.IDENTITY) private Integer id; private String title; private String content; private String username; @CreationTimestamp // persistance centext 에 전달될 때 자동으로 주입됨. private Timestamp createdAt; public void update(BoardRequest.UpdateDTO requestDTO){ this.title = requestDTO.getTitle(); this.content = requestDTO.getContent(); this.username = requestDTO.getUsername(); } }
 
💡
DTO를 편하게 받기 위해 update 메서드를 만든다.
 

2. 레파지토리

 
@Transactional public void updateById(Integer id,BoardRequest.UpdateDTO requestDTO) { Board board = findById(id); board.update(requestDTO); //영속화된 객체의 상태를 변경하고, 트랜잭션이 종료되면 더티체킹이 완료된다. }
 

3. JUnit 테스트

 
@Test public void updateById_test(){ //given int id = 1 ; String title = "제목수정1"; //when Board board = boardPersistRepository.findById(id); board.setTitle(title); //pc에 있는 데이터를 직접 수정 //더티 체킹 em.flush(); //강제로 update 쿼리를 전달 } }
 
💡
위의 과정을 더티 체킹이라고 한다. 더티 체킹(Dirty Checking)은 JPA에서 제공하는 기능 중 하나로, 엔티티의 상태 변화를 자동으로 감지하고 데이터베이스에 반영하는 메커니즘이다. 이 기능 덕분에 개발자는 엔티티 객체의 필드 값을 변경하기만 하면, JPA가 이러한 변경 사항을 데이터베이스에 자동으로 업데이트 해준다. 따라서 개발자가 명시적으로 SQL 쿼리를 작성하거나 업데이트 메소드를 호출할 필요가 없어 개발의 편리성이 크게 향상된다.
 

4. 컨트롤러

 
@GetMapping("/board/{id}/update-form") public String updateForm(@PathVariable Integer id,HttpServletRequest request){ Board board = boardPersistRepository.findById(id); request.setAttribute("board",board); return "board/update-form"; } @PostMapping("/board/{id}/update") public String update(@PathVariable Integer id,BoardRequest.UpdateDTO requestDTO){ boardPersistRepository.updateById(id,requestDTO); return "redirect:/board/"+id ; }
 
Share article

{CODE-RYU};