ํฐ์คํ ๋ฆฌ ๋ทฐ
[SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 4 (์ํฐํฐ ๋งคํ)
chaewonni 2024. 4. 25. 18:49๐ก๊ฐ์ฒด์ ํ ์ด๋ธ ๋งคํ
๐ป @Entity
'@Entity' ์ ๋ ธํ ์ด์ ์ ํด๋์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํ๋ ์ํฐํฐ์์ ๋ํ๋ธ๋ค.
์ด ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด JPA๊ฐ ํด๋น ํด๋์ค๋ฅผ ์ํฐํฐ๋ก ๊ด๋ฆฌํ๋ค.
JPA๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ @Entity๊ฐ ํ์์ด๋ค.
์ฃผ์์ฌํญ
- ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์์ด๋ค. (public ๋๋ protected).
- final ํด๋์ค, enum, interface, inner ํด๋์ค์๋ ์ฌ์ฉํ ์ ์๋ค.
- final ํ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์ฑ: name
- JPA์์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์ ํ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- ๋ค๋ฅธ ํจํค์ง์ ๋์ผํ ์ด๋ฆ์ ์ํฐํฐ ํด๋์ค๊ฐ ์์ ๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- ๊ฐ์ ํด๋์ค ์ด๋ฆ์ด ์์ผ๋ฉด ๊ฐ๊ธ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ค.
@Entity(name = "myMember")
public class Member { ... }
๐ป @Table
'@Table' ์ ๋ ธํ ์ด์ ์ ์ํฐํฐ์ ๋งคํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ง์ ํ๋ค.
์๋ตํ๋ฉด ์ํฐํฐ ์ด๋ฆ์ ํ ์ด๋ธ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค.
์์ฑ
- name: ๋งคํํ ํ ์ด๋ธ์ ์ด๋ฆ์ ์ง์ ํ๋ค.
- catalog: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ catalog๋ฅผ ๋งคํํ๋ค.
- schema: ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ schema ๋งคํํ๋ค.
- uniqueConstraints: ํ ์ด๋ธ์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ๋ค. ์คํค๋ง ์๋ ์์ฑ ์์๋ง ์ ์ฉ๋๋ค.
@Entity
@Table(name = "t_member", uniqueConstraints = {@UniqueConstraint(columnNames = {"name"})})
public class Member { ... }
๐ป ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ
- ํ
์ด๋ธ ์ค์ฌ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก์ ์ ํ:
- ์ ํต์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์ ๊ทผ ๋ฐฉ์์ ํ ์ด๋ธ ์ค์ฌ์ด์์ผ๋, ORM์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ์ค์ฌ์ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์๊ฒ ๋์๋ค. ์ด๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์ฌ์ด์ ๊ฐ๊ทน์ ์ค์ฌ ์ค๋ค.
- DDL ์๋ ์์ฑ:
- ORM ํ๋ ์์ํฌ๋ ์ํฐํฐ ํด๋์ค์ ๊ทธ ๊ด๊ณ๋ค์ ๋ถ์ํ์ฌ ํ์ํ ํ ์ด๋ธ, ์นผ๋ผ, ์ ์ฝ์กฐ๊ฑด(์: ์ธ๋ ํค, ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด) ๋ฑ์ DDL์ ์๋์ผ๋ก ์์ฑํ๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ ๊ณ ๋ คํ์ฌ, Oracle, MySQL, PostgreSQL ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋ง๋ ์ฟผ๋ฆฌ ํ์์ผ๋ก ์ถ๋ ฅ๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ์์์ ์ฌ์ฉ:
- ์คํค๋ง ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฃผ๋ก ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ ์ฉํ๋ค. ๊ฐ๋ฐ์๋ ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ด ๋น ๋ฅด๊ฒ ๋ฐ์๋๋ DDL์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๋์ ์ ์ํ๊ฒ ํ ์คํธํ ์ ์๋ค.
- ์ด์ ํ๊ฒฝ์์์ ์ฌ์ฉ ์ ํ:
- ์ด์ ์๋ฒ์์๋ ์๋ ์์ฑ๋ DDL์ ์ง์ ์ฌ์ฉํ๋ ๊ฒ์ ํผํด์ผ ํ๋ค. ๋์ , ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ฑ๋ DDL์ ๊ธฐ๋ฐ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ, ๋ณด์ ๊ฐํ ๋ฐ ๊ธฐํ ํ์ํ ์์ ์ ๊ฑฐ์น ํ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.
์์ฑ
์คํค๋ง ์๋ ์์ฑ์ persistence.xml ๋๋ application.yml๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ํ์ผ์์ ๊ด๋ จ ์์ฑ์ ์ค์ ํ์ฌ ์ ์ดํ ์ ์๋ค.
<property name="hibernate.hbm2ddl.auto" value="create"/>
- create
๊ธฐ์กด ํ ์ด๋ธ์ ์ญ์ ํ ์๋ก ์์ฑํ๋ค. (DROP + CREATE) - create-drop
create์ ๊ฐ์ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฃ์์ ์ ์์ฑํ ํ ์ด๋ธ์ DROPํ๋ค. (DROP + CREATE + DROP) - update
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ์ํฐํฐ ๋งคํ์ ๋ณด๋ฅผ ๋น๊ตํด์ ๋ณ๊ฒฝ ์ฌํญ๋ง ์์ ํ๋ค.
(column ์ญ์ ๋ ๋ฐ์ํ์ง ์๋๋ค.) (์ด์ DB์๋ ์ฌ์ฉํ๋ฉด ์๋๋ค.) - validate
์ํฐํฐ์ ํ ์ด๋ธ์ด ์ ์ ๋งคํ๋์๋์ง๋ง ํ์ธํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ์ํฐํฐ ๋งคํ์ ๋ณด๋ฅผ ๋น๊ตํด์ ์ฐจ์ด๊ฐ ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธฐ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์๋๋ค. - none
์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋๋ค. (์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ๊ณผ ๋์ผ)
์ฃผ์์ฌํญ
- ์ด์ ์ฅ๋น์๋ ์ ๋ create, create-drop, update ์ฌ์ฉํ๋ฉด ์๋๋ค.
- ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ๋ create ๋๋ update
- ํ ์คํธ ์๋ฒ๋ update ๋๋ validate
- ์คํ ์ด์ง๊ณผ ์ด์ ์๋ฒ๋ validate ๋๋ none
๐ป DDL ์์ฑ ๊ธฐ๋ฅ
์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
- ์ํฐํฐ์ ํ๋์ ๋ค์ํ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํ์์ ์ด๋ฆ์ด ํ์์ด๋ฉฐ ์ต๋ 10์๋ฅผ ์ด๊ณผํ ์ ์๋๋ก ์ค์ ํ ์ ์๋ค.
@Column(nullable = false, length = 10)
private String name;
์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
- ํ ์ด๋ธ ์์ค์์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ๋ ๊ฐ ์ด์์ ์ปฌ๋ผ์ ์กฐํฉํ ๋ณตํฉ ์ ๋ํฌ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ ์ ์๋ค.
@Table(uniqueConstraints = {@UniqueConstraint(name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"})})
JPA ์คํ ๋ก์ง์ ์ํฅ ์์
- DDL ์์ฑ ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์ฑํ ๋๋ง ์ฌ์ฉ๋๋ฉฐ, JPA์ ์คํ ๋ก์ง์๋ ์ง์ ์ ์ธ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ๋ฐํ์์๋ ์ํฐํฐ ๊ด๋ฆฌ์ ์ฟผ๋ฆฌ ์คํ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ด ์ค์ฌ์ด ๋๋ฉฐ, DDL ์์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ ์ด๊ธฐ ์ค์ ๋จ๊ณ์์๋ง ๊ด๋ จ์ด ์๋ค.
๐กํ๋์ ์ปฌ๋ผ ๋งคํ
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member() {
}
}
๐ป ๋งคํ ์ด๋ ธํ ์ด์ ์ ๋ฆฌ

๐ป @Column
- name:
- ์ญํ : ํ๋์ ๋งคํํ ํ ์ด๋ธ์ ์ปฌ๋ผ ์ด๋ฆ์ ์ง์ ํ๋ค.
- ๊ธฐ๋ณธ๊ฐ: ๊ฐ์ฒด์ ํ๋ ์ด๋ฆ์ด ์ฌ์ฉ๋๋ค.
- insertable, updatable:
- ์ญํ : ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ ๋ ํด๋น ์ปฌ๋ผ์ด ํฌํจ๋ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. (๋ฑ๋ก, ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ฌ๋ถ)
- ๊ธฐ๋ณธ๊ฐ: 'true' (๋ฑ๋ก๊ณผ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค).
- nullable (DDL):
- ์ญํ : ์ปฌ๋ผ์ด null ๊ฐ์ ํ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค.
- ๊ธฐ๋ณธ๊ฐ: 'true' (null ํ์ฉ).
- 'false'๋ก ์ค์ ํ๋ฉด, DDL ์์ฑ ์ 'NOT NULL' ์ ์ฝ์กฐ๊ฑด์ด ์ ์ฉ๋๋ค.
- unique (DDL):
- ์ญํ : ๋จ์ผ ์ปฌ๋ผ์ ๋ํ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ค์ ํ๋ค.
- ์ฃผ์: ๋ณต์กํ ์ ๋ํฌ ์กฐ๊ฑด์ '@Table'์ 'uniqueConstraints'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์ด ์ต์ ์ ์ปฌ๋ผ์ด ์ ์ผํด์ผ ํจ์ ๋ํ๋ธ๋ค.
- columnDefinition (DDL):
- ์ญํ : ์ปฌ๋ผ์ ๋ํ SQL ์ ์๋ฅผ ์ง์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ๊ธฐ๋ณธ๊ฐ ์ค์ , ์ปฌ๋ผ ํ์ ์ง์ ๋ฑ์ด ๊ฐ๋ฅํ๋ค.
- ์์: 'columnDefinition = "varchar(100) default 'EMPTY'" ๋ ๊ธฐ๋ณธ๊ฐ์ 'EMPTY'๋ก ํ๋ varchar ์ปฌ๋ผ์ ์์ฑํ๋ค.
@Column(name = "name", columnDefinition = "varchar(100) default 'EMPTY'")
private String name;
6. length (DDL):
- ์ ์ฉ ๋์: 'String' ํ์ ์ ํ๋์ ์ฌ์ฉ๋๋ค.
- ์ญํ : ๋ฌธ์์ด ๊ธธ์ด ์ ์ฝ์กฐ๊ฑด์ ์ค์ ํ๋ค.
- ๊ธฐ๋ณธ๊ฐ: 255
7. precision, scale (DDL):
- ์ ์ฉ ๋์: ์ฃผ๋ก 'BigDecimal' (๋๋ 'BigInteger') ํ์ ์์ ์ฌ์ฉ๋๋ค.
- precision: ์์์ ์ ํฌํจํ ์ ์ฒด ์ซ์์ ์๋ฆฟ์๋ฅผ ์ ์ํ๋ค.
- scale: ์์์ ์ดํ์ ์๋ฆฟ์๋ฅผ ์ ์ํ๋ค.
- ์์: precision = 19, scale = 2๋ ์ต๋ 19์๋ฆฌ ์ซ์ ์ค ์์์ ์๋ 2์๋ฆฌ๊น์ง๋ฅผ ํ์ฉํ๋ ์ซ์ํ ํ๋๋ฅผ ์๋ฏธํ๋ค. ์ด ์ค์ ์ ์์ฃผ ํฐ ์๋ ์ ๋ฐํ ๊ณ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
๐ป @Enumerated
@Enumerated๋ ์๋ฐ enum ํ์ ์ ๋งคํํ ๋ ์ฌ์ฉ๋๋ค.
- EnumType.ORDINAL:
- enum ์์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค. (0,1,2 ....)
- enum ํญ๋ชฉ์ ์์น์ ๋ฐ๋ผ ์ ์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค.
- EnumType.STRING:
- enum์ ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค.
- enum ํญ๋ชฉ์ ์ด๋ฆ์ ๋ฌธ์์ด๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ฉฐ, enum ์ ์์ ๋ณ๊ฒฝ์ ๋ ์ ์ฐํ๋ค.
๊ทธ๋ ๋ค๋ฉด EnumType.STRING์ ๋นํด EnumType.ORDINAL์ด ๊ฐ์ง๋ ๋จ์ ์ ๋ฌด์์ผ๊น?
EnumType.ORDINAL ์ค์ ์ ์ด๊ฑฐํ์ ๊ฐ ์์๊ฐ ์ ์ธ๋ ์์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์๋ก ์ ์ฅ๋๋ค.
์๋ฅผ ๋ค์ด
public enum Status {
OPEN, REVIEW, CLOSED
}
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Id;
@Entity
public class Task {
@Id
private Long id;
@Enumerated(EnumType.ORDINAL)
private Status status;
}
์ด๋ ๊ฒ Enum ํ์ ๊ณผ ์ํฐํฐ๋ฅผ ์ ์ํ๋ค๋ฉด, 'OPEN'์ 0, 'REVIEW'๋ 1, 'CLOSED'๋ 2๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค.
๋จ์ 1. ์์ ์์กด์ฑ
์์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ค๊ฐ,
๋ง์ฝ Enum ์์์ ์์๋ฅผ OPEN, CLOSED, REVIEW ์์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋, OPEN๊ณผ REVIEW ์ฌ์ด์ ์๋ก์ด ์์ 'RESERVE'๊ฐ ์ถ๊ฐ๋๋ค๋ฉด ๊ธฐ์กด์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์๋ฏธ๊ฐ ์์ ํ ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
๋จ์ 2. ๊ฐ๋ ์ฑ ์ ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ์กฐํํ ๋ ์ ์ ๊ฐ๋ง ๋ณด๊ณ ๋ ์ด๋ค ์ํ๋ฅผ ์๋ฏธํ๋์ง ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
๐ป @Temporal
@Temporal ์ ๋ ธํ ์ด์ ์ ์๋ฐ์ java.util.Date์ java.util.Calendar ํ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ง ๋ฐ ์๊ฐ ํ์ ๊ณผ ๋งคํํ ๋ ์ฌ์ฉ๋๋ค. ์ต์ ๋ฒ์ ์ ํ์ด๋ฒ๋ค์ดํธ๋ LocalDate์ LocalDateTime์ ์๋์ผ๋ก ์ง์ํ๋ฏ๋ก, ์ด ๊ฒฝ์ฐ @Temporal ์ ๋ ธํ ์ด์ ์ ํ์ํ์ง ์๋ค.
- TemporalType.DATE:
- ์ค์ง ๋ ์ง๋ง์ ์ ์ฅํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ date ํ์ ๊ณผ ๋งคํ๋๋ฉฐ, ์๊ฐ ์ ๋ณด๋ ์ ์ฅ๋์ง ์๋๋ค. (์: 2013-10-11).
- TemporalType.TIME:
- ์ค์ง ์๊ฐ๋ง์ ์ ์ฅํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ time ํ์ ๊ณผ ๋งคํ๋๋ฉฐ, ๋ ์ง ์ ๋ณด๋ ์ ์ฅ๋์ง ์๋๋ค. (์: 11:11:11).
- TemporalType.TIMESTAMP:
- ๋ ์ง์ ์๊ฐ์ ๋ชจ๋ ์ ์ฅํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ timestamp ํ์ ๊ณผ ๋งคํ๋๋ฉฐ, ๋ ์ง์ ์๊ฐ ์ ๋ณด๊ฐ ๋ชจ๋ ์ ์ฅ๋๋ค. (์: 2013-10-11 11:11:11).
๐ป @Lob
@Lob ์ ๋ ธํ ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ BLOB (Binary Large OBject) ๋๋ CLOB (Character Large OBject) ํ์ ๊ณผ ๋งคํ๋ ๋ ์ฌ์ฉ๋๋ค. ์ด ์ ๋ ธํ ์ด์ ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ ํฉํ๋ฉฐ, ๋งคํํ ํ๋์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๋ผ ์๋์ผ๋ก CLOB ๋๋ BLOB์ผ๋ก ๋งคํ๋๋ค.
- ์์ฑ: @Lob์๋ ์ค์ ํ ์์ฑ์ด ์๋ค.
- CLOB ๋งคํ: ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค. String, char[], java.sql.CLOB ํ์ ์ ํ๋์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CLOB ํ์ ๊ณผ ๋งคํ๋๋ค.
- BLOB ๋งคํ: ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค. byte[], java.sql.BLOB ํ์ ์ ํ๋์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ BLOB ํ์ ๊ณผ ๋งคํ๋๋ค.
๐ป @Transient
@Transient ์ ๋ ธํ ์ด์ ์ ํน์ ํ๋๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํํ์ง ์์ ๋ ์ฌ์ฉ๋๋ค.
์ด ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ ํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ฑฐ๋ ์กฐํ๋์ง ์์ผ๋ฉฐ, ์ค์ง ๋ฉ๋ชจ๋ฆฌ ์์์๋ง ๊ฐ์ ์ ์งํ๋ค.
์ด๋ ์ฃผ๋ก ๊ณ์ฐ๋ ๊ฐ์ด๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์ํฐํฐ์ ์ผ๋ถ๋ก ์์ํํ ํ์๊ฐ ์๋ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํ๋ค.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name; // ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ํ๋
@Transient
private Integer temp; // ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋์ง ์์ ์์ ํ๋
// ์์ฑ์, ๊ฒํฐ, ์ธํฐ ๋ฑ ๊ธฐํ ๋ฉ์๋
}
- ํ๋ ๋งคํ ์ ์ธ: @Transient ์ ๋ ธํ ์ด์ ์ ์ ์ฉํ temp ํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ด๋ค ์ปฌ๋ผ๊ณผ๋ ๋งคํ๋์ง ์๋๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์กฐํ ์ ์ธ: ์ด ํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ฑฐ๋ ์กฐํ๋์ง ์์ผ๋ฉฐ, ์ค์ง Java ์ ํ๋ฆฌ์ผ์ด์ ๋ด์์๋ง ์ฌ์ฉ๋๋ค.
- ์ฉ๋: ์ด ํ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ค ์์๋ก ๊ณ์ฐ๋ ๊ฐ์ด๋ ์ํ ์ ๋ณด ๋ฑ์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ํฐํฐ์ ์์ํ ๊ณผ์ ์์ ์ ์ธ๋๋ค.
๐ก๊ธฐ๋ณธ ํค ๋งคํ
๊ธฐ๋ณธ ํค ๋งคํ์ ์ํฐํฐ์ ์๋ณ์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ณธ ํค(primary key)์ ๋งคํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค. JPA์์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ฃผ์ ์ ๋ ธํ ์ด์ ์ @Id์ @GeneratedValue์ด๋ค.
๐ป ์ง์ ํ ๋น: @Id ๋ง ์ฌ์ฉ
@Id๋ ์ํฐํฐ ํด๋์ค์ ํ๋๋ฅผ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ก ์ง์ ํ๋ค. ์ด ํ๋์ ๊ฐ์ ์ํฐํฐ์ ์๋ณ์ ์ญํ ์ ํ๋ฉฐ, ๊ฐ ์ํฐํฐ ์ธ์คํด์ค๋ฅผ ์ ์ผํ๊ฒ ๊ตฌ๋ถํ๋ค.
๐ป ์๋ ์์ฑ: @GeneratedValue ์ ๋ ธํ ์ด์
@GeneratedValue ์ ๋ ธํ ์ด์ ์ ๊ธฐ๋ณธ ํค์ ๊ฐ์ ์๋์ผ๋ก ์์ฑํ๊ธฐ ์ํ ์ ๋ต์ ์ง์ ํ๋ค. ์ด ์ ๋ ธํ ์ด์ ์ strategy ์์ฑ์ ํตํด ๋ค์ํ ํค ์์ฑ ์ ๋ต์ ์ง์ํ๋ค.
- IDENTITY: ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋์ผ๋ก ํค ๊ฐ์ ์์ฑํ๋๋ก ์์ํ๋ค. ์ด ์ ๋ต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ง์ํ๋ auto-increment ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
- SEQUENCE: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ ํค ๊ฐ์ ์์ฑํ๋ค. ์ด ์ ๋ต์ ์ํ์ค ์์ฑ๊ธฐ๋ฅผ ์ ์ํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ํ์ค์ ์ด๋ฆ, ์ด๊ธฐ๊ฐ, ์ฆ๊ฐ ํฌ๊ธฐ ๋ฑ์ ์ง์ ํ ์ ์๋ค.
- TABLE: ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ํค ๊ฐ์ ์์ฑํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํน์ ํ ์ด๋ธ์์ ํ์ํ ํค ๊ฐ์ ๊ด๋ฆฌํ๋ฉฐ, ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
- AUTO: ํ๋ซํผ(๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ)์ ๋ฐ๋ผ ์ต์ ์ ์ ๋ต(IDENTITY, SEQUENCE, TABLE)์ ์๋์ผ๋ก ์ ํํ๋ค.
๐ป IDENTITY
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
- ๊ธฐ๋ณธ ํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ค.
- ์ฃผ๋ก MySQL, PostgreSQL, SQL Server, DB2์์ ์ฌ์ฉํ๋ค. (์: MySQL์ AUTO_INCREMENT)
- JPA๋ ๋ณดํต ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ INSERT SQL์ ์คํํ๋๋ฐ, AUTO_INCREMENT๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ์คํํ ์ดํ์ ID๊ฐ์ ์ ์ ์๋ค.
- ๋ฐ๋ผ์ IDENTITY ์ ๋ต์ em.persis() ์์ ์ ์ฆ์ INSERT SQL์ ์คํํ๊ณ DB์์ ์๋ณ์๋ฅผ ์กฐํํ๋ค.
๐ป SEQUENCE
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1,
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ ์ ์ผํ ๊ฐ์ ์์๋๋ก ์์ฑํ๋ ํน๋ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ธ์ ํธ์ด๋ค.
- Oracle, PostgreSQL, DB2 ๋ฑ์์ ์ฌ์ฉ๋๋ค.
- 'allocationSize'๋ฅผ 1๋ก ์ค์ ํ๋ฉด, ์ํ์ค ๊ฐ์ด ํ๋์ฉ ์ฆ๊ฐํ๋ค.
@SequenceGenerator ์์ฑ
@SequenceGenerator๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณ์๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค.
- name: ์๋ณ์ ์์ฑ๊ธฐ์ ์ด๋ฆ์ ์ง์ ํ๋ค. ์ด ์ด๋ฆ์ @GeneratedValue์์ generator ์์ฑ์ผ๋ก ์ฐธ์กฐ๋๋ค.
- sequenceName: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก๋์ด ์๋ ์ค์ ์ํ์ค์ ์ด๋ฆ์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ hibernate_sequence์ด๋ค.
- initialValue: ์ํ์ค DDL์ ์์ฑํ ๋ ์ํ์ค์ ์์ ์ซ์๋ฅผ ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ 1์ ๋๋ค.
- allocationSize: ์ํ์ค๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ฆ๊ฐํ๋ ์๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ ์ต์ ํ์ ์ฌ์ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 50์ด์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ๊ฐ์ด ํ๋์ฉ ์ฆ๊ฐํ๋๋ก ์ค์ ๋์ด ์๋ค๋ฉด 1๋ก ์ค์ ํด์ผ ํ๋ค.
- catalog, schema: ์ํ์ค๊ฐ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์นดํ๋ก๊ทธ ๋๋ ์คํค๋ง๋ฅผ ์ง์ ํ ์ ์๋ค.
๐ป TABLE
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnName = "sequence_name",
valueColumnName = "next_val",
pkColumnValue = "MEMBER_SEQ",
allocationSize = 1
)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
- ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ํ๋ด๋ด๋ ์ ๋ต์ด๋ค.
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ๊ฐ๋ฅํ๋ค.
- ๋ค์ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
@TableGenerator ์์ฑ
@TableGenerator๋ ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์๋ณ์๋ฅผ ์์ฑํ๋ค.
- name: ์๋ณ์ ์์ฑ๊ธฐ์ ์ด๋ฆ์ ์ง์ ํ๋ค. ์ด ์ด๋ฆ์ @GeneratedValue์์ generator ์์ฑ์ผ๋ก ์ฐธ์กฐ๋๋ค.
- table: ํค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋ ํ ์ด๋ธ์ ์ด๋ฆ์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ hibernate_sequences์ด๋ค.
- pkColumnName: ํ ์ด๋ธ์์ ์๋ณ์ ์ด๋ฆ์ ์ ์ฅํ๋ ์ปฌ๋ผ์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ sequence_name์ด๋ค.
- valueColumnName: ์๋ณ์ ๊ฐ์ด ์ ์ฅ๋ ์ปฌ๋ผ์ ์ด๋ฆ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ next_val์ด๋ค.
- pkColumnValue: ํน์ ์ํฐํฐ์ ํค๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ์ ์ด๋ฆ์ด๋ค. ์ฃผ๋ก ์ํฐํฐ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
- initialValue: ์๋ณ์์ ์ด๊ธฐ ๊ฐ์ผ๋ก, ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ๊ฐ์ด ๊ธฐ์ค์ด ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ค.
- allocationSize: ํ ๋ฒ์ ํธ์ถ์ ์ฆ๊ฐํ๋ ์๋ณ์์ ์์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ 50์ด๋ค.
- catalog, schema: ํค ์์ฑ ํ ์ด๋ธ์ด ์์นํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์นดํ๋ก๊ทธ ๋๋ ์คํค๋ง๋ฅผ ์ง์ ํ ์ ์๋ค.
- uniqueConstraints: ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค.
๐ป ๊ถ์ฅํ๋ ์๋ณ์ ์ ๋ต
๊ธฐ๋ณธ ํค๋ฅผ ์ค๊ณํ ๋๋ ๋ช ๊ฐ์ง ์ค์ํ ์ ์ฝ ์กฐ๊ฑด์ ๊ณ ๋ คํด์ผ ํ๋ค.
- ํค๋ null์ด ์๋์ด์ผ ํ๋ฉฐ, ์ ์ผํด์ผ ํ๊ณ , ์๊ฐ์ด ์ง๋๋ ๋ณํ์ง ์์์ผ ํ๋ค.
- ๊ทธ๋ฌ๋ ์ด ์กฐ๊ฑด๋ค์ ๋ง์กฑํ๋ ์์ฐํค๋ฅผ ์ฐพ๊ธฐ๋ ์ข ์ข ์ด๋ ต๋ค. ์์ฐํค๋ ์ํฐํฐ์์ ์์ฐ์ค๋ฝ๊ฒ ์๋ณ์ ์ญํ ์ ํ ์ ์๋ ์์ฑ์ ์๋ฏธํ๋ค.
- ์๋ฅผ ๋ค์ด, ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ฐํค์ ํด๋นํ ์ ์์ผ๋, ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ ํค ๊ฐ์ ๋ณ๋ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ ๊ถ์ฅ๋์ง ์๋๋ค.
๋ฐ๋ผ์ !!!! ๋๋ฆฌํค(๋์ฒดํค)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋์ฒดํค ์ฌ์ฉ์ ์ฅ์ :
- ๋ณํ์ง ์์: ๋๋ฆฌํค๋ ์์ฑ๋ ํ์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ์ํฐํฐ์ ์๋ณ์๋ก์์ ์์ ์ฑ์ด ๋ณด์ฅ๋๋ค.
- ์ ์ผ์ฑ ๋ณด์ฅ: ์์คํ ์ด ๊ด๋ฆฌํ๋ ํค์ด๋ฏ๋ก ์ค๋ณต์ ์ฐ๋ ค๊ฐ ์๋ค.
- ๊ฐ์ธ์ ๋ณด ๋ณดํธ: ๋น์ฆ๋์ค์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ์๋๋ฏ๋ก ๊ฐ์ธ ์ ๋ณด ๋ณดํธ์ ๊ด๋ จ๋ ๋ฌธ์ ์์ ์์ ๋กญ๋ค.
ํค ์์ฑ ์ ๋ต:
- Longํ ID ์ฌ์ฉ: ์ผ๋ฐ์ ์ผ๋ก Long ํ์ ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฆฌํค๋ฅผ ๊ตฌํํ๋ค. ์ด๋ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ถฉ๋ถํ ํฐ ๋ฒ์๋ฅผ ์ ๊ณตํ์ฌ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
- ์๋ ํค ์์ฑ: @GeneratedValue ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ IDENTITY, SEQUENCE ๋๋ TABLE ์ ๋ต ์ค ํ๋๋ฅผ ์ ํํ์ฌ ํค๋ฅผ ์๋์ผ๋ก ์์ฑํ ์ ์๋ค. ๊ฐ ์ ๋ต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ฑ์ ๋ฐ๋ผ ์ ํ๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์คํ๋ง ํค์๋ ๋ชจ์ #4 (1) | 2024.05.07 |
|---|---|
| ์คํ๋ง ํค์๋ ๋ชจ์ #3 (0) | 2024.04.26 |
| [SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 3 (์์์ฑ ๊ด๋ฆฌ - ๋ด๋ถ ๋์ ๋ฐฉ์) (2) | 2024.04.25 |
| [SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 2 (JPA ์์ํ๊ธฐ) (1) | 2024.04.19 |
| [SPRING]์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ ์น์ 1 (JPA ์๊ฐ) #2 (0) | 2024.04.19 |
- Total
- Today
- Yesterday
- ์น MVC
- ์ธํ ๋ฆฌ์ ์ด
- ํ๋ก ํธ์๋
- ์ง์ฐ๋ก๋ฉ
- ๋ถ๋งํฌ
- ์คํ๋ง ์ปค๋ฎค๋ํฐ
- EnumType.ORDINAL
- DP
- ์คํ๋ง
- ์ค์์
- ๋น์์
- ์์
- ๋ฐฑ์ค ํ์ด์ฌ
- ์๋ฐ ์คํ๋ง
- ๋ก๊ทธ์์
- ์คํ๋ง ๋ถ๋งํฌ
- ํ์ํํด
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ
- ์ปค๋ฎค๋ํฐ
- ํ์ด์ฌ
- SQL ๋ ๋ฒจ์
- ๋ก๊น
- ๋ฐฑ์ค
- ์คํ๋ง๋ถํธ
- SQL
- elasticsearch
- ์๋ฐ
- ์นMVC
- JPA
- SQLD
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |