DataSource
๋ฌผ๋ฆฌ์ ์ ๋ฐ์ดํฐ์์ค(๋ฐ์ดํฐ๋ฒ ์ด์ค) ์ ๋ณด๋ฅผ ๋ด๋ ์ธํฐํ์ด์ค
โข
ํ๋์ ๋ฌผ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํํ
โข
๋ค์ํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉ
TransactionManager
์คํ๋ง ํธ๋์ญ์
๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ์ธํฐํ์ด์ค
โข
์ฉ๋์ ๋ฐ๋ผ ๋ค์ํ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ค
JPA DB ์๋ ์ค์ (java code)
์ฌํ DataSource๋ TransactionManager๋ฅผ ์๋ฐ ์ฝ๋๋ก ์์ฑํ ์ผ์ ์์๋ค. ํ์ง๋ง
์๋ฐ ์ฝ๋๋ก DataSource, TransactionManager๋ฅผ ์๋ ์ธํ
ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
โข
์ธ์ ?
โฆ
configuration properties๋ก ์ปค๋ฒ๋์ง ์๋ ์ธ๋ฐํ ์ต์
์ ์ค ๋
โฆ
๋ค์ค DataSource(ํฐ ํ๋ก์ ํธ๋ ๋ ๊ฑฐ์)
โข
์ธํ
ํด์ผ ํ๋ ์์
โฆ
DataSource
โฆ
EntityManagerFactory โLocalContainerEntityManagerFactoryBean
โช
์ถ๊ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ๋๋ฌธ์, ์ธํฐํ์ด์ค ๋ง๊ณ ๊ตฌํ์ฒด๋ฅผ ์ง์ ๋น์ผ๋ก ๋ฑ๋กํด์ผ ํ๋ค
์ผ๋ฐ์ Bean ๋ฑ๋ก
@Bean
public DataSource dataSource() {
return ๊ตฌํ์ฒด;
}
ํ์ง๋ง LocalContainerEntityManagerFactoryBean์
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
return new LocalContainerEntityManagerFactoryBean()
}
Java
๋ณต์ฌ
โฆ
PlatformTransactionManager
โข
์ธํ
๊ตฌ์ฑ: DataSource(DB ์ค์ ) โ EntityManagerFactory(JPA ์ํฐํฐ ๊ด๋ฆฌ) โ PlatformTransactionManager(ํธ๋์ญ์
๊ด๋ฆฌ)
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.H2).build();
}
/* //jdbc
@CofigurationProperties("spring.datasource")
public DataSource dataSource() {
return new DataSourceBuilder.create().build();
}
*/
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.acme.domain");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
Java
๋ณต์ฌ
@Transactional
์คํ๋ง์ด ์ ๋
ธํ
์ด์
๊ธฐ๋ฐ ํธ๋์ญ์
๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณต
โข
EntityManager ๋ถ๋ฌ์ค๊ณ โ ๊ตฌ์ญ ์ง์ ํ๊ณ โ commit(), rollback() ์ง์ ํ ํ์ ์๋ค!
โข
์๋น์ค ํด๋์ค, ๋ฉ์๋์ ์ ์ฉํ๋ ๊ฒ์ผ๋ก ๊ฐ๋จํ ํธ๋์ญ์
๊ตฌ์ญ์ ์ค์
โฆ
๋์์ ์ค์ ํ๋ฉด ๋ฉ์๋๊ฐ ์ฐ์ ์์
โข
JpaRepository๋ ๋ฉ์๋ ๋จ์ @Transactional์ด ์ด๋ฏธ ๋ถ์ด์์
โข
๊ด๋ จ ์ ๋
ธํ
์ด์
โฆ
์คํ๋ง ํ
์คํธ ์ง์ ์ ๋
ธํ
์ด์
: @DataJpaTest ์ ์ข์ ๊ถํฉ
โฆ
@Commit
โฆ
@Rollback
โข
javax.transaction.@Transactional: ์คํ๋ง ํจํค์ง๊ฐ ์๋, ๊ธฐ๋ํ๋ ๊ธฐ๋ฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก ์ฃผ์
@Transactional: attributes
@Transactional์ด ์ ๊ณตํ๋ ๋ค์ํ ์ต์
๋ค
โข
transactionManager(value): ์ฌ์ฉํ ํธ๋์ญ์
๋งค๋์ ๋ฅผ ์ด๋ฆ์ผ๋ก ํน์
โข
label: ํธ๋์ญ์
๊ตฌ๋ถ ์ง๋ ์๋ณํ๋ ๋ ์ด๋ธ
โข
propagation: ํธ๋์ญ์
์ด ์ค์ฒฉ๋ ๊ฒฝ์ฐ ๋์(ํธ๋์ญ์
ํจ๊ณผ์ ์ ํ) ๊ท์น(dafalut: REQUIRED)
โข
isolation: ํธ๋์ญ์
๋ด๋ถ ๋ฐ์ดํฐ์ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ
โข
timeout, tumeoutString: ์๊ฐ ์ ํ์ ๊ฑฐ๋ ๊ฒ์ด ๊ฑฐ๋ฅ
โข
readOnly: ์ด ํธ๋์ญ์
์์์๋ select๋ง ์ผ์ด๋๋ค๋ฅผ ํํ
โข
rollbackFor, rollbackForClassName
โข
noRollbackFor, noRollbackForClassName
@Transactional:Propagation
์ค์ฒฉ๋ ํธ๋์ญ์
์ ๋์ ๊ท์น
โข
REQUIRED(default): ํ์ฌ ์์ผ๋ฉด ๋ณด์กฐ, ์์ผ๋ฉด ์๋ก ๋ง๋ค๊ธฐ
โข
SUPPORTS: ํ์ฌ ์์ผ๋ฉด ๋ณด์กฐ, ์์ผ๋ฉด ํธ๋์ญ์
์์ด ์คํ
โข
MANDATORY: ์์ผ๋ฉด ๋ณด์กฐ, ์์ผ๋ฉด ์์ธ ์ฒ๋ฆฌ
โข
REQUIRED_NEW: ํธ๋์ญ์
์์ฑํ๊ณ ์คํ, ํ์ฌ ์๋ ๊ฒ์ ๋ฏธ๋ฃธ
โข
NOT_SUPPORTED: ํธ๋์ญ์
์์ด ์คํ, ํ์ฌ ์๋ ๊ฒ์ ๋ฏธ๋ฃธ
โข
NEVER: ํธ๋์ญ์
์์ด ์คํ, ํ์ฌ ํธ๋์ญ์
์ด ์์์ผ๋ฉด ์์ธ ์ฒ๋ฆฌ
โข
NESTED: ํ์ฌ ์์ผ๋ฉด ๊ทธ ์์์ ์ค์ฒฉ๋ ํธ๋์ญ์
ํ์ฑ
@Transactional:Isolation
ํธ๋์ญ์
๋ด๋ถ ๋ฐ์ดํฐ์ ๊ฒฉ๋ฆฌ ์์ค
โข
DEFAULT: ๋ฐ์ดํฐ๋ฒ ์ด์ค์๊ฒ ๋งก๊น
โข
READ_UNCOMMITED: dirty read + non-repeatable read + phantom read
โข
READ_COMMITED: non-repeatable read + phantom read
โข
REPEATABLE_READ: phantom read
โข
SERIALIZABLE: ์์ ์ง๋ ฌ ์ํ