본문으로 바로가기

[Spring MVC] @RequestBody , HttpEntity

category 카테고리 없음 2019. 8. 22. 05:40

@RequestBody

     요청 본문(body)에 들어있는 데이터를 HttpMessageConveter를 통해 변환한 객체로 받아올 수 있다.

     @Valid 또는 @Validated를 사용해서 값을 검증 할 수 있다.

     BindingResult 아규먼트를 사용해 코드로 바인딩 또는 검증 에러를 확인할 수 있다.

 

HttpMessageConverter

     스프링 MVC 설정 (WebMvcConfigurer)에서 설정할 수 있다.

        스프링부트에선 기본적으로 jackson Library가 잡혀있다.

     configureMessageConverters: 기본 메시지 컨버터 대체

     extendMessageConverters: 메시지 컨버터에 추가

     기본 컨버터

              WebMvcConfigurationSupport.addDefaultHttpMessageConverters

 

HttpEntity

     @RequestBody와 비슷하지만 추가적으로 요청 헤더 정보를 사용할 수 있다.

 

package com.example.demo;

import javax.validation.Valid;

import org.springframework.http.HttpEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/events")
public class EventApi {
	
	
	 @PostMapping
	 public Event createEvent(@RequestBody @Valid Event event ,BindingResult bindingResult) {
		
		 if(bindingResult.hasErrors()) {
			 bindingResult.getAllErrors().forEach(error->{
				 System.out.println(error);
			 });
		 }
		 
		 return event; 
     }
	
	
	@PostMapping
	public Event createEvent(@RequestBody HttpEntity<Event> request ) {
		request.getHeaders();
		return request.getBody();
	}

}

 

주로 컨트롤러에서 데이터들을 받을때 json 형태로 받게 되는데

json으로 형식을 특정 객체로 변환하게 하려면 @RequestBody를 사용하면 됩니다.

{"name":"hello","limit":"10"} 을 보내게 되면

event.setName("hello") , event.setLimit("10") 을 자동으로 해주는것이다.

 

HttpEntity는 @RequestBody와 비슷하지만 추가적으로 요청 헤더 정보를 사용할 수 있다.

@RequestBody는 생략가능

 

<Test Code>

 

package com.example.demo;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import com.fasterxml.jackson.databind.ObjectMapper;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class EventApiTest {

	@Autowired
	ObjectMapper objectMapper;
    	
	@Autowired
	MockMvc mockMvc;
	
	@Test
	public void createEvent() throws Exception{
		
		Event event = new Event();
		event.setName("sungwon");
		event.setLimit(20);
		
		String json = objectMapper.writeValueAsString(event);
		
		mockMvc.perform(post("/api/events")
				.contentType(MediaType.APPLICATION_JSON_UTF8)
				.content(json))
				.andDo(print())
				.andExpect(status().isOk())
				.andExpect(jsonPath("name").value("sungwon"));
	}
	
}