[Spring] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 강의 정리 - 7

JJAM·2022년 10월 4일
0
post-thumbnail

📖 스프링 MVC - 기본 기능

📒 HTTP 요청 메시지 - 단순 텍스트

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

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

텍스트 메시지HTTP 메시지 바디에 담아서 전송하고, 읽을 것이다.

main/java/hello/springmvc/basic/reques/RequestBodyStringController

@RequestBody를 사용하여 HTTP 메시지 바디 정보를 편리하게 조회할 수 있고,

@ResponseBody를 사용하여 응답 결과를 HTTP 메시지 바디에 직접 담아서 전달할 수 있다.

@ResponseBody
@PostMapping("/request-body-string-v4")
public String requestBodyStringV4(@RequestBody String messageBody) {

}

Postman을 사용하여 실행하면 정상적으로 동작되는 것을 볼 수 있다.

추가적으로 헤더 정보가 필요할 때엔 @RequestHeader 를 사용하면 된다.

📒 HTTP 요청 메시지 - JSON

HTTP API에서 주로 사용하는 JSON 데이터 형식을 조회할 것이다.

{"username":"hello", "age":20}
content-type: application/json

main/java/hello/springmvc/basic/request/RequestBodyJsonController

@RequestBody를 사용하면, HTTP 메시지 컨버터가 HTTP 메시지 바디의 내용을 우리가
원하는 문자나 객체 등으로 변환해준다.

그래서 JSON객체로 변환을 해주는데, 이때 content-type이 application/json인지 꼭 확인해야 한다.

즉, HTTP 메시지 바디로 받은 JSONHTTP 메시지 컨버터가 HelloData라는 객체로 변환을 해주는 것이다.

@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody HelloData helloData) {

Postman으로 실행하면, 정상적으로 동작하는 것을 볼 수 있다.

추가적으로 응답을 할 때, 문자열이 아닌 객체HTTP 메시지 바디에 넣어줄 수 있다.

@ResponseBody
@PostMapping("/request-body-json-v5")
public HelloData requestBodyJsonV5(@RequestBody HelloData data) {
	...
	return data;
}

  • @RequestBody 요청
    JSON 요청 -> HTTP 메시지 컨버터 -> 객체
  • @ResponseBody 응답
    객체 -> HTTP 메시지 컨버터 -> JSON 응답

📒 HTTP 응답 - 정적 리소스, 뷰 템플릿

  • 정적 리소스

    웹 브라우저에 정적인 HTML, css, js를 제공할 때
  • 뷰 템플릿

    웹 브라우저에 동적인 HTML을 제공할 때
  • HTTP 메시지 사용

    HTTP API를 제공할 때, HTTP 메시지 바디에 JSON 같은 형식

✏️ 정적 리소스

src/main/resources
/static, /public, /resources, /META-INF/resources 디렉토리에서 정적 리소스를 제공한다.

그래서 src/main/resources/static/basic/hello-form.html 경로에 파일이 있으면

http://localhost:8080/basic/hello-form.html 이대로 웹 브라우저가 실행된다.

✏️ 뷰 템플릿

뷰 템플릿 경로 src/main/resources/templates

뷰 템플릿은 일반적으로 HTML을 동적으로 생성하는 용도로 사용하지만, 다른 것들도 가능하다.

src/main/resources/templates/response/hello.html

뷰 템플릿을 생성한다.

...
<body>
<p th:text="${data}">empty</p>
</body>
...

main/java/hello/springmvc/basic/response/ResponseViewController

뷰 템플릿을 호출하는 컨트롤러를 생성한다.

그러면 response/hello 로 뷰 리졸버가 실행돼 뷰를 찾고, 해당 경로의 뷰 템플릿이 렌더링 된다.

@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
	model.addAttribute("data", "hello!!");
	return "response/hello";
}

http://localhost:8080/response-view-v2 에 들어가면 정상적으로 실행되는 것을 볼 수 있다.

📒 HTTP 응답 - HTTP API, 메시지 바디에 직접 입력

  • HTTP 메시지 사용

    HTTP API를 제공할 때, HTTP 메시지 바디에 JSON 같은 형식

