# JPA
Java Persistence API
๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ ์์ฑํ์ง ์๊ณ , JPA API๋ฅผ ํ์ฉํด DB๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
JPA๋ ์ค๋๋ ์คํ๋ง์์ ๋ง์ด ํ์ฉ๋๊ณ ์์ง๋ง, ์คํ๋ง์ด ์ ๊ณตํ๋ API๊ฐ ์๋ ์๋ฐ๊ฐ ์ ๊ณตํ๋ API๋ค.
์๋ฐ ORM ๊ธฐ์ ์ ๋ํ ํ์ค ๋ช ์ธ๋ก, ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ ์ํ ์ธํฐํ์ด์ค๋ค.
# ORM(Object Relational Mapping)
ORM ํ๋ ์์ํฌ๋ ์๋ฐ ๊ฐ์ฒด์ ๊ด๊ณํ DB๋ฅผ ๋งคํํ๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ DB ํ ์ด๋ธ์ด ๋๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค. ORM์ ์ฌ์ฉํ๋ฉด, SQL์ ์์ฑํ์ง ์์๋ ์ง๊ด์ ์ธ ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ( ๊ฐ๋ฐ์์๊ฒ ์์ฐ์ฑ์ ํฅ์์์ผ์ค ์ ์์ )
์ข ๋ฅ๋ก๋ Hibernate, EclipseLink, DataNucleus ๋ฑ์ด ์๋ค.
์คํ๋ง ๋ถํธ์์๋ spring-boot-starter-data-jpa
๋ก ํจํค์ง๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ Hibernate ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ๋ค.
JPA๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ JPA๋ฅผ ํ์ฉํ์ ๋ JDBC API๋ฅผ ํตํด SQL์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ์ถํ๋ ์ ๊ฐ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ฆ, ๊ฐ๋ฐ์๋ JPA์ ํ์ฉ๋ฒ๋ง ์ตํ๋ฉด DB ์ฟผ๋ฆฌ ๊ตฌํ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
# JPA ํน์ง
# ๊ฐ์ฒด ์ค์ฌ ๊ฐ๋ฐ ๊ฐ๋ฅ
SQL ์ค์ฌ ๊ฐ๋ฐ์ด ์ด๋ฃจ์ด์ง๋ค๋ฉด, CRUD ์์ ์ด ๋ฐ๋ณตํด์ ์ด๋ฃจ์ด์ ธ์ผํ๋ค.
ํ๋์ ํ ์ด๋ธ์ ์์ฑํด์ผํ ๋ ์ด์ ํด๋นํ๋ CRUD๋ฅผ ์ ๋ถ ๋ง๋ค์ด์ผ ํ๋ฉฐ, ์ถํ์ ์ปฌ๋ผ์ด ์์ฑ๋๋ฉด ๊ด๋ จ SQL์ ๋ชจ๋ ์์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค. ๋ํ ๊ฐ๋ฐ ๊ณผ์ ์์ ์ค์ํ ๊ฐ๋ฅ์ฑ๋ ๋์์ง๋ค.
# ์์ฐ์ฑ ์ฆ๊ฐ
SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ , ๋ง๋ค์ด์ง ๊ฐ์ฒด์ JPA ๋ฉ์๋๋ฅผ ํ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ํธ๋ฆฌ์ฑ์ ์ ๊ณตํด์ค๋ค.
# ์ ์ง๋ณด์ ์ฉ์ด
์ฟผ๋ฆฌ ์์ ์ด ํ์ํ ๋, ์ด๋ฅผ ๋ด์์ผ ํ DTO ํ๋๋ ๋ชจ๋ ๋ณ๊ฒฝํด์ผ ํ๋ ์์ ์ด ํ์ํ์ง๋ง JPA์์๋ ์ํฐํฐ ํด๋์ค ์ ๋ณด๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ฏ๋ก ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค.
# ์ฑ๋ฅ ์ฆ๊ฐ
์ฌ๋์ด ์ง์ SQL์ ์ง๋ ๊ฒ๊ณผ ๋น๊ตํด์ JPA๋ ๋์ผํ ์ฟผ๋ฆฌ์ ๋ํ ์บ์ ๊ธฐ๋ฅ์ ์ง์ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋์ ์ฑ๋ฅ ํจ์จ์ ๊ฒฝํํ ์ ์๋ค.
# ์ ์ฝ์ฌํญ
JPA๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ณด๋ค๋ ์ค์๊ฐ ์ฟผ๋ฆฌ์ ์ต์ ํ๋์ด์๋ค. ์๋ฅผ ๋ค์ด ํต๊ณ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ณต์กํ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด์ Mybatis์ ๊ฐ์ Mapper ๋ฐฉ์์ด ๋ ํจ์จ์ ์ผ ์ ์๋ค.
Spring์์๋ JPA์ Mybatis๋ฅผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ํฉ์ ๋ง๋ ๋ฐฉ์์ ํํ์ฌ ๊ฐ๋ฐํ๋ฉด ๋๋ค.