JPA, Spring Data JPA Document - dev-team-projects/DeliTalk GitHub Wiki
์์ฑ์ : ์์ฑ์ค
JPA, Spring Data JPA
- ๋ ๋ค Java ORM ๊ธฐ์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
JPA - Java Persistence API
-
๊ฐ์ฒด์ ๊ด๊ณํ DB ๊ฐ์ ๋งคํ์ ์ํ ํ์ค ๋ช ์ธ์ ๋๋ค.
-
DB ์ฐ๋์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๊ฐ์ฅ ์ ํต์ ์ธ JDBC๋ถํฐ Spring DAO, Mybatis, Hibernate ๋ฑ ORM์ ์ด๋ฅด๊ธฐ ๊น์ง ๋ค์ํ๊ฒ ์กด์ฌํฉ๋๋ค.
-
์ด ์ค Hibernate ๊ฐ์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ SQL๊น์ง๋ ํ๋ ์์ํฌ์์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํด์ผ ํ ์ผ๋ค์ ์ค์ฌ์ค๋๋ค.
-
์ด๋ฐ ORM๋ค์ ๋ณด๋ค ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ์คํํ ๊ฒ์ด JPA์ ๋๋ค.
ํน์ง
DB ์ถ์ํ
- JPA๋ฅผ ํตํด DB์ ์ข ๋ฅ์ ์๊ด์์ด ๊ฐ์ฒด ์ค์ฌ DB ์์ ์ ์ํํฉ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ
- ์ํฐํฐ ๋งคํ, ์์์ฑ ์ปจํ ์คํธ, ์ฟผ๋ฆฌ API ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด DB์ ๊ฐ์ฒด ๊ฐ์ ๋งคํ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
JPA ๊ฐ๋ ์ดํดํ๊ธฐ
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ ํน์ ์ด์ฉ ์ค ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด DB ๊ฐ์ ์ ์ฅ๊ณต๊ฐ์ ์ ์ฅํด์ผํฉ๋๋ค.
DB ์ฐ๋ ๊ธฐ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์์ SQL์ ๋ค๋ฃจ๋ ๋ฐฉ์์ ๋ฐ๋ผ ๊ตฌ๋ถ๋ฉ๋๋ค.
- Mybatis ํ๋ ์์ํฌ์ ๊ฒฝ์ฐ์๋ SQL์ ๊ฐ๋ฐ์๊ฐ ์ง์ XML ํ์ผ์ ๋ฑ๋กํด์ ์ฌ์ฉํ์ง๋ง Hibernate ORM์ ๊ฒฝ์ฐ์๋ ํ๋ ์์ํฌ์์ SQL์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ SQL์ ์ง์ ์์ฑํ๊ฑฐ๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค.
SQL์ ์ง์ ๋ค๋ฃจ๋ ๊ธฐ์ ์ ๋ฌธ์ ์
๊ฒ์๊ธ์ผ ๊ฒฝ์ฐ BOARD_TB ํ
์ด๋ธ๊ณผ BoardVO ํด๋์ค๊ฐ ํ์ํฉ๋๋ค.
๊ฒ์๊ธ CRUD ์์
์ ์ํด์๋ ์ด ๋ ๊ฐ์ง๋ฅผ ์ฐ๊ฒฐํ SQL๊ตฌ๋ฌธ์ด ํ์ํฉ๋๋ค.
INSERT...
SELECT...
UPDATE...
DELETE...
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ JDBC๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ
๋๋ผ์ด๋ฒ ํด๋์ค ๋ก๋ฉ๋ถํฐ ์์ํ์ฌ
์ปค๋ฅ์
์ฐ๊ฒฐ,
Statement ๊ฐ์ฒด ์์ฑ,
SQL ์ ์ก ๋ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ,
์ฐ๊ฒฐํด์ ๋ฑ๋ฑ ์ฌ๋ฌ ๊ฐ์ง์ ๋ฐ๋ณต ์์
์ด ํ์ํฉ๋๋ค.
โก๏ธ ์ด๊ฒ์ Mybatis ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ์ ๋๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง SQL ๊ตฌ๋ฌธ์ ๋ณ๋์ XML ํ์ผ์ ๋ฑ๋กํ์ฌ ๊ด๋ฆฌํด์ผ ํ๋ฏ๋ก
์ ์ง๋ณด์๊ณผ์ ์์ SQL์ด ์์๋ก ๋ณ๊ฒฝ๋ ์ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ํน์ ํ
์ด๋ธ์ ์ปฌ๋ผ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ
VO์๋ ํ๋ ๋ณ์๋ฅผ ์ถ๊ฐํด์ผ ํ๊ณ
๊ด๋ จ SQL ๊ตฌ๋ฌธ๋ ์ ๋ถ ์์ ํด์ค์ผ ํฉ๋๋ค.
๋ํ ์ฝ๋๋ ์์ ํด์ค์ผ ํฉ๋๋ค.
โก๏ธ ๊ฒฐ๊ตญ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ต๋๋ค.
SQL์ ์ง์ ๋ค๋ฃจ์ง ์๋๋ค๋ฉด
- ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ Hibernate์ ๊ฐ์ ORM ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
- ORM์ VO ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ DB๊ฐ์๋ Map ๊ฐ์ ์ปฌ๋ ์
์ ์ ์ฅํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฐ๋
์
๋๋ค.
- โก๏ธ ํน์ ์ปฌ๋ผ์ด ์ถ๊ฐ๋ ์ ๋ณ์๋ง ์ถ๊ฐํ๋ฉด ๋๋ฏ๋ก ๊ด๋ฆฌ๊ฐ ์ฌ์์ง๋๋ค.
JPA๋ JDBC API์ ๊ฐ์ ๊ฐ๋
- JDBC API๋ JDBC ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ DB ์ฐ๋์ ์ฒ๋ฆฌํ๋ฉด ์คํ๋ ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๋๋ผ์ด๋ฒ ๊ฐ์ฒด๊ฐ ๋์ํฉ๋๋ค.
- ์ด๋ ๊ฒ ๊ตฌํํด์ผ ์ถํ DB๋ฅผ ๋ณ๊ฒฝํ ๋ DB์ ์ข ์์ ์ธ ๋๋ผ์ด๋ฒ๋ง ๊ต์ฒดํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ค๋ ์์ ํ์ง ์์๋ ๋ฉ๋๋ค.
- ์ด์ฒ๋ผ JPA๋ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ์ฌ DB๋ฅผ ์ฒ๋ฆฌํ๋ฉด ์ค์ ๋ก๋ JPA๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๊ฐ ๋์ํฉ๋๋ค.
โก๏ธ ์ด ๊ตฌํ์ฒด๊ฐ
Hibernate
์ ๋๋ค.
- JPA ์ฌ์ฉ ์ ๊ฐ๋ฐ ์์ ์๋ Hibernate๋ฅผ ์ฌ์ฉํ๊ณ ์ค์ ์๋น์ค๊ฐ ์์๋ ๋๋ ๋ค๋ฅธ ORM ๊ธฐ์ ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค.
JPA ๋์ ์๋ฆฌ
-
JPA๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ปฌ๋ ์ ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค.
-
๊ฒฐ๊ตญ ์ปฌ๋ ์ ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ฅผ ํ ์ด๋ธ์ ROW์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ JDBC API๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
-
JPA๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC ์ฌ์ด์ ์กด์ฌํ์ฌ JDBC์ ๋ณต์กํ ์ฒ๋ฆฌ๋ฅผ ๋์ ์ฒ๋ฆฌํฉ๋๋ค.
JDBC API๋ฅผ ๋ชฐ๋ผ๋ DB๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB ์ฌ์ด์์ JPA์ ์ญํ
๊ทธ๋ผ JPA๋ Mybatis์ ๋ณ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ธ๊ฐ..?
JPA์ Mybatis์ ์ฐจ์ด
- JPA๋ DB ์ฐ๋๋ฟ ์๋๋ผ SQL๊น์ง ์ ๊ณตํฉ๋๋ค.
๊ตฌ๋ถ | JPA (ORM) | Mybatis (SQL Mapper) |
---|---|---|
SQL ์์ฑ | ์๋ ์์ฑ (JPQL๋ก ํ์ ์ ์์ฑ) | ์ง์ ์์ฑ (XML or Annotation) |
๊ฐ์ฒด ๋งคํ | Entity ๊ธฐ๋ฐ | ResultMap ๋ฑ ์๋ ๋งคํ |
์ ์ง๋ณด์์ฑ | ์ปฌ๋ผ ๋ณ๊ฒฝ ์ ์ํฐํฐ ์์ | SQL๊ณผ ๊ฐ์ฒด ๋ ๋ค ์์ ํ์ |
๋ฌ๋์ปค๋ธ | ์๋์ ์ผ๋ก ๋์ | ์๋์ ์ผ๋ก ๋ฎ์ |
์์ ๋ | ๋ฎ์ (์ถ์ํ ๋์) | ๋์ (SQL ์์ ์ ์ด ๊ฐ๋ฅ) |
JPA์ SQL ์์ฑ ๋งค์ปค๋์ฆ
- ์ฌ๋ฌ ๊ฐ์ ํ ์ด๋ธ์ด ์กด์ฌํ๊ณ ํด๋น ํ ์ด๋ธ์ CRUD SQL๋ฌธ์ ์ด๋ ์ ๋ ๋น์ทํ๋ฏ๋ก VO ํด๋์ค๋ฅผ ํ ์ด๋ธ์ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ์ฐ๊ฒฐํ๊ณ ์ปฌ๋ผ์ VO ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์์ ์ฐ๊ฒฐํ๋ฉด ์ด๋์ ๋ ํ์ผํ๋ SQL์ ์์ฑํ ์ ์์ต๋๋ค.
Spring Data JPA
-
Spring Data JPA๋ JPA๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ DB ์ ๊ทผ ์ฝ๋๋ฅผ ๋์ฑ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ Spring ํ๋ก์ ํธ์ ์ผ๋ถ์ ๋๋ค.
- JPA๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๋ชจ๋์
๋๋ค.
- Spring Data JPA๋ JPA + Spring Data๋ผ๋ ๋ณ๋์ ์ถ์ํ ๊ณ์ธต์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์๋ Repository ์ธํฐํ์ด์ค๋ง ์ ์ํ๊ณ , Spring Data JPA๊ฐ ์ด๋ฅผ ์๋์ผ๋ก ๊ตฌํํด ์ค๋๋ค.
- JPA๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ ๋ชจ๋์
๋๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋๋ฐ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ XML ์ค์ ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฉ๋๋ค.
ํน์ง
JPA ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ณต์ ์ธ CRUD ์ฝ๋ ์์ฑ์ ์ค์ฌ์ค๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ ์ถ์ํ
- JPA ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง (CRUD, ํ์ด์ง, ์ ๋ ฌ ๋ฑ)์ ์๋์ผ๋ก ์์ฑํ๊ณ ๊ตฌํํด์ค๋๋ค.
๊ฐํธํ ๊ฐ๋ฐ
- ๊ฐ๋ฐ์๋ ๋ณต์กํ SQL ์ฟผ๋ฆฌ ์์ฑ ๋์ , ๋ฉ์๋ ์ด๋ฆ๋ง์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ฐ๋จํ ์ค์ ์ ํตํด DB ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์ํฐํฐ ํด๋์ค ๋งคํ๋ฒ
์ด๋ ธํ ์ด์ | ์ค๋ช |
---|---|
@Entity |
์ํฐํฐ ํด๋์ค์์ ๋ช ์. ์ด ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํ๋ ํ ์ด๋ธ๊ณผ ๋งคํ๋ฉ๋๋ค. |
@Table |
๋งคํํ ํ ์ด๋ธ ์ด๋ฆ๊ณผ ์ถ๊ฐ ์ค์ ์ ์ง์ ํ ๋ ์ฌ์ฉ. ํด๋์ค๋ช ๊ณผ ํ ์ด๋ธ๋ช ์ด ๊ฐ์ผ๋ฉด ์๋ต ๊ฐ๋ฅ. |
@Id |
**๊ธฐ๋ณธ ํค(primary key)**๋ฅผ ์ง์ . ๋ฐ๋์ ํ ๊ฐ ์ด์ ํ์. |
@GeneratedValue |
๊ธฐ๋ณธ ํค์ ๊ฐ ์์ฑ ์ ๋ต์ ์ง์ (์: AUTO, IDENTITY, SEQUENCE, TABLE). ๋ณดํต auto-increment์ ์ฌ์ฉ. |
์ถ๊ฐ๋ก ์์ฃผ ์ฐ์ด๋ ์ด๋ ธํ ์ด์
์ด๋ ธํ ์ด์ | ์ค๋ช |
---|---|
@Column |
์ปฌ๋ผ์ ์ด๋ฆ, ๊ธธ์ด, nullable ์ฌ๋ถ ๋ฑ ์์ฑ์ ์ง์ ํ ๋ ์ฌ์ฉ. |
@Enumerated |
Enum ํ์ ์ ๋งคํํ ๋ ์ฌ์ฉ. (ORDINAL ๋๋ STRING) |
@Lob |
Large Object ํ์ ๋งคํ (BLOB, CLOB). |
@Transient |
DB์ ๋งคํํ์ง ์๋ ํ๋์ ์ฌ์ฉ. |
@Temporal (๊ตฌ๋ฒ์ ) |
๋ ์ง ํ์
๋งคํํ ๋ ์ฌ์ฉ (Date, Calendar). ํ์ฌ๋ LocalDate , LocalDateTime ๊ถ์ฅ. |
@Embedded |
์๋ฒ ๋๋ ํ์ (๋ด์ฅ ํ์ ) ๋งคํ. |
@Embeddable |
์๋ฒ ๋๋ ํ์ ํด๋์ค์ ์ฌ์ฉ. |
์ด๋ ธํ ์ด์ | ์ค๋ช |
---|---|
@Repository |
JPA Repository๋ฅผ Spring Bean์ผ๋ก ๋ฑ๋กํ ๋ ์ฌ์ฉ. ์์ธ ์ฒ๋ฆฌ๋ ๋ด๋น. |
@Query |
JPQL ๋๋ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ์ํ ๋ ์ฌ์ฉ. |
@Modifying |
Update/Delete ์ฟผ๋ฆฌ์ ๋ถ์ฌ์ผ ํจ. |
@EntityListeners |
์ํฐํฐ ์๋ช ์ฃผ๊ธฐ ์ด๋ฒคํธ ์ฝ๋ฐฑ ๋ฑ๋ก. |