[스프링&JPA 스터디] #14 스프링 MVC - 기본 기능

오예찬·2023년 7월 24일
0

spring&jpa 스터디

목록 보기
14/15

로깅

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

로깅 라이브러리
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging)가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용한다.

로그 선언

  • private Logger log = LoggerFactory.getLogger(getClass());
  • private static final Logger log = LoggerFactory.getLogger(Xxx.class)
    - @Slf4j : 롬복 사용 가능

로그 호출

  • `log.info("hello")
  • System.out.println("hello")
    시스템 콘솔로 직접 출력하는 것보다 로그를 사용하면 다음과 같은 장점이 있다. 실무에서는 항상 로그를 사용해야한다.
package hello.springmvc.basic;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//@Slf4j
@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); //이렇게 사용하면 안됨

        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";
    }

}

매핑 정보
-@RestController

  • @Controller는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
  • @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메세지 바디에 바로 입력한다.

테스트

  • 로그가 출력되는 포멧:시간, 로그 레벨, 프로세스 ID, 쓰레드 명, 클래스명, 로그 메시지
  • 로그 레벨: TRACE > DEBUG > INFO > WARN > ERROR
    • 개발 서버는 debug 출력
    • 운영 서버는 info 출력

로그 레벨 설정
application.properties

#전체 로그 레벨 설정(기본 info)
logging.level.root=info

#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug

올바른 로그 사용법

  • log.debug("data="+data)
    로그 출력 레벨을 info로 설정해도 해당 코드에 있는 "data=" + data가 실제 실행이 되어 버린다. 결과적으로 문자 더하기 연산이 발생한다.
  • log.debug("data={}", data)
    로그 출력 레벨을 info로 설정하면 아무일도 발생하지 않는다. 따라서 앞과 같은 의미없는 연산이 발생하지 않는다.

로그 사용시 장점

  • 쓰레드 정보, 클래스 이름과 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.
  • 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영서버에서는 출력하지 않는 등 로그를 상황에 맞게 조정할 수 있다.
    -시스템 아웃 콘솔에만 출력하는 것이 아니라, 파일이나 네트워크 등, 로그를 별도의 위치에 남길 수 있다.
  • 성능도 System.out보다 좋다.

요청 매핑

매핑 정보
-@RestController

  • @Controller는 반환 값이 String이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.
  • @RestController는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메세지 바디에 바로 입력한다.

HTTP 메서드

  • @RequestMappingmethod 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE

매핑의 여러가지 버젼

  • HTTP 메서드 매핑

  • HTTP 메서드 매핑 축약

  • PathVariable(경로 변수) 사용

  • PathVariable 사용 - 다중

  • 특정 파라미터 조건 매핑

  • 특정 헤더 조건 매핑

  • 미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume

  • 미디어 타입 조건 매핑 - HTTP 요펑 Accept, produce

요청 매핑 - API 예시

회원 관리 API

  • 회원 목록 조회: GET /users

  • 회원 등록: POST /users

  • 회원 조회: GET /users/{userId}

  • 회원 수정: PATCH /users/{userId}

  • 회원 삭제: DELETE /users/{userId}

HTTP 요청 - 기본, 헤더 조회

애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다.
이번엔 HTTP 헤더 정보를 조회하는 방법을 알아 본다.

package hello.springmvc.basic.request;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@Slf4j
@RestController
public class RequestHeaderController {

    @RequestMapping("/headers")
    public String headers(HttpServletRequest request,
                          HttpServletResponse response,
                          HttpMethod httpMethod,
                          Locale locale,
                          @RequestHeader MultiValueMap<String, String> headerMap,
                          @RequestHeader("host") String host,
                          @CookieValue(value = "myCookie", required = false) String cookie
                          ) {

        log.info("request={}", request);
        log.info("response={}", response);
        log.info("httpMethod={}", httpMethod);
        log.info("locale={}", locale);
        log.info("headerMap={}", headerMap);
        log.info("header host={}", host);
        log.info("myCookie={}", cookie);

        return "ok";

    }
}
  • HttpServletRequest

  • HttpServletResponse

  • HttpMethod: HTTP 메서드를 조회한다. org.springframework.http.HttpMethod

  • Locale: Locale 정보를 조회한다.

  • @RequestHeader MultiValueMap<String, String> headerMap
    모든 HTTP 헤더를 MultiValueMap 형식으로 조회한다.

  • @RequestHeader("host") String host
    특정 HTTP 헤더를 조회한다.
    속성: 필수 값 여부: required, 기본 값 속성: defaultValue

  • @CookieValue(value = "myCookie", required = false) String cookie
    특정 쿠키를 조회한다.
    속성: 필수 값 여부: required, 기본값:defaultValue

  • MultiValueMap: MAP과 유사한데, 하나의 키에 여러 값을 받을 수 있다.

HTTP 요청 파라미터

HTTP 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아보자.
클라이어느에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용한다.

GET - 쿼리 파라미터

  • /url?username=hello&age=20
  • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
  • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식

POST-HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메세지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
  • 예) 회원 가입, 상품 주문, HTML Form 사용

HTTP message body에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식은 주로 JSON 사용
  • POST, PUT, PATCH

요청 파라미터 - 쿼리 파라미터, HTML Form

HttpServletrequest.getParameter()을 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.

profile
안녕하세요. 반갑습니다.

0개의 댓글