Java ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ ๋ฒจ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ/์
๋ฐ์ดํธ ํ๊ฑฐ๋, ๋ฐ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Java ์ฝ๋ ๋ ๋ฒจ์์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ Java ์ ๊ณต ํ์ค API (ํ์ค ์ฌ์, Specification)
โ
Ex. mybatis, Spring JDBC, Spring Data JDBC, JPA, Spring Data JPA ๋ฑ
๐ก ์ฌ์ (Specification)
โ ์ค๊ณ๊ตฌ์กฐ / ๊ธฐ์ ์ค๋ช ์ ๋ฑ์ ์๋ฏธ
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ ๊ฐ๋ฅ
โ JDBC ๋๋ผ์ด๋ฒ (JDBC Driver)
๐ก ๋ฒค๋ (Vendor)
โ ์ฌ์ฉ์์๊ฒ ํ๋์จ์ด๋ ์ํํธ์จ์ด ๊ฐ์ ์ปดํจํฐ ์์คํ ๊ด๋ จ ์ ํ์ ํ๋งคํ ๋, ๊ทธ ๋ธ๋๋์ ์ฑ ์์ ์ง๋ ์ ์กฐ์ ์ฒด๋ ํ๋งค ํ์ฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค Connection์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ณด๊ดํ๊ณ ์ ๊ณตํ๋ ์ญํ ์ ํ๋ Connection ๊ด๋ฆฌ์
JDBC API ์ฌ์ฉํ์ฌ DB์ ์ฐ๊ณ์ ์ํ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ค ํ๋
โ ์ ํ๋ฆฌ์ผ์ด์
๋ก๋ฉ ์์ ์ Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ ์ ํ๋ฆฌ์ผ์ด์
์์ DB์ ์ฐ๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ, ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ Connection ๊ฐ์ฒด ์ฌ์ฉ
Spring Boot 2.0 ๋ถํฐ๋ HikariCP๋ฅผ ๊ธฐ๋ณธ DBCP๋ก ์ฑํ
[์ฐธ๊ณ ] https://github.com/brettwooldridge/HikariCP
์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด
SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์
๋ด๋ถ์ ์ง์ ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ค์ฌ์ด ๋๋ ๊ธฐ์
์์ฑ๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ํ, Java ๊ฐ์ฒด๋ก ๋ณํํด ์ฃผ๋ ๊ฒ์ด mybatis์ ๋ํ์ ์ธ ๊ธฐ์ ์ ํน์ง
Java ์ง์์์๋ SQL ์ค์ฌ์ ๊ธฐ์ ์์ ๊ฐ์ฒด(Object) ์ค์ฌ์ ๊ธฐ์ ๋ก ์ง์์ ์ผ๋ก ์ด์ ์ ํ๊ณ ์๋ ์ถ์ธ
โ โ
Ex. mybatis, Spring JDBC
Spring JDBC ์ Spring Data JDBC ๋ ๋ค๋ฅธ ๊ฒ !!
์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด
์ ํ๋ฆฌ์ผ์ด์
๋ด๋ถ์์ Java ๊ฐ์ฒด(Object)๋ฅผ SQL ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์๋ ๋ณํ ํ ํ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ์ ๊ทผ
๊ฐ์ฒด(Object) ์ค์ฌ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์ = ORM (Object-Relational Mapping)
Ex. JPA (Java Persistence API), Spring Data JPA, Spring Data JDBC
JPA (Java Persistence API)
- Java์ ORM ๊ธฐ์ ํ์ค ์ธํฐํ์ด์ค์ ๋ชจ์
- ์ด JPA ํ์ค ์ฌ์์ ๊ตฌํํ ๊ตฌํ์ฒด๊ฐ Hibernate
โ๏ธ ORM (Object-Relational Mapping)
- ๊ฐ์ฒด(Object) ์ค์ฌ์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ธฐ์
- ๊ฐ์ฒด(Object)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํ์ผ๋ก ์ํฐํฐ ํด๋์ค ๊ฐ์ฒด ์์ ํฌํจ๋ ์ ๋ณด๋ฅผ ํ ์ด๋ธ์ ์ ์ฅํ๋ ๊ธฐ์
[์ฐธ๊ณ ] https://geonlee.tistory.com/207
JPA์ฒ๋ผ ORM ๊ธฐ์ ์ ์ฌ์ฉํ์ง๋ง JPA์ ๊ธฐ์ ์ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ ๋ฐ์ดํฐ ๊ธฐ์
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ์๋์ ์ผ๋ก ํฌ์ง ์๊ณ , ๋ณต์กํ์ง ์์ ๊ฒฝ์ฐ์๋ Spring Data JDBC๊ฐ ๋ฐ์ด๋ ์์ฐ์ฑ ๋ณด์ฌ์ค ์ ์์
โ๏ธ JPA
โ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ๊ธฐ์
( ๊ธฐ์ ์ ์ธ ๋์ด๋์ ๋ณต์ก๋๊ฐ ๊ฝค ๋์ ํธ )
โ
โ๏ธ Spring Data JPA
โ Spring์์ JPA ๊ธฐ์ ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ์
( JPA์ ๋ํ ์ ํ ์ง์์ด ์์ด์ผ ์ ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ )
1. ํ๋ก์ ํธ์ build.gradle
์ dependencies
์ ์๋์ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
โ
( Spring Boot Initializr ์ ์ฌ์ฉํ๋ค๋ฉด spring-boot-starter-data-jdbc
์ถ๊ฐ )
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
2. ์ธ๋ฉ๋ชจ๋ฆฌ(In-memory) DB์ธ H2๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ก์ ํธ์ build.gradle
์ dependencies
์ ์๋์ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
runtimeOnly 'com.h2database:h2'
โ๏ธ ์ธ๋ฉ๋ชจ๋ฆฌ(In-memory) DB
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์์๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
โ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ค์งํ๋ค๊ฐ ๋ค์ ์คํ์ํค๋ฉด ์ธ๋ฉ๋ชจ๋ฆฌ DB ์์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ฌ๋ผ์ง
โ - ํ ์คํธ์ ํ์ํ ๋ฐ์ดํฐ ์ด์ธ์ ๋๋จธ์ง ์ธ๋ฐ์๋ ๋ฐ์ดํฐ๊ฐ ํ ์ด๋ธ์ ์์ด์ ํ ์คํธ์ ์ ํ๋ ๋ฉด์์ ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ
โ - ๋ก์ปฌ ํ ์คํธ ํ๊ฒฝ์์๋ ์ธ๋ฉ๋ชจ๋ฆฌ(In-memory) DB ์ฌ์ฉ์ ๊ถ์ฅ
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด์ ํ ์คํธ๋ฅผ ์งํํ๊ณ ์ฝ๋๋ฅผ ์์ ํ๋ ์์ ์ ๋ฐ๋ณตํ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๊ธฐ ์ํ๋ฅผ ๊นจ๋ํ๊ฒ ์ ์งํ ์ ์๊ธฐ ๋๋ฌธ
โ
โ ์ด์ ํ๊ฒฝ์์๋ ๋น์ฐํ ์ธ๋ฉ๋ชจ๋ฆฌ(In-memory) DB ์ ๋ ์ฌ์ฉ X
( ๋ฐ์ดํฐ๊ฐ ์ง์์ง๊ธฐ ๋๋ฌธ์ )
3. application.yml ํ์ผ์ H2 Browser ํ์ฑํ ์ค์ ์ถ๊ฐ
application.properties
/ application.yml
๋ผ๋ ๋น์ด ์๋ ํ์ผ์ด ์์[์ฐธ๊ณ ] https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html
spring: h2: console: enabled: true
โ ์น ๋ธ๋ผ์ฐ์ ์(H2 ์ฝ์)์์ H2 DB์ ์ ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌํ ์ ์์
โ
.properties
ํ์ผ๋ณด๋ค.yml
ํ์ผ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ณด(ํ๋กํผํฐ)๋ฅผ depth ๋ณ๋ก ์ ๋ ฅํ ์ ์๋ ๋ ๋์ ๋ฐฉ๋ฒ์ ์ ๊ณต !
โ
โ ์ฒซ ํ์ผ์ด.properties
๋ผ๋ฉด, ํ์ผ ์ ํ ํ [Shift + F6] ํค๋ก ํ์ผ ํ์ฅ์.yml
๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
4. H2 DB ์ ์ ๋์ ์ ๋ฌด ํ์ธ
H2 console available at '/h2'. Database available at 'jdbc:h2:mem:test
๋ก๊ทธ๊ฐ '์ด์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ ์ค๋น๊ฐ ๋์์ผ๋ฉฐ, ์น ๋ธ๋ผ์ฐ์ ๋ก ์ ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ ์ ์์'์ ์๋ฏธ5. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์
๋ก๊ทธ์์ ํ์ธํ URL ์ปจํ
์คํธ์ธ /h2
๋ฅผ ๋ณต์ฌํด ์น ๋ธ๋ผ์ฐ์ ์ localhost:8080/h2
์
๋ ฅ
์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ์ ์ถ๋ ฅ๋ jdbc:h2:mem:test
๋ฅผ ๋ณต์ฌํด ์น ๋ธ๋ผ์ฐ์ ์์ ๋ฌ ์ฐฝ์ [JDBC URL] ํญ๋ชฉ์ ๋ถ์ฌ๋ฃ๊ธฐ
โ
( ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ณด์ธ๋ค๋ฉด H2 DB์ ์ ์์ ์ผ๋ก ์ ์ํ ๊ฒ ! )
โ
โ ์ด์ ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํ๊ณ ํ
์คํธ๋ฅผ ํด๋ณด๋ฉด์ H2 DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ ์ฅ๋์๋์ง ๋ฑ์ H2 ์ฝ์์ ํตํด์ ํ์ธ ๊ฐ๋ฅ
โ๏ธ H2 DB ๋ํดํธ ์ค์ ์ ๋ฌธ์ ์
- H2 DB๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์์ ํ ๋ ๋ง๋ค ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ์ ์ถ๋ ฅ๋๋ JDBC URL์ด ๋งค๋ฒ ๋๋คํ๊ฒ ๋ฐ๋
โ ๋งค๋ฒ ๋๋คํ๊ฒ ๋ณ๊ฒฝ๋ JDBC URL์ ๋ค์ ์ ๋ ฅํ๋ ๊ฒ์ด ์๋นํ ๋ถํธ
โ
โ ์ด๋ application.yml ํ์ผ์ H2์ ๋ํ ์ถ๊ฐ ์ค์ ์ ํจ์ผ๋ก์จ ํด๊ฒฐ ๊ฐ๋ฅspring: h2: console: enabled: true path: /h2 # Context path ๋ณ๊ฒฝ datasource: url: jdbc:h2:mem:test # JDBC URL ๋ณ๊ฒฝ
์์ ๊ฐ์ด
URL Context path
์JDBC URL
๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ฉด, ๋๋คํ๊ฒ ๋ฐ๋์ง ์๊ณ ๊ณ ์ ๋์ด ์ฌ์ฉ ๊ฐ๋ฅ !
( ์ ์์์์๋ URL Context path -/h2
, JDBC URL -jdbc:h2:mem:test
๋ก ์ค์ )
build.gradle์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ์์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
application.yml ํ์ผ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ค์ ํ๊ธฐ
โschema.sqlโ ํ์ผ์ ํ์ํ ํ ์ด๋ธ ์คํฌ๋ฆฝํธ ์์ฑ
application.yml ํ์ผ์์ โschema.sqlโ ํ์ผ์ ์ฝ์ด์ ํ ์ด๋ธ์ ์์ฑํ ์ ์๋๋ก ์ด๊ธฐํ ์ค์ ์ถ๊ฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ๊ณผ ๋งคํํ ์ํฐํฐ(Entity) ํด๋์ค ์์ฑ
์์ฑํ ์ํฐํฐ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ์ ์ฒ๋ฆฌํ Repository ์ธํฐํ์ด์ค ์์ฑ
์์ฑ๋ Repository ์ธํฐํ์ด์ค๋ฅผ ์๋น์ค ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋๋ก DI
DI ๋ Repository์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์๋น์ค ํด๋์ค์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CRUD ์์ ์ํ
โ ์๋น์ค ๊ณ์ธต์ Service ํด๋์ค์ ๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต์ Repository ์ธํฐํ์ด์ค๋ฅผ ์ด๋ป๊ฒ ์ฐ๋ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋์ง๊ฐ ํต์ฌ !
๊ทธ๋๋ ๋ง์ด ์ด๋ ต์ง ์๊ณ ์ฌ๋ฐ์๋ ํ๋ฃจ !!
ํ์ง๋ง ํ๊ณ ํ๊ณ ์์๊ฐ ๊ฐ๋
๋ค์ด ๋ง๋ค ใ
ํ์ดํ