본문 바로가기
Spring|Spring-boot

[Spring] MessageConverter

by oncerun 2020. 7. 17.
반응형

 

 

MessageConverter는 자바 객체와 HTTP 요청 / 응답 바디를 변환하는 역할을 합니다.

외부에서 전달받은 json을 내부에서 사용할 수 있는 객체로 변환하거나 클라이언트에게 json으로 변환해서 전달할 수 있는 역할을 합니다.

@EnableWebMvc로 인한 기본 설정이며

WebMvcConfigurationSupport를 사용하여 Spring MVC 구현을 하고 있습니다.

 

메서드와 컨트롤러에 @RequestBody를 명시할 경우  파라미터 타입에 맞는 컨버터를 선택 한 다음  HTTP 요청 본문 통째로 메시지로 변환한 후 리턴하거나 파라미터에 바인딩합니다.

 

기본 메시지 컨버터는 jackson라이브러리를 사용하고 있습니다.

@EnableWebMvc에서 기본 설정으로 객체를 json으로 변환하는 메시지 컨버터가 사용되도록 되어있습니다.

따라서 jackson라이브러리를 추가하지 않으면 500 오류가 발생합니다.

 

사용자가 임의의 메시지 컨버터를 사용하기 위해선 WebMvcConfigurerAdapter의 configureMessageConverters메서드를 오버 라이딩합니다.

 

package kr.or.connect.guestbook.controller;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import kr.or.connect.guestbook.dto.Guestbook;
import kr.or.connect.guestbook.service.GuestbookService;

@RestController
@RequestMapping(path="/guestbooks")
public class GuestbookApiController {
	@Autowired
	GuestbookService guestbookService;
	
	@GetMapping
	public Map<String, Object> list(@RequestParam(name="start", required=false, defaultValue="0") int start) {
		
		List<Guestbook> list = guestbookService.getGuestbooks(start);
		
		int count = guestbookService.getCount();
		int pageCount = count / GuestbookService.LIMIT;
		if(count % GuestbookService.LIMIT > 0)
			pageCount++;
		
		List<Integer> pageStartList = new ArrayList<>();
		for(int i = 0; i < pageCount; i++) {
			pageStartList.add(i * GuestbookService.LIMIT);
		}
		
		Map<String, Object> map = new HashMap<>();
		map.put("list", list);
		map.put("count", count);
		map.put("pageStartList", pageStartList);
		
		return map;
	}
	
	@PostMapping
	public Guestbook write(@RequestBody Guestbook guestbook,
						HttpServletRequest request) {
		String clientIp = request.getRemoteAddr();
		// id가 입력된 guestbook이 반환된다.
		Guestbook resultGuestbook = guestbookService.addGuestbook(guestbook, clientIp);
		return resultGuestbook;
	}
	
	@DeleteMapping("/{id}")
	public Map<String, String> delete(@PathVariable(name="id") Long id,
			HttpServletRequest request) {
		String clientIp = request.getRemoteAddr();
		
		int deleteCount = guestbookService.deleteGuestbook(id, clientIp);
		return Collections.singletonMap("success", deleteCount > 0 ? "true" : "false");
	}
}

 

 

 

MessageConverter에는 ConversionService가 적용되지 않습니다.

객체를 JSON으로 변환할 때 Converter개념과 많이 혼동되는데, HttpMessageConverter의 역할은 HTTP 메시지 바디의 내용을 객체로 변환하거나 객체를 HTTP 메시지 바디에 입력하는 것이다. 이러한 메시지 컨버터는 내부에서 Jackson, Gson과 같은 라이브러리를 사용한다. 이러한 결과는 라이브러리에 달린 것이기 때문에 JSON 결과로 만들어지는 숫자나 날짜 포맷을 변경하고 싶으면 해당 라이브러리 설정을 통해 포멧으 변경해야 한다. 

 

즉 이것은 ConversionService와 어떠한 관계도 없다.

 

 

Spring Converter

 

Spring Converter

HTTP 요청 파라미터는 모두 문자로 처리된다. 따라서 요청 파라미터를 다른 타입으로 변환해서 사용하고 싶으면 다른 타입으로 변환하는 과정이 필요하다. 그런데 스프링에서는 (@RequestParam Interge

chinggin.tistory.com

 

반응형

'Spring|Spring-boot' 카테고리의 다른 글

[Spring] Spring security  (0) 2020.07.20
[Spring] Spring MVC Session  (0) 2020.07.20
레이어드 아키텍쳐  (0) 2020.07.17
[Spring] setting  (0) 2020.07.17
[Spring] Spring JDBCTemplate  (0) 2020.07.16

댓글