Home 스프링 MVC 시작 + 로깅
Post
Cancel

스프링 MVC 시작 + 로깅

스프링 시작

Packaging Jar를 선택한다.

Jar을 사용하면 항상 내장 서버(톰캣 등)를 사용하고, webapp 경로도 사용하지 않는다. 내장 서버 사용에 최적화 되어있는 기능이고 주로 이 방식을 사용한다.

War를 사용하는 이유는 JSP를 사용하기 위해, 톰캣같은 서버를 별도로 설치할 때 사용한다.

Welcome 페이지

스프링부트에 Jar를 사용하면 /resources/static/ 위치에 index.html 파일을 두면 Welcome 페이지로 처리해준다.

로깅

운영 시스템에서는 System.out.println() 같은 시스템 콘솔을 이용해 필요한 정보를 출력하지 않고 별도의 로깅 라이브러리를 사용해 로그를 출력한다.

로그 관련 라이브러리가 많지만, 우선 최소한의 사용 방법만 알아둔다.

스프링 부트의 로깅 라이브러리는 기본으로 아래와 같은 라이브러리를 사용한다.

  • SLF4J - http://www.slf4j.org
  • Logback - http://logback.qos.ch

로그 라이브러리는 Logback, Log4J, Log4J2 등등 수 많은 라이브러리가 있는데 그것을 통합해 인터페이스로 제공하는 것이 SLF4J 라이브러리이다.

즉, SLF4J는 인터페이스이고 그 구현체로 Logback 같은 로그라이브러리를 선택하는 것이다.

실무에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용한다. 성능도 좋고 기능이 다양하다.

로그 예시

@RestController

  • @Controller는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 렌더링 된다.
  • @RestController는 반환 값으로 뷰를 찾지 않고 HTTP 메시지 바디에 바로 입력한다.
  • 따라서 실행 결과로 “ok” 메시지를 받을 수 있다.
  • @ResponseBody와 관련이 있다.

테스트

  • 로그가 출력되는 포멧
    • 시간, 로그레벨, 프로세스 ID, 쓰레드 명, 클래스 명, 로그 메시지
    • 로그레벨 (INFO), 프로세스 ID (1388), 쓰레드 명 ([nio ~~])
  • 로그 레벨 설정 변경
    • LEVEL : TRACE > DEBUG > INFO > WARN > ERROR
    • 개발 서버는 DEBUG 추력
    • 운영 서버는 INFO 출력

application.properties에 아래와 같이 설정하면 로그의 단계를 설정할 수 있다.

1
2
3
4
5
//전체 로그 레벨 설정(default = info)
logging.level.root=info

//hello.springmvc 패키지와 그 하위 로그레벨 설정
logging.level.hello.springmvc=trace // (trace 자리에 debug, info..)

@Slf4j로 변경

@Slf4j 애노테이션을 선언하면

1
private final Logger log = LoggerFactory.getLogger(getClass());

를 작성할 필요 없다.

올바른 로그 사용법

1
2
3
log.info("trace log=" + name); //1번

log.info("trace log={}", name); //2번

둘 다 작동한다.

만약 로그레벨이 INFO여서 TRACE를 출력하지 않아도 되는 상황을 가정해보자.

1번같은 경우 자바 언어 특성상 “trace my log=” + “Spring” 이 연산이 먼저 수행된다.

2번같은 경우 바로 trace만 보고 trace 출력 안한다. 가 되는데 1번은 연산을 하고 나서 trace인 것을 확인하고 출력을 안하게 되는 것이다.

즉 의미없는 연산을 방지하기 위해 2번으로 사용해야 한다.

로그 사용 시 장점

  • 쓰레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조절할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영 서버에서는 출력하지 않는 등 로그를 상황에 맞게 조절할 수 있다.
  • 시스템 아웃 콘솔에만 출력하는 것이 아니라 설정을 통해 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
    • 특히 파일로 남길 때는 일별, 특정 용량에 따라 로그를 분할하는 것도 가능하다. (내가 겪었던 로그 용량 문제 생각)
  • System.out보다 성능이 좋다. (내부 버퍼링, 멀티 쓰레드 등등)
This post is licensed under CC BY 4.0 by the author.