-
[SpringBoot] JPA๋?๐ปProgramming/SpringBoot 2024. 3. 20. 18:48
JPA(Java Persistence API)๋?
JPA๋ Java ์ง์์์ ORM(Object-Relational Mapping) ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ์
Hibernate, Spring JPA๋ฑ๊ณผ ๊ฐ์ ๊ตฌํ์ฒด๊ฐ ์๊ณ , ์ด๊ฒ์ ํ์ค ์ธํฐํ์ด์ค๊ฐ JPA์ด๋ค. -> JPA๋ ์ธํฐํ์ด์ค
์ค์ฒด์ ์ผ๋ก ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌํ๋ ํด๋์ค์ ๋งคํํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ์ด๋ค.
ORM(Object-Relational Mapping)์ด๋?
์๋ฐ์ ๊ฐ์ฒด์ Relational Database(RDB)๋ฅผ ๋งคํํ๋ ๊ฒ์ผ๋ก DB์ ํน์ ํ ์ด๋ธ์ด ์๋ฐ์ ๊ฐ์ฒด๋ก ๋งคํ๋์ด SQL๋ฌธ์ ์ผ์ผ์ด ์์ฑํ์ง ์๊ณ ๊ฐ์ฒด๋ก ๊ตฌํํ ์ ์๋๋ก ํ๋ ํ๋ ์์ํฌ์ด๋ค. ๊ธฐ์ ์ ์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฒด๋ฅผ RDB ํ ์ด๋ธ์ ์๋์ผ๋ก ์์ํ ํด์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
ORM์ ์ฅ์
- SQL๋ฌธ์ด ์๋ Method๋ฅผ ํตํด DB๋ฅผ ์กฐ์ํ ์ ์์ด, ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ด์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋ ๋ฐ๋ง ์ง์คํ ์ ์์.
- Query์ ๊ฐ์ด ํ์ํ ์ ์ธ๋ฌธ, ํ ๋น ๋ฑ์ ๋ถ์์ ์ธ ์ฝ๋๊ฐ ์ค์ด๋ค์ด, ๊ฐ์ข ๊ฐ์ฒด์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋๋ก ์์ฑํ์ฌ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์.
- ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅ. -> ์์ฐ์ฑ ์ฆ๊ฐ
- ๋งคํํ๋ ์ ๋ณด๊ฐ Class๋ก ๋ช ์๋์ด ์๊ธฐ ๋๋ฌธ์ ERD๋ฅผ ๋ณด๋ ์์กด๋๋ฅผ ๋ฎ์ถ ์ ์๊ณ , ์ ์ง๋ณด์ ๋ฐ ๋ฆฌํฉํ ๋ง์ ์ ๋ฆฌ <- MySQL์ ์ฌ์ฉํ๋ค๊ฐ PostgreSQL๋ก ๋ณํํ๋ค๊ณ ๊ฐ์ ํด๋ ์ฟผ๋ฆฌ๋ฅผ ์์ ํ ํ์ x
ORM์ ๋จ์
- ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ํฌ๊ณ ๋ณต์กํ์ฌ ์ค๊ณ๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ, ์๋ ์ ํ ๋ฐ ์ผ๊ด์ฑ์ ๋ฌด๋๋จ๋ฆฌ๋ ๋ฌธ์ ์ ๋ฐ์ ๊ฐ๋ฅ
- ๋ณต์กํ๊ณ ๋ฌด๊ฑฐ์ด Query๋ ์๋๋ฅผ ์ํด ๋ณ๋์ ํ๋์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ SQL๋ฌธ์ ์ฌ์ฉํ ์๋ ์์.
Spring์์์ JPA
์คํ๋ง์์ ์ฌ์ฉํ๋ JPA๋ JPA๋ฅผ ์ด์ฉํ๋ spring-data-jpa ํ๋ ์์ํฌ์ด์ง, JPA๋ ์๋๋ค. (JPA๋ ์ธํฐํ์ด์ค spring-data-jpa๋ ๊ตฌํ์ฒด)
spring-data-jpa์ ์ฌ์ฉ
build.gradle
// implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
jdbc ํ๋ ์์ํฌ๋ ์ด๋ฏธ spring-data-jpa๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ด ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ง์๋ ๋๋ค.
๋ํ ์์ ์ฌ์ง์ ๋ณด๋ฉด, EntityManager๋ผ๋ ๊ฒ์ด ์๋๋ฐ ๋ง์ฝ ์ด spring-data-jpa ํ๋ ์์ํฌ๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด, ์คํ๋ง๋ถํธ๊ฐ ์๋์ผ๋ก ํ์ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ์ฌ EntityManager๋ผ๋ ๊ฒ์ ์์ฑํด์ฃผ๊ณ , ์ฐ๋ฆฌ๋ ์ฃผ์ ๋ฐ์ ์ด๊ฒ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ์ผ๋ค์ ํด์ค๋ค.
์ด ํ๋ ์์ํฌ์ ๋ํด ์ค์ ์ ํด์ฃผ๊ณ ์ถ์ผ๋ฉด, application.properties์์
spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none
์ ๊ฐ์ด ์ค์ ํด์ค ์ ์๋ค.
ddl-auto: ํ ์ด๋ธ์ ์๋์ผ๋ก ์์ฑํ ๊ฒ์ธ์ง์ ๋ํ ์ค์
show-sql: JPA๊ฐ ์ฌ์ฉํ๋ SQL๋ฌธ์ ์ถ๋ ฅํด์ค ๊ฒ์ธ์ง์ ๋ํ ์ค์
์ ๊ฐ์ด ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋๋ง๋ค ์ถ๋ ฅ๋๋ค.
์คํ๋ง ๋ฐ์ดํฐ JPA ์ ๊ณต ๊ธฐ๋ฅ
- ์ธํฐํ์ด์ค๋ฅผ ํตํ ๊ธฐ๋ณธ์ ์ธ CRUD
- findByName(), findByEmail()๊ณผ ๊ฐ์ด ๋ฉ์๋ ์ด๋ฆ ๋ง์ผ๋ก ์กฐํ ๊ธฐ๋ฅ ์ ๊ณต
- ํ์ด์ง ๊ธฐ๋ฅ ์๋ ์ ๊ณต
* ์ค๋ฌด์์๋ JPA์ ์คํ๋ง ๋ฐ์ดํฐ JPA๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ , ๋ณต์กํ ๋์ ์ฟผ๋ฆฌ๋ Querydsl์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ.
querydsl๊ณผ ์คํ๋ง ๋ฐ์ดํฐ JPA๋ก๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ฟผ๋ฆฌ๋ JPA๊ฐ ์ ๊ณตํ๋ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ ํน์ JdbcTemplate์ ์ฌ์ฉ.
References
๊น์ํ๋์ ์คํ๋ง ๊ฐ์
https://kim-oriental.tistory.com/20
'๐ปProgramming > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