에러 발생시 디버깅을 항상 system.out.println()으로 진행해왔다.
실무에서는 위처럼 찍지 않는다고한다.
이유는 날짜, 시간, log level, thread 등등 나오지 않기 때문이다.
자세한 로그를 확인하기 위해 라이브러리를 사용하여 로그를 찍는다.
SLF4J 인터페이스를 구현한 Logback을 사용해보았다.
로그 레벨
로그 레벨에는 5단계가 있다.
trace > debug > info > warn > error
일반적으로 로컬 서버는 trace, 개발 서버는 debug, 운영 서버는 info로 한다.
설정된 level 이하의 상태를 출력하지 않기 위해서는 properties에 아래 코드를 작성한다
# 전체 로그 레벨 설정(default = info)
logging.level.root=info
# 패키지와 그 하위 로그 레벨 설정
logging.level.(패키지명)=trace;
root를 적용 안해줄 경우 기본으로 info로 설정되며 그 이상의 로그 레벨은 출력되지 않는다.
올바른 사용법
// 틀린 예)
log.trace("trace log=" + name);
// 옳은 예)
log.trace("trace log={}", name);
첫번째 방식은 출력에는 문제가 없다.
하지만 java 문법상 "trace log="+name 이라는 문자열 더하기 연산이 먼저 일어난 후 log level을 확인하기 때문에 해당 프로젝트의 log level 설정이 debug일 경우 trace는 debug 이하의 log level이므로 출력은 하지 않지만 불필요한 연산 자체가 일어난 경우가 된다. 출력되지 않을 가능성이 높은곳에 연산이 무조건 들어간다면 자원낭비가 될 가능성이 높다.
두번째 방식은 SLF4J 치환문자를 사용하는 방식이다.
문자열에 중괄호를 넣어 순서대로 출력하고자 하는 데이터들을 ,(쉼표)로 구분한 후 전달하여 치환해주는 방식으로 불필요한 연산이 발생하지 않도록 한다. parameter가 들어가기 때문에 자원낭비가 발생하지 않는다.
방법 1
private final Logger log = LoggerFactory.getLogger(CrudController.class.getName());
public CrudController(){
String name = "CRUD";
log.trace("trace log={}", name);
log.debug("debug log={}", name);
log.info("info log={}", name);
log.warn("warn log={}", name);
log.error("error log={}", name);
System.out.println("----------CrudController 시작");
}
LoggerFactory의 getLogger를 이용하여 가져오기
방법 2
클래스에 SLF4J 어노테이션 선언하여 logger 가져오기
결과

참고
'Java' 카테고리의 다른 글
| '다중 스킬' 검색 기능 구현 (0) | 2025.09.08 |
|---|---|
| @RequestBody의 유무에 따른 DTO 매핑 차이와 타임리프/React 컨트롤러 비교 (1) | 2025.07.10 |