๐ค ์ํฐํฐ ๋งคํ?
๐ Entity
์ง์ญํ๋ฉด '์ค์ฒด', '๋ ๋ฆฝ์ฒด' ๋ผ๋ ๋ป์ผ๋ก ์ ๋ฌด์ ํ์ํ๊ณ ์ ์ฉํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ '์ด๋ค ๊ฒ(Thing)'์ด๋ผ๊ณ ๋งํ ์ ์๋ค. (DB์ ์ ์ฅ๋๊ฑฐ๋ ๊ฐ์ ธ์์ง๋ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ ๊ฒ ๊ฐ์ต๋๋ค. )
๐ Mapping
์ผ๋ฐ์ ์ธ ์๋ฏธ๋ก๋ ํ๋์ ์์๋ฅผ ๋ค๋ฅธ ์์์ ๋์์ํค๊ฑฐ๋ ์ฐ๊ฒฐํ๋ ํ๋ก์ธ์ค๋ฅผ ๋งํฉ๋๋ค.
๐
Entity(๊ฐ์ฒด)์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(ํ
์ด๋ธ, ์ปฌ๋ผ, ๊ด๊ณ ๋ฑ)๋ฅผ Mapping ์ฆ ์๋ก ๋์์์ผ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ผ๋ก ๋ณดํต ์ด๋
ธํ
์ด์
(Annotation)์ ์ฌ์ฉํ์ฌ ์ด๋ฃจ์ด์ง๋ฉฐ Mapping์ ํตํด JPA๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋ณํ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋ฉ๋๋ค.
โ Mapping
๊ตฌ๋ถ | Annotation |
๊ฐ์ฒด์ ํ ์ด๋ธ ๋งคํ | @Entity, @Table |
ํ๋์ ์ปฌ๋ผ ๋งคํ | @Column |
๊ธฐ๋ณธ ํค ๋งคํ | @Id |
๋ ์ง ํ์ ๋งคํ | @Temporal |
enum ํ์ ๋งคํ | @Enumerated |
BLOB, CLOB ๋งคํ | @Lob |
ํน์ ํ๋๋ฅผ ์ปฌ๋ผ์ ๋งคํํ์ง ์์ | @Transient |
@Entity
public class Member {
@Id
private Long id;
@Column(name="name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
private LocalDate test1
private LocalDateTime test2
@Lob
private String description;
@Transient
private int temp;
}โ
@Entity : JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ ํ์ ( ๊ธฐ๋ณธ ์์ฑ์ ํ์ )
@Table : ์ํฐํฐ์ ๋งคํํ ํ
์ด๋ธ ์ง์ name ์์ฑ์ ํตํด ๋งคํํ ํ
์ด๋ธ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ค.
@Column
์ต์ | ์ค๋ช |
name | ํ๋์ ๋งคํํ ํ ์ด๋ธ์ ์ปฌ๋ผ ์ด๋ฆ |
insertable, updateable | ๋ฑ๋ก, ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ |
nullable(DDL) | null๊ฐ์ ํ์ฉ ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค. false๋ก ์ค์ ํ๋ฉด DDL ์์ฑ ์์ not null ์ ์ฝ์กฐ๊ฑด์ด ๋ถ๋๋ค. |
nuique(DDL) | @Table์ uniqueConstraints์ ๊ฐ์ง๋ง ํ ์ปฌ๋ผ์ ๊ฐ๋จํ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ ๋ ์ฌ์ฉํ๋ค. |
columnDefinition(DDL) | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ ์ ๋ณด๋ฅผ ์ง์ ์ค ์ ์๋ค |
length(DDL) | ๋ฌธ์ ๊ธธ์ด ์ ์ฝ์กฐ๊ฑด, String ํ์ ์๋ง ์ฌ์ฉํ๋ค. |
precision, scale(DDL) | BigDecimal ํ์ ์์ ์ฌ์ฉํ๋ค(BigInteger๋ ์ฌ์ฉํ ์ ์๋ค) precision์ ์์์ ์ ํฌํจํ ์ ์ฒด ์๋ฆฌ์๋ฅผ, scale์ ์์์ ์๋ฆฟ์ (double, floatํ์ ์๋ ์ ์ฉ๋์ง ์๋๋ค. ์์ฃผ ํฐ ์ซ์๋ ์ ๋ฐํ ์์๋ฅผ ๋ค๋ฃจ์ด์ผ ํ ๋๋ง ์ฌ์ฉํ๋ค. |
@Enumerated : ์๋ฐ enumํ์ ์ ๋งคํํ ๋ ์ฌ์ฉ ( EnumType.STRING ์ฌ์ฉ! )
EnumType.ORDINAL - enum ์์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
EnumType.STRING - enum ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
@Temporal : LocalDate, LocalDateTime์ผ๋ก ๋์ ์ฌ์ฉ (์ต์ ํ์ด๋ฒ๋ค์ดํธ ์ง์)
@Lob : ์ง์ ํ ์ ์๋ ์์ฑ์ด ์๊ณ , ๋ฌธ์๋ฉด CLOB ๋๋จธ์ง๋ BLOB ๋งคํ
@Transient : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅx, ์กฐํx ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ์์์๋ง ์์๋ก ์ด๋ค ๊ฐ์ ๋ณด๊ดํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
โ ๊ธฐ๋ณธํค ๋งคํ
@Entity
@SequenceGenerator(
name = "MBR_SEQ_GENERATOR",
sequenceName = "MBR_SEQ", //๋งคํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ์ด๋ฆ
initialValue = 1, allocationSize = 1 )
public class Member {
@Id
//@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MBR_SEQ_GENERATOR")
private Long id;
@Column(name = "name", nullable = false)
private String username;
public Member() {
}
}
์ง์ ํ ๋น : @Id
์๋ ์์ฑ : @GeneratedValue
strategy | ์ค๋ช |
IDENTITY | ํ ์ดํฐ๋ฒ ์ด์ค์ ์์, MYSQL |
SEQUENCE | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ์ค๋ธ์ ํธ ์ฌ์ฉ, ORACLE ( @SequenceGeneratorํ์ ) |
TABLE | ํค ์์ฑ์ฉ ํ ์ด๋ธ ์ฌ์ฉ, ๋ชจ๋ DB์์ ์ฌ์ฉ ( @TableGeneratorํ์ ) |
AUTO | ๋ฐฉ์ธ์ ๋ฐ๋ผ ์๋ ์ง์ , ๊ธฐ๋ณธ๊ฐ |
๐
IDENTITY์ ๋ต์ id๊ฐ(PK)์ ์ธํ
ํ์ง ์๊ณ DB์ ๋ฃ์ด์ผํ๋ค ์ฆ null๋ก SQL์์ฒญ์ ํ๋ฉด DB์์ ๊ทธ๋ id๊ฐ์ ์ธํ
ํ๋ค
id๊ฐ์ ์๋ ค๋ฉด DB์ insert๋์ด์ง ํ์ ์ ์ ์๋ค.
ํ์ง๋ง JPA์ ์์์ฑ ์ปจํ
์คํธ์์ ๊ด๋ฆฌ๋๋ ค๋ฉด PK๊ฐ์ ์์์ผํ๋ค ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ธ์ ์ผ๋ก EntityManager.persist ํ๋ ์์ ์ ๋ฐ๋ก SQL๋ฌธ์ด ์์ฒญ๋์ด์ง๊ณ insert๋ id๊ฐ์ ์์์ฑ ์ปจํ
์คํธ์ ๋ฐ๋ก ์ ์ฅํ๊ฒ๋๋ค.
SEQUENCE์ ๋ต ํน์ง
sequence๋ IDENTITY์ ๋ต๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ฑ ์ปจํ
์คํธ์์ ๊ด๋ฆฌํ id๊ฐ์ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ persistํ๋ ์์ ์ ์ํ์ค์ ๊ฐ์ ๋ถ๋ฌ์(call) ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ฒ ๋๋ค.
๐ก ๊ทธ๋ ๋ค๋ฉด insert์ฟผ๋ฆฌ๋ฅผ ํ๋ฒ ๋ณด๋ผ์ผ์ id๊ฐ์ ๋ฐ์์ค๋ ์์ฒญ, insertํ๋ ์์ฒญ ์ด๋ ๊ฒ 2๋ฒ์ ์์ฒญ์ ํ๊ฒ๋๋๋ฐ ๋คํธ์ํฌ๋ฅผ ์๋ค ๊ฐ๋ค ํ๋ ๋น์ฉ์ด ์ฑ๋ฅ์ ์ข์ง ์๋ค ๋ผ๋ ์๊ฐ์ ํ ์ ์๋ค.
@Entity
@SequenceGenerator(
name = "MBR_SEQ_GENERATOR",
sequenceName = "MBR_SEQ",
initialValue = 1, allocationSize = 50 ) //allocationSize default = 50
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MBR_SEQ_GENERATOR")
private Long id;
}
์ด๋ฐ ์ฑ๋ฅ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด allocationSize์์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
allocationSize๋ ํ๋ฒ ํธ์ถํ ๋ ์ฆ๊ฐํ๋ ๊ฐ์ผ๋ก ( default 50 )
์ฒ์ ํธ์ถํ ๋ 50๋งํผ DB๋ฅผ ์ฆ๊ฐ์์ผ๋๊ณ 50์ ๋ฐ์์ ๋ฉ๋ชจ๋ฆฌ ์์์๋ 1์ฉ ์ฌ์ฉํ๋ ์ ๋ต์ด๋ค.
์ด๋ ๊ฒ๋๋ฉด ์ํ์ค๊ฐ 50์ ์ด๊ณผํ๊ธฐ ์ ๊น์ง๋ DB์ next val ์์ฒญ์ ๋ณด๋ด์ง ์๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ
์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ์์ ์ DBํ ์ด๋ธ์ ์์ฑ(DDL)ํ๋ ๊ธฐ๋ฅ( ๋ก์ปฌ์ด๋ ํ ์คํธ์๋ง ์ฌ์ฉ๊ถ์ฅ )
<property name="hibernate.hbm2ddl.auto" value="create" />
์ต์ | ์ค๋ช |
create | ๊ธฐ์กดํ ์ด๋ธ ์ญ์ ํ ๋ค์ ์์ฑ (DROP+CREATE) |
create-drop | create์ ๊ฐ์ผ๋ ์ข ๋ฃ์์ ์ ํ ์ด๋ธ DROP |
update | ๋ณ๊ฒฝ๋ถ๋ง ๋ฐ์ ALTER |
validate | ์ํฐํฐ์ ํ ์ด๋ธ์ด ์ ์ ๋งคํ๋์๋์ง๋ง ํ์ธ |
none | ์ฌ์ฉํ์ง ์์ |
๐ ์ฐธ๊ณ ๋ฐ ์๋ฃ ์ถ์ฒ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (๊น์ํ)