Web/Java+Spring

RestController - Rest API by Spring MVC

WakaraNai 2021. 6. 10. 16:41
728x90
반응형

@RestController

  • Spring 4, Spring MVC에서 Rest API 또는 Web API를 개발하기 위해 등장
  • 이전 버전의 @Controller와 @ResponseBody를 포함합니다.

 

MessageConvertor

  • JSON 변환 관련 담당. jackson 라이브러리를 추가해야만 JSON 처리 Convertor가 등장함
    • 추가하지 않았다면 500번 오류
  •  예
    • 외부에서 전달받은 JSON 메소드를 내부에서 사용할 수 있는 객체로 변환하기
    • 컨트롤러를 반환한 객체가 클라이언트에게 JSON으로 변화해서 전달될 수 있도록 하는 역할 
  • 자바 객체와 HTTP 요청 / 응답 바디를 변환하는 역할
  • @ResponseBody, @RequestBody
  • @EnableWebMvc 로 인한 기본 설정
    • WebMvcConfigurationSupport 를 사용하여 Spring MVC 구현
    • Default MessageConvertor 를 제공
    • 링크 바로가기 의 addDefaultHttpMessageConverters메소드 항목 참조

 

 

실습

이전에 작성한 guestbook 프로젝트에 웹 API 추가하기

 

꼭 jackson 라이브러리가 포함되어 있는지 확인하기

  <!-- jackson -->
     <jackson2.version>2.8.6</jackson2.version>


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

 

 

RestController

controller 패키지에

RestController 용 GuestbookApiController.java 생성하기

 

!! 클라이언트한테 응답이 갈 때는 메소드의 반환형과 관련없이

json으로 바뀌어서 전송된다 !!

 

@RestController -> RestController임을 선언하기

 

@RequestMapping(path="") -> 해당 API 클래스 안에 있는 것을 같은 url 맵핑으로 사용하게 해줌

그래서 @GetMapping에 path를 또다시 적지 않아도 됨

 

@Autowired -> 이 클래스에서도 서비스가 사용될 수 있도록

 

@PathVariable -> URL 속 변수의 값을 읽어들임

 

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;
	
	// application/json 요청이기 때문에
	// DispatcherServlet은 jsonMessageConvert를 내부적으로 사용해서
	// 해당 Map 객체를 json으로 변환해서 전송
	@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;
	}
	
	// Guestbook 객체도 json 메소드로 변환되어 클라이언트에게 전송됨
	@PostMapping
	public Guestbook write(@RequestBody Guestbook guestbook,
						HttpServletRequest request) {
		String clientIp = request.getRemoteAddr();
		// id가 입력된 guestbook이 반환된다.
		Guestbook resultGuestbook = guestbookService.addGuestbook(guestbook, clientIp);
		return resultGuestbook;
	}
	
	// 지정한 부분 뒤에 URL 변수는 이렇게 이어서 지정 가능
	@DeleteMapping("/{id}")
	public Map<String, String> delete(@PathVariable(name="id") Long id,
			HttpServletRequest request) {
		String clientIp = request.getRemoteAddr();
		
		int deleteCount = guestbookService.deleteGuestbook(id, clientIp);
		// key는 "success", value는 "true" 또는 "false"
		return Collections.singletonMap("success", deleteCount > 0 ? "true" : "false");
        // 리턴한 true를 가지고 Map 객체을 만들어서 JSON으로 응답
	}

}

 

 

 

Rest API 테스트를 위한 클라이언트

크롬 브라우저의 관련 확장 프로그램 설치

https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ko 

 

Talend API Tester - Free Edition

Visually interact with REST, SOAP and HTTP APIs.

chrome.google.com

 

방명록 조회 프로젝트 생성 후

get request 추가(add)하기

 

send 버튼으로 요청 전송

응답이 잘 되면 200번

 

GET request

예시 1

주소 : http://localhost:8082/guestbook/guestbooks

헤더 : Content-Type : application/json 

send를 누르면

첫 페이지의 방명록이 딱 5개만 보임

 

예시 2 - 쿼리문 추가

주소 : http://localhost:8082/guestbook/guestbooks?start=5

헤더 : Content-Type : application/json

send를 누르면

두 번째 페이지 목록이 나옴

 

 

 

 

POST Request

실제 입력할 guestbook의 정보를 가지고 들어와야 하기에

Body에 실제 입력할 값을 json 형태로 추가해준 뒤 테스트하기

 

주소 : http://localhost:8082/guestbook/guestbooks?start=5

헤더 : Content-Type : application/json

Body에 적은 내용이 그 다음번째 id가 할당되어 나온 모습

 

 

 

DELETE Request

삭제하고 싶은 id를 url의 쿼리문에 작성

주소 : http://localhost:8082/guestbook/guestbooks/8

728x90
반응형

'Web > Java+Spring' 카테고리의 다른 글

Interceptor  (0) 2021.07.13
Spring MVC에서 Session 사용하기  (0) 2021.07.08
Layered Architecture 실습 - 방명록  (0) 2021.06.09
Layered Architecture  (0) 2021.06.07
Spring MVC - Controller 작성 실습 3  (0) 2021.06.07