Bibi's DevLog ๐ค๐
[Spring Data JDBC] Spring Data JDBC๋? ๋ณธ๋ฌธ
[Spring Data JDBC] Spring Data JDBC๋?
๋น๋น bibi 2021. 4. 30. 19:49Spring Data JDBC
์๊ฐ
- Spring Data family ๊ตฌ์ฑ์
- JDBC ๊ธฐ๋ฐ์ผ๋ก repository๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ค๋ค
- DDD(Domain Driven Design)์์ ์๊ฐ์ ๋ฐ์
- JPA๋ณด๋ค ๊ธฐ๋ฅ์ ์ ์ง๋ง ๋ ๋จ์ํจ. ๊ฐ๋จํ๋ฉด์ ์ ํ๋ ๋ฐฉ๋ฒ๋ค์ ์ง์ํจ
์ง์ ๊ธฐ๋ฅ
CrudRepository
@Query
Id
์์ฑ- ์ด๋ฒคํธ ์ฒ๋ฆฌ
- MyBatis, Auditing, CustomConversions
์ง์๋์ง ์๋ ๊ธฐ๋ฅ
- ์บ์ฑ, ์ง์ฐ ๋ก๋ฉ
- JPA์ ๋ฌ๋ฆฌ save()ํ๋ฉด ์ ์ฅ๋๊ณ , save()ํ์ง ์์ผ๋ฉด ์ ์ฅ๋์ง ์๋๋ค.
DDD (๋๋ฉ์ธ ๊ธฐ๋ฐ ์ค๊ณ)
๋ชจ๋ spring data ๋ชจ๋์ DDD์ repository, aggregate, aggregate root์ ๊ฐ๋ ์์ ์๊ฐ์ ๋ฐ์๋ค.
aggregate
- '์งํฉ'์ด๋ผ๋ ๋ป
- ๊ฐ์ด ๋ณํํ ๋ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์งํฉ.
- ์ :
order
์item
-item
์ด ์ฃผ๋ฌธ๋๋ฉดorder
์ ์ฌ๊ณ ์๋๋ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค - aggregate์ ๊ฐ ๋ณํ๋ ์์์ ์ด๋ฉฐ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๋ค.
- Strong Consistency๋ฅผ ๋ณด์ฅํด ์ฃผ์ง ์๋๋ค. (Eventual Consistency ๋ณด์ฅ) ์ฆ, aggregate์ ๋ํ ์ฐธ์กฐ๋ ํญ์ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง ์์ง๋ง ๊ฒฐ๊ตญ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๋ค.
the Aggregate Root
- ๊ฐ๊ฐ์ aggregate์๋ ์ ํํ๊ฒ ํ๋์ aggregate root๊ฐ ์กด์ฌํจ
- aggregate root์ ๋ฉ์๋๋ฅผ ํตํด์๋ง aggregate์ ๊ฐ์ ์กฐ์ํ ์ ์๋ค
repository
- ์๊ตฌ์ ์ธ ๊ฐ์ฒด์ ์ ์ฅ์
- ํ๋์ aggregate root๋น ํ๋์ repository๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ํ๋์ aggregate root์์ ๋๋ฌํ ์ ์๋ ๋ชจ๋ ์ํฐํฐ๋ ๊ทธ aggregate root์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋๋ค.
- aggregate์๋ง ํ ์ด๋ธ(๋ฃจํธ๊ฐ ์๋ ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ ํ ์ด๋ธ)์ ๋ํ ์ธ๋ ํค๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ค๋ฅธ ์ํฐํฐ๊ฐ ๋ฃจํธ๊ฐ ์๋ ์ํฐํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ผ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
- aggregate root์ ์ฐธ์กฐ๋๋ ์ํฐํฐ๋ Spring Data JDBC์ ์ํด ์ญ์ ๋๊ณ ๋ค์ ์์ฑ๋๋ค.
Spring Data JDBC ์ ๋ํด..
๊ฐ๋ฒผ์ด ๋ง์์ผ๋ก ์คํ๋ง ๋ฐ์ดํฐ JDBC์ ๋ํ ๊ธ์ ํ๋ ์ฝ์ด ๋ณด์๋ค.
(spring data jdbc๋ถ๋ถ๋ง ์ฝ์๋ค)
JDBC๋...
DB์ ์ ๊ทผํ๊ธฐ ์ํ ์๋ฐ ํ์ค API.
- JDBC ๋๋ผ์ด๋ฒ ๋ก๋ฉ
- DBMS์ ์ฐ๊ฒฐ
- SQL๋ฌธ์ DB์ ์ ์กํ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ๋๋ค
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ - JDBC API - JDBC Driver Manager - JDBC Driver - DBMS
- JDBC Driver
- ์๋ฐ ์ฑ์ ์์ฒญ์ DBMS๊ฐ ์ดํดํ ์ ์๋ ํ๋กํ ์ฝ๋ก ๋ณํํด ์ฃผ๋ ์ด๋ํฐ ์ญํ
- ์ผ๋ฐ์ ์ผ๋ก DB์ฐ๋ ์์
์ ์ปค๋ฅ์
์ฐ๊ฒฐ, SQL ์ฟผ๋ฆฌ ์ ์ก ๋ฑ์ ์์
์ ์ํํ๋ค.
- Connection : DB์ ์ฐ๊ฒฐ (=session)
- Statement : SQL๋ฌธ์ ์คํํ๊ฑฐ๋, SQL๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฐ ์ฌ์ฉ
- ์กฐ๊ธ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ฐ๋ ๊ฒ์ด Spring JDBC Templateํด๋์ค๋ MyBatis ๊ฐ์ ํ๋ ์์ํฌ์ด๋ค.
ORM
Object-Relational Mapping
๊ฐ์ฒด์ ๊ด๊ณํDB๋ฅผ ๋งตํํ๋ ๊ธฐ์
- ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ณด๋ค ๋ก์ง ์์ฒด์ ์ง์คํ ์ ์๋๋ก ํจ
- SQL๋ฌธ์ ์ง์ ์ง์ง ์์๋ ๋จ
- ์ ์ง๋ณด์๊ฐ ํธํด์ง
JPA, Hibernate
JPA : ORM ๊ธฐ์ ์ ๋ํ ํ์ค ๋ช ์ธ.
Hibernate : JPA ํ์ค์ ๊ตฌํํ ํ๋ ์์ํฌ ์ค ํ๋
Spring Data JPA
Spring Data JPA : JPA์์ ์ถ๊ฐ๋ ์ถ์ํ ๊ณ์ธต
JPA๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ์ํ ๋ ๊ฐ๋จํ๊ณ ํฅ์๋ ๊ธฐ๋ฅ ์ ๊ณต
Spring Data JDBC
- Spring Data JPA๊ฐ ์ด๋ฏธ ์๋ ์ํ์์ 2018๋
์ ์ถ์๋์๋ค
- ์? JPA๊ฐ ๋ ๋ง์ด ์๋ํ ๋์ด์๊ณ ํธํ๊ณ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํ๋๋ฐ?
- ๋๋ฌด ๋ณต์กํ๋ค
- ๊ทธ ์ธ ์ฌ๋ฌ ๋จ์ ๋ค (Lazy Loading Exception, Dirty Checking ... ๋ฑ)
- ์? JPA๊ฐ ๋ ๋ง์ด ์๋ํ ๋์ด์๊ณ ํธํ๊ณ ๋ง์ ๊ธฐ๋ฅ์ ์ง์ํ๋๋ฐ?
Spring Data JDBC์ ํน์ง
- ์ฌํํ๋ค.
- Very simple & limited & opinionated ORM
- No Lazy Loading, Caching, Proxies and Deffered Flushing
Spring ์ ํ๋ฆฌ์ผ์ด์ - Spring Data JDBC - JDBC API - JDBC Driver Manager - JDBC Driver - DBMS
Spring Data JDBC - ๊ณต์๋ฌธ์ ์ฝ์ด๋ณด๊ธฐ
Spring Data JDBC ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ผ๋ถ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค.
9.5. Annotation-based Configuration
Spring Data JDBC์ repository ์ง์์ ์๋ฐ configuration์ ํตํ ์ด๋ ธํ ์ด์ ์ ์ํด ํ์ฑํ๋๋ค.
Example 54. ์๋ฐ configuration์ ์ฌ์ฉํ๋ Spring Data JDBC repositories
@Configuration
@EnableJdbcRepositories
class ApplicationConfig extends AbstractJdbcConfiguration {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
NamedParameterJdbcOperations namedParameterJdbcOperations(DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
TransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@EnableJdbcRepositories
๋Repository
๋ก๋ถํฐ ๋์จ ์ธํฐํ์ด์ค๋ค์ ์ํ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ ๋ค- Spring Data JDBC ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํ์ฑํํ๋ค.
AbstractJdbcConfiguration
์ Spring Data JDBC์ ์๊ตฌ๋๋ ๋ค์ํ ๊ธฐ๋ณธ ๋น๋ค์ ์ ๊ณตํ๋คDataSource
๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ์ ์์ฑํ๋ค.- ์๋์ ๋ bean ๋ฉ์๋๋ค ๋๋ฌธ์ ํ์ํ๋ค.
NamedParameterJdbcOperations
๋ SpringDataJDBC๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.- Spring Data JDBC๋ Spring JDBC์ ์ํด ์ ๊ณต๋๋ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ํ์ฉํ๋ค.
โ Spring Boot๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ํธํ๋ค.
- `DataSource`๋ฅผ ๋ง๋ค ํ์๊ฐ ์๋ค. (`spring-boot-starter-data-jdbc` ์์กด์ฑ๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.)
9.5.1. Dialects
Spring Data JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ JDBC ๋๋ผ์ด๋ฒ์ ์ํด ํน์ ๋๋ ํ๋์ ์บก์ํํ๊ธฐ ์ํด, ์ธํฐํ์ด์ค์ธ Dialect
์ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ AbstractJdbcConfiguration
์ด ์ฌ์ฉ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฒฐ์ ํ๊ณ ์ฌ๋ฐ๋ฅธ Dialect
๋ฅผ ๋ฑ๋กํ๋ ค ํ๋ค.
(์ด ๋์์ jdbcDialect(NamedParameterJdbcOperations)
์ overwritingํด ๋ฐ๊ฟ ์ ์๋ค)
๋ง์ฝ ์๋ฌด Dialect
๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋น์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ํ์ง ์์ ๊ฒ์ด๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๊ณต๊ธ์
์์๊ฒ Dialect
์ ๊ตฌํ์ฒด๋ฅผ ์ ๊ณตํ๋๋ก ์์ฒญํด์ผ ํ ๊ฒ์ด๋ค. ๋๋ ์๋์ ๊ฐ์ด ํ ์ ์๋ค :
- ๋น์ ๋ง์
Dialect
๋ฅผ ๊ตฌํํ๋ค. Dialect
๋ฅผ ๋ฐํํ๋JdbcDialectProvider
๋ฅผ ๊ตฌํํ๋ค.- Register the provider by creating a
spring.factories
resource underMETA-INF
and perform the registration by adding a lineorg.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=<fully qualified name of your JdbcDialectProvider>
9.6 Persisting Entities
์ง์ ์ํฐํฐ?
aggregate๋ฅผ ์ ์ฅํ๋ ๊ฒ์ CrudRepository.save()
๋ฉ์๋๋ฅผ ํตํด ์ํ๋๋ค.
- ๋ง์ฝ ๊ทธ aggregate๊ฐ ์๋ก์ด ๊ฒ์ด๋ผ๋ฉด, ์ด๋ aggregate root์ ์ฝ์ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ผ๋ฉฐ, ์ด์ด์ ๋ชจ๋ ์ง์ /๊ฐ์ ์ ์ผ๋ก ์ฐธ์กฐ๋๋ ์ํฐํฐ๋ฅผ ์ํ ๊ตฌ๋ฌธ์ด ์ฝ์ ๋๋ค.
- ๋ง์ฝ ๊ทธ aggregate๊ฐ ์๋ก์ด ๊ฒ์ด ์๋๋ผ๋ฉด, ๋ชจ๋ ์ฐธ์กฐ๋ ์ํฐํฐ๋ค์ ์ญ์ ๋๋ฉฐ, aggregate root๋ ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฐธ์กฐ๋ ์ํฐํฐ๋ค์ด ๋ค์ ์ฝ์ ๋๋ค. ์ธ์คํด์ค๊ฐ ์๋ก์ด ๊ฒ์ธ์ง ์ฌ๋ถ๋ ์ธ์คํด์ค์ ์ํ์ ์ผ๋ถ๋ผ๋ ๊ฒ์ ์ฃผ๋ชฉํ๋ผ.
์ด ์ ๊ทผ์ ๋ช๋ช ๋ช ํํ ๋จ์ ๋ค์ด ์๋ค.
๋ง์ฝ ์ฐธ์กฐ๋ ์ํฐํฐ์ ์ผ๋ถ๋ง์ด ์ค์ ๋ก ๋ฐ๋์๋ค๊ณ ํ๋ฉด, ์ญ์ ์ ์ฝ์ ์ ๋ญ๋น์ด๋ค.
์ด ์ ์ฐจ๊ฐ ๊ฐ์ ๋ ์ ์๊ณ ์์ผ๋ก ๊ฐ์ ๋ ์ง๋ผ๋, Spring Data JDBC๊ฐ ์ ๊ณตํ ์ ์๋ ์ด๋ค ํ๊ณ๋ค์ด ์๋ค. ๊ทธ๊ฒ์ aggregate์ ์ด์ ์ํ๋ฅผ ์์ง ๋ชปํ๋ค(๋ ๊ฒ์ด๋ค?).
๋ฐ๋ผ์ ๋ชจ๋ ์์ ์ ์ฐจ๋ ํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐพ๋ ๋ฌด์์ด๋ ๋ชจ๋ ๊ฐ์ ธ์์ผ ํ๋ฉฐ, save๋ฉ์๋๋ก ์ ๋ฌ๋ ์ํฐํฐ์ ์ํ๊ฐ ๋ฌด์์ด๋ ๊ทธ ์ํ๋ก ํ์คํ ๋ณ๊ฒฝํด์ผ ํ๋ค.
์ฒ์๋ถํฐ ์ฝ์ด๋ณด๊ณ ์๋๋ฐ ๋๋ฌด ๊ธธ๊ธฐ๋ ํ๊ณ ๊ตฌ๊ธ๋ฒ์ญ์ ๋ง์ด ๋ถ์กฑํ๊ณ ๋ด๊ฐ ๋ฒ์ญํ๊ธฐ์ ๋๋ฌด ๋๋ฆฌ๋คใ ใ ใ ใ ...