Chapter#01 : [Spring] IntelliJ를 사용한 Spring Project 생성( Gradle )
Chapter#02 : [Spring] MVC 패턴 및 MyBatis를 사용한 게시판 제작
Chapter#03 : [Spring] Log4j 설정 및 사용하기( log 파일 저장하기 )
Chapter#04 : [Spring] SpringSecurity를 이용한 사용자 인증 프로세스 구축
Chapter#05 : [Spring] JWT 토큰 발급 및 토큰 인증 받기
Chapter#06 : [Spring] Swagger 웹 서비스 RESTful API 문서 자동 생성
※ 해당 포스팅은 [Spring] MVC 패턴 및 MyBatis를 사용한 게시판 제작에서 생성한 프로젝트에 이어서 진행됩니다.
1. 스프링 프로젝트에 log4j. slf4j 라이브러리 추가하기
Log4j
Log4j를 사용하면 로그를 다양한 형태로 출력할 수 있으며, 로그의 심각도를 기준으로 로그 메시지를 필터링하여
개발 진행과정에서 로그 출력의 상세정도를 동적으로 조절할 수 있다.
Log4j는 로거를 계층적으로 구성합니다. 각 로거는 특정 클래스나 패키지와 연결되어 있으며,
애플리케이션의 다른 부분에 대해 로그 레벨을 세밀하게 조절할 수 있다.
또한 Log4j는 로그 메시지를 비동기적으로 기록할 수 있는 기능을 제공하여 특정 상황에서 성능을 향상시킬 수 있다.
SLF4J (Simple Logging Facade for Java)
SLF4J는 로깅 프레임워크가 아니라 로깅 퍼사드(프로그래밍 인터페이스) 또는 API이다.
이는 실제 로깅을 스스로 수행하지 않고, Logback, Log4j 또는 java.util.logging과 같은 다른 로깅 구현체에게 작업을 위임한다.
SLF4J의 주요 장점은 어플리케이션 코드를 실제 로깅 구현체로부터 분리한다는 것이다.
이를 통해 코드를 변경하지 않고도 로깅 구현체를 쉽게 교체할 수 있다.
예를 들어, 어플리케이션이 Log4j를 사용하고 있을 때 SLF4J를 사용하도록 변경하면 Log4j 대신 Logback을 사용하도록 쉽게 전환할 수 있다.
build.gradle을 열고 log4j와 slf4j 라이브러리를 추가한다.
build.gradle
~~ 이 하 생 략 ~~
dependencies {
~~ 이 하 생 략 ~~
// log4j
implementation "org.apache.logging.log4j:log4j-api:2.14.1"
implementation "org.apache.logging.log4j:log4j-core:2.14.1"
implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
// slf4j
implementation "org.slf4j:slf4j-api:1.7.25"
~~ 이 하 생 략 ~~
}
~~ 이 하 생 략 ~~
build.gradle에 위 코드의 내용을 추가하고 재 build 한다.
plugins {
id "java"
id "war"
}
apply plugin : "war"
group "org.example"
version "0.0.1-SNAPSHOT"
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.1"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.1"
// Servelt API
providedCompile "javax.servlet:servlet-api:2.5"
// JSTL
implementation "javax.servlet:jstl:1.2"
// SpringFramework
implementation "org.springframework:spring-aop:5.2.22.RELEASE"
implementation "org.springframework:spring-beans:5.2.22.RELEASE"
implementation "org.springframework:spring-context:5.2.22.RELEASE"
implementation "org.springframework:spring-core:5.2.22.RELEASE"
implementation "org.springframework:spring-expression:5.2.22.RELEASE"
implementation "org.springframework:spring-jcl:5.2.22.RELEASE"
implementation "org.springframework:spring-tx:5.2.22.RELEASE"
implementation "org.springframework:spring-web:5.2.22.RELEASE"
implementation "org.springframework:spring-webmvc:5.2.22.RELEASE"
implementation "org.springframework:spring-jdbc:5.2.22.RELEASE"
// log4j
implementation "org.apache.logging.log4j:log4j-api:2.14.1"
implementation "org.apache.logging.log4j:log4j-core:2.14.1"
implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.14.1"
// MariaDB Connect
implementation "org.mariadb.jdbc:mariadb-java-client:2.5.4"
// MyBatis
implementation "org.mybatis:mybatis:3.5.8"
implementation "org.mybatis:mybatis-spring:2.0.6"
// Jackson
implementation "com.fasterxml.jackson.core:jackson-core:2.11.4"
implementation "com.fasterxml.jackson.core:jackson-annotations:2.11.4"
implementation "com.fasterxml.jackson.core:jackson-databind:2.11.4"
}
test {
useJUnitPlatform()
}
2. Consol창에 Log 메시지 출력하기
src/main/resources 경로를 선택하고 log4j2.xml 파일을 생성한다.
log4j2.xml은 Apache Log4j 2.x 버전에서 로깅 설정을 구성하는 파일이다.
log4j2.xml 파일은 로그 출력 형식, 로그 레벨, 로그 파일 위치 등과 같은 다양한 로깅 설정을 정의하는 데 사용된다.
log4j2.xml 파일이 생성되었다면 아래 코드를 입력하여 준다.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 콘솔 -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%c] %m%n"></PatternLayout>
</Console>
</Appenders>
<Loggers>
<!-- 프로젝트의 패키지 경로 -->
<Logger name="org.example" level="INFO" additivity="false">
<AppenderRef ref="console"></AppenderRef>
</Logger>
<Logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="console"></AppenderRef>
</Logger>
<Root level="INFO">
<AppenderRef ref="console"></AppenderRef>
</Root>
</Loggers>
</Configuration>
[Spring] MVC 패턴 및 MyBatis를 사용한 게시판 제작 포스팅에서 작성한
BoardController.java 파일을 열고 /board/boardList.do 페이지를 오픈하면
log 메시지를 출력 할 수 있게 내용을 추가한다.
BoardController.java
~~ 이 하 생 략 ~~
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
~~ 이 하 생 략 ~~
@Controller
@RequestMapping("/board")
public class BoardController {
// Logger 생성을 위한 LoggerFactory
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
~~ 이 하 생 략 ~~
@RequestMapping(value = "/boardList.do")
public String boardList((HttpServletRequest request, Model model) throws Exception {
// 로그 메시지 기록
logger.debug("Debug log message");
logger.info("Info log message");
logger.warn("Warning log message");
logger.error("Error log message");
BoardVO boardVO = new BoardVO();
int totalRow = boardService.selectCountBoard(boardVO); // 해당 테이블의 전체 갯수
int choicePage = 0; // 선택 페이지
int startRow = 0; // MySQL LIMIT 시작점
int limitRow = 10; // MySQL LIMIT 종료점( 출력될 가로(row)의 개수를 지정 )
if(request.getParameter("page") != null && request.getParameter("page").length() > 0) {
choicePage = Integer.parseInt(request.getParameter("page"));
startRow = (choicePage - 1) * limitRow;
} else {
choicePage = 1;
startRow = 0;
}
OutputPagination outputPagination = new OutputPagination();
model.addAttribute("boardList", boardService.selectListBoard(boardVO, startRow, limitRow));
model.addAttribute("boardPagination", outputPagination.outputServletPagination(choicePage, limitRow, totalRow, "boardMovePage"));
return "board/boardList";
}
}
이제 Apache Tocmat을 실행하고 http://localhost:8181/board/boardList.do 페이지를 오픈하면
위와 같이 intelliJ 콘솔창에 log 메시지가 출력되는 것을 확인 할 수 있다.
3. Log 메시지 파일로 저장하기
출력한 log 메시지를 파일로 저장 보관 할 수 있게 설정을 변경하려 한다.
( 생성된 *.log 파일은 기본적으로 Apahce Tomcat 설치경로의 bin 디렉토리 안에 저장된다. )
먼저 log4j2.xml 파일을 열고 아래와 같이 파일 저장을 위한 설정을 추가하여 준다.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- 콘솔 -->
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%c] %m%n"></PatternLayout>
</Console>
<!-- 파일 -->
<RollingFile name="RollingFile">
<FileName>logs/example.log</FileName>
<FilePattern>logs/%d{yyyy-MM-dd}_example.log</FilePattern>
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} %5p [%c] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"></TimeBasedTriggeringPolicy>
</Policies>
<DefaultRolloverStrategy max="30"></DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileError">
<FileName>logs/example_error.log</FileName>
<FilePattern>logs/%d{yyyy-MM-dd}_example_error.log</FilePattern>
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} %5p [%c] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"></TimeBasedTriggeringPolicy>
</Policies>
<DefaultRolloverStrategy max="30"></DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.example" level="INFO" additivity="false">
<AppenderRef ref="console"></AppenderRef>
<AppenderRef ref="RollingFile"></AppenderRef>
<AppenderRef ref="RollingFileError" level="ERROR"></AppenderRef>
</Logger>
<Logger name="org.springframework" level="INFO" additivity="false">
<AppenderRef ref="console"></AppenderRef>
</Logger>
<Root level="INFO">
<AppenderRef ref="console"></AppenderRef>
</Root>
</Loggers>
</Configuration>
이번에는 BoardDAOMyBatis.java 클래스에서 System.out.println(); 을 사용하여 출력했던 메시지를
Logger를 사용하여 log 메시지로 출력할 수 있게 설정을 변경하여 준다.
package org.example.board.service.impl;
import org.example.board.service.BoardDAO;
import org.example.board.service.BoardVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
@Repository("boardDaoMyBatis")
public class BoardDAOMyBatis implements BoardDAO {
private static final Logger logger = LoggerFactory.getLogger(BoardDAOMyBatis.class);
@Resource(name="boardMapper")
private BoardMapper boardMapper;
public BoardDAOMyBatis() {
// System.out.println("===> BoardDAOMyBatis 생성");
logger.info("===> BoardDAOMyBatis 생성");
}
public BoardVO selectBoard(BoardVO boardVO) throws Exception {
// System.out.println("===> MyBatis로 selectBoard() 기능 처리");
logger.info("===> MyBatis로 selectBoard() 기능 처리");
return (BoardVO) boardMapper.selectBoard(boardVO);
}
public int selectCountBoard(BoardVO boardVO) throws Exception {
// System.out.println("===> MyBatis로 selectCountBoard() 기능 처리");
logger.info("===> MyBatis로 selectCountBoard() 기능 처리");
return boardMapper.selectCountBoard(boardVO);
}
public List<BoardVO> selectListBoard(BoardVO boardVO, int startRow, int limitRow) throws Exception {
// System.out.println("===> MyBatis로 selectListBoard() 기능 처리");
logger.info("===> MyBatis로 selectListBoard() 기능 처리");
return boardMapper.selectListBoard(boardVO, startRow, limitRow);
}
public int insertBoard(BoardVO boardVO) throws Exception {
// System.out.println("===> MyBatis로 insertBoard() 기능 처리");
logger.info("===> MyBatis로 insertBoard() 기능 처리");
return boardMapper.insertBoard(boardVO);
}
public int updateBoard(BoardVO boardVO) throws Exception {
// System.out.println("===> MyBatis로 updateBoard() 기능 처리");
logger.info("===> MyBatis로 updateBoard() 기능 처리");
return boardMapper.updateBoard(boardVO);
}
public int deleteBoard(BoardVO boardVO) throws Exception {
// System.out.println("===> MyBatis로 deleteBoard() 기능 처리");
logger.info("===> MyBatis로 deleteBoard() 기능 처리");
return boardMapper.deleteBoard(boardVO);
}
}
내용을 수정하고 다시 Apache Tocmat을 실행하고 http://localhost:8181/board/boardList.do 페이지를 오픈하면
Log 메시지가 콘솔창에 출력되는 것을 확인 할 수 있다.
LOG 파일 생성된 이미지 추가
'Spring Web > Spring Framework' 카테고리의 다른 글
[Spring] JWT 토큰 발급 받고 및 토큰 인증 받기 (0) | 2023.06.13 |
---|---|
[Spring] SpringSecurity를 이용한 사용자 인증 프로세스 구축 (0) | 2023.06.13 |
[Spring] MVC 패턴 및 MyBatis 사용하는 게시판 제작 (0) | 2023.06.13 |
[Spring] IntelliJ를 사용한 Spring Project 생성(Gradle) (1) | 2023.06.13 |
[Spring] src/main/resources 경로 폴더 형태로 노출 (2) | 2023.03.30 |