우리가 일반적으로 출력문을 사용할 때 System.out.print를 사용했지만 실무에서는 이것을 사용하지 않고 로그로 출력을 한다. 그 이유는 시간, 쓰레드, 컨트롤러 등 다양한 정보를 알 수 있고 출력을 할 때 단순히 콘솔이 아니라 네트워크, 파일로 출력을 할 수도 있다.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass()); // 내 클래스를 지정하기
@RequestMapping("/log-test")
public String logTest() {
String name = "spring";
System.out.println("hi hello");
log.info("info log = ", name);
return "ok";
}
}
여기서 @RestController는 @Controller와 달리 view 이름이 반환되는 것이 아니라 문자가 그대로 반환이 된다.
즉, http 메시지 바디에 문자를 그대로 넣어버릴 수 있어서 테스트할 때 간단하게 쓸 수 있다.
일반적인 System.out.println 출력문과 로그 출력문을 비교했을 때 로그로 출력을 하면 시간, 인포, 쓰레드, 컨트롤러 이름까지 출력이 되는 것을 볼 수 있다.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass()); // 내 클래스를 재정하기
@RequestMapping("/log-test")
public String logTest() {
String name = "spring";
System.out.println("hi hello");
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);
return "ok";
}
}
로그로 확인할 수 있는 기능들을 추가한 코드이다.
주로 개발 서버는 debug, 운영 서버는 info를 주로 사용한다.
여기서 코드를 더 간단히 하고 싶으면 @slf4j 애너테이션을 추가하면 된다.
위 코드와 비교해보면 private final Logger log 부분을 선언 안 해도 작동이 되는 것을 알 수 있다.
@Slf4j
@RestController
public class LogTestController {
@RequestMapping("/log-test")
public String logTest() {
String name = "spring";
System.out.println("hi hello");
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);
return "ok";
}
}
로그의 올바른 사용법
로그 출력을 + 연산자로 하면 어떻게 될까?
예를 들어서
log.trace("trace log = {}", name);
log.trace("trace log = " + name);
위의 코드를 아래로 바꾸게 되면 자바 언어 특성상 메서드 호출보다 + 연산이 더 먼저 일어나게 된다.
그냥 단순히 출력 방식의 차이 아닌가? 라고 생각이 들 수 있지만 만약 우리가 log를 볼 때 trace는 안 보고 info, warn만 보려고 한다고 가정한다면 + 연산을 이용하면 사용자가 출력하지도 않는데 쓸데없는 + 연산이 되어서 메모리 낭비가 되는 셈이다. 쓸데없는 메모리, cpu 낭비는 좋지 않으니 로그를 사용할 때는 + 연산을 사용하지 말자.
'Spring > Spring' 카테고리의 다른 글
[Spring] @ResponseBody 애너테이션 (1) | 2024.10.03 |
---|---|
[Spring] HTTP 요청 파라미터 - 쿼리 파라미터 (1) | 2024.10.03 |
[Spring] 서블릿 알아보기 (@WebServlet,getParameter, getParameterValues) (0) | 2024.09.20 |
[Spring] 웹 서버, 웹 애플리케이션 서버 (0) | 2024.09.15 |
[Spring] 빈 스코프 (0) | 2024.09.08 |