Programming-[Backend]/Spring

[스프링 웹MVC] 9. 스프링 MVC - 프로젝트 생성과 로깅

컴퓨터 탐험가 찰리 2021. 8. 2. 16:12
728x90
반응형

스프링MVC의 구조

 

 

1. 프로젝트 생성



스프링 MVC도 이전 글에서 살펴본 ControllerV5와 똑같은 구조를 갖고 있다. 다만 FrontController의 이름이 DispatcherServlet이고, MyView등 강의에서 만든 일부 객체의 이름이 다르다. 이제 springMVC에 대해서 본격적으로 알아본다.

새롭게 프로젝트를 만든다. 기존에 프로젝트를 만들던 start.spring.io 사이트에서 만들면 된다. Gradle Project, Java는 11버전, Jar Packaing을 선택하고, 라이브러리는 Spring web, Thymeleaf, Lombok을 추가한다. jsp를 쓰거나, 별도의 tomcat 서버에 설치하기 위해서는 War 패키징을 하지만, 그냥 스프링에서 제공하는 내장 서버를 이용할려면 Jar 패키징을 선택하면 된다.

프로젝트를 오픈하고 늘하던대로 git 추가, annotation processors 활성화, Build Tools -> Gradle에서 IntelliJ로 변경 작업을 해준다. (https://whitepro.tistory.com/298)

Jar로 패키징을 했으므로, main/resources/static/ 경로에 index.html 파일을 만들어두면 스프링부트가 이 파일을 가장 먼저 참조하게 된다. index.html 파일은 강의에서 받아온 파일을 복사해서 쓰도록 한다.


 

2. 로깅


로깅은 강의에서 추가로 설명하는 부분으로 springmvc와 직접적인 연관은 없지만, http 통신에 따른 정보들을 출력하고 기록할 수 있도록하는 중요한 부분이다. 로깅을 위한 여러가지 라이브러리가 제공되지만, 여기서는 Slf4j 라이브러리를 사용한다.

@RestController 어노테이션을 붙여주고, org.slf4j의 Logger를 주입받는다. 아래 코드와 함께 하나씩 내용을 살펴보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RestController
@Slf4j
public class LogTestController {
 
//  private final Logger log = LoggerFactory.getLogger(getClass());
 
  @RequestMapping("/log-test")
  private String logTest() {
    String name = "Spring";
 
    System.out.println("name = " + name);
 
    log.trace("trace log " + name);
    
    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";
  }
}
 
cs

 

 

 

 

@RestController

Controller에서 View를 반환하는게 아니라, 응답 Body에 실어보낼 문자열을 반환하게 해준다.

그리고 위 코드와 같이 작성한다. 원래는 컨트롤러에 작성하는 @Controller 어노테이션을 달지만, 여기서는 @RestController를 작성해주었다. 원래는 @Controller라고 작성하면 각 메서드에서 viewName을 return 해주었다. 이 반환값은 뷰의 이름으로, 이 값을 통해 viewResolver 등으로 실제 viewPath를 찾아서 뷰를 렌더링을 하는 방식이였다. 그러나 @RestController를 사용하면 메서드의 반환값을 http 응답의 body에 그대로 실어서 보낼 수 있게 된다.

@Slf4j

slf4j는 어노테이션을 제공한다. 이 어노테이션을 적용하면 5번줄처럼 LoggerFactory에서 log를 불러와서 처리할 필요없이, 코드 내에서 log의 다양한 메서드들을 사용할 수 있다.

System.out과 log의 차이 : Logger 사용의 장점

System.out에 비해 Logger를 사용하면 여러가지 장점들이 있기 때문에, 반드시 Logger를 사용해야 한다. 장점은 다음과 같다.

  1. 쓰레드 정보 등 부가 정보를 볼 수 있고, 출력 양식을 설정해줄 수 있다.
  2. 로그 레벨 설정으로 서버 환경에 따라 로그 출력을 조절할 수 있다.
  3. 단순히 콘솔에 출력하는 것뿐만 아니라, 로그 파일로 남길 수 있다. 설정을 해주면 네트워크로 쏴줄 수도 있고 용량에 따라 분할 저장도 가능하다.
  4. 내부 버퍼링, 멀티 쓰레드 기능 등을 지원하여 성능이 System.out에 비해 좋다.

 

로그 레벨 설정하기 : trace > debug > info > warn > error

레벨을 설정하여 특정 레벨 이상의 로그만 출력되도록 할 수 있다. 기본적으로 "logging.level.root = info" 라는 설정으로 되어 있기 때문에, info, warn, error 정보만 출력되게 된다. 그러나 "logging.level.패키지이름 = trace" 설정을 통해 trace 레벨 이상인, 모든 로그를 출력하도록 할수도 있다. resource/application.properties 파일에서 로그 설정을 해주면된다. root는 해당 애플리케이션뿐만 아니라 모든 라이브러리에 적용되므로, root 레벨을 debug로 바꾸면 애플리케이션 실행 시 스프링 등에서의 로그까지 전부 출력되는 것을 볼 수 있다.

보통은 개발서버에서는 debug 레벨로 사용하고, 운영 서버에서는 info 레벨로 사용한다. 운영 서버에서 모든 로그가 출력되면 필요없는 정보이고, 서버에 부하를 줄 수도 있기 때문이다.

 

debug 시 콘솔 출력 화면

 

문자열을 더하는 방식을 사용하지 말자. {} 문법을 사용하도록 한다.


사용할 변수를 {}로 포맷팅하고, 콤마를 찍어서 어떤 변수를 표현할지 설정해줄 수 있다. 만약 여러 변수를 출력하고 싶다면, {} 표기를 여러번 하면 된다. 그런데 코드의 15번줄과 같이 단순히 문자열을 더하는 방식을 사용하면 안된다. 이렇게 설정하면 자바에서는 log를 통해 출력 여부를 결정하기 전에, 이미 문자열을 더하는 연산을 하고 이 값을 저장하고 있게 된다. 따라서 불필요한 CPU와 메모리를 사용하게 되므로 반드시 {} 문법을 사용해야 한다.




slf4j 라이브러리의 기초 사용법에 대해 알아보았다. 이외에도 스프링부트에서 제공하는 logback등의 라이브러리가 있으며, 더 필요한 기능이 있다면 추가로 공부가 필요하다.




참조

1. 인프런_스프링 MVC 1편 - 백엔드 웹개발 핵심 기술_김영한 님 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

728x90
반응형