Spring/SpringMVC

스프링MVC 기본기능

느리지만 꾸준하게 2022. 4. 29. 18:15

프로젝트를 먼저 생성해보자.  여기서 프로젝트 생성 후

 

 

 

 

 

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파일을 만들고 목차대로 하나씩 배워 나가자.

 

로깅에 대해서 간단히 알아보자.

slf4j, logback

 

운영 시스템에서  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

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

'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