이전 글을 끝으로 페이징과 검색 처리, 그리고 검색 조건과 이전 페이지 정보를 유지하는 기능의 구현이 완료되었습니다. 다음 글부터는 게시판에 댓글 CRUD 기능을 구현하는데요. 이번에는 댓글 처리에서 이용할 REST API에 대해 맛보기 시간을 가져보겠습니다.
이번 글은 구멍가게 코딩단의 코드로 배우는 스프링 웹 프로젝트 서적을 참고해서 포스팅하였습니다.
1. REST란?
REST는 "Representational State Transfer"의 약어로, 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념입니다. 스마트폰과 태블릿 등 서버에 접근하는 디바이스의 종류가 다양해지고 있기에 디바이스의 종류에 상관없이 공통으로 데이터를 처리할 수 있도록 하는 방식을 REST라고 합니다.
우리는 지금까지 게시판을 구현하면서 컨트롤러에서 서비스를 호출하고, 사용자가 필요로 하는 데이터를 화면(View)으로 전달한 후 HTML을 리턴해주는 형태로 진행해 왔습니다. REST API는 사용자가 어떠한 요청을 했을 때 HTML을 리턴하지 않고, 자바스크립트를 이용해서 사용자가 필요로 하는 결과(데이터)만을 리턴해주는 방식입니다.
당장은 이해가 쉽지 않으실 수 있으니, 실제로 댓글 데이터를 처리하는 과정에서 다시 설명드리도록 할게요 :)
김동범 님의 글에 REST API에 대한 설명이 너무나도 잘 정리되어 있습니다. 한 번쯤은 꼭! 읽어보시기를 권장드립니다.
2. REST 방식의 데이터 처리
2-1) @ResponseBody
우선은 스프링 3 버전부터 제공된 @ResponseBody의 사용법을 알아보겠습니다. java 디렉터리에 다음의 클래스를 추가하고, 소스 코드를 작성해 주세요.
package com.study;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class RestApiTestController {
@GetMapping("/members")
@ResponseBody // public @ResponseBody List<Map<String, Object>> findAllMember()와 같이 리턴 타입 앞에도 선언 가능
public List<Map<String, Object>> findAllMember() {
List<Map<String, Object>> members = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
Map<String, Object> member = new HashMap<>();
member.put("id", i);
member.put("name", i + "번 개발자");
member.put("age", 10 + i);
members.add(member);
}
return members;
}
}
이제, 브라우저에서 해당 주소로 접속해 보면 findAllMembmer( )가 리턴하는 회원(members) 데이터가 화면에 출력됩니다.
어떤 느낌인지 감이 좀 잡히시나요? 컨트롤러 메서드에 @ResponseBody가 붙으면, 스프링의 메시지 컨버터(Message Converter)에 의해 화면(HTML)이 아닌 리턴 타입에 해당하는 데이터 자체를 리턴합니다.
JSON Formatter를 이용하면 JSON을 한눈에 알아보기 쉬운 구조로 포맷할 수 있습니다. 유효성 검사도 함께 해주니 한 번쯤은 이용해 보시길 권장드립니다.
2-2) @RestController
다음은 스프링 4 버전부터 제공되는 @RestController입니다. @RestController는 클래스 레벨에 선언할 수 있으며, @RestController가 붙은 컨트롤러의 모든 메서드에는 자동으로 @ResponseBody가 적용된다고 이해해 주시면 됩니다.
RestApiTestController를 다음과 같이 변경해 주세요.
package com.study;
import com.study.common.dto.SearchDto;
import com.study.common.paging.PagingResponse;
import com.study.domain.post.PostResponse;
import com.study.domain.post.PostService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class RestApiTestController {
private final PostService postService;
@GetMapping("/posts")
public PagingResponse<PostResponse> findAllPost() {
return postService.findAllPost(new SearchDto());
}
}
브라우저에서 해당 주소로 접속해 보면, 객체 배열인 "list"에는 각각의 게시글 데이터가 담겨 있고, "pagination"에는 계산된 페이지 정보가 담겨있는 걸 확인하실 수 있습니다.
참고로, 화면에 출력된 결과 데이터를 개발자 도구의 콘솔(Console)에서 변수로 선언한 후 출력하면 다음과 같은 구조로 확인하실 수 있습니다.
마치며
REST API에 대해 깊게 다루지는 않았지만, "REST는 화면(HTML)이 아닌 데이터 자체를 리턴한다."는 개념만 확실히 짚고 넘어가 주시면 되겠습니다.
다음 글부터는 데이터베이스에 댓글 테이블과 데이터(레코드)를 추가하고, @RestController와 jQuery의 Ajax를 이용해서 비동기 방식으로 데이터를 주고받는 방법을 알아보겠습니다.
오늘도 방문해 주신 여러분께 진심으로 감사드립니다. 좋은 하루 보내세요 :)
댓글