main/java/hello/springmvc/basic/response/ResponseBodyController

@Controller 대신 @RestController 애노테이션을 사용하면, 해당 컨트롤러에 모두 @ResponseBody 가 적용된다.

@RestController
public class ResponseBodyController {

✏️ 문자열

ResponseEntity는 HTTP 메시지의 헤더, 바디 정보를 가지고 있고, HTTP 응답 코드를 설정할 수 있다.

@RestController@ResponseBody가 있기 때문에, 바로 return 값으로 응답 메시지를 보낼 수 있다.

@GetMapping("/response-body-string-v2")
public ResponseEntity<String> responseBodyV2() {
	return new ResponseEntity<>("ok", HttpStatus.OK);
}

@GetMapping("/response-body-string-v3")
public String responseBodyV3() {
	return "ok";
}

✏️ JSON

ResponseEntity 를 반환하며, HTTP 메시지 컨버터를 통해 JSON 형식으로 변환 후 반환한다.

@ResponseBody 를 사용해, HTTP 메시지 컨버터를 통해 JSON 형식으로 변환 후 반환하고,
@ResponseStatus 애노테이션을 사용해 HTTP 응답 코드를 설정할 수 있다.

@GetMapping("/response-body-json-v1")
public ResponseEntity<HelloData> responseBodyJsonV1() {
	
    // 객체 생성하고, 객체에 username, age 넣는 코드

	return new ResponseEntity<>(helloData, HttpStatus.OK);
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/response-body-json-v2")
public HelloData responseBodyJsonV2() {

	// 객체 생성하고, 객체에 username, age 넣는 코드
    
	return helloData;
}

📒 HTTP 메시지 컨버터

JSON 데이터HTTP 메시지 바디에서 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용한다.

@ResponseBody 사용

  • HTTP의 Body에 문자 내용을 직접 반환
  • HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다.

  • HTTP 요청: @RequestBody , HttpEntity(RequestEntity)
  • HTTP 응답: @ResponseBody , HttpEntity(ResponseEntity)

✏️ 스프링 부트 기본 메시지 컨버터

스프링 부트는 다양한 HTTP 메시지 컨버터를 제공하여,
대상 클래스 타입미디어 타입 둘을 체크하여 사용여부를 결정한다.

  • ByteArrayHttpMessageConverter: byte[] 데이터 처리
    클래스 타입: byte[]
    미디어타입: */*
응답 ex) byte[] data
요청 ex) return byte[]; 쓰기 미디어 타입 `application/octet-stream`
  • StringHttpMessageConverter: String 문자로 데이터 처리
    클래스 타입: String
    미디어타입: */*
응답 ex) String data 
요청 ex) return "ok"; 쓰기 미디어 타입 `text/plain`
  • MappingJackson2HttpMessageConverter
    클래스 타입: 객체 or HashMap
    미디어타입 application/json 관련
응답 ex) HelloData data
요청 ex) return helloData;

📒 요청 매핑 헨들러 어뎁터 구조

HTTP 메시지 컨버터가 스프링 MVC 어디쯤에서 사용되는 지 알아볼 것이다.

이는 @RequestMapping을 처리하는 핸들러 어댑터인
RequestMappingHandlerAdapter(요청 매핑 헨들러 어뎁터)에 있다.

RequestMappingHandlerAdapter(요청 매핑 헨들러 어뎁터) 의 구조는 아래 사진과 같다.

ArgumentResolver

컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체) 생성
제공하는 파라미터 종류: https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

ReturnValueHandler

응답 값을 변환하고 처리
제공하는 응답 값 종류: https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types

✏️ HTTP 메시지 컨버터 위치

요청의 경우 ArgumentResolverHTTP 메시지 컨버터를 사용해서 필요한 객체를 생성한다.

응답의 경우 ReturnValueHandlerHTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.


지금까지 김영한 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(유료강의) 강의를 참고하여 스프링 MVC - 기본 기능 2 에 대해 공부하였다.

profile
☘️

0개의 댓글