JPA ์ฑ ์ ์ด์ ๋ง ๋ค ์ฝ์๋ค.
ORM์ ์ฒ์ ๊ณต๋ถํ๋ค๋ ์๊ฐ์ ๊ธด์ฅ์ด ๋ง์ด ๋์ง๋ง, DB ๊ณต๋ถ๋ ํ๊ณ , ๊ฐ์ฒด์งํฅ์ ๋ํ ๊ณต๋ถ๋ฅผ ์ถฉ๋ถํ ํ ์ํ์ฌ์ ๊ทธ๋ฐ์ง ์๊ฐ๋ณด๋ค ๊ธฐ์กด์ ์ฝ์๋ real mysql, ํ ๋น์ ์คํ๋ง 3.1๋ณด๋ค ์ ์ฝํ๋ค.
๊ธฐ์กด์ database layer๋ Mybatis ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํด ๊ตฌํํ์ง๋ง, ์ด๋ ๋ฌธ์ ๊ฐ ์์๋ค. SQL ์ค์ฌ์ ๊ฐ๋ฐ์ด ๋๋ ๊ฒ์ด๋ค.
์์ผ๋ก ํ ์ผ์ด ๋ง์ด ๋จ์์ผ๋ฏ๋ก, JPA๋ก์ ๋ฆฌํฉํฐ๋ง์ ์ฌ์ฌ ์์ํด๋ณด์.
JPA
- Java Persistence API
- ์๋ฐ ์ง์์ ORM ํ์ค ๊ธฐ์
ORM
- Object Relational Mapping
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ๋งคํ
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด์ ์ ์ฅํ ์ ์๋ค.
Hibernate
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ORM ํ๋ ์์ํฌ
- JPA ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด Hibernate
JPA ํ์ ๋ฐฐ๊ฒฝ
JDBC๋ฅผ ์ด์ฉํ ๊ฐ๋ฐ์ ๊ฐ์ฒด ์ค์ฌ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ์ผ๋ก ๊ตฌ์กฐํ๋์ด์๋ค.
๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ก ์ธํด ์๋นํ ๊ฐ๋ฐ ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ์๋ฐ์ ์๋ค. ์๋ฅผ ๋ค์ด
- ๋ฐ์ดํฐ๋ฅผ ๋งคํํ ๊ฐ์ฒด๋ฅผ ์ ์
- ๋งคํผ ์ ์
- SQL ์์ฑ
์ด๋ฌํ SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธธ ๊ฒฝ์ฐ ์ ๊ณผ์ ์ ๋ฌดํ ๋ฐ๋ณตํ๋ค.
๊ฐ๋ฐ์์ธ์ง, SQL ๋งคํผ์ธ์ง ํท๊ฐ๋ฆด ์ง๊ฒฝ์ด๋ค.
๋ณด๋ค ๊ฐ์ฒด์งํฅ์ ์ธ ๊ฐ๋ฐ์ ์ง์คํ๊ธฐ ์ํด ์๋ฐ ์ง์์ JPA๋ฅผ ๋ง๋ค์๋ค.
JPA์ ๋์
JPA ์ฅ์
1. ์์ฐ์ฑ ๋ฐ ์ ์ง๋ณด์์ ์ฉ์ดํ๋ค.
ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ์๋์ง ์๊ณ , ๊ฐ์ฒด์งํฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅํ๋ค.
2. ๋ฐ์ดํฐ์ ๊ฐ์ฒด ๊ฐ์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๊ฐ ํด๊ฒฐ๋๋ค.
์์๊ณผ ์ฐ๊ด๊ด๊ณ, ๊ฐ์ฒด ๊ทธ๋ํ ํ์ ๋ฐ ๋น๊ต์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค.
Entity Manager Factory & Entity Manager
Entity
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฃ ํ๊ฑด์ ๊ตฌ์ฑํ๋ ๋ ์ฝ๋
์ , ๋ฌดํ์ ์๋ก ๊ตฌ๋ณ๋๋ ๊ฐ์ฒด
Entity Manager Factory
- Entity Manager๋ฅผ ์์ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น ํ ๊ฐ๋ฅผ ์์ฑ
- Thread-safe ํ๋ค.
Entity Manager
- Entity๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Entity์ ์กฐํ, ์ ์ฅ, ์์ , ์ญ์ ๊ด๋ จ ์ผ
- ๋์์ฑ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์, Spring์์๋ proxy๋ก ๊ฐ์ธ Thread-safe๋ฅผ ๋ณด์ฅํ๋ค.
PersistenceContext
- Entity๋ฅผ ์๊ตฌํ ์ ์ฅํ๋ ํ๊ฒฝ
- Entity Manager๋ฅผ ์ด์ฉํด Entity๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ค.
- Entity Manager ์์ฑ ์ ๊ฐ์ด ๋ง๋ค์ด์ง
์ฅ์
- Entity์ ๋์ผ์ฑ ๋ณด์ฅ
- ๋ณ๊ฒฝ ๊ฐ์ง
- ์ง์ฐ ๋ก๋ฉ
- 1์ฐจ ์บ์ ๊ธฐ๋ฅ
- ์ฐ๊ธฐ ์ง์ฐ
์ง์ฐ ๋ก๋ฉ๊ณผ ์ฆ์ ๋ก๋ฉ
์ฆ์ ๋ก๋ฉ
ํน์ entity ์กฐํ ์ ์ฐ๊ด entity๋ฅผ ๊ฐ์ด ๋ก๋ฉํ๋ ๊ฒ
์๋ง์ ์กฐ์ธ์ ํ๋ฏ๋ก ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํด
์ ์ฌ์ฉํ์ง ์๋ ํธ
N+1 ๋ฌธ์ ๋ฅผ ์ผ์ผํด
์ง์ฐ ๋ก๋ฉ
์ฐ๊ด entity๋ฅผ ์ฌ์ฉํ ๋๊ฐ ๋ผ์์ผ ์กฐํ
ํจ์ฌ ์ ์ ๋ก๋ฉ ์๊ฐ๊ณผ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์๋น
N+1 ๋ฌธ์
์ฐ๊ด ๊ด๊ณ๊ฐ ์ค์ ๋ entity๋ฅผ ์กฐํํ ๋ ์กฐํ๋ ๋ฐ์ดํฐ ๊ฐ์๋งํผ ์ฐ๊ด ๊ด๊ณ์ ์๋ ๋ฐ์ดํฐ์ ์กฐํ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ์คํ๋๋ค. ์ด๋ฅผ N+1 ๋ฌธ์ ์ด๋ฉฐ ์ฃผ๋ก ์ฆ์ ๋ก๋ฉ ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
JPQL ์ ์ฅ์์ ์ฐ๊ด๊ด๊ณ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฌด์ํ๊ณ , Entity๋ฅผ ๊ธฐ์ค์ผ๋ก๋ง ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ๋๋ฌธ์, FetchType์ผ๋ก ์ง์ ํด์ค์ผ ํ๋ค.
ํด๊ฒฐ ๋ฐฉ์
Fetch Join์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
'๐ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MapStruct! JPA Entity ๋งคํ ๊ฐ ์ฃผ์ํด์ ์ฌ์ฉํ์ (0) | 2024.03.24 |
---|---|
JPA ์ง๊ณํจ์ sum ์ long ์ ๋ฐํํ๋ค. (0) | 2023.07.26 |
[Spring Data JPA] JPA Enum ํ๋์ ๊ดํ ๋ฌธ์ (1) | 2023.02.21 |
[Spring Data JPA] ํ๋ฐฉ ์ฟผ๋ฆฌ์ ํจ๋ฅ (feat : JPQL) (0) | 2023.02.01 |
[Spring Data JPA] Transaction ์์ด ์ฝ๊ธฐ (0) | 2023.01.30 |