본문 바로가기

Archived(Programming)/Spring #2(기초)

트랜잭션과 로깅

# 스프링 트랜잭션

선언적 트랜잭션 - 스프링은 선언적 트랜잭션 방식을 사용

  • 어노테이션을 이용한 선언적 방식
  • 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으로 통일을 함

SLF4J, LogBack 의존성 추가
 LogBack을 xml파일을 통해서 설정해야 사용 가능

 

Logback Logger/Appeder 추가
Logback Log의 패턴
5가지 레벨의 로그

 

# 실습 - 트랜잭션, 로깅 설정

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