프로젝트 생성#

Welcome Page
스프링 부트에 Jardmf tkdydgkaus /resources/static/index.html/ 자동 처리
로깅#
로깅 라이브러리
스프링 부트를 사용하면, spring-boot-logging이 함께 포함됨
기본적으로 SL4J (인터페이스) 의 구현체 Logback을 사용
trace>debug>info>warn>error 5레벨 있으며
로깅을 사용해서 특정 수준 이상의 로그만 볼 수 있음
application.properties에서 설정 가능
효율
log.debug("data"+data)- debug레벨을 실행하지 않을 때도, 문자열 합치는 연산 실행 => 쓸모없는 자원낭비
log.debug("data={}.data")(파라미터로 넘기기)- 실행하지 않으면 아무 리소스 소비 없음 => 효율적
로그는 시간, 레벨, PID, 쓰레드명, 클래스명, 메세지 형식으로 출력됨
요청 매핑#
@RestController- 뷰를 렌더링하지 않고, 반환값이 HTTP메세지 바디에 바로 입력됨
`@RequestMapping(“hello-basic”)
/hello-basicURL이 호출되면, 이 메소드 실행- 배열로 넣을수도 있음 {?,?}
- 메소드 속성을 지정하지 않으면, 전부 가능 (post,get ….)
@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"- 쿼리 파라미터에 mode=debug가 있어야 호출됨
headers="mode=debug- 헤더에 mode=debug 가 있어야 호출
미디어 타입 조건 매핑 (
consume="application/json)- 컨텐츠가 json 타입이여만 호출
기본, 헤더 조회#
HttpServletRequestHttpServletResponseHttpMethod: Http메서드 조회Locale로케일 정보 조회@RequestHeader MultiValueMap<String, String> headerMap- 모든 헤더 정보를 맵으로 (Multivalue=중복허용)
@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)
// 단순 타입이면 어노테이션 생략도 가능하지만, 비추- required를 통해 필수값 설정
@ModelAttribute#
요청 파라미터 받기 => 객체생성 => 객체에 값 너주기
를 자동화해주는 기능
public String modelAttributeV1(@ModelAttribute HelloData helloData)동작방식 객체 생성 => 객체의 프로퍼티 찾음 => setter 호출 => 바인딩 (값 입력)
요청 메세지#
Httpmessage body에 직접 데이터를 담아서 요청
- Http API에서 주로 사용 (json,text,xml)
- POST, PUT, PATCH
메시지 바디를 통해서 데이터가 직접 넘어오면
@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 정보 편리하게 조회- 메시지 바디 정보를 직접 조회
- 파라미터 조회 기능과 관계 X
응답에도 사용 가능
- 바디 정보 직접 반환
- 헤더 정보 포함 가능
- view로 넘어가지 않음
HttpEntity를 상속받은 개체들RequestEntity:HttpMethod, url정보추가, 요청ResponseEntity: Http상태 코드 설정, 응답
@RequestBody#
앞의 과정은 필요없이, 메세지 바디 직접 조회
public HttpEntity<String> requestBodyStringV4(@RequestBody String messageBody)@ResponseBody#
응답 결과를 Http 메시지 바디에 직접 담아서 전달 (view 사용 X)
JSON#
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가지 방법
- 정적 리소스 (파일 그대로 전달)
- 뷰 템플릿 사용 (동적인 HTML)
- Http 메시지 사용
- Http 메시지 바디에 Json등의 형식으로 데이터를 실어 보냄
정적 리소스#
src/main/resources/static에 리소스를 넣어두면, 정적 리소스 제공
뷰 템플릿#
뷰 템플릿을 거쳐서 HTML이 생성되고, 뷰가 응답을 만들어서 전달
기본 템플릿 경로 = src/main/resources/templates
- String: View | Http메시지
- Void : 요청 URL을 논리 뷰 이름으로
Thymeleaf 설정#
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'기본설정
spring.thymleaf.prefitx=classpath:/templates/
spring.thymeleaf.suffix=.htmlHTTP 메시지 컨버터#
ResponseBody 원리
스프링에서 Http메시지 컨버터 적용 경우
- 요청 :
@RequestBody,HttpEntity(RequestEntity) - 응답 :
@ResponseBody,’HttpEntity(ResponseEntity)
요청 매핑 핸들러 어댑터 구조#
RequestMappingHandlerAdapter 등작 방식
ArgumentResolver
어노테이션 기반의 컨트롤러가 Model,@RequestParam….등 여러 파라미터를 처리할 수 있는 이유가 ArugmentResolver덕분임
Http메세지 컨버터가 여기에 포함됨
ReturnValueHandler
ArgumentResolver와 비슷한데, 응답값 반환,처리
ex) 뷰 이름을 String으로 반환해도 동작