*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>
'스프링(Spring)' 카테고리의 다른 글
Spring Interceptors(스프링 인터셉터) (0) | 2023.01.02 |
---|---|
예외처리 (0) | 2022.12.27 |
PointCut 표현식과 Advisor 구현 (0) | 2022.11.20 |
Dynamic SQL (MyBatis 동적 SQL), AOP(Aspect Oriented Programming) (0) | 2022.11.02 |
MyBatis 소개, Mapper XML 파일 (0) | 2022.10.27 |