Merge branch 'refs/heads/dev' into xithoon

pull/24/head
xhoon 4 weeks ago
commit 46a7008155

@ -7,7 +7,7 @@ import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.*; import org.springframework.transaction.interceptor.*;
@ -17,79 +17,58 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
/** /**
* @ClassName : EgovConfigAppTransaction.java * @ClassName : EgovConfigTransaction.java
* @Description : Transaction * @Description : Transaction
*
* @author :
* @since : 2021. 7. 20
* @version : 1.0
*
* <pre>
* << (Modification Information) >>
*
*
* ------------- ------------ ---------------------
* 2021. 7. 20
* </pre>
*
*/ */
@Slf4j @Slf4j
@Configuration @Configuration
public class EgovConfigTransaction { public class EgovConfigTransaction {
@Autowired @Autowired
DataSource dataSource; DataSource dataSource;
@PostConstruct @PostConstruct
public void init() { public void init() {
log.info("Datasource type: {}", dataSource.getClass().getName()); log.info("Datasource type: {}", dataSource.getClass().getName());
} }
@Bean // ✅ 더 이상 DataSourceTransactionManager 직접 생성 X
public DataSourceTransactionManager txManager() { // JPAConfig 에서 만든 "transactionManager" (JpaTransactionManager)를 주입받아 사용
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
// ------------------------------------------------------------- @Bean
// TransactionAdvice 설정 public TransactionInterceptor txAdvice(PlatformTransactionManager transactionManager) {
// ------------------------------------------------------------- TransactionInterceptor txAdvice = new TransactionInterceptor();
txAdvice.setTransactionManager(transactionManager);
txAdvice.setTransactionAttributeSource(getNameMatchTransactionAttributeSource());
return txAdvice;
}
@Bean private NameMatchTransactionAttributeSource getNameMatchTransactionAttributeSource() {
public TransactionInterceptor txAdvice(DataSourceTransactionManager txManager) { NameMatchTransactionAttributeSource txAttributeSource = new NameMatchTransactionAttributeSource();
TransactionInterceptor txAdvice = new TransactionInterceptor(); txAttributeSource.setNameMap(getRuleBasedTxAttributeMap());
txAdvice.setTransactionManager(txManager); return txAttributeSource;
txAdvice.setTransactionAttributeSource(getNameMatchTransactionAttributeSource()); }
return txAdvice;
}
private NameMatchTransactionAttributeSource getNameMatchTransactionAttributeSource() { private HashMap<String, TransactionAttribute> getRuleBasedTxAttributeMap() {
NameMatchTransactionAttributeSource txAttributeSource = new NameMatchTransactionAttributeSource(); HashMap<String, TransactionAttribute> txMethods = new HashMap<>();
txAttributeSource.setNameMap(getRuleBasedTxAttributeMap());
return txAttributeSource;
}
private HashMap<String, TransactionAttribute> getRuleBasedTxAttributeMap() { RuleBasedTransactionAttribute txAttribute = new RuleBasedTransactionAttribute();
HashMap<String, TransactionAttribute> txMethods = new HashMap<String, TransactionAttribute>(); txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttribute.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
RuleBasedTransactionAttribute txAttribute = new RuleBasedTransactionAttribute(); // 이름 패턴별 트랜잭션 속성 설정
txAttribute.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); // 여기서는 모든 메서드에 동일 룰 적용
txAttribute.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class))); txMethods.put("*", txAttribute);
txMethods.put("*", txAttribute);
return txMethods; return txMethods;
} }
// ------------------------------------------------------------- @Bean
// TransactionAdvisor 설정 public Advisor txAdvisor(PlatformTransactionManager transactionManager) {
// ------------------------------------------------------------- AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(
@Bean "execution(* go.kr.project..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))"
public Advisor txAdvisor(DataSourceTransactionManager txManager) { );
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut(); return new DefaultPointcutAdvisor(pointcut, txAdvice(transactionManager));
pointcut.setExpression( }
"execution(* go.kr.project..impl.*Impl.*(..)) or execution(* egovframework.com..*Impl.*(..))");
return new DefaultPointcutAdvisor(pointcut, txAdvice(txManager));
}
} }

@ -3,9 +3,8 @@ package egovframework.config.JPAConf;
import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory; import javax.persistence.EntityManagerFactory;
@ -17,22 +16,28 @@ public class JPAConfig {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
/** QueryDSL용 JPAQueryFactory */
@Bean @Bean
public JPAQueryFactory jpaQueryFactory() { public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em); return new JPAQueryFactory(em);
} }
/**
*
*/
@Bean(name = "transactionManager") @Bean(name = "transactionManager")
@Primary
public JpaTransactionManager transactionManager(EntityManagerFactory emf) { public JpaTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf); return new JpaTransactionManager(emf);
} }
// @Bean // 필요하면 나중에 다시 켜서 쓰면 됨
// public JpaVendorAdapter jpaVendorAdapter() { // @Bean
// HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); // public JpaVendorAdapter jpaVendorAdapter() {
// adapter.setShowSql(false); // HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
// adapter.setGenerateDdl(false); // adapter.setShowSql(false);
// adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect"); // adapter.setGenerateDdl(false);
// return adapter; // adapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect");
// } // return adapter;
// }
} }

Loading…
Cancel
Save