BoostCource/Back-end

#03. BE - RestController

칸타탓 2018. 8. 3. 00:49

<3. RestController>

http://www.edwith.org/boostcourse-web




@RestController


  • Spring 4 에서 Rest API 또는 Web API를 개발하기 위해 등장한 애노테이션

  • 이전 버전의 @Controller와 @ResponseBody를 포함한다.



 


* MessageConvertor


  • 자바 객체와 HTTP 요청 / 응답 바디를 변환하는 역할

  • @ResponseBody, @RequestBody

  • @EnableWebMvc 로 인한 기본 설정

  • WebMvcConfigurationSupport 를 사용하여 Spring MVC 구현

  • Default MessageConvertor 를 제공

  • 링크 바로가기 의 addDefaultHttpMessageConverters메소드 항목 참조

 


* MessageConvertor 종류




* JSON 응답하기


  • 컨트롤러의 메소드에서는 JSON으로 변환될 객체를 반환한다.

  • jackson라이브러리를 추가할 경우 객체를 JSON으로 변환하는 메시지 컨버터가 사용되도록 @EnableWebMvc에서 기본으로 설정되어 있음

  • jackson라이브러리를 추가하지 않으면 JSON메시지로 변환할 수 없어 500오류가 발생함!

=> 반드시 jackson라이브러리 추가하기


<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson2.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>${jackson2.version}</version>
</dependency>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <jackson2.version>2.8.6</jackson2.version>

  </properties>


  • 사용자가 임의의 메시지 컨버터(MessageConverter)를 사용하도록 하려면 WebMvcConfigurerAdapter의 configureMessageConverters메소드를 오버라이딩 하도록 한다. 





실습코드


GuestbookApiController.java

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");
	}
}

 




'BoostCource > Back-end' 카테고리의 다른 글

#05. BE - 쿠키  (0) 2018.11.16
#05. BE - 상태정보  (0) 2018.11.16
#03. BE - 레이어드 아키텍처(Layered Architecture)  (0) 2018.08.03
#03. BE - Spring MVC 실습  (0) 2018.08.03
#03. BE - Spring MVC 개념과 동작흐름  (0) 2018.08.03