1. JPA에서 ID 생성 전략
JPA에서는 엔티티의 기본 키(ID)를 생성하기 위한 여러 전략을 제공한다.
2. IDENTITY 전략
- IDENTITY 전략은 기본 키 생성을 데이터베이스에 위임한다.
- MySQL에서는 AUTO_INCREMENT와 같은 데이터베이스 자동 증가 컬럼을 사용한다.
- 엔티티가 영속화될 때 즉시 INSERT SQL이 실행되어 ID 값을 얻는다.
엔티티가 영속화될 때 즉시 INSERT SQL이 실행된다는 의미는 영속성 컨텍스트의 쓰기 지연이 적용되지 않는다는 것이다. 영속성 컨텍스트는 트랜잭션이 끝날 때 까지 실행될 SQL을 쓰기 지연 저장소에 모아두고, 커밋 시점에 데이터베이스로 모아둔 쿼리를 날린다. 하지만, IDENTITY 전략을 사용한 경우, 식별자가 데이터베이스에서 할당이 되기 때문에, 쓰기 지연 저장소를 거치지 않고, 곧장 INSERT문이 실행된다는 것이다.
3. SEQUENCE 전략
데이터베이스에서 시퀀스란, 유일한 값을 자동으로 생성하게 하는 객체이다. 초기 값과 자동으로 증가할 크기를 설정할 수 있다. 시퀀스 키 생성 전략을 지원하는 DB에서 사용할 수 있다.
- SEQUENCE 전략은 데이터베이스의 시퀀스를 사용하여 기본 키를 할당한다.
- 주로 Oracle과 같은 시퀀스를 지원하는 데이터베이스에서 사용된다.
- 어떤 시퀀스(이름, 증가값)를 사용할 것인지를 @SequenceGenerator로 설정할 수 있다.
- 시퀀스 값을 미리 가져와 메모리에서 식별자를 할당하므로 IDENTITY 전략보다 효율적일 수 있다.
SEQUENCE 전략은 entityManager.persist()를 호출하는 경우 먼저 데이터베이스 시퀀스를 이용하여 식별자를 조회한다. 조회한 식별자를 엔티티에 할당한 후에 INSERT문을 영속성 컨텍스트의 쓰기 지연 저장소에 저장해둔다. 커밋 시점에 데이터베이스로 쿼리를 날린다.
4. Table 전략
Table 전략은 키 생성 전용 테이블을 사용하여 기본 키를 할당한다.
- 모든 데이터베이스에서 사용 가능하다.
- 시퀀스를 흉내내는 테이블을 만들어 키를 생성한다.
- 어떤 테이블을 사용할 것인지를 @TableGenerator로 설정할 수 있다.
- 다른 전략들에 비해 성능이 떨어질 수 있다.
Table 전략은 키 생성 전용 테이블에 SELECT 쿼리를 사용해 값을 조회하고 증가를 위해 UPDATE 쿼리를 사용한다. 따라서, DB와 통신을 더 많이 해야하므로 성능상 안 좋다. 하지만, 모든 데이터베이스에서 사용 가능한 방법이라는 장점이 있다.
5. AUTO 전략
- AUTO 전략은 기본 전략이다.
- AUTO 전략은 데이터베이스에 따라 IDENTITY, SEQUENCE, TABLE 중 하나를 자동으로 선택한다.
- 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 장점이 있다.
6. UUID 전략
Hibernate 6부터 UUID 전략이 추가되었다.
- 128비트의 유일한 식별자를 생성한다.
- 분산 시스템에 유용하지만, 인덱스 성능에 영향을 줄 수 있다.
UUID는 중앙 조정 없이 각 노드에서 독립적으로 생성할 수 있기 때문에, 분산 시스템에서 ID 충돌 없이 확장성을 제공한다. 또한, UUID의 랜덤한 특성으로 인해 인덱스의 자료구조인 B+트리에서 재조정이 빈번하게 일어나게 되어 성능이 저하될 우려가 있다. 따라서, UUID를 키 생성 전략으로 사용할 경우, 분산 시스템에서의 이점과 성능상의 영향을 고려하여 선택해야 한다.
References
https://www.maeil-mail.kr/question/69
https://ttl-blog.tistory.com/123#%E2%AD%90%EF%B8%8F%20AUTO%C2%A0-1
https://www.youtube.com/watch?v=Xw9uTs72SVo
https://volkandogan.net/what-is-uuid-guid-advantages-and-disadvantages/
https://www.danielfullstack.com/article/stop-using-uuids-in-your-database
'백엔드 면접 질문' 카테고리의 다른 글
동일성과 동등성에 대해서 설명해주세요. (0) | 2024.12.17 |
---|---|
equals와 hashCode는 왜 함께 재정의 해야 하나요? (0) | 2024.12.16 |
얕은 복사와 깊은 복사에 대해서 설명해주세요. (0) | 2024.12.04 |
트랜잭션 격리수준은 무엇인가요? (0) | 2024.12.03 |
데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2024.12.02 |