프로젝트를 먼저 생성해보자. 여기서 프로젝트 생성 후
SpringmvcApplication을 돌려보자.
package hello.springmvc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringmvcApplication {
public static void main(String[] args) {
SpringApplication.run(SpringmvcApplication.class, args);
}
}
Welcome 페이지도 한번 만들어 보자.
스프링 부트에 Jar 를 사용하면 /resources/static/index.hml 위치에 index.html 파일을 두면 Welcome 페이지로 처리해준다.
(스프링 부트가 지원하는 정적 컨텐츠 위치에 /index.html 이 있으면 된다.)
index.html파일을 만들고 목차대로 하나씩 배워 나가자.
로깅에 대해서 간단히 알아보자.
운영 시스템에서 System.out.println()같은 시스템 콘솔을 사용해서 필요한 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력한다.
로그 관련 라이브러리가 넘 많기 때문에 간단히만 알아보자.
로깅 라이브러리
- 스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다.
- 로깅 라이브러리는 기본으로 로깅 라이브러리를 사용한다.
- SLF4J
- Logback
- SLF4J는 인터페이스이고, 그 구현체로 Logback 같은 로그 라이브러리를 선택하면 된다.
- 실무에서는 스프링 부트가 기본으로 제공하는 Logback을 대부분 사용한다
RestController를 만들어주자.
package hello.springmvc.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// RestController는 스트링이 바로 반환이 된다.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println("name = " + name);
log.info(" info log={}", name);
return "ok";
}
}
system.out.println은 name = spring을 출력해주지만
log는 쓰레드 명칭까지 출력이 된다.
name = Spring
2022-04-29 17:42:57.939 INFO 28850 --- [nio-8080-exec-2] hello.springmvc.basic.LogTestController : info log=Spring
// LogTestController class
package hello.springmvc.basic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
// RestController는 스트링이 바로 반환이 된다.
@RestController
public class LogTestController {
private final Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping("/log-test")
public String logTest() {
String name = "Spring";
System.out.println("name = " + 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";
}
}
실행을 시키고
application.properties에서
logging.level.hello.springmvc=trace로 로그 종류를 다 출력해주고
spring.output.ansi.enabled=always로 색상이 나오게 한 후 확인 할 수 있다.
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace
spring.output.ansi.enabled=always
name = Spring
2022-04-29 17:52:47.758 TRACE 29010 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : trace log=Spring
2022-04-29 17:52:47.760 DEBUG 29010 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : debug log=Spring
2022-04-29 17:52:47.760 INFO 29010 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : info log=Spring
2022-04-29 17:52:47.760 WARN 29010 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : warn log=Spring
2022-04-29 17:52:47.760 ERROR 29010 --- [nio-8080-exec-1] hello.springmvc.basic.LogTestController : error log=Spring
개발 서버는 debug
logging.level.hello.springmvc=debug
spring.output.ansi.enabled=always
운영 서버는 info
logging.level.hello.springmvc=info
spring.output.ansi.enabled=always
로컬 pc에서는
logging.level.hello.springmvc=trace
spring.output.ansi.enabled=always
정리를 해보자
- log.info("hello")
- System.out.println("hello")
- 시스템 콘솔로 직접 출력하는 것 보다 로그를 사용하면 다음과 같은 장점이 있다.
- 실무에서는 항상 로그를 사용해야 한다.
매핑 정보
- @RestController
- @Controller 는 반환 값이 String 이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
- @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
- 따라서 실행 결과로 ok 메세지를 받을 수 있다. @ResponseBody 와 관련이 있다.
테스트
- 로그가 출력되는 포멧 확인
- 시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
- 로그 레벨 설정을 변경해서 출력 결과를 보자
- LEVEL: TRACE > DEBUG > INFO > WARN > ERROR
그리고 이거 대신 Slf4j를 쓸 수도 있다.
private final Logger log = LoggerFactory.getLogger(getClass());
@Slf4j
// RestController는 스트링이 바로 반환이 된다.
@RestController
public class LogTestController {
// private final Logger log = LoggerFactory.getLogger(getClass());
그리고 올바르게 로그를 사용하자.
이 로그가 아니고
log.trace(" trace my log=" + name);
- 로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data="+data가 실제 실행이 되어 버린다.
- 결과적으로 문자 더하기 연산이 발생한다.
이렇게 사용하자.
log.trace("trace log={}", name);
- 로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다.
- 따라서 앞과 같은 의미없는 연산이 발생하지 않는다.
<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring > SpringMVC' 카테고리의 다른 글
요청 매핑 - API 예시 (0) | 2022.04.29 |
---|---|
요청 매핑 (0) | 2022.04.29 |
SpringMVC 구조 정리 (0) | 2022.04.28 |
스프링 MVC를 시작과 컨트롤러 통합 & 실용적인 방식 (0) | 2022.04.28 |
뷰 리졸버 (0) | 2022.04.28 |