운영 시스템에선 System.out.println()
같은 시스템 콘솔을 사용해서 정보를 출력하지 않고, 별도의 로깅 라이브러리를 사용해서 로그를 출력한다.
로깅 라이브러리
스프링 부트 라이브러리를 사용하면 스프링 부트 로깅 라이브러리(spring-boot-starter-logging
)가 함께 포함된다. 스프링 부트 로깅 라이브러리는 기본으로 다음 로깅 라이브러리를 사용한다.
로그 선언
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(Xxx.class)
@Slf4j
: 롬복 사용 가능로그 호출
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 메세지 바디에 바로 입력한다.테스트
TRACE > DEBUG > INFO > WARN > ERROR
로그 레벨 설정
application.properties
#전체 로그 레벨 설정(기본 info)
logging.level.root=info
#hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=debug
올바른 로그 사용법
log.debug("data="+data)
log.debug("data={}", data)
로그 사용시 장점
System.out
보다 좋다. 매핑 정보
-@RestController
@Controller
는 반환 값이 String
이면 뷰 이름으로 인식된다. 그래서 뷰를 찾고 뷰가 랜더링 된다.@RestController
는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메세지 바디에 바로 입력한다.HTTP 메서드
@RequestMapping
에 method
속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게 호출된다. 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE매핑의 여러가지 버젼
HTTP 메서드 매핑
HTTP 메서드 매핑 축약
PathVariable(경로 변수) 사용
PathVariable 사용 - 다중
특정 파라미터 조건 매핑
특정 헤더 조건 매핑
미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume
미디어 타입 조건 매핑 - HTTP 요펑 Accept, produce
회원 관리 API
회원 목록 조회: GET /users
회원 등록: POST /users
회원 조회: GET /users/{userId}
회원 수정: PATCH /users/{userId}
회원 삭제: DELETE /users/{userId}
애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다.
이번엔 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 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아보자.
클라이어느에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용한다.
GET - 쿼리 파라미터
POST-HTML Form
HTTP message body에 데이터를 직접 담아서 요청
HttpServlet
의 request.getParameter()
을 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.