build.gradle 파일로 프로젝트 열기
Welcome Page
스프링 부트에 Jar
dmf tkdydgkaus /resources/static/index.html/
자동 처리
로깅 라이브러리
스프링 부트를 사용하면, spring-boot-logging
이 함께 포함됨
기본적으로 SL4J
(인터페이스) 의 구현체 Logback
을 사용
trace>debug>info>warn>error 5레벨 있으며
로깅을 사용해서 특정 수준 이상의 로그만 볼 수 있음
application.properties
에서 설정 가능
효율
log.debug("data"+data)
log.debug("data={}.data")
(파라미터로 넘기기)로그는 시간, 레벨, PID, 쓰레드명, 클래스명, 메세지 형식으로 출력됨
@RestController
`@RequestMapping("hello-basic")
/hello-basic
URL이 호출되면, 이 메소드 실행@PathVariable("userId")
URL경로를 템플릿화
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data){
log.info("mappingPath userId={},",data);
return "ok";
/mapping/userA
경로가 호출되었을 때
"userA"
를 data로 받음
params = "mode=debug"
headers="mode=debug
미디어 타입 조건 매핑 (consume="application/json
)
HttpServletRequest
HttpServletResponse
HttpMethod
: Http메서드 조회Locale
로케일 정보 조회@RequestHeader MultiValueMap<String, String> headerMap
@RequestHeader("host") String host
: 특정 헤더 조회@CookieValue(value = "myCookie", required = false) String cookie
: 쿠키@RequestParam
요청 파라미터를 편리하게 받음
//기본 사용
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {...
//파라미터 이름과 변수명이 같다면, 다음과 같이 생략 가능
(@RequestParam String username,@requestParam int age)
// 단순 타입이면 어노테이션 생략도 가능하지만, 비추
@ModelAttribute
요청 파라미터 받기 => 객체생성 => 객체에 값 너주기
를 자동화해주는 기능
public String modelAttributeV1(@ModelAttribute HelloData helloData)
동작방식
객체 생성 => 객체의 프로퍼티 찾음 => setter 호출 => 바인딩 (값 입력)
Httpmessage body에 직접 데이터를 담아서 요청
메시지 바디를 통해서 데이터가 직접 넘어오면@RequestParam
,@modelAttribute
사용 불가 (HTML Form 제외)
InputStream
으로 읽고, Writer.write()
으로 써서 전송HttpEntity<String>
사용@PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
return new HttpEntity<>("ok");
}
HttpEntity
: header, body 정보 편리하게 조회HttpEntity
를 상속받은 개체들 RequestEntity
:HttpMethod, url정보추가, 요청ResponseEntity
: Http상태 코드 설정, 응답@RequestBody
앞의 과정은 필요없이, 메세지 바디 직접 조회
public HttpEntity<String> requestBodyStringV4(@RequestBody String messageBody)
@ResponseBody
응답 결과를 Http 메시지 바디에 직접 담아서 전달 (view 사용 X)
ObjectMapper를 통해서 Json=>객체변환하는 방법이 있고,
(@RquestBody HelloData data)
처럼 직접 만든 객체를 지정할 수도 있다.
HttpEntity
, @RequestBody
등을 사용하면, Http 메시지 컨버터가 우리가 원하는 문자나 객체로 변환
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
log.info("username={},age={}",helloData.getUsername(),helloData.getAge());
return "ok";
}
*생략하면 @ModelAttribute
로 인식하기 때문에 생략 X
HttpEntity<HelloData>
로도 꺼낼 수 있음
스프링에서 응답 데이터를 만드는 3가지 방법
src/main/resources/static
에 리소스를 넣어두면, 정적 리소스 제공
뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달
기본 템플릿 경로 = src/main/resources/templates
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
기본설정
spring.thymleaf.prefitx=classpath:/templates/
spring.thymeleaf.suffix=.html
ResponseBody 원리
스프링에서 Http메시지 컨버터 적용 경우
@RequestBody
,HttpEntity(RequestEntity)
@ResponseBody
,'HttpEntity(ResponseEntity)
RequestMappingHandlerAdapter
등작 방식
ArgumentResolver
어노테이션 기반의 컨트롤러가 Model
,@RequestParam
....등 여러 파라미터를 처리할 수 있는 이유가 ArugmentResolver
덕분임
Http메세지 컨버터가 여기에 포함됨
ReturnValueHandler
ArgumentResolver
와 비슷한데, 응답값 반환,처리
ex) 뷰 이름을 String으로 반환해도 동작