JPA 의 영속성 컨텍스트
와 변경 감지(Dirty Checking)
덕분이다.
이 둘이 있으므로, 수정(update) 시 save 메서드를 호출할 필요가 없다.
트랜잭션 종료 시, 스냅샷과 현재 상태의 엔티티 객체를 비교 (변경 감지, 더티 체킹)
Entity 의 필드 값이 변경되면, 영속성 컨텍스트가 이를 감지한다
트랜잭션을 커밋할 때, 영속성 컨텍스트가 변경된 필드 값을 DB 에 자동 반영한다
그리고, 메서드 종료 시 트랜잭션 커밋이 수행되면서, JPA flush 가 발동한다.
단, 수정(update) 메서드에는 @Transactional 를 설정해둬야지만 메서드 반환 시점에 트랜잭션이 커밋된다
아래 코드는 게시글을 수정하는 메서드의 예시다.
save 메서드 사용 O
public BoardResponseDto updateBoard(Long id, BoardRequestDto requestDto) {
Board board = findBoard(id);
if (board.getPassword().equals(requestDto.getPassword())) {
board.update(requestDto);
boardRepository.save(board); // save 메서드로 변경된 baord 엔티티를 저장
} else {
return new BoardResponseDto("비밀번호가 일치하지 않습니다.");
}
return new BoardResponseDto(board);
}
save 메서드 사용 X
@Transactional
public BoardResponseDto updateBoard(Long id, BoardRequestDto requestDto) {
Board board = findBoard(id);
if (board.getPassword().equals(requestDto.getPassword())) {
board.update(requestDto);
} else {
return new BoardResponseDto("비밀번호가 일치하지 않습니다.");
}
return new BoardResponseDto(board);
}