ysk(0soo)
Lifealong
ysk(0soo)
전체 방문자
오늘
어제
  • 분류 전체보기 (238)
    • Java (50)
      • whiteship-java-study (11)
      • Java (28)
      • time (6)
    • Spring (68)
      • JPA (15)
      • Spring (1)
      • SpringBoot (1)
      • SpringMVC (6)
      • Spring Security (22)
      • Jdbc (1)
      • RestDocs (14)
      • log (6)
    • Kotlin (3)
    • Web (2)
      • nginx (1)
    • Database (14)
      • MySQL (5)
      • PostgreSQL (1)
      • SQL (1)
      • Redis (4)
    • C, C++ (0)
    • Git (1)
    • Docker (2)
    • Cloud (3)
      • AWS (3)
    • 도서, 강의 (0)
      • t5 (0)
    • 기타 (7)
      • 프로그래밍 (1)
    • 끄적끄적 (0)
    • CS (14)
      • 운영체제(OS) (2)
      • 자료구조(Data Structure) (9)
    • 하루한개 (12)
      • 우아한 테크코스-10분테코톡 (12)
    • 스터디 (12)
      • 클린 아키텍처- 로버트마틴 (2)
      • JPA 프로그래밍 스터디 (10)
    • 테스트 (34)
      • JUnit (19)
      • nGrinder (2)
      • JMeter (0)
    • Infra (3)
    • 프로그래머스 백엔드 데브코스 3기 (0)
    • 디자인 패턴 (3)
    • Issue (4)
    • system (1)
      • grafana (0)
      • Prometheus (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • nGrinder
  • jpa
  • mysql
  • LocalDateTime
  • scope value
  • DataJpaTest
  • StructuredConcorrency
  • node exporter basic auth
  • 동일성
  • FilterSecurityInterceptor
  • 동등성
  • nginx basic auth
  • UserDetailsService
  • 트랜잭션
  • junit5
  • querydsl
  • restdocs custom
  • java
  • 가상 스레드 예외 핸들링
  • 정규표현식
  • AccessDecisionVoter 커스텀
  • tree
  • 인가(Authorization) 처리
  • AuthenticationException
  • AccessDecisionManager
  • 동시성 제어
  • 가상 스레드
  • VirtualThread Springboot
  • restdocs enum
  • 구조화된 동시성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ysk(0soo)

Lifealong

Spring/JPA

Jpa Id 생성전략에 따른 동작 방식

2023. 1. 18. 02:54

JpaRepository.save 동작방식은 persist 하거나 merge를 한다.

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

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

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

}
  • 엔티티에 Id 값이 있으면 DB를 조회 (select)한 후에 insert 하게 된다.

생성전략이 존재하지 않을 경우 merge 로 동작.

  • merge 는 입력받은 entity 를 복사한 후 진행하기에 리소스 소모가 있다.

생성전략이 존재하는 경우 persist 로 동작한다.

ID 생성 전략이 없고 애플리케이션에서 Set하는 방식 

애플리케이션에서 ID 를 생성해줬기에 DB 에 값이 있나 확인하기 위해 select 를 날려본 후에, INSERT 가 이루어진다.

  • 즉, merge 방식으로 동작

ID 생성 전략이 존재할 때

GenerationType.IDENTITY

  • IDENTITY 는 id 값을 세팅하지 않고, insert 쿼리를 날리면 database 시스템에서 자동으로 가져와 엔티티에 지정한다.
  • id 값 생성에 대해서 database 에서 관여하기에 save 메소드를 수행시 persist 로 동작한다.
    • select 하지 않고 바로 insert 1번을 날린다

GenerationType.SEQUENCE

  • database 의 sequence 기능을 사용하는 기능
  • persist 를 호출하면 (spring data jpa 의 경우 save) sequence 를 가져온다.
  • 가져온 Sequence 를 id 에 할당하고 (영속성 상태), transaction 이 commit 될 때, insert 쿼리를 날린다.

GenerationType.Table

  • 키 생성 전용 테이블을 만들어서 시퀀스처럼 동작하게 하는 방식.
  • 모든 데이터베이스에서 사용할 수 있지만 문제점이 있다.
  • Sequence 나 Identity 방식은 하나의 Request 로 처리가 가능하지만 테이블 생성전략은 3개의 step이 필요하다
  • lock 을 잡고, seq 를 증가시키고 데이터베이스에 저장한다. (리소스 소모)
  • 그렇기에 운영할 때 잘 사용하지 않는다.

참조

  • https://yjh5369.tistory.com/entry/JPA%EC%97%90%EC%84%9C-insert-update-delete-%ED%95%A0-%EB%95%8C-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-select-%ED%95%98%EC%A7%80-%EC%95%8A%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
저작자표시 비영리 (새창열림)

'Spring > JPA' 카테고리의 다른 글

QueryDSL 설정 - SpringBoot 2.7.X & SpringBoot 3.x 버전  (0) 2023.01.18
Jpa Insert, update delete 시 select query를 통한 먼저 조회하지 않는 방법.md  (1) 2023.01.18
JPA Hibernate Id 생성 전략과 UUID 전략  (0) 2023.01.18
Jpa Hibernate Custom Id Generator  (1) 2023.01.18
Jpa ArrayType. PostgreSQL Array Type을 저장하는 방법 - Hibernate Types, List, Array  (0) 2023.01.05
    'Spring/JPA' 카테고리의 다른 글
    • QueryDSL 설정 - SpringBoot 2.7.X & SpringBoot 3.x 버전
    • Jpa Insert, update delete 시 select query를 통한 먼저 조회하지 않는 방법.md
    • JPA Hibernate Id 생성 전략과 UUID 전략
    • Jpa Hibernate Custom Id Generator
    ysk(0soo)
    ysk(0soo)
    백엔드 개발을 좋아합니다. java kotlin spring, infra 에 관심이 많습니다. email : kim206gh@naver.com github : https://github.com/devysk

    티스토리툴바