6. 스프링 데이터 JPA 분석

2024. 4. 12. 17:49·Spring/Spring Data Jpa
목차
  1. 1. persist 와 merge
  2. 2. Spring Data JPA에서의 동작 방식

1. persist 와 merge

save

: 엔티티를 새로 저장하거나 변경 사항을 업데이트 한다.

 

persist

: 새로운 엔티티 객체를 영속성 컨텍스트에 추가한다.

 

merge

: 준영속 상태(detached)의 엔티티 객체를 받아 영속 상태로 전환한다.

여기서 준영속 상태는 엔티티가 현재 세션의 영속성 컨텍스트에 속하지 않는 상태를 의미한다.

즉, 데이터베이스에는 존재하지만 현재 세션에서는 관리되지 않는 상태이다.

 

 


 

2. Spring Data JPA에서의 동작 방식

Entity ID(식별자) 생성 전략

1) @GenerateValue

: 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 persist가 정상 동작한다.

 

2) 직접할당

: 이미 식별자 값이 있는 상태로, merge가 호출된다.

 

DB에 select 쿼리를 호출해서 엔티티가 있는지 확인한다.

만약 존재하면 DB 정보를 기반으로 새로운 영속 상태의 엔티티를 생성하고, 준영속 상태의 엔티티의 상태를 복사한다.

만약 존재하지 않는다면 새로운 엔티티로 취급하여 영속성 컨텍스트에 추가한다.

그리고 트랜잭션이 커밋될 때 insert 쿼리를 통해 DB에 반영된다.

 

이 때 직접할당의 경우에는 merge가 호출됨으로써

새로운 엔티티임을 인식하지 못하고, insert 쿼리 전에 select 쿼리를 1번 호출하게 된다.

 

따라서 Persistable를 사용해서 새로운 엔티티 확인 여부를 직접 구현하는 것이 좋다!!

cf. 등록시간(@CreatedDate)을 조합해서, 이 필드로 새로운 엔티티 여부를 확인하면 편리하다.

 

@Entity
@EntityListeners(AuditingEntityListener.class)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item implements Persistable<String> {
    @Id
    private String id;
    @CreatedDate
    private LocalDateTime createdDate;
    public Item(String id) {
        this.id = id;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public boolean isNew() {
        return createdDate == null;
    }
}

 

 

[JpaRepository save 구현체]

@Transactional
@Override
public <S extends T> S save(S entity) {

    Assert.notNull(entity, "Entity must not be null");

    if (entityInformation.isNew(entity)) {
        entityManager.persist(entity);
        return entity;
    } else {
        return entityManager.merge(entity);
    }
}

 

저작자표시 (새창열림)

'Spring > Spring Data Jpa' 카테고리의 다른 글

7. Projections  (0) 2024.04.13
5. 확장 기능  (0) 2024.04.11
4. 쿼리 메소드 기능  (0) 2024.03.25
3. 공통 인터페이스 기능  (1) 2024.03.24
2. 예제 도메인 모델  (1) 2024.03.23
  1. 1. persist 와 merge
  2. 2. Spring Data JPA에서의 동작 방식
'Spring/Spring Data Jpa' 카테고리의 다른 글
  • 7. Projections
  • 5. 확장 기능
  • 4. 쿼리 메소드 기능
  • 3. 공통 인터페이스 기능
wch_t
wch_t
  • wch_t
    끄적끄적(TIL)
    wch_t
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (171)
      • Architecture (0)
      • Algorithm (67)
        • Math (5)
        • Simulation (1)
        • Data Structure (4)
        • DP (7)
        • Brute Fource (10)
        • Binary Search (6)
        • Greedy (2)
        • Graph (11)
        • Mst (1)
        • Shortest path (10)
        • Two Pointer (1)
        • Tsp (3)
        • Union Find (2)
        • Mitm (1)
      • CS (2)
        • 데이터베이스 (5)
        • 네트워크 (5)
      • DB (6)
      • DevOps (17)
        • AWS (9)
        • Docker (1)
        • CI-CD (5)
      • Error (1)
      • Project (0)
        • kotrip (0)
      • Spring (59)
        • 끄적끄적 (5)
        • 기본 (9)
        • MVC 1 (7)
        • MVC 2 (11)
        • ORM (8)
        • JPA 1 (7)
        • JPA 2 (5)
        • Spring Data Jpa (7)
      • Test (2)
      • TIL (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    view algorithm
    spring-cloud-starter-aws-secrets-manager-config
    Sxssf
    백준 17299 파이썬
    docker: not found
    애플
    Merge
    docker
    aws secrets manager
    Jenkins
    form_post
    apache poi
    response_mode
    spring-cloud-starter-bootstrap
    백준 17289 파이썬
    TempTable
    scope
    백준 3015 파이썬
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
wch_t
6. 스프링 데이터 JPA 분석
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.