[One Day One Question]
JPA ID 생성 전략에 대해 설명해 주세요.
JPA에서 ID 생성 전략은 직접 할당 방식과 자동 생성 방식 두 가지로 나뉩니다. 각각의 방식은 기본 키를 어떻게 관리하고 생성할지 결정하며, 데이터베이스 설계 및 애플리케이션 요구사항에 따라 선택됩니다.
1. 직접 할당 방식 (Manual Assignment)
- 설명: 개발자가 직접 기본 키 값을 설정하여 관리하는 방식입니다. JPA는 엔티티를 저장하기 전에 기본 키 필드에 값이 설정되어 있어야 하며, 그렇지 않으면 오류가 발생합니다.
- 특징:
- 개발자가 값을 명시적으로 설정.
- 외부 시스템(예: REST API, 시퀀스 생성기 등)에서 기본 키를 생성할 수 있습니다.
- ID 생성 방식이 데이터베이스에 의존적이지 않음.
- 복합 키를 사용하는 경우 주로 직접 할당 방식을 사용.
@Entity
public class User {
@Id
private String id; // 기본 키를 직접 할당
private String name;
// 생성자나 서비스에서 기본 키를 수동으로 설정
public User(String id, String name) {
this.id = id;
this.name = name;
}
}
2. 자동 생성 방식 (Auto Generation)
- 설명: JPA와 데이터베이스가 협력하여 기본 키를 자동으로 생성하는 방식입니다. @GeneratedValue를 사용하여 자동 생성 방식을 지정할 수 있습니다.
- 특징:
- JPA가 기본 키 값을 자동으로 생성하므로 개발자는 기본 키를 관리하지 않아도 됩니다.
- 다양한 ID 생성 전략을 지원 (IDENTITY, SEQUENCE, TABLE, AUTO).
- 데이터베이스의 기본 키 생성 기능을 활용하거나 JPA가 직접 생성.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // 기본 키를 자동 생성
private Long id;
private String name;
}
1. IDENTITY
- 설명: 데이터베이스의 AUTO_INCREMENT 기능을 사용하여 기본 키 값을 생성합니다.
- 작동 방식:
- 엔티티를 저장할 때 INSERT 쿼리를 실행하고, 데이터베이스가 기본 키 값을 생성합니다.
- 기본 키 값은 INSERT가 완료된 후 반환됩니다.
- 특징:
- 데이터베이스에 의존적이며, MySQL, SQL Server 등에서 주로 사용.
- 즉시 INSERT 쿼리가 실행되어야 기본 키 값이 생성되므로, 배치 INSERT에서는 효율이 떨어질 수 있음.
- 시퀀스를 지원하지 않는 데이터베이스에 적합.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
2. SEQUENCE
- 설명: 데이터베이스의 시퀀스(Sequence) 객체를 사용하여 기본 키 값을 생성합니다.
- 작동 방식:
- JPA가 시퀀스에서 다음 값을 가져와서 기본 키로 사용합니다.
- @SequenceGenerator를 사용하여 시퀀스 이름 및 속성을 설정할 수 있습니다.
- 특징:
- 시퀀스를 지원하는 데이터베이스(예: Oracle, PostgreSQL)에서 사용 가능.
- 기본 키 값을 미리 가져오기 때문에 배치 처리에 적합.
- JPA는 기본적으로 hibernate_sequence라는 이름의 시퀀스를 사용.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
private Long id;
private String name;
}
3. TABLE
- 설명: 별도의 테이블을 생성하여 기본 키 값을 관리하는 방식입니다.
- 작동 방식:
- JPA는 별도의 테이블에 현재 기본 키 값을 저장하고, 다음 키 값을 생성할 때 해당 값을 증가시킵니다.
- @TableGenerator를 사용해 테이블 이름과 속성을 설정할 수 있습니다.
- 특징:
- 모든 데이터베이스에서 사용 가능.
- 성능은 다른 방식보다 낮을 수 있음(테이블에 대한 추가 조회 필요).
- 데이터베이스 독립성을 보장.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen")
@TableGenerator(
name = "table_gen",
table = "id_table",
pkColumnName = "entity_name",
valueColumnName = "next_id",
pkColumnValue = "user",
allocationSize = 1
)
private Long id;
private String name;
}
4. AUTO
- 설명: JPA가 사용하는 데이터베이스에 따라 적절한 ID 생성 전략을 자동으로 선택합니다.
- 작동 방식:
- 시퀀스를 지원하면 SEQUENCE 전략 사용.
- 시퀀스를 지원하지 않으면 IDENTITY 전략 사용.
- 데이터베이스 설정에 따라 유연하게 작동.
- 특징:
- 데이터베이스에 종속적이며, 개발자가 특정 전략을 지정하지 않을 때 유용.
- Hibernate는 데이터베이스가 시퀀스를 지원하지 않으면 기본적으로 IDENTITY를 선택.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
전략 | 특징 | 장점 | 단점 |
IDENTITY | AUTO_INCREMENT를 사용하여 DB가 키를 생성 | 설정이 간단, DB 기본 기능 활용 | 배치 처리 성능 낮음, DB 의존적 |
SEQUENCE | DB 시퀀스 객체를 사용하여 키 생성 | 배치 처리 성능 우수, 사전 키 생성 가능 | 시퀀스 지원 DB에서만 사용 가능 |
TABLE | 별도의 테이블에 키를 저장하고 관리 | DB 독립적 | 성능이 느림, 테이블 조회 추가 작업 필요 |
AUTO | DB에 따라 적절한 전략을 자동으로 선택 | 설정이 간단, 유연성 | 동작 방식이 DB에 따라 달라짐, 예측 어려움 |
'cs > ODOQ' 카테고리의 다른 글
[ODOQ] 운영체제(OS)란? (0) | 2024.12.18 |
---|---|
[ODOQ] 동기(Synchronous), 비동기(Asynchronous) (0) | 2024.12.17 |
[ODOQ] 동일성과 동등성 (0) | 2024.12.06 |
[ODOQ] 로그와 메트릭 (1) | 2024.12.03 |
[ODOQ] 얕은 복사 깊은 복사 (0) | 2024.12.02 |