JPA
Java Persistence API์ ์ฝ์๋ก, ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค์ด๋ค.
ORM ๊ธฐ์ ์ ์ฌ์ฉํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค์ ๋ชจ์
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ Hibernate, EclipseLink, DataNucleus ๋ฑ ์กด์ฌ(๋ณดํต Hibernate ์ฌ์ฉ)
JPA ์ฌ์ฉ์ ์ด์
๊ฐ์ฒด ์ค์ฌ ๊ฐ๋ฐ
SQL ์ค์ฌ์ ๋ฐ์ดํฐ ์ ๊ทผ์์ ๋ฒ์ด๋ ๊ฐ์ฒด ์ค์ฌ์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
// ์ฐ๊ด๊ด๊ณ ๋งคํ
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}SQL ์ฟผ๋ฆฌ์ ์์กดํ๋ ๋์ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
์์ฐ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ
์์ฐ์ฑ:
save(),findById()๋ฑ ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ์๋๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต์ ์ง๋ณด์์ฑ: ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋, ๋งคํ๋ ์ํฐํฐ ํด๋์ค ์ค์ฌ์ ์์ ์์
ํจ๋ฌ๋ค์ ๋ถ์ผ์น ํด๊ฒฐ
๊ฐ์ฒด์งํฅ ์ธ์ด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์๋ ๊ทผ๋ณธ์ ์ธ ํจ๋ฌ๋ค์์ ๋ถ์ผ์น๋ฅผ JPA๊ฐ ํด๊ฒฐํด์ค๋ค.
์ฐ๊ด๊ด๊ณ: ์ธ๋ ํค(Foreign Key) ๋์ ๊ฐ์ฒด์ ์ฐธ์กฐ(Reference)๋ฅผ ์ฌ์ฉํ ์ฐ๊ด๊ด๊ณ ๋งคํ
๊ฐ์ฒด ๊ทธ๋ํ ํ์: ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๋, JOIN ์ฟผ๋ฆฌ ์์ด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์์ ๋กญ๊ฒ ํ์ ๊ฐ๋ฅ
๋์ผ์ฑ ๋น๊ต: JPA๋ ๊ฐ์ ํธ๋์ญ์ ๋ด์์ ์กฐํํ ๋์ผํ ๋ก์ฐ์ ๋ํด ํญ์ ๋์ผํ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋๋ก ๋ณด์ฅ ๋ฐ ๊ฐ์ฒด์ ๋๋ฑ์ฑ ๋น๊ต ๊ฐ๋ฅ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋
๋ฆฝ์ฑ
JPA๋ ํ์ค ์ธํฐํ์ด์ค์ด๋ฏ๋ก, ์ค์ ํ์ผ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ(Dialect)๋ง ๊ต์ฒดํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
์ฑ๋ฅ ์ต์ ํ
JPA๋ ๋จ์ํ SQL์ ๋์ ์์ฑํด์ฃผ๋ ๊ฒ์์ ๊ทธ์น์ง ์๊ณ , ๋ค์ํ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
1์ฐจ ์บ์
์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์กด์ฌํ๋ ์ํฐํฐ ์ ์ฅ์๋ก, ํธ๋์ญ์ ๋ฒ์ ์์์ ๋์
em.find()๋ฑ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํฐํฐ๋ฅผ ์ฒ์ ์กฐํํ๋ฉด, ํด๋น ์ํฐํฐ์ ์ธ์คํด์ค๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ๊ณ ๊ทธ ์ธ์คํด์ค๋ฅผ ๋ฐํ์ดํ ๊ฐ์ ํธ๋์ญ์ ๋ด์์ ๋์ผํ ์ํฐํฐ๋ฅผ ๋ค์ ์กฐํํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ง ์๊ณ 1์ฐจ ์บ์์ ์๋ ์ํฐํฐ ์ธ์คํด์ค๋ฅผ ๋ฐํ
๊ฐ์ ํธ๋์ญ์ ๋ด์์ ์กฐํํ ์ํฐํฐ์ ๋ฐ๋ณต ๊ฐ๋ฅํ ์ฝ๊ธฐ(Repeatable Read)์ ๊ฐ์ฒด ๋์ผ์ฑ ๋ณด์ฅ
์ฐ๊ธฐ ์ง์ฐ (Transactional Write-Behind)
em.persist()์ ๊ฐ์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, JPA๋ ํด๋น SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ฅ์ด๋ ๊ฒ ๋ชจ์๋ ์ฟผ๋ฆฌ๋ค์ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ ์์ ์
flush()๊ฐ ํธ์ถ๋๋ฉด์ ํ๊บผ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ก
์ง์ฐ ๋ก๋ฉ (Lazy Loading)
์ฐ๊ด๊ด๊ณ๊ฐ ์ค์ ๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๋, ์ค์ ๋ก ํด๋น ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๋ ์์ ๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ธฐ์
๋ฐ์ดํฐ ์กฐํ ์ ์ฐ๊ด๋ ์ํฐํฐ ์ปฌ๋ ์ (
@OneToMany(fetch = FetchType.LAZY))์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ํ๋ก์(Proxy) ๊ฐ์ฒด๋ก ์ด๊ธฐ***ToOne-> ๊ธฐ๋ณธ๊ฐ ์ฆ์ ๋ก๋ฉ /***ToMany-> ๊ธฐ๋ณธ๊ฐ ์ง์ฐ ๋ก๋ฉ
์ดํ ์ฝ๋์์ ์ค์ ์ปฌ๋ ์ ์ ์ ๊ทผํ๋ ์์ ์, JPA๊ฐ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ค์ ๋ฐ์ดํฐ๋ก ์ด๊ธฐํ
JPA์ ๋์ ๊ณผ์
JPA๋ EntityManagerFactory์ EntityManager๋ฅผ ์ค์ฌ์ผ๋ก ๋์ํ๋ค.
EntityManagerFactoryEntityManager๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ํ๊ณผ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌ(์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๋จ ํ๋๋ง ์์ฑ๋์ด ๊ณต์ )
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด๋ ์์ ํ๊ฒ ๊ณต์ ๊ฐ๋ฅ
EntityManager์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ (์ ์ฅ, ์์ , ์ญ์ , ์กฐํ ๋ฑ)์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด
๋ด๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ ์งํ๋ฉด์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด ์ํฐํฐ๋ฅผ ๊ด๋ฆฌ
์คํ๋ง ๋ถํธ์์์ JPA ์ค์
๊ณผ๊ฑฐ์๋ DataSource, EntityManagerFactory, PlatformTransactionManager ๋ฑ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋น์ผ๋ก ๋ฑ๋กํด์ผ ํ๋ค.
DataSource: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒดJpaVendorAdapter: ์ฌ์ฉํ JPA ๊ตฌํ์ฒด(์: Hibernate)์ ๋ํ ์ธ๋ถ ์ค์ ์ ๋ด๋ ๊ฐ์ฒดLocalContainerEntityManagerFactoryBean:DataSource์JpaVendorAdapter์ ๋ณด๋ฅผ ์กฐํฉํ์ฌEntityManagerFactory๋ฅผ ์์ฑํ๋ ๊ฐ์ฒดJpaTransactionManager: JPA์ ํธ๋์ญ์ ์ ์คํ๋ง์ ํธ๋์ญ์ ๊ด๋ฆฌ ์ฒด๊ณ(@Transactional)์ ์ฐ๋์์ผ์ฃผ๋ ๊ฐ์ฒด
์คํ๋ง ๋ถํธ์ JPA ์๋ ์ค์
ํ์ง๋ง ์ค๋๋ ์คํ๋ง ๋ถํธ ํ๊ฒฝ์์๋ ๋ ๊ฐ์ง ์ค์ ๋ง์ผ๋ก JPA๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
spring-boot-starter-data-jpa์์กด์ฑ ์ถ๊ฐapplication.properties(๋๋.yml) ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ ๋ณด์ ๊ธฐ๋ณธ์ ์ธ JPA ์ต์ ๋ช ์
์ฐธ๊ณ ์๋ฃ
Last updated
Was this helpful?