๐ JPA GenerationType ๋น๊ต
1. GenerationType.IDENTITY
- ํน์ง: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์กดํ์ฌ ๊ธฐ๋ณธ ํค๋ฅผ ์์ฑํฉ๋๋ค.
- ๋์ ๋ฐฉ์:
- PK๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์
AUTO_INCREMENT
๋๋IDENTITY
์ปฌ๋ผ์ผ๋ก ์์ฑ๋ฉ๋๋ค. em.persist()
ํธ์ถ ์ ์ฆ์ INSERT ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑํ ํค ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
- PK๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์
- ์ฅ์ : ์ค์ ์ด ๊ฐ๋จํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ID ์์ฑ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ํ์ฉ.
- ๋จ์ :
- PK๊ฐ INSERT ์ดํ์ ๊ฒฐ์ ๋๋ฏ๋ก, ๋ค๋ฅธ ์ํฐํฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋นํจ์จ์ .
- INSERT ์ง์ฐ์ด ๋ถ๊ฐ๋ฅ.
- ์ถ์ฒ ์ํฉ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ID ์์ฑ ์์์ด ํ์ํ ๋.
2. GenerationType.SEQUENCE
- ํน์ง: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ PK๋ฅผ ์์ฑ.
- ๋์ ๋ฐฉ์:
- JPA๊ฐ ์ํ์ค ๊ฐ์ฒด์์ ID๋ฅผ ๋จผ์ ๊ฐ์ ธ์ค๊ณ , ํด๋น ID๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ ๋ค
em.persist()
๋ฅผ ์ํ. - INSERT ์ฟผ๋ฆฌ๋
tx.commit()
์์ ์ ์คํ๋ฉ๋๋ค.
- JPA๊ฐ ์ํ์ค ๊ฐ์ฒด์์ ID๋ฅผ ๋จผ์ ๊ฐ์ ธ์ค๊ณ , ํด๋น ID๋ฅผ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ ๋ค
- ์ฅ์ :
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์์ ๊ณ ์ ID ์์ฑ ๊ฐ๋ฅ.
em.persist()
์์ ์ INSERT๋ฅผ ์ง์ฐํ ์ ์์ด ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ.
- ๋จ์ : ์ํ์ค๋ฅผ ์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ.
- ์ถ์ฒ ์ํฉ: ์ํ์ค๋ฅผ ์ง์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Oracle, PostgreSQL ๋ฑ)์์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋.
3. GenerationType.TABLE
- ํน์ง: ๋ณ๋์ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ID๋ฅผ ์์ฑ.
- ๋์ ๋ฐฉ์:
- JPA๋ ์ง์ ๋ ํ
์ด๋ธ(์:
sequence_table
)์์ ID๋ฅผ ๊ด๋ฆฌ. - ํ ์ด๋ธ์ ํ์ฌ ์ํ์ค ๊ฐ์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ก์ด ID๋ฅผ ์์ฑ.
- JPA๋ ์ง์ ๋ ํ
์ด๋ธ(์:
- ์ฅ์ : ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ID๋ฅผ ๊ด๋ฆฌ.
- ๋จ์ :
- ๋ณ๋์ ํ ์ด๋ธ ์กฐํ/๊ฐฑ์ ์์ ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ.
- ํธ๋์ญ์ ๊ฒฝํฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ.
- ์ถ์ฒ ์ํฉ: ์ํ์ค๋ฅผ ์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํด์ผ ํ ๋.
4. ๋น๊ต ํ
์ ๋ต | ID ์์ฑ ์ฃผ์ฒด | INSERT ์ง์ฐ | ํธํ์ฑ | ์ฑ๋ฅ | ์ถ์ฒ ์ํฉ |
---|---|---|---|---|---|
IDENTITY |
๋ฐ์ดํฐ๋ฒ ์ด์ค | ๋ถ๊ฐ๋ฅ | MySQL, SQL Server ๋ฑ | ์ค๊ฐ | ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ID ์์ฑ ์์ ํ์ํ ๋ |
SEQUENCE |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค | ๊ฐ๋ฅ | Oracle, PostgreSQL ๋ฑ | ์ฐ์ | ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ํ์ค ์ง์ DB ์ฌ์ฉ ์ |
TABLE |
๋ณ๋ ํ ์ด๋ธ | ๊ฐ๋ฅ | ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค | ๋ฎ์ | ์ํ์ค ๋ฏธ์ง์ DB, DB ๋ ๋ฆฝ์ ๊ด๋ฆฌ ํ์ ์ |
5. ์ฝ๋ ์์
1. IDENTITY
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
2. SEQUENCE
@Entity
@SequenceGenerator(name = "member_seq", sequenceName = "member_sequence", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq")
private Long id;
}
3. TABLE
@Entity
@TableGenerator(
name = "member_table_gen",
table = "sequence_table",
pkColumnName = "seq_name",
valueColumnName = "seq_value",
pkColumnValue = "member_seq",
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "member_table_gen")
private Long id;
}
๐ JPA ์์์ฑ ์ปจํ ์ด๋์ PK
์์์ฑ ์ปจํ ์ด๋(JPA์ ์์์ฑ ์ปจํ ์คํธ)๊ฐ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ์ํฐํฐ ํด๋์ค์ ์๋ณ์(PK)๊ฐ ๋ฐ๋์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ JPA์์ ์ํฐํฐ๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ๊ณ ์์์ฑ ์ปจํ ์คํธ ๋ด์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ์กฐ๊ฑด์ ๋๋ค.
@Id
์ @GeneratedValue(strategy = GenerationType.IDENTITY)
์ ๋ํ ๋์ ๋ฐฉ์
@GeneratedValue(strategy = GenerationType.IDENTITY)
๋ฅผ ์ฌ์ฉํ๋ฉด, ๊ธฐ๋ณธ ํค(PK)๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์ ๋์ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. em.persist()
ํธ์ถ ์์
- JPA๋ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ๋ฑ๋กํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ธฐ๋ณธ ํค ๊ฐ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
GenerationType.IDENTITY
์ ๋ต์์๋ ๊ธฐ๋ณธ ํค ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ฑ๋๊ธฐ ๋๋ฌธ์,em.persist()
๋ฅผ ํธ์ถํ๋ฉด ์ฆ์ INSERT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฐํฐ๋ฅผ ์ ์ฅํ๊ณ , ์์ฑ๋ ๊ธฐ๋ณธ ํค ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
2. tx.commit()
ํธ์ถ ์์
em.persist()
์์ ์ ์ด๋ฏธ INSERT ์ฟผ๋ฆฌ๊ฐ ์คํ๋์์ผ๋ฏ๋ก, ํธ๋์ญ์ ์ปค๋ฐ ์์ ์๋ ์ถ๊ฐ์ ์ธ INSERT ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ง ์์ต๋๋ค.- ๋จ,
em.persist()
์ดํ์ ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ(์: UPDATE, DELETE ๋ฑ)์tx.commit()
์์ ์ ํ๋ฌ์(Flush)๋๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋ฉ๋๋ค.
์ด์ : GenerationType.IDENTITY
์ PK ์์ฑ ํ์ด๋ฐ
GenerationType.IDENTITY
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ PK๋ฅผ ์์ฑํ๋ฏ๋ก, JPA๋ ์์์ฑ ์ปจํ
์คํธ์ ์ํฐํฐ๋ฅผ ๋ฑ๋กํ๊ธฐ ์ํด PK๋ฅผ ๋จผ์ ์์์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ em.persist()
์์ ์ INSERT ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ ๋ค๋ฅธ ID ์์ฑ ์ ๋ต(TABLE
, SEQUENCE
, AUTO
)๊ณผ ๋น๊ตํ์ ๋ ํฐ ์ฐจ์ด์ ์
๋๋ค:
- TABLE, SEQUENCE, AUTO:
- JPA๊ฐ ์์์ฑ ์ปจํ
์คํธ์ ์ํฐํฐ๋ฅผ ๋ฑ๋กํ๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ณ์(PK)๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ,
em.persist()
์์ ์ INSERT๋ฅผ ์ง์ฐ(Delay)ํ ์ ์์ต๋๋ค. - INSERT๋ ๋ณดํต
tx.commit()
์์ ์ ํ๋ฌ์๋ฉ๋๋ค.
- JPA๊ฐ ์์์ฑ ์ปจํ
์คํธ์ ์ํฐํฐ๋ฅผ ๋ฑ๋กํ๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ณ์(PK)๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ,
์์ฝ
- ์์์ฑ ์ปจํ ์คํธ์์ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด PK ๊ฐ์ด ๋ฐ๋์ ํ์ํฉ๋๋ค.
@GeneratedValue(strategy = GenerationType.IDENTITY)
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํด PK๊ฐ ์์ฑ๋๋ฏ๋ก,em.persist()
์์ ์ INSERT ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ PK๋ฅผ ๊ฐ์ ธ์ต๋๋ค.- ๋ค๋ฅธ ID ์์ฑ ์ ๋ต๊ณผ ๋ฌ๋ฆฌ,
GenerationType.IDENTITY
๋ INSERT ์ง์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ฆ์ ์คํ๋ฉ๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๋ฉด ๋ ์ ์ฐํ JPA ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค! ๐
'JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JPA ์ํฐํฐ ์๋ฐฉํฅ ๊ด๊ณ์์ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ด ํ์ํ ์ด์ (1) | 2024.12.09 |
---|---|
JPA ์ํฐํฐ์ ๊ฐ์ฒด์งํฅ์ ์ค๊ณ (0) | 2024.12.09 |
JPA EntityManagerFactory, EntityManager๋ ์ฌ์ฉ ํ ๊ผญ ๋ซ์์ผ ํ๋ค (3) | 2024.12.05 |
JPA ๊ตฌ๋๋ฐฉ์ (0) | 2024.12.05 |
hibernate entitymanager ์์กด์ฑ (0) | 2024.12.05 |
๋๊ธ