트랜잭션(Transaction)
트랜잭션은 하나의 작업을 안전하게 처리하기 위한 실행 단위이다.
트랜잭션이 시작되면 JPA는 조회한 엔티티를 영속성 컨텍스트에서 관리한다.
이후 엔티티의 상태를 계속 추적하다가 트랜잭션이 종료되는 시점에 변경된 내용을 데이터베이스(DB)에 반영한다.
더티 체킹(Dirty Checking)
JPA에서는 트랜잭션 안에서 영속 상태의 엔티티 값만 변경해도 DB에 자동으로 UPDATE SQL이 실행된다.
이 기능을 더티 체킹 이라고 한다.
즉, 개발자가 save()를 직접 호출하지 않아도 JPA가 변경 사항을 감지하여 자동으로 저장해 준다.
기존 방식
게시글을 수정한 후 다시 저장해야 했다.
public void modify(Post post, String title, String body){
post.setTitle(title);
post.setBody(body);
postRepository.save(post);
}
더티 체킹 적용
하지만 수정 작업이 트랜잭션 안에서 수행된다면 save()를 호출할 필요가 없다.
@Transactional
void work4(){
Post post = postService.findById(1).get();
postService.modify(post, "제목1-수정", "내용1-수정");
}
public void modify(Post post, String title, String body){
post.setTitle(title);
post.setBody(body);
}
처럼 엔티티의 값만 변경하면 된다.
트랜잭션이 종료되는 시점에 JPA가 최초 상태와 현재 상태를 비교하여 변경 여부를 확인하고, 변경된 경우에만 UPDATE SQL을 자동으로 실행한다.
엔티티가 자신의 상태를 변경하도록 만들기
객체지향 관점에서는 엔티티의 상태를 변경하는 책임은 엔티티 자신이 가지는 것이 더 자연스럽다.
따라서 Service에서 Setter를 직접 호출하기보다는 엔티티에 수정 메서드를 만들어 사용하는 것이 좋다.
public class Post extends BaseEntity {
...
public void modify(String title, String body){
this.title = title;
this.body = body;
}
}
Service에서는 엔티티의 메서드만 호출한다.
public void modify(Post post, String title, String body){
post.modify(title, body);
}
이렇게 하면 수정 로직이 엔티티 내부에 모여 객체의 책임이 명확해지고, 캡슐화도 유지할 수 있다.
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] 테스트 환경 분리(dev / test) (0) | 2026.08.04 |
|---|---|
| [Spring] BaseEntity와 @MappedSuperclass (0) | 2026.08.04 |
| [Spring] @Component, @Transactional, JPA Auditing (0) | 2026.07.31 |
| [Spring] intelliJ 세팅 (0) | 2026.07.31 |
| [Spring] JPA 기초 (0) | 2026.07.30 |
댓글