๐งฉ JPA ์ํฐํฐ ๋งคํ๊ณผ ๊ธฐ๋ณธ ํค ์ ๋ต ์ ๋ฆฌ
์ ๋ฆฌ ๊ธฐ์ค: ใ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐใ ํ์ต ๋ด์ฉ ๊ธฐ๋ฐ
์์ฑ์: ๋ฐฑ์๋ ๊ฐ๋ฐ์์ฉ ์์ฝ ์ ๋ฆฌ
1๏ธโฃ ์ํฐํฐ ๋งคํ (Entity Mapping)
JPA์์ @Entity๋ ํด๋น ํด๋์ค๊ฐ JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ์์ ๋ช
์ํฉ๋๋ค.
DB ํ
์ด๋ธ๊ณผ ๋งคํํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ด๋
ธํ
์ด์
์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๋งคํ ์ด๋ ธํ ์ด์
| @Entity | ํด๋น ํด๋์ค๊ฐ ์ํฐํฐ์์ ์๋ฆผ |
| @Table(name = "ํ ์ด๋ธ๋ช ", uniqueConstraints = {...}) | ํ ์ด๋ธ ์ด๋ฆ ๋ฐ ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด ์ง์ |
| @Column | ์ผ๋ฐ ์ปฌ๋ผ ๋งคํ |
| @Enumerated | Enum ํ์ ๋งคํ |
| @Temporal | Date ํ์ ๋งคํ (์: @UpdateTimestamp๋ก ์๋ ์๊ฐ ์ค์ ๊ฐ๋ฅ) |
| @Lob | CLOB, BLOB ํ์ ๋งคํ |
@Entity
@Table(
name = "member",
uniqueConstraints = {
@UniqueConstraint(columnNames = "email", name = "UK_MEMBER_EMAIL")
}
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
}
2๏ธโฃ ๊ธฐ๋ณธ ํค ๋งคํ (Primary Key Mapping)
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๊ธฐ๋ณธํค ์์ฑ ๋ฐฉ์์ด ๋ค๋ฆ
๋๋ค.
์:
- Oracle → ์ํ์ค ๊ฐ์ฒด (SEQUENCE)
- MySQL → AUTO_INCREMENT
์ด๋ฅผ ํตํฉ์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํด JPA๋ ๋ค์ํ ํค ์์ฑ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
๐น ์ง์ ํ ๋น (Manual Assignment)
์ํฐํฐ๋ฅผ persist() ํ๊ธฐ ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง์ ๊ธฐ๋ณธํค๋ฅผ ์ง์ ํ๋ ๋ฐฉ์์ ๋๋ค.
๐น ์๋ ์์ฑ (Generated Value)
@Id์ @GeneratedValue๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํค๋ฅผ ์์ฑํฉ๋๋ค.
1. IDENTITY ์ ๋ต
- DB์ ์๋ ์ฆ๊ฐ ์ปฌ๋ผ์ ์์ (MySQL, PostgreSQL ๋ฑ)
- ์ฆ, insert ์์ ์ DB๊ฐ ID๋ฅผ ์์ฑํจ
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
2. SEQUENCE ์ ๋ต
- DB ์ํ์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํค ์์ฑ (Oracle, PostgreSQL ๋ฑ)
- ์ํ์ค ์ด๋ฆ์ ์ง์ ํ๋ ค๋ฉด @SequenceGenerator ์ฌ์ฉ
@SequenceGenerator(
name = "member_seq_gen",
sequenceName = "member_seq",
allocationSize = 1
)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_gen")
private Long id;
3. TABLE ์ ๋ต
- ๋ณ๋์ ํค ์์ฑ ํ ์ด๋ธ์ ์ด์ฉํด ์ํ์ค์ฒ๋ผ ๊ด๋ฆฌํ๋ ๋ฐฉ์
- DB ๋ ๋ฆฝ์ ์ผ๋ก ๋์ ๊ฐ๋ฅ
@TableGenerator(
name = "member_table_gen",
table = "sequence_table",
pkColumnValue = "member_seq",
allocationSize = 1
)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "member_table_gen")
private Long id;
4. AUTO ์ ๋ต
- **DB ๋ฐฉ์ธ(Dialect)**์ ๋ฐ๋ผ ์๋์ผ๋ก ์ ์ ํ ์ ๋ต ์ ํ
- DB ๋ฒค๋์ ์ข ์๋์ง ์์ ์ด์์ฑ์ด ๋์
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
โ๏ธ ์ฐธ๊ณ ์ค์
Hibernate 5 ์ด์์์๋ hibernate.id.new_generator_mappings=true์ค์ ์ persistence.xml์ด๋ application.yml์ ์ถ๊ฐํด์ผ
์๋ก์ด ํค ์์ฑ ์ ๋ต์ด ์ ์ฉ๋ฉ๋๋ค.
3๏ธโฃ ์๋ณ์(Primary Key) ์ ํ ์ ๋ต
โ ๊ธฐ๋ณธ ํค์ ํ์ ์กฐ๊ฑด
- NULL ๊ฐ์ ํ์ฉํ์ง ์์์ผ ํ๋ค.
- ์ ์ผํด์ผ ํ๋ค.
- ๋ณํ์ง ์์์ผ ํ๋ค.
๐ฟ ์์ฐ ํค(Natural Key) vs ๋๋ฆฌ ํค(Surrogate Key)
| ์์ฐ ํค | ๋น์ฆ๋์ค ์๋ฏธ๊ฐ ์๋ ๊ฐ | ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ, ์ด๋ฉ์ผ, ์ ํ๋ฒํธ | ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์์ |
| ๋๋ฆฌ ํค | ๋น์ฆ๋์ค์ ๋ฌด๊ดํ ์์ ๊ฐ | ์ํ์ค, UUID ๋ฑ | ๋ณ๊ฒฝ๋์ง ์์, ๊ด๋ฆฌ ์ฉ์ด |
๊ถ์ฅ: ๋น์ฆ๋์ค์ ๋ฌด๊ดํ ๋๋ฆฌ ํค(Surrogate Key) ์ฌ์ฉ
์ด์ : ๋น์ฆ๋์ค ๋ก์ง ๋ณํ๋ ์ ์ฑ ๋ณ๊ฒฝ์๋ ์ํฅ์ด ์ ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ ์ ๋ฆฌ
| ์ง์ ํ ๋น | @Id | ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง์ ์ค์ | ๋ชจ๋ DB |
| IDENTITY | @GeneratedValue(strategy = IDENTITY) | DB ์๋ ์ฆ๊ฐ ์ปฌ๋ผ ์ฌ์ฉ | MySQL, PostgreSQL |
| SEQUENCE | @GeneratedValue(strategy = SEQUENCE) | ์ํ์ค ๊ฐ์ฒด ์ด์ฉ | Oracle, PostgreSQL |
| TABLE | @GeneratedValue(strategy = TABLE) | ํค ์์ฑ์ฉ ํ ์ด๋ธ ์ฌ์ฉ | ๋ชจ๋ DB |
| AUTO | @GeneratedValue(strategy = AUTO) | ๋ฐฉ์ธ์ ๋ฐ๋ผ ์๋ ์ ํ | ๋ชจ๋ DB |
๐ ์์ฝ
- ์ํฐํฐ ๋งคํ: @Entity, @Table, @Column, @Enumerated ๋ฑ์ ํ์ฉ
- ๊ธฐ๋ณธํค ์์ฑ ์ ๋ต: IDENTITY, SEQUENCE, TABLE, AUTO
- ์ถ์ฒ ์ ๋ต: ๋น์ฆ๋์ค์ ๋ฌด๊ดํ ๋๋ฆฌ ํค ์ฌ์ฉ
- ์ค์ ํ: Hibernate์ new_generator_mappings ์์ฑ ํ์ฑํ ํ์
'Back-End > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| JPA ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ ์ค์ (0) | 2018.12.02 |
|---|---|
| ๊ฐ์ฒด ์ฐ๊ด๊ด๊ณ VS ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ (0) | 2018.12.01 |
| QueryDSL ๊ด๋ จ pom.xml ์ค๋ฅ (0) | 2018.11.26 |
| ์์์ฑ ์ปจํ ์คํธ (Persistence Context) ๋ (2) (0) | 2018.11.25 |
| ์์์ฑ ์ปจํ ์คํธ (Persistence Context) ๋ (1) (0) | 2018.11.25 |