๐ง @Id
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค(PK)์ ๊ฐ์ฒด์ ํ๋๋ฅผ ๋งคํ์์ผ์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
์ ์ฉ ๊ฐ๋ฅ ํ์
- ์๋ฐ ๊ธฐ๋ณธํ (int, long, ...)
- ์๋ฐ ๋ํผํ (Integer, Long, ...)
- String
- Date (java.util)
- Date (java.sql)
- BigDecimal
- BigInteger
@Id๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ํค๋ฅผ ์ง์ ํ ๋นํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๊ธฐ๋ณธ ํค๋ฅผ ์ง์ ํ ๋นํ๋ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ฑํด์ฃผ๋ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด @GeneratedValue๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๐ง @GeneratedValue
๊ธฐ๋ณธ ํค๋ฅผ ์๋ ์์ฑํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
์์ฑ์ผ๋ก๋ strategy๊ฐ ์๋๋ฐ, ์ด๋ฅผ ํตํด ์๋ ์์ฑ ์ ๋ต์ ์ง์ ํด ์ค ์ ์์ต๋๋ค.
์ด์ ๋ถํฐ ๊ฐ๊ฐ์ ์ ๋ต๋ค์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
โญ๏ธ IDENTITY
@GeneratedValue(strategy = GenerationType.IDENTITY)
IDENTITY ์ ๋ต์ ๊ธฐ๋ณธ ํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ ์ ๋ต์ ๋๋ค.
์ฃผ๋ก MySQL, PostgreSQL, SQL Server์์ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด MySQL์ AUTO_INCREMENT ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ธฐ๋ณธ ํค๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋๋ค.
IDENTITY ์ ๋ต์ AUTO_INCREMENT์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์ ์ฅํ๊ณ ๋์์ผ ๊ธฐ๋ณธ ํค ๊ฐ์ ๊ตฌํ ์ ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฃผ์์
์ํฐํฐ๊ฐ ์์ ์ํ๊ฐ ๋๊ธฐ ์ํด์๋ ์๋ณ์๊ฐ ํ์์ ๋๋ค.
๊ทธ๋ฐ๋ฐ IDENTITY ์ ๋ต์ ์ฌ์ฉํ๋ฉด ์๋ณ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ ํ๊ธฐ ์ ๊น์ง๋ ์ ์ ์๊ธฐ ๋๋ฌธ์, em.persist()๋ฅผ ํ๋ ์ฆ์ INSERT SQL์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ด ์ ๋ต์ ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ์ด ๋์ํ์ง ์์ต๋๋ค.
โญ๏ธ SEQUENCE
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ ์ ์ผํ ๊ฐ์ ์์๋๋ก ์์ฑํ๋ ํน๋ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ธ์ ํธ์ ๋๋ค.
SEQUENCE ์ ๋ต์ ์ด ์ํ์ค๋ฅผ ์ฌ์ฉํด์ ๊ธฐ๋ณธ ํค๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ ๋ต์ ์ํ์ค๋ฅผ ์ง์ํ๋ ์ค๋ผํด, PostgreSQL, H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ",
initialValue = 1,
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "BOARD_SEQ_GENERATOR")
@Column(name = "MEMBER_ID")
private Long id;
}
์ํ์ค ์ ๋ต์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ๋งคํํด์ผ ํฉ๋๋ค.
@SequenceGenerator๋ฅผ ์ฌ์ฉํ์ฌ ์ํ์ค ์์ฑ๊ธฐ๋ฅผ ๋ฑ๋กํ ํ, @GeneratedValue์ generator ์์ฑ์ผ๋ก ์ํ์ค ์์ฑ๊ธฐ๋ฅผ ์ ํํ์์ต๋๋ค.
@SequenceGenerator ์์ฑ
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
name | ์๋ณ์ ์์ฑ๊ธฐ ์ด๋ฆ | ํ์ |
sequenceName | ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก๋์ด ์๋ ์ํ์ค ์ด๋ฆ | hibernate_sequence |
initialValue | DDL ์์ฑ ์์๋ง ์ฌ์ฉ๋๋ค. ์ํ์ค DDL์ ์์ฑํ ๋ ์ฒ์ ์์ํ๋ ์๋ฅผ ์ง์ ํ๋ค. |
1 |
allocationSize | ์ํ์ค๋ฅผ ํ ๋ฒ ํธ์ถํ ๋ ์ฆ๊ฐํ๋ ์ (์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ๋๋ค.) | 50 |
catalog, schema | ์๋ณ์ ์์ฑ๊ธฐ์ catalog, schema ์ด๋ฆ |
โญ๏ธ IDENTITY์ SEQUENCE์ ์ฐจ์ด
๋ญ๊ฐ ๋ ์ ๋ต์ด ๋น์ทํด ๋ณด์ด์ง๋ง ์ฌ์ค ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์ํ์ค ์ ๋ต์ em.persist()๋ฅผ ํธ์ถํ ๋ ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ์ฌ์ฉํด์ ์๋ณ์๋ฅผ ์กฐํํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์กฐํํ ์๋ณ์๋ฅผ ์ํฐํฐ์ ํ ๋นํ ํ, ํด๋น ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํฉ๋๋ค.
์ดํ ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ ํ๋ฌ์๊ฐ ๋ฐ์ํ๋ฉด ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค.
IDENTITY ์ ๋ต์ ๋จผ์ ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ํ์ ์๋ณ์๋ฅผ ์กฐํํ์ฌ, ์ํฐํฐ์ ์๋ณ์์ ํ ๋นํ ํ, ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํฉ๋๋ค.
โญ๏ธ TABLE
TABLE ์ ๋ต์ ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ ์ด๋ฆ๊ณผ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ปฌ๋ผ์ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ํ๋ด๋ด๋ ์ ๋ต์ ๋๋ค.
์ด ์ ๋ต์ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ํ์ค๋ฅผ ์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@TableGenerator(
name = "BOARD_SEQ_GENERATOR",
table = "MY_SEQUENCE",
pkColumnValue = "BOARD_SEQ",
initialValue = 1,
allocationSize = 50
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
@Column(name = "MEMBER_ID")
private Long id;
}
์์ฑ๋๋ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
SEQUENCE ์ ๋ต๊ณผ ๋งค์ฐ ํก์ฌํ์ฌ, ์ํ์ค ๋์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ ์ด์ธ์๋ ๋ด๋ถ ๋์๋ฐฉ์์ด ๊ฐ์ต๋๋ค.
@TableGenerator ์์ฑ
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
name | ์๋ณ์ ์์ฑ๊ธฐ ์ด๋ฆ | ํ์ |
table | ํค์์ฑ ํ ์ด๋ธ๋ช | hibernate_sequences |
pkColumnName | ์ํ์ค ์ปฌ๋ผ๋ช | sequence_name |
valueColumnName | ์ํ์ค ๊ฐ ์ปฌ๋ผ๋ช | next_val |
pkColumnValue | ํค๋ก ์ฌ์ฉํ ๊ฐ ์ด๋ฆ | ์ํฐํฐ ์ด๋ฆ |
initialValue | ์ด๊ธฐ ๊ฐ. ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ๊ฐ์ด ๊ธฐ์ค์ด๋ค. | 0 |
allocationSize | ์ํ์ค๋ฅผ ํ ๋ฒ ํธ์ถํ ๋ ์ฆ๊ฐํ๋ ์ (์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ๋๋ค.) | 50 |
catalog, schema | ์๋ณ์ ์์ฑ๊ธฐ์ catalog, schema ์ด๋ฆ | |
uniqueConstraints (DDL) | ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค. |
โญ๏ธ SEQUENCE , TABLE ์ ๋ต์ ์ต์ ํ
์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์
https://ttl-blog.tistory.com/122
โญ๏ธ AUTO
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ข ๋ฅ๋ ๋ง๊ณ ๊ธฐ๋ณธ ํค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๋ ๋ค์ํฉ๋๋ค.
AUTO๋ก ์ค์ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ ๋ฐ๋ผ IDENTITY, SEQUENCE, TABLE ์ ๋ต ์ค ํ๋๋ฅผ ์๋์ผ๋ก ์ ํํฉ๋๋ค.
@GeneratedValue์ strategy์ ๊ธฐ๋ณธ๊ฐ์ AUTO์ ๋๋ค.
๋ง์ฝ AUTO๋ฅผ ์ฌ์ฉํ ๋ SEQUENCE๋ TABLE ์ ๋ต์ด ์ ํ๋๋ฉด, ์ํ์ค๋ ํค ์์ฑ์ฉ ํ ์ด๋ธ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ด์ผ ํฉ๋๋ค.
๋ง์ฝ ์คํค๋ง ์๋ ์์ฑ ๊ธฐ๋ฅ(ddl-auto)์ ์ฌ์ฉํ๋ค๋ฉด, ํ์ด๋ฒ๋ค์ดํธ๊ฐ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํด์ ์ ์ ํ๊ฒ ๋ง๋ค์ด์ค๋๋ค.
๐ Reference
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊น์ํ]
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] SEQUENCE (& TABLE) ์ ๋ต์์ ์ฒซ ํธ์ถ์ด 2๋ฒ ์ด๋ฃจ์ด์ง๋ ์ด์ (0) | 2021.12.14 |
---|---|
[JPA] ์๋ณ์(๊ธฐ๋ณธ ํค) ์ ํ ์ ๋ต (0) | 2021.12.14 |
[JPA] ๊ธฐ๋ณธ ํค ๋งคํ - SEQUENCE, TABLE ์ ๋ต์ ์ต์ ํ (0) | 2021.12.14 |
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @ElementCollection (๊ฐ ํ์ ์ปฌ๋ ์ ๋งคํ), @CollectionTable (0) | 2021.12.14 |
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Access (0) | 2021.12.14 |