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) : 영속성 컨텍스트에 보관된 변경 내용을 실제 데이터베이스에 반영하는 작업. 보통 트랜잭션 커밋이 자동 발생
'cs(with 매일메일)' 카테고리의 다른 글
| [250922월] 일급 컬렉션(패턴)이 무엇인가요? (0) | 2025.09.29 |
|---|---|
| [250923화] 데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2025.09.29 |
| [250924수] 트랜잭션 격리수준은 무엇인가요? (0) | 2025.09.29 |
| [250925목] 얕은 복사와 깊은 복사에 대해서 설명해주세요. (0) | 2025.09.29 |
| [250926금] 로그와 메트릭을 설명해주세요. (0) | 2025.09.29 |