FireDrago
[Spring] Spring 기본기능 본문
Http 요청을 처리하고 Http 응답을 전송하는것이 웹 프로그램의 기능이다.
Spring 에서 Http 요청을 받고 Http 응답을 전송하는 기본적인 기능을 사용해보자
Http 요청
- HTML Form 전송 (post)
- 쿼리 스트링 (get)
- HTTP 메세지 바디에 직접 전송 (post,put,delete,patch)
<HTML 폼, 쿼리스트링 요청>
1. @RequestParam
이 두가지 요청은 같은 방식으로 처리할 수 있다. 가장 기본적인 방법부터 살펴보자

@RequestParam 애너테이션으로 파라미터를 직접 받아오는 방법이다.
- @RequestParam(required = true / false) : 필수인지 선택인지 설정을 할 수 있다.
- @RequestParam(defaultValue = "1") : 기본값을 설정할 수 있다. 아무것도 입력 없으면 "1"
2. @ModelAttribute
두번째 방법은 @ModelAttribute 애너테이션을 이용하는 방법이다.
지정된 객체로 파라미터를 받아온다.


Lombok의 @Data 애너테이션을 사용하면 getter, setter, 생성자, equals 와 hascode 메서드를
자동으로 생성해준다.
< HTTP 메세지 바디에 직접 전송 - Text>
1. InputStream 사용
문자열로 HTTP 바디 정보를 가져올때 ServletInputStream을 사용하는 방법이 있다.

- 먼저 Request 객체의 getInputStream() 을 통해 ServletInputStream 객체를 생성한다.
- Stream 객체를 String으로 변환하기위해 StreamUtils.copyToString( 스트림, 인코딩방법); 을 사용한다.
- response.getWriter() 메서드로 Writer 객체를 가져온뒤 write(문자열) 로 응답메시지 바디에 문자열을 직접입력
2. HttpEntity 사용
HttpEntity 객체는 HTTP 바디 정보를 가져올때, HTTP 응답 메시지에 바디 정보를 입력할때 둘다 사용할 수 있다.
HttpEntity 객체를 반환하는 경우, 스프링은 View 객체를 생성하지 않고,
HttpMessageConverter를 통해 HTTP 응답메시지 데이터를 생성한다. 나중에 더 자세히 알아보자

3. @RequestBody 사용
@RequestBody 애너테이션도 사용할 수 있다.
HttpEntity와 차이점은 HTTP 상태코드를 동적으로 작성할 수 없다는 점 (@RequestStatus)과
헤더정보를 조회하려면 HttpEntity를 사용해야한다는 점이다.

< HTTP 메세지 바디에 직접 전송 - JSON>
1. InputStream 사용

Json 데이터를 InputStream으로 받아올때, 문자열과의 차이점은 ObjectMapper를 통해 문자열을 객체로 Mapping
해야한다는 점이다. 그 외에는 큰 차이가 없다
2. @RequestBody 사용

@RequesBody 애너테이션을 사용하면, HttpEntity 객체와 마찬가지로, HttpMessageConverter 가 사용된다.
입력된 데이터를 HelloData 객체로 변환하기위해, MappingJackson2HttpMessageConverter가 사용된다.
HTTP 응답
- 정적 리소스
- 동적 리소스 (뷰 템플릿)
- HTTP 메세지 바디에 직접 전송
정적 리소스를 응답할때는 resource/static 패키지 안의 정적리소스를 호출 할 수 있다.
동적 리소스를 응답할때는 resource/templates 패키지 안의 리소스를 View 객체를 이용하여 렌더링 후 전송한다.
정적리소스와 동적 리소스 둘다 Html 파일을 전송한다.
< HTTP 메세지 바디에 직접 전송>

이 포스팅은 김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 수강하고 작성되었습니다
'프로그래밍 > Spring' 카테고리의 다른 글
| [Spring] 검증처리 (0) | 2024.02.09 |
|---|---|
| [Spring] HttpMessageConverter (0) | 2024.02.01 |
| [Spring] Spring MVC 기본구조 (0) | 2024.01.26 |
| [Spring] 빈 생명주기 콜백 (0) | 2024.01.11 |
| [Spring] 의존성 자동주입 (0) | 2024.01.09 |
