기본키(Primary Key)
- 데이터베이스에서 기본키(Primary Key)는 각 테이블의 행을 고유하게 식별하는 값이다.
- 기본키는 중복될 수 없으며, 한 테이블에서 단 하나만 존재해야 한다.
- JPA(Java Persistence API)에서 엔티티(Entity)의 데이터를 데이터베이스에 저장할 때도 기본키가 반드시 필요하다.
JPA에서 기본키를 생성하는 방법
JPA에서는 기본키를 자동으로 생성할 수 있도록 4가지 기본키 생성 전략을 제공한다.
- IDENTITY
- SEQUENCE
- TABLE
- AUTO
IDENTITY 전략
1. 특징
- 데이터베이스가 기본키 생성을 담당하는 방식이다.
- AUTO_INCREMENT 기능이 있는 MySQL, MariaDB 등에서 주로 사용된다.
- @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 사용한다.
- 영속성 컨텍스트에 저장되기 전에 데이터베이스에 INSERT를 실행해야 한다. → 추가 설명
2. 장점
- 별도의 키 생성 테이블을 만들 필요가 없다.
- 데이터베이스에서 자동 증가 값을 보장하므로 충돌이 발생하지 않는다.
3. 단점
- JPA의 1차 캐시 및 영속성 컨텍스트 기능을 제대로 활용하지 못할 수 있다. → 추가 설명
- persist() 메서드를 호출하는 즉시 INSERT 쿼리가 실행되므로, 트랜잭션 처리 시 비효율적일 수 있다. → 추가 설명
ex. IDENTITY 전략 적용 코드
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
SEQUENCE 전략
1. 특징
- 데이터베이스의 시퀀스(Sequence) 객체를 이용하여 기본키를 생성하는 방식이다. → 추가 설명
- @GeneratedValue(strategy = GenerationType.SEQUENCE) 어노테이션을 사용한다.
- Oracle, PostgreSQL, H2 등에서 지원된다.
- 별도의 시퀀스 객체를 생성해야 한다.
2. 장점
3. 단점
- 일부 데이터베이스(MySQL 등)에서는 지원되지 않는다.
ex. SEQUENCE 전략 적용 코드
@Entity
@SequenceGenerator(name = "user_seq_generator", sequenceName = "user_seq", allocationSize = 1)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq_generator")
private Long id;
private String name;
}
TABLE 전략
1. 특징
- 별도의 키 생성 테이블을 만들어 기본키를 관리하는 방식이다.
- @GeneratedValue(strategy = GenerationType.TABLE) 어노테이션을 사용한다.
- 데이터베이스에 의존하지 않고 JPA에서 키를 관리할 수 있다. → 추가 설명
2. 장점
- 모든 데이터베이스에서 동일하게 동작한다. → 추가 설명
- 기본키 관리 방법을 데이터베이스와 분리할 수 있다.
3. 단점
- 다른 전략에 비해 성능이 떨어질 수 있다. → 추가 설명
- 키 값을 저장하는 테이블을 별도로 생성해야 하므로, 추가적인 관리가 필요하다.
ex. TABLE 전략 적용 코드
@Entity
@TableGenerator(name = "user_table_generator", table = "id_table", pkColumnName = "pk_name", valueColumnName = "pk_value", allocationSize = 1)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
private Long id;
private String name;
}
AUTO 전략
1. 특징
- 기본키 생성 전략을 JPA 구현체가 자동으로 선택하도록 하는 방식이다.
- @GeneratedValue(strategy = GenerationType.AUTO) 어노테이션을 사용한다.
- 데이터베이스 종류에 따라 IDENTITY, SEQUENCE, TABLE 중 적절한 전략을 선택한다.
2. 장점
- 데이터베이스에 맞는 기본키 전략을 자동으로 선택할 수 있어 유연하다.
3. 단점
- 내부적으로 어떤 전략이 선택되는지 명확하지 않을 수 있다.
- 성능이 중요한 경우, 명확한 전략을 선택하는 것이 더 좋을 수도 있다.
ex. AUTO 전략 적용 코드
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
JPA 기본키 전략 선택 기준
전략 | 특징 | 주로 사용되는 데이터베이스 |
IDENTITY | DB가 자동으로 기본키를 생성 (AUTO_INCREMENT) | MySQL, MariaDB |
SEQUENCE | 별도의 시퀀스를 사용하여 기본키 생성 | Oracle, PostgreSQL |
TABLE | 키 값을 저장하는 별도 테이블을 생성 | 모든 DB에서 사용 가능 |
AUTO | JPA가 자동으로 적절한 전략을 선택 | DB에 따라 다름 |
요약
- JPA는 데이터베이스와 상관없이 기본키를 관리할 수 있도록 다양한 기본키 생성 전략을 제공한다.
- IDENTITY는 MySQL 등에서 사용되며, 데이터베이스의 자동 증가 기능을 이용한다.
- SEQUENCE는 Oracle, PostgreSQL에서 시퀀스를 활용하여 기본키를 생성한다.
- TABLE은 별도의 테이블을 만들어 기본키를 관리하지만, 성능이 낮아 잘 사용되지 않는다.
- AUTO는 JPA가 적절한 전략을 자동으로 선택하는 방식이다.
- 성능과 유지보수를 고려하여 IDENTITY 또는 SEQUENCE 전략을 주로 사용하는 것이 일반적이다.
출처
OpenAI의 ChatGPT (https://openai.com)
반응형
'DB > JPA' 카테고리의 다른 글
[JPA] ddl-auto를 썼는데 컬럼이 삭제되지 않는 이유 (1) | 2025.04.12 |
---|---|
[JPA] 더티 체킹 (Dirty Checking) (0) | 2025.03.13 |
[JPA] 기본키 생성 전략 (추가설명) (업데이트중...) (0) | 2025.03.12 |
[JPA] BaseEntity (0) | 2025.02.28 |
[JPA] Enity Annotation (1) | 2024.12.19 |