본문 바로가기

cs(with 매일메일)

[250929월] JPA에서 ID생성 전략에 대해 설명해주세요.

JPA에서 ID 생성에는 직접 할당자동 할당 방법을 사용할 수 있다.

 

직접 할당 : @Id 단일 사용하여 id값을 직접 할당한다.

자동 할당 : @Id + @GenerativeValue를 함께 사용하여 원하는 키 생성 전략을 선택할 수 있다. 

 

GenerationType(키 생성 전략 타입)

    1) AUTO

    2) IDENTITY

    3) SEQUENCE

    4) TABLE

 

IDENTITY 전략 : 기본 키 생성을 DB에 위임하는 전략

- 엔티티를 생성할 때 쓰기 지연이 적용되지 않는다.

 (JPA에서 엔티티를 영속하기 위해서는 식별자가 필요한데, 이 식별자가 DB에 저장되어야 할당되기 때문!)

- 즉, 엔티티를 생성할때 즉시 INSERT쿼리가 실행되어야 한다. 

- 이때 하이버네이트를 사용하는 경우, INSERT쿼리 결과를 다시 조회하지 않기 위해 내부적으로 statement.getGeneratedKey를 사용. 

- 배치 인서트가 불가함. 

 

SEQUENCE 전략 : 시퀀스 키 생성 전략을 지원하는 DB에서 사용 가능

- 데이터베이스 시퀀스란? 유일한 값을 자동으로 생성하게 하는 객체

- auto_increment와 달리, 초기 값과 한번에 증가할 크기를 설정할 수 있다. 

- 어떤 시퀀스를 사용할지는 @SequenceGenerator를 사용

- em.persist()를 호출 > DB 시퀀스 이용하여 식별자 조회 > 조회한 식별자를 엔티티에 할당 > 엔티티를 영속성 컨텍스트에 저장

- 트랜잭션을 커밋하여 플러시가 일어나면 엔티티를 저장한다는 점에서 IDENTITY전략과 차이가 있다.

 

TABLE 전략 : 키 생성 전용 테이블을 만들어 시퀀스를 흉내내는 전략

- 어떤 테이블을 사용할지는 @TableGenerator를 사용

- 값을 조회하면서 SELECT 쿼리를 사용하며 증가를 위해 UPDATE 쿼리를 사용

- SEQUENCE전략보다 DB와 한 번 더 통신한다는 점에서 성능이 안좋지만, 모든 DB에 적용할 수 있는 장점이 있다. 

 

AUTO 전략 : 데이터베이스 방언에 따라 위 세가지 전략 중 하나를 자동으로 선택하는 전략

- 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 장점이 있다.

 

=====

✨엔티티 : 데이터베이스의 테이블과 매핑되는 자바 객체. 

✨ 영속성 컨텍스트 : 엔티티를 임시로 보관하는 메모리 공간. DB와 어플리케이션 사이에서 엔티티를 관리하는 중간 저장소

✨ 영속(persist) : 엔티티가 영속성 컨텍스트에 저장되어 관리되는 상태. (= JPA의 관리대상이 되었다)

✨ 엔티티 생명주기

    - 비영속 : 새로 만든 객체로, 아직 JPA가 모름 

    - 영속 : 영속성 컨텍스트에 저장되어 JPA가 관리하는 상태

    - 준영속 : 한때 관리되었으나, 지금은 관리하지 않는 상태 

    - 삭제 : 삭제 예정인 상태

✨ EntityManager.persist() : 엔티티를 영속성 컨텍스트에 등록하는 메서드 

✨ 쓰기지연 : 데이터베이스에 바로 저장하지 않고 모아서 한 번에 처리하는 기능

    - em.persist()를 호출해도 즉시 INSERT쿼리가 날라가지 않음. 

    - 트랜잭션 커밋 시점에 한꺼번에 SQL을 날림. 

    - DB통신이 줄어들어 성능 향상 장점 있음. 

✨플러시(Flush) : 영속성 컨텍스트에 보관된 변경 내용을 실제 데이터베이스에 반영하는 작업. 보통 트랜잭션 커밋이 자동 발생