-
JPA에서 ID 생성 전략에 대해 설명하세요.매일메일 2025. 7. 9. 10:02728x90
JPA에서 ID를 생성하기 위해서는 직접 할당과 자동 할당을 사용할 수 있다.
직접할당 : 애플리케이션에서 기본 키 값을 직접 지정하는 방식
- @Id 어노테이션만 사용하여 기본 키 필드를 지정하고, 애플리케이션 내에서 생성자, Setter등을 통해서 값을 직접 할당한다.
- 사용자가 직접 ID 값을 관리하기 때문에, 중복이나 누락 등의 휴먼 에러가 발생할 가능성이 있다.
자동 생성 방식 : 데이터베이스의 기능이나 별도의 수단을 통해 기본 키를 자동으로 생성하게 하는 방식
- @Id 나 @GeneratedValue 어노테이션을 함께 사용하여 기본 키를 자동으로 생성하도록 설정한다.
- 자동 생성 방식에는 여러 전력이 있으며, 데이터베이스 종류에 따라 지원하는 방식이 다르다.
- IDENTITY : 데이터베이스의 AUTO_INCREMENT 와 같이 자동 증가 기능을 사용한다.
- 기본키 생성을 DB에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL server, DB2 등에서 사용된다. 해당 전략을 사용하면 엔티티를 생성할 때 쓰기 지연이 적용되지 않는다. 왜냐하면 JPA에서 엔티티를 영속하기 위해선 식별자가 필요한데, IDENTITY 전략에서는 이 식별자가 DB에 저장되어야 할당되기 때문이다. 따라서 이 엔티티를 생성할 때 즉지 INSERT 쿼리가 실행되어야 한다. 이때 하이버네이트를 사용하는 경우에는 INSERT 쿼리의 결과를 다시 조회하지 않기 위해 내부적으로 Statement.getGeneratedKeys를 사용한다. 추가로 IDENTITY 전략을 사용하면 배치 인서트가 불가하다는 점을 주의해야 한다.
- SEQUENCE : 데이터베이스 시퀀스를 사용하여 기본 키를 생성한다.
- 시퀀스 키 생성 전략을 지원하는 DB에서 사용할 수 있다. 데이터베이스 시퀀스란, 유일한 값을 자동으로 생성하는 객체이다. auto_increment와 달리 초기 값과 한번에 증가할 크기를 설정할 수 있다. 해당 시퀀스를 키 생성 전략으로 갖은 DB에 대해 SEQUENCE 전략을 사용할 수 있다. 어떤 시퀀스를 사용할 것인지를 @SequenceGenerator 로 설정할 수 있다. SEQUENCE 전략은 em.persist()를 호출하는 경우 먼저 데이터베이스 시퀀스를 이용하여 식별자를 조회한다. 이후 조회한 식별자를 엔티티레 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 트랜잭션을 커밋하여 플러시가 일어나면 엔티티를 저장한다는 점에서 IDENTITY 전략과 차이가 있다.
- TABLE : 별도의 테이블을 생성하여 기본 키의 다음 값을 관리한다.
- 키 생성 전용 테이블을 만드어 시퀀스를 흉내내는 전략이다. 어떤 테이블을 사용할 것인지를 @TableGenerator 로 설정할 수 있다. TABLE 전략은 값을 조회하면서 SELECT 쿼리를 사용하며 증가를 위해 UPDATE 쿼리를 사용한다. SEQUENCE 전략보다 DB와 한번 더 통신한다는 점에서 성능이 안좋다는 단점도 있지만, 모든 DB에 적용할 수 있다는 장점이 있다.
- AUTO : 각 데이터베이스에 맞는 기본 키 생성 전략을 선택하여 사용한다.
- 데이터베이스의 방언에 따라서 IDENTITY, SEQUENCE, TABLE 중 하나를 자동으로 선택한다. 데이터베이스를 변경해도 코드를 수정할 필요가 없다는 장점이 있다.
- IDENTITY : 데이터베이스의 AUTO_INCREMENT 와 같이 자동 증가 기능을 사용한다.
** 배치 인서트(Batch Insert) : 여러 개의 insert 쿼리를 한 번에 묶어서 DB에 보내는 것을 말한다.
'매일메일' 카테고리의 다른 글
[백엔드]로그와 메트릭은 모야? (0) 2025.07.02 [백엔드] 얕은 복사와 깊은 복사 (0) 2025.07.01 [백엔드]일급 컬렉션이 모지?? (0) 2025.06.30 [프론트엔드]인터넷 창에 www.google.com를 입력하면 무슨 일이 일어나는지?? (0) 2025.06.30 [백엔드] 자바에서 객체를 복사하는 방법에는 어떤 종류가 있는지?? (0) 2025.04.29