728x90
📌 @GeneratedValue란?
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- @GeneratedValue는 기본 키(PK) 값을 자동으로 생성해주는 어노테이션이야.
- 주로 @Id와 함께 사용돼.
- DB마다 기본 키 생성 방식이 다르기 때문에, 전략(strategy) 을 지정할 수 있어.
🧩 사용 목적
우리가 엔티티를 저장할 때마다 id를 일일이 지정하지 않아도, JPA가 알아서 적절한 값을 생성해서 넣어줘. → Insert할 때 PK를 자동으로 생성해주는 것!
🏷️ 주요 전략 4가지 (strategy)
전략 이름 | 설명 | 사용되는 DB |
IDENTITY | DB의 auto_increment 사용 | MySQL, MariaDB |
SEQUENCE | DB의 sequence 객체 사용 | Oracle, PostgreSQL |
AUTO | JPA가 DB에 맞게 자동 선택 | 대부분의 경우 |
TABLE | 별도의 키 생성용 테이블 사용 | DB 독립적이지만 성능 저하 |
1️⃣ GenerationType.IDENTITY
- DB가 자동으로 숫자를 증가시켜 생성
- JPA가 insert 할 때 ID 값을 안 주고, insert 후 DB가 생성한 ID를 받아옴
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
✔ 주로 MySQL에서 사용
✔ DB에 AUTO_INCREMENT 기능이 있어야 함
2️⃣ GenerationType.SEQUENCE
- DB 시퀀스 객체를 이용해 ID를 미리 가져옴
- @SequenceGenerator 와 함께 사용됨
@SequenceGenerator(
name = "post_seq_generator",
sequenceName = "post_seq",
initialValue = 1, allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "post_seq_generator")
private Long id;
✔ Oracle, PostgreSQL 등에서 사용됨
3️⃣ GenerationType.AUTO
- JPA가 DB 방식을 알아서 감지하고 적절한 전략을 선택
- 개발 초기에는 편하지만, DB를 바꿨을 때 의도치 않게 전략이 바뀔 수도 있음
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
4️⃣ GenerationType.TABLE
- 키 값을 생성하는 전용 테이블을 만들어서 사용하는 방식
- 모든 DB에서 동작하지만 성능이 가장 느림
@TableGenerator(
name = "post_table_generator",
table = "id_generator",
pkColumnValue = "post_id",
allocationSize = 1
)
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "post_table_generator")
private Long id;
💡 정리하자면
전략 | 특징 | 장점 | 단점 |
IDENTITY | DB가 자동 증가 | 설정 간편 | Insert 후 ID를 알게 됨 |
SEQUENCE | DB 시퀀스 사용 | Insert 전에 ID 확보 | 일부 DB에서만 사용 가능 |
AUTO | JPA가 자동 선택 | 빠른 개발 가능 | 전략이 바뀔 수 있음 |
TABLE | 별도 테이블 이용 | DB 독립성 | 느림, 잘 안 씀 |
✅ 결론
- MySQL → GenerationType.IDENTITY
- Oracle / PostgreSQL → GenerationType.SEQUENCE
- 초기 개발 / 실습 → AUTO
728x90
'프로그래밍 > Spring' 카테고리의 다른 글
🌟 트랜잭션(Transaction) 이란? (0) | 2025.04.09 |
---|---|
JDBC를 이용한 간단한 CRUD 구현 (0) | 2025.04.08 |
🌙JPA 매핑 어노테이션 가이드 (0) | 2025.04.07 |
커밋, 롤백, 트랜잭션, flush()과 커밋의 차이점 (0) | 2025.04.07 |
변경 감지 (Dirty Checking)란? (0) | 2025.04.07 |