# 스프링 트랜잭션
선언적 트랜잭션 - 스프링은 선언적 트랜잭션 방식을 사용
- 어노테이션을 이용한 선언적 방식
- AOP를 이용한 선언적 방식
- 프로그래머틱한 방식(권장되지 않음)
스프링에서 트랜잭션 처리 모범 사례
- 선언적 방식에 의한 트랜잭션 처리
- 트랜잭션은 주로 서비스 메서드를 대상으로 함
# 어노테이션에 의한 트랜잭션
@root-context.xml 에 Transaction Manager를 설정
<tx:annotation-driver ../> 설정
<bean id="transactionManger"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManger" />
트랜잭션이 필요한 클래스나 메소드에 @Transactional 어노테이션 추가
주로 서비스 클래스의 메소드에 적용
# AOP를 이용한 트랜잭션
트랜잭션 매니저 설정
<bean id="transactionManger"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
트랜잭션 어드바이스 설정
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="delete" />
</tx:attributes>
</tx:advice>
AOP 설정
<aop:config>
<aop:pointcut id="transactionPointcut"
expression="execution(*kr.co.acomp.hello.service.*.*(..)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />
</aop:config>
# SLF4J와 Logback을 이용한 로그 남기기
- Java 진영에는 많은 로깅툴이 존재(commons-logging, log4j, java util logging, logback)
- 이전에는 log4j와 commons-loggin이 주로 사용됨(spring도 commons-logging을 사용해 로그를 남김)
- SLF4J가 등장 후 비중이 커지고 있음
- 여러 오픈소스 프로젝트 사용 시 Logging tool이 혼재되어 충돌이 발생하는데 이에 대해 Logging Tool을 통일 시켜야함
- SLF4J, Logback으로 통일을 함
# 실습 - 트랜잭션, 로깅 설정
datasource.xml 설정 파일 수정을 통한 트랜잭션 설정
...
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
...
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* kr.co.acomp.hello.service.*Service.*(..))"
id="transactionPointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut"/>
</aop:config>
...
로깅 설정
pom.xml에서 commons-loggin 제외
...
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
그 후 src/main/resources/loback.xml 파일을 생성 후 양식에 맞게 기록
'Archived(Programming) > Spring #2(기초)' 카테고리의 다른 글
예외처리 (0) | 2020.03.18 |
---|---|
PointCut 표현식과 Advisor 구현 (0) | 2020.03.17 |
AOP(Aspect Oriented Programming) (0) | 2020.03.17 |
Dynamic SQL (0) | 2020.03.17 |
Mapper XML 파일 (1) | 2020.03.16 |