@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 테스트를 위한 클라이언트
크롬 브라우저의 관련 확장 프로그램 설치
방명록 조회 프로젝트 생성 후
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
'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 |