스프링(Spring)

스프링 트랜잭션과 로깅

개발학생 2022. 12. 5. 00:41
반응형

*22년 4월 한 달간 한국이러닝협회의 '실전 개발자를 위한 Spring Framework'를 수강하고 정리한 내용입니다

*모든 이미지의 출처는 한국이러닝협회의 '전 개발자를 위한 Spring Framework'에 있습니다

 

 

 

1. 스프링 트랜잭션

1) 트랜잭션 처리

(1) 프로그램에 의한 트랜잭션 처리 (권장되지 않음)

(2) 선언적 트랜잭션 [스프링에서 이 방식을 사용]

 

2) 스프링 트랜잭션 처리 모범사례 

- 선언적 방식에 의한 트랜잭션 처리 (주로 서비스 메소드를 대상으로 함)

 

(1) 어노테이션에 의한 트랜잭션

- @root-context.xml에 Transaction Manager 설정

- <tx:annotation-driven .. /> 설정

<!-- Transaction Manager -->
<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

 

- 트랜잭션이 필요한 클래스나 메소드에 @Transactional

- 주로 서비스 클래스의 메소드에 적용

 

(2) AOP를 이용한 트랜잭션

- 트랜잭션 매니저 설정

<!-- Transaction Manager -->
<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="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>

 

2. 로깅

1) JAVA 진영의 로깅툴(Logging Tool)

(1) commons-logging

(2) log4j

 

(3) java util logging

 

(4) Logback

 

(5) SLF4J

 

- 여러 오픈소스 프로젝트를 사용하다 보면 로깅툴이 혼재되어 충돌하는 경우가 빈번함 -> 로깅툴 통일 필요

- 가장 최근에 나오고 가장 많이 사용되고 있는 SLF4J, Logback으로 통일함

 

2) SLF4J와 Logback을 이용한 로그 만들기

(1) SLF4J, Logback Dependency 추가

<dependency>
	...
    
    <exclusions>
    	<exclusion>
    		<groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
    	</exclusion>
    </exclusions>    
</dependency>

<dependency>
	<groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
   	<version>1.7.10</version>
</dependency>

<dependency>
	<groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
<dependency>

 

(2) Logback 설정 - logback.xml 수정

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    	<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        	<pattern>
            	%-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
            </pattern>
        </encoder>
	</appender>

	<logger name="org.springframework" level="INFO" />
    
    <root level="info">
		<appender-ref ref="console" />
    </root>
</coufiguration>

 

(3) Logback Logger / Appeder - 기존 파일에 코드 추가

- 단순 파일 로깅

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    	...
    </appender>
    
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    	<file>c:\testFile.log</file>
        <append>true</append>
        <encoder>
        	<pattern>
            	%-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
        	</pattern>
        </encoder>
    </appender>
    
    ...
    
    <root level="info">
    ...
    	<appender-ref ref="FILE" />
    </root>
<configuration>

 

- 파일 롤링: 날짜별 / 시간별 로깅파일 분리

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    	...
    </appender>
    
    <appender name="dailyRolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
    	<file>c:\logFile.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        	<!-- <fileNamePattern>c:\logFile.%d{yyyy-MM-dd}.log</fileNamePattern> -->
            <fileNamePattern>c:\logFile.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        <rollingPolicy>
        
        <encoder>
        	<pattern>
            	%-5level %d{HH:mm:ss.SSS} [%thread] %logger[%method:%line] - %msg%n
        	</pattern>
        </encoder>
    </appender>
    
    ...
    
    <root level="info">
    ...
    	<appender-ref ref="dailyRolling" />
    </root>
<configuration>

 

(4) Logback Log의 패턴

Conversion Pattern Description
%thread 실행할 스레드 이름
%msg 로깅 내용
%n 개행 문자(new line 출력)
%-5level 로깅 레벨(erro, warn, info, debug, trace) 출력,
고정폭(5자리), 로깅 레벨이 info일 경우 빈칸 하나 추가
%d{yyyy-MM-dd HH:mm:ss.SSS} 로깅하고 있는 현재 시간, 시/분/초/밀리초
%logger 패키지 포함 클래스 정보
%logger{0} 패키지를 제외한 클래스 이름만 출력
%method 로깅하고 있는 클래스의 메소드
%line 로깅하고 있는 클래스 소스의 line

 

(5) Logback 로그 레벨

- Logback에는 5가지 로그 레벨이 존재함

 

1단계 - TRACE

    - Trace, Debug, Info, Warn, Error를 포함

    - logger.trace("..");

 

2단계 - DEBUG

    - Debug, Info, Warn, Error를 포함

    - logger.debug("..");

 

3단계 - INFO

    - Info, Warn, Error를 포함

    - logger.info("..");

 

4단계 - WARN

    - Warn, Error를 포함

    - logger.warn("..");

 

5단계 - ERROR

    - Error만 포함

    - logger.error("..");

 

* logback.xml 파일명 변경 및 적용

- Logback은 기본 설정파일로 logback.xml을 필요로 함

- 스프링은 기본 설정파일을 Listener를 통해서 변경이 가능하도록 지원해주는데, Logback의 경우 'logback-ext-spring'을 필요로 함

- logback-ext-spring dependency 추가

<dependency>
	<groupId>org.logback-extensions</groupId>
    <artifactId>logback-ext-spring</artifactId>
    <version>0.1.2</version>
</dependency>

 

- web.xml 수정

<listener>
	<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>

<context-param>
	<param-name>logbackConfigLocation</param-name>
	<param-value>classpath:logbackDev.xml</param-value>
</context-param>
반응형