ํด๋น ๊ธ์ ๋ฐฐ์๋ณด์ Spring Data JPA ์๋ฆฌ์ฆ ์ ๋๋ค.
ํด๋น ์๋ฆฌ์ฆ์ ๋ด์ฉ์ด ์ด์ด์ง๋ ํํ์ด๋ฏ๋ก ๊ธ์ ๋ด์ฉ ์ค์ ์๋ต๋๋ ๋ง๋ค์ด ์์ ์ ์์ผ๋, ์์ธํ ์ฌํญ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
- Spring Data JPA์ ๊ธฐ๋ณธ๊ณผ ํ๋ก์ ํธ ์์ฑ :: ์๋ฆฌ์ฆ ํ์ต ํ๊ฒฝ ์ค๋น
- JPA์ ๊ธฐ๋ณธ๊ณผ Spring Data JPA
- Springboot project ์์ JPA ์ค์ ํ๊ธฐ
- JPA์ ๊ธฐ๋ณธ ์ด๋
ธํ
์ด์
๋ค :: JPA์ ์์๊ณผ ๋์์ ๋
- ์ํฐํฐ์ ํ ์ด๋ธ ๋งคํ
- ํ๋์ ์ปฌ๋ผ ๋งคํ
- ๋งคํ ํ
์ด๋ธ๊ณผ ์ฐ๊ด๊ด๊ณ ๋งคํํ๊ธฐ :: RDB์ ๊ฝ, ์ฐ๊ด ๊ด๊ณ
- ์ฐ๊ด๊ด๊ณ๋?, ์ธ๋ ํค๋?, ๋งคํ ํ ์ด๋ธ์ด๋?
- ์ผ๋์ผ, ์ผ๋๋ค, ๋ค๋์ผ ์ฐ๊ด๊ด๊ณ
- ๊ณตํต ์ธํฐํ์ด์ค ๊ธฐ๋ฅ :: ์ด๋ป๊ฒ Data JPA ๋ ๋์ํ ๊น?
- ๋จ๊ฑด ์กฐํ ๋ฐํ ํ์
- ์ปฌ๋ ์ ์กฐํ ๋ฐํ ํ์
- ์ฌ์ฉ์ ์ ์ ์ฟผ๋ฆฌ ์ด์ฉํ๋ ๋ฐฉ๋ฒ :: ๋ด๊ฐ ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ JPA ์์ ๋ง๋ค์ด๋ณด์!
- ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ
@Query
๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋์ ์ ์ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ
- ํ์ด์ง๊ณผ ์ ๋ ฌ :: ๊ฒ์ํ๊ณผ ๊ฐ์ ํ์ด์ง๊ฐ ์๋ ์๋น์ค์์ ๋น์ ๋ฐํ๋ JPA ํ์ด์ง!
- Data JPA์ ํ์ด์ง๊ณผ ์ ๋ ฌ
- Web MVC ์์ JPA ํ์ด์ง๊ณผ ์ ๋ ฌ
- Auditing :: ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์
๋๊ฐ, ์ธ์
์ ๊ทผํ๋์ง ํ๋์ ์ํฐํฐ๋ก ๊ด๋ฆฌํ์.- ์์ JPA์ Auditing
- Spring Data JPA์ Auditing
- ๋ฐฐ์๋ณด์ Spring Data JPA ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ...
- ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ ๋๋์
- ๋ด๊ฐ ์ ๋ณด๋ฅผ ์ป์ ๊ณณ
- ํด๋น ์๋ฆฌ์ฆ๋ฅผ ์์ฃผํ์ จ๋์?
JPA ์์๋ ์ํฐํฐ์ ๋งคํํ๊ธฐ, ์ฐ๊ด๊ด๊ณ ๋งคํํ๊ธฐ, ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด์ ์ฌ๋ฌ ์ด๋ ธํ ์ด์ ์ ์ ๊ณตํ๋ค.
์ง๊ธ ์ด์ผ๊ธฐํ ๋ด์ฉ๋ค์ Spring Data JPA ์๋ ๋ณ๊ฐ๋ก ์์ JPA Framework์ ๋ํ ๋ด์ฉ์ด๋ค.
JPA ๊ธฐ๋ณธ ์ด๋ ธํ ์ด์
JPA๋ ORM, ์ฆ ๊ฐ์ฒด์ ํ ์ด๋ธ์ ๋งคํํ๋ ํ๋ ์์ํฌ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ ํํ๊ฒ ๋งคํํ๋ ๊ฒ์ด ์ค์ํ๋ฐ, JPA ์์๋ ์ด๋ฐ ๋งคํ์ ๋ค์๊ณผ ๊ฐ์ ์ด๋ ธํ ์ด์ ๋ค์ ์ด์ฉํ๋ค.
- ๊ฐ์ฒด์ ํ
์ด๋ธ ๋งคํํ๊ธฐ
@Entity
@Table
- ๊ธฐ๋ณธ ํค ๋งคํํ๊ธฐ
@Id
- ํ๋์ ์ปฌ๋ผ ๋งคํํ๊ธฐ
@GeneratedValue
@Column
@Enumerated
- ์ฐ๊ด๊ด๊ณ ๋งคํํ๊ธฐ
@OneToOne
@OneToMany
@ManyToOne
@ManyToMany
์ด๋ ต์ง ์์ผ๋ ๊ฐ์ด ํ๋์ฉ ์์๋ณด์.
์ด๋ค ํํ๋ก ์ฐ๋์ง ์์๋ณด์.
@Entity // 1
@Table(name = "Member_tb") // 2
public class Member {
@Id // 3
@GeneratedValue(stretagy = GenerationType.IDENTITY) // 4
@Column(name = "member_id", nullable = false) // 5
private Long id;
private String username;
private int age;
@Enumerated(EnumType.STRING) // 6
private RoleType role = RoleType.USER;
}
@Entity, JPA ๊ด๋ฆฌ ํด๋์ค
@Entity
์ด๋
ธํ
์ด์
์ JPA์ ์์์ด๋ผ๊ณ ์๊ฐํ๋ค.
ํ
์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค์ @Entity
์ด๋
ธํ
์ด์
์ ๋ถํ์ฃผ๋ ๊ฒ์ผ๋ก JPA์๊ฒ ํด๋น ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋งคํํ ๊ฐ์ฒด๋ค๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ฐ Entity ์๋ ์ค์ํ 3๊ฐ์ง ์์น์ด ์๋ค.
- ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๊ผญ ๊ฐ์ง๊ณ ์์ ๊ฒ,
- final class, interface, enum, inner ํด๋์ค๊ฐ ์๋ ๊ธฐ๋ณธ ํด๋์ค์ผ ๊ฒ
- ์ ์ฅํ ํ๋์ final ์ ์ฌ์ฉํ์ง ์์ ๊ฒ
์ด ์ธ ๊ฐ์ง๋ง ๋ง์กฑํ๋ฉด Entity๋ก์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
@Table, ํ ์ด๋ธ๊ณผ ๋งคํ
Table์ ์คํฐํฐ์ ๋งคํํ ํ ์ด๋ธ์ ์ด๋ฆ์ผ๋ก ์ง์ ์ง์ ํ๋ค.
์์์ ๋ณด๋ฉด @Table(name = "")
๊ณผ ๊ฐ์ ํํ๋ก ํ
์ด๋ธ์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ค.
์ฌ์ค @Entity(name = "")
์ผ๋ก๋ ํ
์ด๋ธ์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋๋ฐ, @Table
์ด๋
ธํ
์ด์
์๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ๋ค์ด ๋ ์๋ค.
- DDL ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด ์ถ๊ฐ.
- ์คํค๋ง ๋งคํ
- Catalog ๋งคํ
์์ ์ฌํญ๋ค์ ํ์ฌ๋ก์จ๋ ํ์ํ์ง ์์ผ๋ ๋์ด๊ฐ๋๋ก ํ์.
@Id, ๊ธฐ๋ณธํค ๋งคํํ๊ธฐ
๊ธฐ๋ณธํค๋?
๊ธฐ๋ณธ ํค๋ ์ฃผ ํค ๋๋ ํ๋ผ์ด๋จธ๋ฆฌ ํค๋ผ๊ณ ํ๋ฉฐ, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐ์ ์๋ณ์๋ก ์ด์ฉํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ๊ด๊ณ ๋ง๋ค ๋จ ํ ์ค๊ณ์์ ์ํด ์ ํ, ์ ์๋ ํ๋ณด ํค๋ฅผ ๋งํ๋ค.
@Id
์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ฉด Primary Key, ๊ธฐ๋ณธํค ๋ฅผ ์ง์ ํ ์ ์๋ค.
์ด๋ฌํ ๊ธฐ๋ณธํค์๋ ๋ค์ํ ์ ๋ต์ด ์กด์ฌํ๋๋ฐ, ์ด๋ฅผํ ๋ฉด MySql ์ AUTO_INCREAMENT ์ ๊ฐ์ด ์๋ ์ฆ๊ฐํ๊ฒ ํ ์ ์๊ณ , ์๋๋ฉด ์ง์ ๊ธฐ๋ณธ ํค๋ฅผ ์ง์ ํ ์ ์๋ค.
@GeneratedValue, ๊ธฐ๋ณธ ํค ์์ฑ ์ ๋ต
์์ ๋ง ํ ๊ธฐ๋ณธ ํค์ ๋ค์ํ ์์ฑ ์ ๋ต์ ๋ช ์ํ ์ ์๋ค.
๊ธฐ๋ณธ ํค๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ง์ ํ ๋น๊ณผ ์๋ ์์ฑ ์ด ๋๋๋ค.
์ฐ๋ฆฌ๋ ์๋ ์์ฑ์ ์ด์ ์ ๋ง์ถฐ๋ณด์.
JPA์์ ์๋ ์์ฑ์๋ 3๊ฐ์ง ์ ๋ต์ด ์๋ค.
๊ทธ ์ค์ IDENTITY ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ IDENTITY์ ์ง์คํ์.
- IDENTITY : ๊ธฐ๋ณธ ํค ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๊ฒ ์์ํ๋ค.
- SEQUENCE : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค๋ฅผ ์ด์ฉํด์ ๊ธฐ๋ณธ ํค๋ฅผ ํ ๋นํ๋ค.
- TABLE : ํค ์์ฑ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
JPA ์์๋ strategy = GenerationType.IDENTITY
๋ก ์ง์ ํ๋ค.
@Column, ํ๋ ๋งคํํ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก JPA ์์ @Column
์ ๋ช
์ํ์ง ์์ผ๋ฉด ํด๋น ํ๋์ ์ด๋ฆ์ผ๋ก ๋งคํ ํ๋๋ฐ, ๋ง์ฝ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์์ ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด ํ
์ด๋ธ์์๋ Member์ ๊ธฐ๋ณธ ํค๊ฐ member_id
์ด๋ฉฐ, ์๋ฐ ํด๋์ค์์๋ id
๋ก ์ฐ์ด๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋น๋๋ค.
์ด ๊ฒฝ์ฐ @Column(name = "")
์์ฑ์ ์ด์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๋ํ DDL ์์ฑ ๊ธฐ๋ฅ์ผ๋ก @Column(nullable = true)
๊ณผ @Column(length = 400)
์ด ๋ํ์ ์ด๋ค.
์์ํ๋ค ์ถ์ด nullable์ null ์ ์ฝ ์กฐ๊ฑด๊ณผ length ์ ๊ธธ์ด ์ ์ฝ ์กฐ๊ฑด์ด๋ค.
@Enumerated, ENUM ํ์ ๋งคํํ๊ธฐ
Enum ํ์ ์ด๋?
์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์์ ์ด๊ฑฐํ, ์ด๋, ํฉํฐ๋ ์์, ๋ฉค๋ฒ๋ผ ๋ถ๋ฆฌ๋ ๋ช ๋ช ๋ ๊ฐ์ ์งํฉ์ ์ด๋ฃจ๋ ์๋ฃํ์ด๋ค. ์ด๊ฑฐ์ ์ด๋ฆ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ํด๋น ์ธ์ด์ ์์ ์ญํ ์ ํ๋ ์๋ณ์์ด๋ค. ์ผ๋ถ ์ด๊ฑฐ์ ์๋ฃํ์ ์ธ์ด์ ๊ธฐ๋ณธ ์์๋์ด ์์ ์ ์๋ค.
์ด๋ฌํ Enum ํ์ ์ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ, Enum ํ์ ์ ์ํ ์ด๋ ธํ ์ด์ ๋ ์กด์ฌํ๋ค.
@Enumerated
enum RoleType {
ADMIN, USER
}
๊ณผ ๊ฐ์ Enum ์ด ์กด์ฌํ๋ค๊ณ ํด๋ณด์.
๊ทธ๋ผ ์์ ๊ฐ์ด @Enumerated
์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ฉด ๋๋ค.
@Enumerated
์๋ 2๊ฐ์ง ํ์
์ด ์กด์ฌํ๋ค.
EnumType.ORDINAL
EnumType.STRING
ORDINAL์ Enum ์ ์ ์๋ ์์๋๋ก JPA๊ฐ ์ด์ฉํ๋๋ฐ, ๋ง์ฝ ์์๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ผฌ์ด๊ฒ ๋๋๋ฐ, ๋ฌด์กฐ๊ฑด์ ์ผ๋ก STRING ํ์ ์ ์ด์ฉํ์.
STRING ํ์ ์ ๋ฌธ์๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๋ค.
์ฝ๊ฐ์ ์ฑ๋ฅ์ ORDINAL์ด ์ด์ ์ด ์์ผ๋ ์์ ์ฑ์ ํํ๋๋ก ํ์
๋๊ธ