[JPA] 4.์ํฐํฐ ๋งตํ
1. ๊ฐ์ฒด์ ํ ์ด๋ธ ๋งตํ
์ํฐํฐ ๋งตํ ์๊ฐ
- ๊ฐ์ฒด์ ํ ์ด๋ธ ๋งตํ : @Entity, @Table
- ํ๋์ ์ปฌ๋ผ ๋งตํ : @Column
- ๊ธฐ๋ณธ ํค ๋งตํ : @Id
- ์ฐ๊ด๊ด๊ณ ๋งตํ : @ManyToOne, @JoinColumn
1) ๊ฐ์ฒด์ ํ ์ด๋ธ ๋งตํ
@Entity
- @Entitiy๊ฐ ๋ถ์ ํด๋์ค๊ฐ JPA๊ฐ ๊ด๋ฆฌ
- JPA๋ฅผ ์ฌ์ฉํด์ ํ ์ด๋ธ๊ณผ ๋งตํํ ํด๋์ค๋ @Entity ํ์
- ์ฃผ์)
> ๊ธฐ๋ณธ ์์ฑ์ ํ์(ํ๋ผ๋ฏธํฐ๊ฐ ์๋ public ๋๋ protected ์์ฑ์)
> final ํด๋์ค, enum, interface, inner ํด๋์ค ์ฌ์ฉ X
> ์ ์ฅํ ํ๋์ final ์ฌ์ฉ X
@Entity ์์ฑ ์ ๋ฆฌ
- ์์ฑ : name (@Entity="Person") // ๊ฑฐ์ ์์
> JPA์์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์
> ๊ธฐ๋ณธ๊ฐ : ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉ (ex: Member)
> ๊ฐ์ ํด๋์ค ์ด๋ฆ์ด ์์ผ๋ฉด ๊ฐ๊ธ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ
@Table // ex.INSERT ๋ฃ์๋ ํ ์ด๋ธ๋ช
- (@Table(name="MBR"))
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ
DB ์คํค๋ง ์๋ ์์ฑ
- DDL์ ์ ํ๋ฆฌ์ผ์ด์
๋ก๋ฉ ์์ ์ ์๋ ์์ฑ
- ํ
์ด๋ธ ์ค์ฌ -> ๊ฐ์ฒด ์ค์ฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ ํ์ฉํด์ DB์ ๋ง๋ ์ ์ ํ DDL ์์ฑ
- ์ด๋ ๊ฒ ์์ฑ๋ DDL์ ๊ฐ๋ฐ ์ฅ๋น์์๋ง ์ฌ์ฉ
- ์์ฑ๋ DDL์ ์ด์์๋ฒ์์๋ ์ฌ์ฉํ์ง ์๊ฑฐ๋, ์ ์ ํ ๋ค๋ฌ์ ํ ์ฌ์ฉ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ - ์์ฑ
hibernate.hbm2ddl.auto
์ฃผ์)
- ์ด์์ฅ๋น์๋ ์ ๋ create / create-drop / update ์ฌ์ฉํ๋ฉด ์๋จ!
- ๊ฐ๋ฐ ์ด๊ธฐ ๋จ๊ณ - create / update (๋ก์ปฌ, ๊ฐ๋ฐ์๋ฒ)
- ํ ์คํธ ์๋ฒ - validate
- ์คํ ์ด์ง๊ณผ ์ด์ ์๋ฒ - validate / none
3. ํ๋์ ์ปฌ๋ผ ๋งตํ
์๊ตฌ์ฌํญ ์ถ๊ฐ
- ํ์์ ์ผ๋ฐ ํ์๊ณผ ๊ด๋ฆฌ์๋ก ๊ตฌ๋ถ
- ํ์ ๊ฐ์ ์ผ๊ณผ ์์ ์ผ์ด ์์ด์ผํจ
- ํ์์ ์ค๋ช ํ ์ ์๋ ํ๋๊ฐ ์์ด์ผํจ / ์ด ํ๋๋ ๊ธธ์ด ์ ํ์ด ์์
@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;
}
๋งตํ ์ด๋ ธํ ์ด์ ์ ๋ฆฌ
@Column
- unique ์ ์์! (์ด๋ฆ ๋ฐ์์ด ์ด๋ ค์)
-> @Table์์ ๊ฑธ์ด์ค
@Enumerated
- ์๋ฐ enum ํ์ ๋งตํํ ๋ ์ฌ์ฉ
- ์ฃผ์! ORDINAL ์ฌ์ฉ X
- value
EnumType.ORDINAL: enum ์์๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ (X)
EnumType.STRING: enum ์ด๋ฆ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ (O)
- ๊ธฐ๋ณธ๊ฐ : EnumType.ORDINAL
@Temporal
- ๋ ์ง ํ์ (java.util.Date, java.util.Calendar)์ ๋งตํํ ๋ ์ฌ์ฉ
- ์ฐธ๊ณ ) LocalDate, LocalDateTime์ ์ฌ์ฉํ ๋ ์๋ต ๊ฐ๋ฅ (์ต์ hibernate ์ง์)
@Lob
- ๋ฐ์ดํฐ๋ฒ ์ด์ค BLOB, CLOB ๋งตํ
- @Lob์๋ ์ง์ ํ ์ ์๋ ์์ฑ์ด ์๋ค
- ๋งตํํ๋ ํ๋ ํ์ ์ด ๋ฌธ์๋ฉด CLOB ๋งตํ ๋๋จธ์ง๋ BLOB ๋งตํ
@Transient : ๋งตํํ๊ธฐ ์ซ์ผ๋ฉด
4. ๊ธฐ๋ณธ ํค ๋งตํ
๊ธฐ๋ณธ ํค ๋งตํ ์ด๋ ธํ ์ด์
์ง์ ํ ๋น : @Id๋ง ์ฌ์ฉ
์๋์์ฑ : @Id + @GeneratedValue
- IDENTITY : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์, MYSQL
- SEQUENCE : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ์ค๋ธ์ ํธ ์ฌ์ฉ, ORACLE / @SequenceGenerator ํ์
- TABLE : ํค ์์ฑ์ฉ ํ
์ด๋ธ ์ฌ์ฉ, ๋ชจ๋ DB์์ ์ฌ์ฉ / @TableGenrator ํ์
- AUTO : ๋ฐฉ์ธ์ ๋ฐ๋ผ ์๋ ์ง์ , ๊ธฐ๋ณธ๊ฐ
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenrationType.AUTO)
private String username;
@Column(name="name", nullable=false)
private String username;
public Member() {
}
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
}
[IDENTITY ์ ๋ต - ํน์ง]
- ๊ธฐ๋ณธ ํค ์์ฑ์ DB์ ์์
- ์ฃผ๋ก MySQL(AUTO_INCREMENT), PostgreSQL, SQL Server, DB2
- JPA๋ ๋ณดํต ํธ๋์ญ์ ์ปค๋ฐ ์์ ์ INSERT SQL ์คํ
- AUTO_INCREMENT๋ DB์ INSERT SQL์ ์คํํ ์ดํ์ ID ๊ฐ ์ ์ ์์
- IDENTITY์ ๋ต์ em.persist() ์์ ์ ์ฆ์ INSERT SQL ์คํํ๊ณ DB์์ ์๋ณ์๋ฅผ ์กฐํ
[SEQUENCE ์ ๋ต - ํน์ง]
- DB ์ํ์ค๋ ์ ์ผํ ๊ฐ์ ์์๋๋ก ์์ฑํ๋ ํน๋ณํ DB ์ค๋ธ์ ํธ (ex.์ค๋ผํด ์ํ์ค)
- ์ค๋ผํด, PostgreSQL, DB2, H2
- @SequenceGenerator ํ์
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //๋งคํํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ์ด๋ฆ
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
private Long id;
@SequenceGenerator
*์ฃผ์) allocationSize ๊ธฐ๋ณธ๊ฐ = 50
[TABLE ์ ๋ต]
- ํค ์์ฑ ์ ์ฉ ํ ์ด๋ธ์ ํ๋ ๋ง๋ค์ด์ DB ์ํ์ค๋ฅผ ํ๋ด๋ด๋ ์ ๋ต
์ฅ์ ) ๋ชจ๋ DB ์ ์ฉ๊ฐ๋ฅ
๋จ์ ) ์ฑ๋ฅ
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",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@TableGenrator - ์์ฑ
๊ถ์ฅํ๋ ์๋ณ์ ์ ๋ต
- ๊ธฐ๋ณธ ํค ์ ์ฝ ์กฐ๊ฑด : NOT NULL / ์ ์ผ / ๋ณํ๋ฉด ์๋จ
- ๋จผ๋ฏธ๋๊น์ง ๋ณํ๋ฉด ์๋จ / ๋ฌธ์ : ์ด๊ฑธ ๋ง์กฑํ๋ ์์ฐํค(์ฃผ๋ฏผ๋ฒํธ) ์ฐพ๊ธฐ ํ๋ฆ / ๋๋ฆฌํค(๋์ฒดํค)๋ฅผ ์ฌ์ฉ -> generate value
- ์๋ฅผ ๋ค์ด ์ฃผ๋ฏผ๋ฒํธ๋ ํค๋ก ์ ์ ํ์ง ์์
- ๊ถ์ฅ : Longํ + ๋์ฒดํค + ํค ์์ฑ์ ๋ต ์ฌ์ฉ
*์์ธ์ ์ผ๋ก IDENTITY์ ๋ต์ ๊ฒฝ์ฐ em.persist(member) ํธ์ถ์์ ์ DB INSERT ์ฟผ๋ฆฌ ๋ ๋ฆผ (db์ ๋ฃ์ด์ผ pk ์ ์ ์์ด์)
* allocationsize ๋ 50์ ๋ฏธ๋ฆฌ db์์ ๋ก๊ฒจ์ ๋ฉ๋ชจ๋ฆฌ์์ ํ ๋นํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ (์ซ์๋ฅผ ๋ฏธ๋ฆฌ ํ๋ณด, ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ๊ฐ๋ฅ)
5. ์ค์ ์์ - 1. ์๊ตฌ์ฌํญ ๋ถ์๊ณผ ๊ธฐ๋ณธ ๋งตํ
์๊ตฌ์ฌํญ ๋ถ์
- ํ์์ ์ํ ์ฃผ๋ฌธ ๊ฐ๋ฅ
- ์ฃผ๋ฌธ ์ ์ฌ๋ฌ ์ข ๋ฅ์ ์ํ ์ ํ ๊ฐ๋ฅ
๊ธฐ๋ฅ ๋ชฉ๋ก
๋๋ฉ์ธ ๋ชจ๋ธ ๋ถ์
- ํ์๊ณผ ์ฃผ๋ฌธ์ ๊ด๊ณ : ํ์์ ์ฌ๋ฌ ๋ฒ ์ฃผ๋ฌธ (์ผ๋๋ค)
- ์ฃผ๋ฌธ ์ํ(๋ค๋๋ค)
ํ ์ด๋ธ ์ค๊ณ
์ํฐํฐ ์ค๊ณ์ ๋งตํ
@Table์ index
@Column์ length
๊ฐ์ ์กฐ๊ฑด๋ค ๋ฃ์ด์ฃผ๋ ๊ฒ ์ข๋ค
๋ฐ์ดํฐ ์ค์ฌ ์ค๊ณ์ ๋ฌธ์ ์
- ํ์ฌ ๋ฐฉ์ -> ๊ฐ์ฒด ์ค๊ณ๋ฅผ ํ ์ด๋ธ ์ค๊ณ์ ๋ง์ถ ๋ฐฉ์
- ํ ์ด๋ธ ์ธ๋ํค๋ฅผ ๊ฐ์ฒด์ ๊ทธ๋๋ก ๊ฐ์ ธ์ด
- ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๋ถ๊ฐ๋ฅ
- ์ฐธ์กฐ๊ฐ ์์ผ๋ฏ๋ก UML๋ ์๋ชป๋จ
'๐จโ๐ป Web Development > JPA - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] 3.์์์ฑ ๊ด๋ฆฌ - ๋ด๋ถ ๋์ ๋ฐฉ์ (0) | 2023.03.09 |
---|---|
[JPA] 2.JPA ์์ํ๊ธฐ (0) | 2023.03.09 |
[JPA] 1.JPA ์๊ฐ (0) | 2023.03.08 |
์ต๊ทผ๋๊ธ