[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ DB ์ฐ๋ (๊ธฐ๋ณธํธ)
Spring Data JDBC๋ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๊ณ ์๋ Spring JDBC์๋ ์กฐ๊ธ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
JDBC ํ ํ๋ฆฟ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ ๋ ฅํ๊ณ ์ฐ๋ฆฌ๊ฐ ์ด๋ค์ ํจ์ ํํ๋ฅผ ์ง์ ์ธํฐํ์ด์ค๋ก ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ด ๋ง์ด ๊ฐ๋๋ค. ๋ฐ๋ผ์ ์ด๋ค์ Spring Data Commons๋ฅผ ๋ฐํ์ผ๋ก ์ฌ๊ตฌ์ฑํ ๊ฒ์ด ๋ฐ๋ก Spring Data JDBC ์ ๋๋ค.
Background of Spring Data JDBC
์ฐ๋ฆฌ๋ ์ด์ ๊ธ์์ Spring Data Commons๊ฐ ๋ฌด์์ธ์ง๋ฅผ ์์๋ดค์ต๋๋ค. ์คํ๋ง์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ๋์ด ์๋ CRUD์ ์ถ์ํ ๋ ์ด์ด๋ฅผ ๋ง๋ ๊ฒ์ด ๋ฐ๋ก Spring Data Commons ์ธ๋ฐ์. ์ด๋ฅผ ๋ฐํ์ผ๋ก JPA๋ฅผ ๋ฃ์ ๊ฒ์ด ๋ฐ๋ก Spring Data JPA์ ๋๋ค.
์ฌํ๊น์ง Spring Data JPA๋ฅผ ์ ์ฌ์ฉํ์ ๋ถ๋ค์ด๋ผ๋ฉด Spring Data JDBC๊ฐ ์ ๋ฑ์ฅํ๋์ง ์์ํด ํ์ค ์๋ ์์ ๊ฒ์ ๋๋ค. JPA์ lazy loading๊ณผ ์์์ฑ ์ปจํ ์คํธ๋ก ๋ง๋ค์ด์ง ์บ์ ๊ธฐ๋ฅ, Dirty checking์ ๊ทธ์ผ๋ง๋ก ํ๋ฅญํฉ๋๋ค. ํ์ง๋ง ์ด๋ค ๊ธฐ๋ฅ์ด ํ์ ์๊ฑฐ๋ ๋๋ฌด ๋ฌด๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ฉด ๊ทธ๋งํผ ๋จ์ ์ด ๋ฐ๋ฅด๊ธฐ ๋ง๋ จ์ ๋๋ค.
lazy loading์ด ๋จ์ ์ด ๋๋ ๋ถ๋ถ์ ์ด๋ค ๊ฒ์ผ๊น์? ์ฐ๋ฆฌ๊ฐ ๋จ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด lazy loading์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ํ์น ์์ ๊ฒ์ ๋๋ค. ์ด๋ฅผํ ๋ฉด users ํ ์ด๋ธ์ ์๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ฃผ์ธ์. ๋ผ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ ๋ ์ด์ ์ฐ๊ฒฐ๋ ํ ์ด๋ธ์ด ์๋ฌด๊ฒ๋ ์๋ค๋ฉด ๊ทธ์ ๊ฑฐ๊ธฐ์ ์์๋์ด ์๋ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์ค๋ฉด ๋๋ฏ๋ก lazy loading์ด ํ์ํ์ง ์์ต๋๋ค.
ํ์ง๋ง users ํ ์ด๋ธ์ team๊ณผ ๊ฐ์ ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ์ ์ข ์์ด ๋์ด ์๋ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์? ๋ง์ฝ ์ด๋ค์ ๋จ์ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๋ถ๋ฌ์จ๋ค๋ฉด ๊ทธ์ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ค์ ๋ณด์ฌ์ง์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ join ๋ฑ์ ์ด์ฉํด ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ด ๋ถ๋ฌ์ผ๋ง ๊ทธ๋ค์ ๋ฐ์ดํฐ์ ํจ๊ผ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ์๋ ์๋ธ ์ฟผ๋ฆฌ. ์ฆ, team ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ์ users ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๊ทธ ์์ ์ด ๋ช ํํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. users ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊ฐ์ ธ์ฌ ์๋ ์๊ณ , team ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๊ฒฝ์ฐ๋ ORM ์ฆ, JPA ๋ด์ง Hibernate์์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ORM์ ๊ฒฝ์ฐ๋ ์ธ์ ํน์ ์ ์ฅ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ค๋ ์ ์ ์์ด ๊ทธ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ๋๊ณ ๊ทธ๊ณณ์ ๋ณด๊ดํด๋๋ค๊ฐ ๋ค์ ํธ์ถ์ด ๋๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก ์ ํจ์ฑ์ด ์๋ค๋ ๊ฒ์ด์ฃ . ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ฐ์ดํฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ด๋ค์ ๋ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ค์ผํ๋ ๋ฑ ์์ด ๋ง์ด ๊ฐ๋ ๊ฒ๋ ๋จ์ ์ด ๋ ์ ์์ต๋๋ค.
Lazy loading์ ๋จ์ ์ ์งง๊ฒ ์์ฝํ๋ค๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- lazy loading์ด ๋ฐ์๋๋ ์์ ์ ์ ํํ ์ ์ ์์ด ์ํ์ง ์๋ ์๊ฐ์ ์ฑ๋ฅ์ ์ธ ์ํฅ์ ์ด๋ํจ.
- ๊ฐ์ฒด ์ด๊ธฐํ์ ๋ฐ์๋๋ ํ๋ก์ ๊ฐ์ฒด์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋๋ก ํด์ค์ผ ํจ.
์ด๋ฌํ ๋ฒ๊ฑฐ๋ก์ด ์ ์ด ์๋ ๊ฒ์ ๋ณด์์ ๋ ์ฐ๋ฆฌ๊ฐ ๋ฐ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ธฐ ์ํด ๋ฐ๋์ Spring Data JPA๋ฅผ ์ด๋ค๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ผ์ด ์๋ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก iBatis๋ MyBatis์๋ lazy loading์ด ์กด์ฌํ์ง๋ง ์์์ ๋งํ ๋จ์ ๋๋ก ๊ทธ ์์ ์ ์ ํํ๊ฒ ๋จ์ ์ง์ ์ ์์์ผ๋ก ์ธํ ๋จ์ ๋๋ฌธ์ ์คํ๋ ค ์ค๋ฒ ์์ง๋์ด๋ง์ด ๋๋ค๋ ๊ฒ์ด์ฃ .
JPA๊ฐ ๊ฐ์ง ์ง์ฐ ๋ก๋ฉ, ๋ํฐ ์ฒดํน, ์บ์ ๋ฑ์ ์ฅ์ ์ ๊ฐ์ง ๊ธฐ์ ๋ค์ ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋จ์ ์ผ๋ก ์ด์ด์ง ์ ์๋๋ฐ, ์ด๋ฌํ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ์์๋ฅผ ์ ๊ฑฐํ๊ณ ๊ฐ๋ฅํ CRUD ๊ธฐ๋ณธ(๋จ์ํ ์์ )์ ์ถฉ์คํ ๋ชจ๋์ ๋๋ค.
Architecture of Spring Data JDBC
Spring Data JDBC๋ ๊ทธ ๊ตฌ์กฐ๊ฐ ๊ต์ฅํ ์ฌํํฉ๋๋ค. JPA๋ JDBC ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์ณ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์๋๋ ๊ตฌ์กฐ๊ฐ ์๋ ์์์ฑ ์ปจํ ์คํธ์์ ์๋ง์ ์์ ์ ํตํด ์์ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐฉ์์ธ๋ฐ์.
Spring Data JDBC๋ ๊ธฐ๋ณธ์ ์ธ JDBC ์์ ๋ฐฉ์์ ๋ฐ๋ฆ ๋๋ค.
์ ์ด๋ฏธ์ง๋ ์ผ๋ฐ Java application์ผ๋ก DB๋ฅผ ์ฐ๋ํ์ ๋์ ์์์ ๋๋ค. Connection์ ์์ฑํ ํ Statement ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ์์๋ก ์ฐ๋ํ๋ ๊ฒ์ธ๋ฐ, Spring Data JDBC๋ Spring Data Commons๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ํ์ฌ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ํฉ๋๋ค.
๋ํ Spring Data Commons๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ Spring Data JPA๋ฅผ ์ฐ์ ๋ถ๋ค์ด๋ผ๋ฉด ์ฝ๋์๋ ํฐ ์ฐจ์ด๊ฐ ์์ด ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
How to use
Spring Initializr๋ฅผ ์ด์ฉํ์ฌ ์๋์ ๋ํ๋์๋ฅผ ์ถ๊ฐํด ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ํ๋ ๊ฒ์ ๊ณจ๋ผ ์ฌ์ฉํ์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค. ์ ๋ PostgreSQL์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ DB ์คํค๋ง ์์ฑ์ ์ํด flyway๋ฅผ ๋ถ์ด๋๋ก ํ๊ฒ ์ต๋๋ค.
Memo๋ผ๋ ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ๊ณ ์ ๊ฐ์ผ๋ก id๋ฅผ ์ฃผ๊ณ , ์ ๋ชฉ๊ณผ ๋ด์ฉ์ ์ ์ ์ ์๋ ์ปฌ๋ผ ๋๊ฐ๋ฅผ ๋ง๋ค๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ก์ ํธ์ ๊ตฌ์กฐ๋ฅผ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋ง๋ค๊ณ , DB์ ์ ์์๋๋์ง ํ์ธํ๊ธฐ ์ํด Test ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
flyway์ entity๋ฅผ ์ด๊ธฐํํ๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ SQL ์ฟผ๋ฆฌ์ ๋๊ฐ์ด ๋ง๋ค์ด์ฃผ๊ณ , Primary key ์ง์ ์ ์ํด Id ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
Spring Data์ ์ถ์ํ repository์ธ CrudRepository๋ฅผ ์์๋ฐ์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ถ๋ถ์ Spring Data JPA์ ๋์ผํฉ๋๋ค.
application.yml ํ์ผ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ์ ๋ ฅํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , flyway ์ค์ ์ ๋ฒ์ ์ ๊ด๋ฆฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐ์ด ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์ locations๋ db ๋ฒ์ ๋ณ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ๊ณณ์ด๊ณ vendor๋ ๊ฐ DB ๋ฒค๋ ๋ณ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์งค ์ ์์ต๋๋ค.
schema๋ ๋ฒ์ ์ ๊ด๋ฆฌํ ์คํค๋ง, table์ ๋ฒ์ ๋ณ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ ๊ธฐ๋ก์ ํ ์ด๋ธ ์ด๋ฆ์ ๋ฃ๋ ๊ณณ์ ๋๋ค.
E2E ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ ๋ชฉ์ Practice memo, ๋ด์ฉ๋ Practice memo๋ก ๋ค์ด๊ฐ ์ ์๋๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ค ํ ์คํธ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์ ์์ ์ผ๋ก ์ ๋์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง Spring Data JDBC์ ๋ฐฐ๊ฒฝ๊ณผ ๊ตฌ์กฐ๋ฅผ ์์๋ณด๊ณ , ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ๋ํด ์ ์ด๋ดค์ต๋๋ค. ์ฌ์ฉ๋ฒ์ด๋ ํน์ง ๋ฑ์ ๋ํด์๋ ๊ธฐ์กด์ ๋ฐฉ๋ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. ๋ค๋ง ์ด์ ์ iBatis, MyBatis ๋ฑ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ ๊ฐ๋ฐ์๋ค์ด๋ผ๋ฉด ์์ผ๋ก๋ Spring Data JDBC๋ก ๋์ฒด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ์ตํ๋๋ ๊ฒ๋ ์ข์ ์ ์์ต๋๋ค.
JPA์ ์ฅ์ ์ธ ์บ์, ์ง์ฐ ๋ก๋ฉ ๋ฑ์ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ํ ์ด๋ธ์ ์์ฑํ๋ DDL ๋ฑ๋ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒ์ ๊ด๋ฆฌ ๊ธฐ์ ๋ฑ์ ์ด์ฉํ๊ฑฐ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์๋ฒ์ ์ง์ํ์ฌ DDL ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์คํ์์ผ์ผ ํ๋ ๋ถํธํจ๋ ํฌํจ๋์ด ์์ต๋๋ค.
ํ์ง๋ง JPA๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์งํํ์ ๋ถ๋ค์ด๋ผ๋ฉด ์คํ๋ ค ์ด๋ฐ ๋ฐฉ๋ฒ์ด ๋ฐ๊ฐ์ธ ์๋ ์์ต๋๋ค. JPA๊ฐ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ง๋๊ณ ์์ด ๋ก๋ฉ์ด๋ ๋ณ๊ฒฝ ์ฒดํฌ์๋ ์ ๋ฆฌํ์ง๋ง ์ค์ ๋ก ๋ฒ์ ๊ด๋ฆฌ ๋ฑ์๋ ์ฝํ ๋ชจ์ต์ ๋ณด์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ์ ๋ถ๋ค์ด๋ผ๋ฉด JPA์ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ ์ ๋ฒ๋ ค๋๊ณ Spring Data์ ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด์ ์ด์ ์ ๋๋ฆด ์๋ ์์ต๋๋ค.
๋ค์ ๊ธ์์๋ ์๋ธ ์ฟผ๋ฆฌ ๋ฑ์ ์ฌ์ฉํ๋ ํ ์ด๋ธ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ ๋ฑ์ ์์๋ณด๋ ์์ฉํธ์ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ ๋ค์ํ ID ์ ๋ต๊ณผ ์๋ ID ์ ๋ต ๊ตฌํ์ ์ฃผ์์ (0) | 2022.01.08 |
---|---|
[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ DB ์ฐ๋ (์์ฉํธ) (0) | 2021.06.19 |
[Spring Data] Spring Data module (0) | 2021.05.29 |
[Spring boot] Spring ํ ์คํธ ๋ฐฉ๋ฒ๊ณผ @SpringBootTest (0) | 2021.05.16 |
[Spring boot] Axon Framework ๋ง๋ณด๊ธฐ (0) | 2021.03.27 |