@Entity
JPA์์ ์ํฐํฐ๋ ์ฝ๊ฒ ์๊ฐํ๋ฉด, DB ํ ์ด๋ธ์ ๋์ํ๋ ํ๋์ ํด๋์ค๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
@Entity๊ฐ ๋ถ์ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํด์ฃผ๋ฉฐ, JPA๋ฅผ ์ฌ์ฉํด์ DB ํ ์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ @Entity๋ฅผ ๊ผญ ๋ถ์ฌ์ผ๋ง ๋งคํ์ด ๊ฐ๋ฅํฉ๋๋ค.
@Entity๋ฅผ ์ฌ์ฉํ ๋๋ ๋ช๊ฐ์ง ์ฃผ์์ฌํญ์ด ์์ต๋๋ค.
์ฃผ์์ฌํญ
- ์ ๊ทผ ์ ์ด์๊ฐ public ํน์ protected ์ธ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํ์์
๋๋ค.
- ๊ตฌํ์ฒด์ ๋ฐ๋ผ ๋๋ ๊ฒ๋ ์์ผ๋, ์คํ์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํด๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
- final ํด๋์ค, enum, interface, inner ํด๋์ค์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค
- ์ ์ฅํ๋ ค๋ ์์ฑ์ final์ด๋ฉด ์๋ฉ๋๋ค.
- ๊ตฌํ์ฒด์ ๋ฐ๋ผ ๋๋ ๊ฒ๋ ์์ผ๋, ์คํ์ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ํด๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ฑ
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
name | JPA์์ ์ฌ์ฉํ ์ํฐํฐ์ ์ด๋ฆ์ ์ง์ ํ๋ค. ๋ณดํต์ ๊ธฐ๋ณธ๊ฐ์ธ ํด๋์ค ์ด๋ฆ์ ์ฌ์ฉํ์ง๋ง, ๋ค๋ฅธ ํจํค์ง์ ์ด๋ฆ์ด ๊ฐ์ ์ํฐํฐ ํด๋์ค๊ฐ ์๋ค๋ฉด ์ด๋ฆ์ ์ง์ ํด์ ์ถฉ๋ํ์ง ์๋๋ก ํด์ผํ๋ค. | ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉ(์ : Member) |
@Entity(name = "Member")
๊ฐ์ ํด๋์ค ์ด๋ฆ์ด ์์ผ๋ฉด ๊ฐ๊ธ์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค.
์ํฐํฐ์ ์ด๋ฆ์ ์ธ์ ์ฌ์ฉํ๋?
JPA๋ JPQL์ด๋ผ๋ SQL์ ์ถ์ํํ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค.
JPQL์ ํ ์ด๋ธ์ด ์๋ ์ํฐํฐ๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ํํ๋๋ฐ, ์ด๋ ์ด ์ฟผ๋ฆฌ์ ์ํฐํฐ์ ์ด๋ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค.
์์๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
select m from Member m where m.age > 18
์ฌ๊ธฐ์ Member๊ฐ ์ํฐํฐ์ ์ด๋ฆ์ ๋๋ค.
๋ง์ฝ Member ํด๋์ค๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์๋ค๋ฉด
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity(name = "ShinDongHun")
@Setter
@Getter
public class Member{
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String username;
private int age;
}
JPQL์ ๋ค์๊ณผ ๊ฐ์ด ์ฐ์ฌ์ง๋๋ค.
select m from ShinDongHun m where m.age > 18
@Table
์ํฐํฐ์ ๋งคํํ ํ ์ด๋ธ์ ์ง์ ํฉ๋๋ค.
์์ฑ
์์ฑ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ |
name | ๋งคํํ ํ ์ด๋ธ ์ด๋ฆ์ ์ง์ ํ๋ค. | ์ํฐํฐ ์ด๋ฆ์ ์ฌ์ฉํ๋ค. |
catalog | catelog ๊ธฐ๋ฅ์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ catalog๋ฅผ ๋งคํํ๋ค. | |
schema | schema ๊ธฐ๋ฅ์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ schema๋ฅผ ๋งคํํ๋ค | |
uniqueConstraints (DDL) | DDL ์์ฑ ์์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ๋ง๋ ๋ค. ์คํค๋ง ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ DDL์ ๋ง๋ค ๋๋ง ์ฌ์ฉ๋๋ค. | |
indexes | ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ ๊ฒ ๊ฐ๋ค. ์ธ๋ฑ์ค ํ ์ด๋ธ์ ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ผ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ๋ค. (Optional) Indexes for the table. These are only used if table generation is in effect. Note that it is not necessary to specify an index for a primary key, as the primary key index will be created automatically. |
์์
name
@Table(name = "MEMBER_TABLE")
uniqueConstrains - ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด ์ค์
uniqueConstraints={
@UniqueConstraint(
name = "unique ์ ์ฝ์กฐ๊ฑด ์ด๋ฆ",
columnNames = {
"ํฌํจํ ์ปฌ๋ผ์ด๋ฆ 1",
"ํฌํจํ ์ปฌ๋ผ์ด๋ฆ 2"
}
),
...
}
columnNames๋ ํ๋๊ฐ ์๋ ์ปฌ๋ผ๋ช ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
@Table(
uniqueConstraints={
@UniqueConstraint( columnNames={"column1"})
}
)
@Table(
uniqueConstraints = {
@UniqueConstraint(name = "UniqueNumberAndStatus", columnNames = {"personNumber", "isActive"}),
@UniqueConstraint(name = "UniqueSecurityAndDepartment", columnNames = {"securityNumber", "departmentCode"})
}
)
์ฐธ๊ณ : uniqueConstrains ์ ๋ํด์
@Table์ uniqueConstrains์ ๋๋ถ์ด, @Column์ unique, length ๋ฑ์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํด์ฃผ๋ ์์ฑ๋ค์ด ์์ต๋๋ค.
ํด๋น ์์ฑ๋ค์ ๋จ์ง DDL์ ์๋์ผ๋ก ์์ฑํ ๋๋ง ์ฌ์ฉ๋๊ณ , JPA์ ์คํ ๋ก์ง์๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ ์คํค๋ง ์๋ ์์ฑ ๊ธฐ๋ฅ('spring.jpa.hibernate.ddl-auto=create' ๋ฑ)์ ์ฌ์ฉํ์ง ์๊ณ ์ง์ DDL์ ๋ง๋ ๋ค๋ฉด ํด๋น ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ด์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๊ฐ ์ํฐํฐ๋ง ๋ณด๊ณ ๋ ์์ฝ๊ฒ ๋ค์ํ ์ ์ฝ์กฐ๊ฑด์ ํ์ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ Reference
https://www.baeldung.com/jpa-unique-constraints
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊น์ํ]
@Table์ uniqueConstrains
https://www.inflearn.com/questions/164425
https://www.inflearn.com/questions/105043
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Enumerated (0) | 2021.12.14 |
---|---|
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Column (0) | 2021.12.14 |
[JPA] ํ๋ฌ์์ ํ๋ฌ์ ํ์ (FlushModeType) (0) | 2021.12.12 |
[JPA] ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ - ๋น์์, ์์, ์ค์์, ์ญ์ (0) | 2021.12.12 |
[JPA] ์์์ฑ ์ปจํ ์คํธ๋? (0) | 2021.12.12 |