티스토리 뷰
http header, context-type(application/x-www-form-urlencoded, text/plain, application/json) [@RequestBody 추가설명]
svdjcuwg4638 2023. 6. 7. 13:13
HTTP header
HTTP 요청이나 응답에 포함되는 정보입니다. 이 정보는 클라이언트와 서버가 데이터를 어떻게 처리해야 하는지에 대한 세부사항을 제공합니다. 예를 들어, 어떤 유형의 내용이 요청이나 응답에 포함되는지, 클라이언트가 어떤 언어를 이해할 수 있는지, 인증 정보 등을 제공합니다.
Content-Type
HTTP 헤더는 요청이나 응답의 바디에 포함된 데이터의 미디어 유형을 나타냅니다. 서버는 이 정보를 이용해서 어떻게 이 데이터를 해석해야 하는지 결정할 수 있습니다. 클라이언트는 이 정보를 이용해서 어떻게 이 데이터를 표현하거나 처리해야 하는지 결정할 수 있습니다.
Content-Type은 API의 POST나 PUT 요청에서 사용되며, 클라이언트가 서버에 어떤 형식의 데이터를 전송하는지 알려주는 역할을 합니다. 그리고 이를 바탕으로 서버는 적절한 방식으로 데이터를 파싱합니다.
Content-Type의 종류
application/x-www-form-urlencoded
이 유형은 HTML 폼 데이터가 서버로 전송될 때 주로 사용됩니다. 이 유형의 데이터는 키-값 쌍을 형성하고 이들 쌍은 `&`로 분리됩니다. 키와 값은 `=`으로 연결됩니다. 이 값들은 URL에서 안전하게 사용할 수 있도록 인코딩되어야 합니다.
@PostMapping("/body1")
public String xwwwform(String username) {
log.info(username);
return "key=value 전송옴";
}
username = cos 가 전송되어 오면 username으로 로그를 확인하면 cos가 오게됨
text/plain
이 유형은 텍스트 데이터를 나타냅니다. 이 유형의 데이터는 어떤 특별한 인코딩 없이 그대로 전송됩니다.
@PostMapping("/body2")
public String plaintext(@RequestBody String data) {
log.info(data);
return "text/plain전송옴";
}
파라미터에 @requestBody 가 있어야 하며 안녕이라고 보낼시 안녕이라는 값이 오게 된다.(String문자만 전달된다.)
application/json
이 유형은 JSON(JavaScript Object Notation) 형식의 데이터를 나타냅니다. JSON은 웹에서 데이터를 교환하는 데 널리 사용되는 경량 데이터 포맷입니다. JSON 데이터는 속성-값 쌍의 집합을 포함하는 객체로 표현됩니다.
@PostMapping("/body3")
public String applicationjson(@RequestBody String data) {
log.info(data);
return "json 전송옴";
}
위 방식으로 데이터를 전송받아 로그를출력해보면
위와같이 json형태로 넘어오게 되는데 만약 값만 필요하다면 어떻게 해야할까
우선 json의 키에 맞는 Class(DTO)를 만들어주자
domain.User.java
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
매개변수를 내가만든 User클래스로 받아 getter로 가져오면 된다.
@PostMapping("/body4")
public String applicationjsonToObject(@RequestBody User user) {
log.info(user.getUsername());
return "json 전송옴";
}
위와같이 json형태로 값을 전송받을때 그 키에 맞게 user객채에 username이라는 속성에 해당하는 값이 알아서 들어가게된다.
@RequestBody
우리가 text나 json형태로 전송받을때 어노테이션@RequestBody를 사용하게 되는데 왜 사용해야하는지에 대해 알아보자.
`@RequestBody`는 Spring에서 HTTP 요청 본문을 Java 객체로 변환하도록 하는 어노테이션입니다. 이는 주로 POST나 PUT 요청에서 사용됩니다.
즉, 클라이언트가 서버로 보내는 HTTP 요청 본문에는 JSON이나 XML과 같은 복잡한 데이터 구조가 포함될 수 있습니다. 이러한 복잡한 데이터 구조를 Java 객체로 쉽게 변환하기 위해 `@RequestBody`를 사용합니다.
예를 들어, 클라이언트가 다음과 같이 JSON 형식의 사용자 데이터를 보낼 수 있습니다.
json
{
"name": "John Doe",
"email": "john.doe@example.com"
}
서버 측에서는 다음과 같이 `@RequestBody`를 사용하여 이 데이터를 `User` 객체로 변환할 수 있습니다.
java
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/users")
public String createUser(@RequestBody User user) {
// 사용자 데이터 처리 로직
return "User created";
}
}
이 경우, `User` 클래스는 `name`과 `email` 필드를 가져야 합니다.
따라서 `@RequestBody`는 클라이언트가 서버에 보낸 복잡한 데이터 구조를 간편하게 Java 객체로 변환하는 역할을 합니다. 이를 통해 개발자는 HTTP 요청 본문의 구문 분석을 걱정하지 않고 비즈니스 로직에 집중할 수 있습니다.
SpringBoot에서 json데이터로 응답
위에선 json데이터를 받아 그에맞는 DTO에 저장을 하였다 하지만 보낼땐 어떻게 해야할까?
package com.example.demo.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.domain.User;
@RestController
public class HttpResponseJsonController {
@GetMapping("/resp/json")
public String respJson() {
return "{\"username\":\"cos\"}";
}
@GetMapping("/resp/json/object")
public User respJsonObject() {
User user = new User();
user.setUsername("홍길동");
return user;
}
}
어떻게 객체를 내보내면 json형태로 값이 나가게 될까?
@RestController 일때만 MessageConverter가 작동하며
MessageConverter가 자동으로JavaObject를 Json으로 변경해서 통신을 통해 응답을해준다.
MessageConverter란?
`MessageConverter`는 Spring Framework에서 제공하는 인터페이스로, 클라이언트와 서버 간에 데이터를 교환할 때 사용되는 메시지의 형식을 변환하는 역할을 합니다.
기본적으로 HTTP 요청이나 응답에 사용되는 데이터는 바이트 스트림 형식이지만, 우리는 일반적으로 Java의 객체를 사용하여 이 데이터를 다룹니다. 따라서 우리는 요청이나 응답 데이터를 자바 객체로 변환하거나, 자바 객체를 HTTP 요청이나 응답 데이터로 변환할 필요가 있습니다. `MessageConverter`는 이러한 변환 작업을 담당합니다.
예를 들어, 클라이언트가 JSON 형식의 데이터를 보낼 경우, 이 데이터는 서버에서 처리할 수 있는 Java 객체로 변환해야 합니다. 반대로, 서버가 Java 객체를 가지고 있을 때, 이 객체는 클라이언트가 이해할 수 있는 JSON 형식으로 변환해야 합니다. `MessageConverter`는 이런 변환 작업을 수행합니다.
Spring에서는 다양한 유형의 `MessageConverter`를 제공합니다. 가장 일반적으로 사용되는 것은 `MappingJackson2HttpMessageConverter`와 `StringHttpMessageConverter`입니다.
- `MappingJackson2HttpMessageConverter`: 이 컨버터는 JSON 형식의 데이터와 Java 객체 간의 변환을 처리합니다. 이 컨버터는 Jackson 2 라이브러리를 사용하여 변환 작업을 수행합니다.
- `StringHttpMessageConverter`: 이 컨버터는 String 형식의 데이터와 Java String 객체 간의 변환을 처리합니다.
따라서 `MessageConverter`는 클라이언트와 서버 간에 데이터를 교환할 때 중요한 역할을 수행합니다.
'Spring Boot' 카테고리의 다른 글
Spring Boot Security Config 로그인확인후 페이지이동시키기 (0) | 2023.06.07 |
---|---|
HTML 응답(txt, mustache, jsp) yml jsp설정(ViewResolver) (0) | 2023.06.07 |
쿼리스트링(Query String )과 주소변수매핑(Path variable) (0) | 2023.06.07 |
Spring Boot 의존성 종류(dependency) (0) | 2023.06.07 |
SpringBoot + MariaDB yml과 jpa란?? (0) | 2023.06.03 |