티스토리 뷰

Spring

[ 스프링 MVC ] 스프링 MVC

GiHoo 2023. 6. 27. 18:21

HTTP  요청 - 쿼리 파라미터, HTML FORM, HTTP 메시지 사용/META-INF/resources

1. GET - 쿼리 파라미터 /url?username=hello&age=20

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

2. POST - HTML Form content-type: application/x-www-form-urlencoded

  • 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
  • 예) 회원 가입, 상품 주문, HTML Form 사용

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

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

 

HTTP 요청 파라미터 - @ModelAttribute

 

@RequestParam 을  @ModelAttribute로 변환

스프링 MVC는 @ModelAttribute가 있으면 

해당 객체를 생성하고, 요청 파라미터 이름으로 HelloData 객체의 프로퍼티를 찾는다. 

이후 해당 프로퍼티의 setter를 호출하여 파라미터의 값을 바인딩한다.

 

프로퍼티 -> 객체에 getter와 setter가 있을 경우 프로퍼티가 있다고 함. 변경하면 set이, 조회하면 get이 호출

 

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

요청 파라미터가 아닌 메세지 바디로 오는 데이터는 @RequestParam, @ModelAttribute를 사용할 수 없다.

 

1. InputStream

HttpRequest -> InputStream

메세지 바디의 내용을 inputStream으로 추출하여 사용할 수 있다.

 

2. HttpEntity<>

HttpEntity<> 사용

HTTP header, body 정보를 편리하게 조회, 메시지 바디 정보를 직접 조회한다.

응답에서도 사용 가능하다.

이 경우 view를 조회하지 않고 바로 메세지 바디에 담아 전달한다.

 

3. @RequestBody

@RequestBody를 통해 쉽게 메세지 바디를 읽어올 수 있다.

Header 정보가 필요하다면 @RequestHeader나 HttpEntity<>를 사용하자

@ResponsBody를 사용하면 메세지 바디에 응답 결과를 보낼 수 있다. 마찬가지로 view를 조회하지 않음

 

요청 파라미터 vs HTTP 메시지 바디 요청

  • 파라미터를 조회하는 기능: @RequestParam , @ModelAttribute
  • HTTP 메시지 바디를 직접 조회하는 기능: @RequestBody

 

HTTP 요청 메시지 - JSON

@RequestBody를 이용한 JSON 요청 메시지

요청 메세지로 JSON이 온다면 inputStream으로 메세지 바디를 읽고, 이를 objectMapper로 객체 형식으로 변환해야 한다.

이는 @RequestBody 와 기존에 있는 클래스 객체로 변환할 수 있으며 훨 간편해진다.

 

HTTP  응답 - 정적 리소스, 뷰 템플릿, HTTP 메시지 사용

1. 정적 리소스 - 정적인 html, css, js를 제공할 때 사용

스프링 부트는 클래스 패스의 /static, /public, /resources, /META-INF/resources 디렉토리의 정적 리소스를 제공

정적 리소스 경로 : src/main/resources/static

 

2. 뷰 템플릿 - 동적인 html을 제공할 때 사용

뷰 템플릿을 거쳐 HTML이 생성되고, 뷰가 응답을 만들어서 전달한다.

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

@ResponseBody가 없으므로 반환값으로 뷰 리졸버를 실행해 뷰를 찾고 렌더링한다.

 

+)Thymeleaf

위 return 값은 response/hello 인데 실제 뷰 템플릿의 위치는 src/main/resources/templates/response/hello.html이다

이는 Thymelead의 기본 설정 값 덕분이다.

  • spring.thymeleaf.prefix=classpath:/templates/
  • spring.thymeleaf.suffix=.html

 

3. HTTP 메세지 - HTTP API를 제공하는 경우 데이터를 전달해야 하므로, HTTP 메세지 바디에 JSON 같은 형식의 데이터 제공

HTTP 응답 메세지에 일반 데이터나 JSON 타입으로 응답하는 코드

+) 클래스 레벨에 @Controller와 @ResponseBody를 합친 것이 @RestController

+) Rest API의 Rest다.

 

 

HTTP 메세지 컨버터

뷰 템플릿으로 HTML을 생성하여 응답하는 것이 아닌

HTTP API처럼 JSON 데이터를 HTTP 메세지 바디에서 읽거나 쓰는 경우 HTTP 메세지 컨버터를 사용하자

@ResponseBody의 동작

  • viewResolver 대신에 HttpMessageConverter 가 동작
  • 기본 문자처리: StringHttpMessageConverter
  • 기본 객체처리: MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

스프링 MVC에서 HTTP 메세지 컨버터를 사용하는 기준

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

주요 컨버터 종류

  • ByteArrayHttpMassageConverter - byte[] 데이터를 처리, 미디어 타입은 모두 가능
  • StringHttpMessageConverter - String 데이터 처리, 미디어 타입은 모두 가능
  • MappingJackson2HttpMessageConverter - JSON데이터 처리, 미디어 타입은 application/json

 

요청 매핑 핸들러 어댑터 구조

RequestMappingHandlerAdapter 동작 방식

이전까지 작성했던 핸들러를 실행할 때 파라미터 값을 매칭시켜줘야 하는데, 이를 누가 처리해주는가?

-> Argument Resolver 가 처리해준다. 이 Resolver가 핸들러가 필요한 파라미터를 준비하고, 

-> 핸들러 어댑터가 핸들러를 호출하면, 그때 준비한 파라미터를 전달하여 실행한다.

 

ReturnValueHandler

-> ModelAndView와 같은 반환 값을 변환해준다. -> ViewResolver가 처리할 수 있게

 

 

 

 

본 포스팅은 인프런 강의 김영한님의

[ 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 ] 을 수강하며 작성한 내용입니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31