Spring Boot

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`는 클라이언트와 서버 간에 데이터를 교환할 때 중요한 역할을 수행합니다.