해당 포스팅은 인프런 스프링 MVC1편 강의를 듣고 적은 강의 노트를 정리하며 기록하기 위한 글입니다.
강의를 시청하며, 프로젝트에 적용할 수 있는 부분들이나 궁금한 기능들을 정리하며 포스팅할 예정입니다.
제 개인적인 의견이 더해져 올바르지 않은 정보가 들어가 있다면, 피드백이나 댓글로 남겨주시면 감사하겠습니다.
자세한 강의 내용은 인프런 스프링 MVC 에서 만나보실 수 있습니다.
로깅 간단히 알아보기
운영시스템에서는 System.out.println() 같은 시스템콘솔을 사용해서 필요한 정보를 출력하지 않고,
별도의 로깅라이브러리를 사용해서 로그를 출력한다.
스프링 부트 라이브러리를 사용하면 기본적으로 로깅 라이브러리가 포함되어 있다.
로그라이브러리는 Logback, Log4J, Log4J2 등등 수많은 라이브러리가 있는데, 그것을 통합해서 인터페이스로 제공하는 것이 바로 SLF4J 라이브러리다.
쉽게 이야기해서 SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그라이브러리를 선택하면 된다.
실무에서는 스프링부트 가기 본으로 제공하는 Logback을대부분사용한다.
로깅라이브러리를 선언하는 방법은 아래와 같이 세 가지 방식이 존재하고 annotation을 선언하는 방법을 주로 사용한다.
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j // 1
public class basicController{
// private Logger log = LoggerFactory.getLogger(getClass()); // 2
// private static final Logger log = LoggerFactory.getLogger(Xxx.class); // 3
}
sout vs logging 비교
다음 그림을 살펴보자.
sout으로 출력하면 데이터의 정보만 출력하고 있다. 하지만, log를 사용하여 데이터의 정보를 살펴보면
시간, info [로그레벨], 프로세스 ID, 쓰레드, 컨트롤러이름[클래스명], 로그메시지 출력해 준다.
서버를 실제로 배포했다고 생각해 보자. 출력을 원하는 로그메시지들을 남겨놓았거나 오류가 발생하였다.
운영 서버에서 확인하기 위해 메시지들을 확인하려고 한다.
사용자가 많다면 sout으로 찍힌 출력으로는 log를 발생시키는 클래스를 찾기 힘들뿐더러 관리, 유지보수하기 매우 힘들 것이다.
로깅의 장점으로 log4j2는 다음과 같이 로그 레벨을 설정하여 원하는 출력모양을 조정할 수 있다.
LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
- TRACE : 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 이벤트를 나타낸다.
- DEBUG : 개발 시 디버그 용도로 사용하는 메시지를 나타낸다.
- INFO : 어떠한 상태 변경과 같은 정보성 메시지를 나타낸다.
- WARN : 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다. WARN에서도 2가지의 부분에선 종료가 일어남
- 명확한 문제 : 현재 데이터를 사용 불가, 캐시값 사용 등
- 잠재적 문제 : 개발 모드로 프로그램 시작, 관리자 콘솔 비밀번호가 보호되지 않고 접속 등
- ERROR : 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. 프로그램 동작에 큰 문제가 발생했다는 것으로 즉시 문제를 조사해야 하는 것 (DB를 사용할 수 없는 상태, 중요 에러가 나오는 상황)
- FATAL : 아주 심각한 에러가 발생한 상태를 나타낸다
개발서버는 debug 출력, 운영서버는 info 출력
application.properties 로그 설정
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc
패키지와 그 하위 로그 레벨 설정 logging.level.hello.springmvc=debug
로그사용시장점
- 쓰레드정보, 클래스이름 같은 부가정보를 함께 볼 수 있고, 출력모양을 조정할 수 있다.
- 로그레벨에 따라 개발서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등로 그를 상황에 맞게 조절할 수 있다.
- 시스템아웃콘솔에만 출력하는 것이 아니라, 파일이 나네트워크등, 로그를 별도의 위치에 남길 수 있다.
- 특히 파일로 남길 때는 일별, 특정용량에 따라로 그를 분할하는 것도 가능하다.
- 성능도일반 System.out 보다 좋다. (내부버퍼링, 멀티쓰레드 등등) 그래서 실무에서는꼭로그를 사용해야 한다.
'Back-End > Spring' 카테고리의 다른 글
[MVC-2편] 오류 코드와 메시지 처리 (0) | 2023.04.16 |
---|---|
[MVC-1편] 웹페이지, 타임리프(Thymeleaf) 구성 (0) | 2023.03.22 |
[MVC-1편] given-when-then 패턴이란 (0) | 2023.03.18 |
[MVC-1편] 기본 기능, HTTP 요청, 요청 파라미터 (0) | 2023.03.14 |
[MVC-1편] 동시 요청 - 멀티 쓰레드, 쓰레드 풀 (0) | 2023.03.14 |