๊ธฐ๋ณธ ํค ํ ๋น ์ ๋ต
JPA๊ฐ ์ ๊ณตํ๋ DB ๊ธฐ๋ณธ ํค ํ ๋น ์ ๋ต์ ์ง์ ํ ๋น ๋ฐฉ์
, ์๋ ์์ฑ ๋ฐฉ์
๋ ๊ฐ์ง์ด๋ค.
์ด ์ค ์ง์ ํ ๋น ๋ฐฉ์
์ Application์์ ๊ธฐ๋ณธ ํค๋ฅผ ์ง์ ํ ๋นํ๋ ๋ฐฉ์์ด๋ค.
์๋ ์์ฑ ๋ฐฉ์
์ ๋๋ฆฌ ํค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก IDENTITY
, SEQUENCE
, TABLE
๋ค ๊ฐ์ง๊ฐ ์๋ค.
ํด๋น ๋ฐฉ์๋ค์ ์ฌ์ฉํ๋ DB์ ์์กดํ๋ค.MySQL
์ IDENTITY
์ฌ์ฉ, Oracle
์ SEQUENCE
์ฌ์ฉ
์ง์ ํ ๋น ๋ฐฉ์
์ง์ ํ ๋น ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ Entity๋ฅผ ์์ฑํ ๋ Key Column์ @Id
๋ง ์ฌ์ฉํด ์ฃผ์ด๋ ๋๋ค.
@Id
private long id;
@Id
๊ฐ ์ ์ฉ ๊ฐ๋ฅํ Java Type์ ์๋์ ๊ฐ๋ค.
- Java ๊ธฐ๋ณธํ(int, double, long ...)
- Java Wrapper ํ
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
ํด๋น ์ ๋ต์ em.persist()
๋ก Entity๋ฅผ ์ ์ฅ ํ๊ธฐ ์ ,
Application์์ ์ง์ ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํด์ฃผ์ด์ผ ํ๋ค.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA");
EntityManager em = emf.createEntityManager();
User user = new User();
user.setName("gillog");
user.setId(1);
em.persist(user);
์๋ ์์ฑ ๋ฐฉ์
์๋ ์์ฑ ๋ฐฉ์
์ ์ฌ์ฉํ ๊ฒฝ์ฐ @Id
์ @GeneratedValue
๋ฅผ ์ฌ์ฉํ๋ค.
IDENTITY
๊ธฐ๋ณธ ํค ์์ฑ์ DB์ ์์ํ๋ ์ ๋ต์ด๋ค.
MySQL
๊ณผ ๊ฐ์ด Sequence๋ฅผ ์ ๊ณตํ์ง ์๊ณ , AutoIncrement
๊ธฐ๋ฅ์ ์ ๊ณตํด,
๊ธฐ๋ณธ ํค ๊ฐ์ ์๋์ผ๋ก ์์ฑํ๋ DBMS์์ ์ฌ์ฉํ๋ค.
์ฃผ๋ก MySQL, PostgreSQL, SQL Server, DB2์์ ์ฌ์ฉํ๋ค.
์๋์ ๊ฐ์ด ์ฌ์ฉํ ์์๋ค.
@Id
@GeneratedValue=strategy = GenerationType.IDENTITY)
private long id;
IDENTITY
์ ๋ต์ Data๋ฅผ DB์ Insertํ ํ ๊ธฐ๋ณธ ํค ๊ฐ์ ์กฐํํ ์ ์๋ค.
Entity์ ์๋ณ์ ๊ฐ์ ํ ๋นํ๋ ค๋ฉด JPA๋ ์ถ๊ฐ๋ก DB๋ฅผ ์กฐํํด์ผ ํ๋๋ฐ,
Hibernate
๋ JDBC3
์ ์ถ๊ฐ๋ Statement.getGeneratedKeys()
๋ฅผ ์ฌ์ฉํด DB์ ํ๋ฒ๋ง ํต์ ํ๋ค.
ํด๋น ๋ฉ์๋๋ Data๋ฅผ ์ ์ฅํ๋ฉด์, ์์ฑ๋ ๊ธฐ๋ณธ ํค ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
ํ์ง๋ง Entity๊ฐ ์์ ์ํ๊ฐ ๋๋ ค๋ฉด ์๋ณ์๊ฐ ๋ฐ๋์ ํ์ํ๋ฐ,
DB์ ์ ์ฅํด์ผ๋ง ์๋ณ์๋ฅผ ๊ตฌํ ์ ์๋ ๋ฐฉ์์ด๋ฏ๋ก,
em.persist()
ํธ์ถ ์ฆ์ Insert Query๋ฅผ DB์ ์ ๋ฌํด ์๋ณ์๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก,
Transaction์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ ๋ฐฉ์์ด ๋์ํ์ง ์๋๋ค.
SEQUENCE
ํด๋น ๋ฐฉ์์ DB Sequence๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก,
Sequence ์ ๋ต์ ์ง์ํ๋ Oracle, PostgreSQL, DB2, H2 DB์์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์๋์ ๊ฐ์ด DB์์ Seqeunce๋ฅผ ์์ฑ ํ์ ์ฌ์ฉํ ์ ์๋ค.
CREATE SEQUENCE USER_SEQ START WITH 1 INCREMENT BY 1;
ํ์ Entity๋ฅผ ์์ฑํ ๋ @SequenceGenerator
Annotation์ ์ฌ์ฉํ๋ค.
@Entity
@SequenceGenerator(
name = "USER_SEQ_GENERATOR"
, sequenceName = "USER_SEQ"
, initialValue = 1
, allocationSize = 1
)
public class User {
@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE
, generator = "USER_SEQ_GENERATOR"
)
private long id;
}
@SequenceGenerator
Annotation์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ๋ค์ ์๋์ ๊ฐ๋ค.
์์ฑ | ์ค๋ช | ๊ธฐ๋ณธ ๊ฐ |
---|---|---|
name | ์๋ณ์ ์์ฑ๊ธฐ ์ด๋ฆ | ์์ ์ง์ ํ์. |
sequenceName | DB์ ๋ฑ๋ก๋์ด ์๋ Sequence์ด๋ฆ | hibernate_sequence |
initalValue(DDL) | DDL ์์ฑ์์๋ง ์ฌ์ฉ, Sequence DDL ์์ฑ์ ์ฒ์ ์์ value๋ฅผ ์ค์ | 1 |
allocationSize | Sequence ํ๋ฒ ํธ์ถ์ ์ฆ๊ฐํ๋ ์(์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ) | 50 |
catalog, schema | DB catalog, schema ์ด๋ฆ |
allocationSize์ ์ฑ๋ฅ ์ต์ ํ
allocationSize
๊ฐ ๊ธฐ๋ณธ๊ฐ์ด 50
์ด๋ฏ๋ก ํด๋น ์์ฑ์ 1
๋ก ์ค์ ํ์ง ์์ ์,
sequence ํธ์ถ ์๋ง๋ค 50์ฉ ์ฆ๊ฐํ๋ค.
๊ธฐ๋ณธ ๊ฐ์ด 50
์ธ ์ด์ ๋ JPA๊ฐ sequence์ ์ ๊ทผ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํจ์ด๋ค.
allocationSize
์ ์ค์ ๊ฐ ๋งํผ ํ ๋ฒ์ sequence๋ฅผ ์ฆ๊ฐ ์ํค๊ณ , ๊ทธ๋งํผ Memory
์ seqeunce ๊ฐ์ ํ ๋นํ๋ค.
๊ทธ ํ Memory
๋ฅผ ํ์ฉํด JVM
์์์ sequence๋ฅผ ํ ๋น ํ๋ค.
์ด ๋ฐฉ๋ฒ์ sequenc๋ฅผ ์ ์ ํ์ฌ ๋ค๋ฅธ ์ฌ๋ฌ JVM
์ด ๋์ ๋์ํด๋ ๊ธฐ๋ณธ ํค ๊ฐ์ด ์ถฉ๋ํ์ง ์๋ ์ฅ์ ์ด ์๋ค.
IDENTITY VS SEQUENCE
IDENTITY
์ ๋ต์ ๋จผ์ Entity๋ฅผ DB์ ์ ์ฅํ ํ์,
์๋ณ์๋ฅผ ์กฐํํด Entity์ ์๋ณ์๋ก ํ ๋นํ๋ ์ ๋ต์ด๋ค.
SEQUENCE
์ ๋ต์ em.persist()
ํธ์ถ ์ ์ ๋จผ์ DB Sequence๋ฅผ ๋จผ์ ์กฐํํ๋ค.
๊ทธ ํ ์กฐํํ ์๋ณ์๋ฅผ Entity์ ํ ๋นํ ํ Entity๋ฅผ ์์์ํ๋ก ์ ์ฅํ๋ค.
๊ทธ ํ Transaction
์ Commit
ํ์ฌ Flush
๊ฐ ๋ฐ์ํ ๋ ํด๋น Entity๋ฅผ DB์ ์ ์ฅํ๋ค.
TABLE
ํด๋น ์ ๋ต์ Key ์์ฑ Table์ ์ฌ์ฉํ๋ ์ ๋ต์ด๋ค.
Key ์์ฑ ์ ์ฉ Table์ ์์ฑํ๊ณ , name, value๋ก ์ฌ์ฉํ Column์ ์์ฑํ์ฌ
DB Sequence๋ฅผ ํ๋ด๋ด๋ ์ ๋ต์ด๋ค.
์๋์ ๊ฐ์ด Key ์์ฑ ์ ์ฉ Table์ ์์ฑํ ํ,
CREATE TABLE CUSTOM_SEQUENCE {
sequence_name varchar(255) not null
, next_val bigint
, primary key (sequence_name)
}
@TableGenerator
Annotation์ ์ฌ์ฉํด Entity๋ฅผ Mappingํ๋ค.
@Entity
@TableGenerator(
name = "USER_SEQ_GENERATOR"
, table = "CUSTOM_SEQUENCE"
, pkColumnValue = "USER_SEQ"
, allocationSize = 1
)
public class User {
@Id
@GeneratedValue(
strategy = GenerationType.TABLE
, generator = "USER_SEQ_GENERATOR"
)
private long id;
}
ํด๋น ์ ๋ต์ SEQUENCE
์ ๋ต๊ณผ ๋ด๋ถ ๋์ ๋ฐฉ์์ด ๊ฐ๋ค.
pkColumnValue
๋ก ์ค์ ํ USER_SEQ
๋ผ๋ SEQUENCE NAME์ CUSTOM_SEQUENCE
Table์ sequence_name
Column์ ์์ฑํ ํ,next_val
Column์ ๊ฐ์ด ์ฆ๊ฐํ๋ค.
๊ฐ์ด ์์ผ๋ฉด JPA๊ฐ Insertํ๋ฉด์ ์ด๊ธฐํํ๋ฏ๋ก ๋ฏธ๋ฆฌ ๊ฐ์ ๋ฃ์ด๋์ง ์์๋ ๋จ
@TableGenerator
์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ฑ๋ค์ ์๋์ ๊ฐ๋ค.
์์ฑ | ์ค๋ช | ๊ธฐ๋ณธ ๊ฐ |
---|---|---|
name | ์๋ณ์ ์์ฑ๊ธฐ ์ด๋ฆ | ์์ ์ง์ ํ์. |
table | ํค ์์ฑ ํ ์ด๋ธ ๋ช | hibernate_sequences |
pkColumnName | ์ํ์ค ์ปฌ๋ผ ๋ช | sequence_name |
valueColumnName | ์ํ์ค ๊ฐ ์ปฌ๋ผ ๋ช | next_val |
pkColumnValue | ํค๋ก ์ฌ์ฉํ ๊ฐ ์ด๋ฆ | Entity ์ด๋ฆ |
initialValue | ์ด๊ธฐ ๊ฐ, ๋ง์ง๋ง ์์ฑ๋ ๊ฐ์ด ๊ธฐ์ค | 0 |
allocationSzie | ์ํ์ค ํธ์ถ์ ์ฆ๊ฐ ๊ฐ(์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ) | 50 |
catalog, schema | DB catalog, schema ์ด๋ฆ | |
uniqueConstraints(DDL) | ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ |
TABLE
์ ๋ต์ ๊ฐ์ ์กฐํํ๋ฉด์ Select Query๋ฅผ, ๊ทธ ํ ๊ฐ ์ฆ๊ฐ๋ฅผ ์ํด Update Query๋ฅผ ์ฌ์ฉํ๋ค.
SEQUENCE
์ ๋ต๊ณผ ๋น๊ตํด DB์ ํ๋ฒ ๋ ํต์ ํ๋ ๋จ์ ์ด ์๊ณ ,
SEQUENCE
์ ๋ต์ ์ต์ ํ์ ๊ฐ์ด allocationSize
๋ฅผ ์ฌ์ฉํด ์ต์ ํ ํ๋ค.
AUTO
AUTO
์ ๋ต์ ์ ํํ DB ๋ฐฉ์ธ์ ๋ฐ๋ผ ์๋์ผ๋ก IDENTITY
, SEQUENCE
, TABLE
์ ๋ต์ ์๋์ผ๋ก ์ ํํ๋ค.
DB์ ์ข
๋ฅ๋ ๋ง๊ณ , ๊ธฐ๋ณธ ํค ์์ฑ ๋ฐฉ์๋ ๋ค์ํ๊ธฐ์
ํด๋น ์ ๋ต์ DB๋ฅผ ๋ณ๊ฒฝํด๋ Code ์์ ์ ํ์ง ์์๋ ๋๋ ์ฅ์ ๊ณผ,
Key ์์ฑ ์ ๋ต์ด ์ ํด์ง์ง ์์ ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋ ํ๋กํ ํ์ ๊ฐ๋ฐ ์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์์๋ค.
ํ์ง๋ง ๋ง์ฝ AUTO
๋ก SEQUENCE
๋ TABLE
์ ๋ต์ด ์ ํ ๋ ๊ฒฝ์ฐ,
Sequence๋ ํค ์์ฑ Table์ ๋ฏธ๋ฆฌ ์์ฑํด ๋์ด์ผ ํ๋ค.
๋ง์ฝ DDL ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค๋ฉด, Hibernate
๊ฐ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉํด ์์์ ์์ฑํด์ค๋ค.