들어가기 전에
하기 포스팅은 "스프링부트 시작하기(김인우 저)" 책을 공부하며 적은 포스팅입니다. 이전 포스팅에서는 RESTful 게시판으로 변경하는 방법을 살펴보았습니다. 앞선 구현을 가지고는 REST API를 만들었다고 이야기하기는 어렵습니다. 이번 포스팅을 통해 실제 어플리케이션 개발에서 프론트와 백엔드가 어떻게 나뉘는지 살펴보도록 하겠습니다.
일반적인 어플리케이션은 백엔드 서버와 클라이언트로 나뉩니다. 여기서 클라이언트는 웹 페이지가 될 수도 있고, 안드로이드나 iOS 앱이 될 수도 있습니다. 그리고, 백엔드 서버는 이러한 클라이언트의 요청을 수행하는 API를 만듭니다. 지금까지는 하나의 어플리케이션에서 Thymeleaf와 jQuery를 이용해 화면을 개발했습니다. 그리고, 이를 실행하기 위한 로직도 함께 포함된 구조였습니다. 현재까지는 하나의 주소에서 비즈니스 로직도 처리하고, 화면을 처리했기 때문에 REST API라고 이야기 하기는 어렵습니다(API와 화면이 구분되지 않음).
REST API 개발하기
먼저 controller 패키지에 RestBoardApiController 클래스를 생성하고 아래 코드를 작성합니다. 대부분 코드는 RestBoardController 클래스와 비슷합니다. REST API의 기본을 알아보기 위한 실습이므로, 게시글 목록 조회, 게시글 상세 내용 조회, 작성, 수정, 삭제 API만 작성합니다.
package board.board.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import board.board.dto.BoardDto;
import board.board.service.BoardService;
@RestController
public class RestBoardApiController {
@Autowired
private BoardService boardService;
@RequestMapping(value="/api/board", method=RequestMethod.GET)
public List<BoardDto> openBoardList() throws Exception {
return boardService.selectBoardList();
}
@RequestMapping(value="/api/board/write", method=RequestMethod.POST)
public void insertBoard(@RequestBody BoardDto board) throws Exception {
boardService.insertBoard(board, null);
}
@RequestMapping(value="/api/board/{boardIdx}", method=RequestMethod.GET)
public BoardDto openBoardDetail(@PathVariable("boardIdx") int boardIdx) throws Exception {
return boardService.selectBoardDetail(boardIdx);
}
@RequestMapping(value="/api/board/{boardIdx}", method=RequestMethod.PUT)
public String updateBoard(@RequestBody BoardDto board) throws Exception {
boardService.updateBoard(board);
return "redirect:/board";
}
@RequestMapping(value="/api/board/{boardIdx}", method=RequestMethod.DELETE)
@DeleteMapping(value="/board/{boardIdx}")
public String deleteBoard(@PathVariable("boardIdx") int boardIdx) throws Exception {
boardService.deleteBoard(boardIdx);
return "redirect:/board";
}
}
- @RestController: @RestController 어노테이션은 @Controller와 @ResponseBody 어노테이션을 합친 것입니다.
- @RestController 어노테이션을 사용하면 해당 API의 응답 결과를 웹 응답 바디(Web Response body)를 이용해 보내줍니다.
- 일반적으로 서버와 클라이언트의 통신에 JSON 형식을 사용하여, @RestController 어노테이션을 이용하면 결과값을 JSON 형식으로 만들어줍니다.
- @RequestMapping(value="/api/board", method=RequestMethod.GET): 앞서 만든 RestBoardController 클래스에 정의된 URI와 겹치지 않도록 앞에 /api/를 붙입니다.
- public List<BoardDto> openBoardList() throws Exception: 게시글 목록을 조회하고 그 결과를 반환합니다.
- 이전에는 ModelAndView 클래스에 게시글 목록 조회 결과를 담아 뷰에 보냈던 것과 달리, 조회 결과를 바로 API 응답 결과로 사용합니다.
- public void insertBoard(@RequestBody BoardDto board) throws Exception: REST API의 기본사항만 알아보기 위해 첨부파일은 넣지 않도록 수정했습니다.
- insertBoard(board, null)로 보내 multipartHttpServletRequest에 빈 값을 보내도록 합니다.
- public String updateBoard(@RequestBody BoardDto board) throws Excpetion: GET과 POST의 주요한 차이점 중 하나는 GET은 요청 주소에 파라미터를 같이 보내고, POST는 파라미터를 HTTP 패킷의 바디에 담아 전송한다는 것입니다. @RequestBody 어노테이션은 메소드의 파라미터가 반드시 HTTP 패킷의 바디에 담겨 있어야 함을 의미합니다.
- POST나 PUT을 사용하는 메소드에는 @RequestBody 어노테이션 사용
- GET 메소드는 @RequestParam 어노테이션 사용
REST API 테스트하기
웹 페이지가 아니기 때문에 API를 테스트할 툴이 필요합니다. 여기서는 Postman을 사용하도록 하겠습니다. 하기 사이트에서 다운받을 수 있고 이메일 주소로 가입할 수 있습니다. 로그인 시 기존에 저장한 내용이 모두 동기화되어 편리합니다.
GET 방식 호출 테스트
게시글 목록 조회 API부터 살펴보겠습니다. 게시글 목록 조회에는 별도 파라미터가 필요 없으므로 URL만 입력하고 전송을 누릅니다. 아래와 같이 게시글 목록 조회 결과가 json array 형식으로 나온 것을 확인할 수 있습니다. 이와 같이 어떤 요청의 호출 결과에 특별한 작업을 하지 않아도 스프링 프레임워크는 자동으로 올바른 형식의 JSON 데이터를 만들어 줍니다.
다음으로는 게시글 상세 내용을 조회해보겠습니다. 게시글 상세 내용의 경우 게시글 목록 조회와 다르게 json object 형식으로 조회가 됩니다. 그리고, 게시글 상세 내용인 BoardDto 클래스 결과가 조회되며 fileList 내에 첨부파일 목록이 포함되어 있음을 확인할 수 있습니다.
여기서 만든 API에는 파라미터를 사용하는 API가 없어 URL만 넘겼습니다. 만약 파라미터 추가가 필요하다면 아래와 같이 Params를 추가해야 합니다.
POST 방식 호출 테스트
다음으로는 POST 방식인 게시글 등록을 테스트해보도록 하겠습니다. POST 방식은 웹 요청의 바디에 파라미터를 담아 보내야 하기 때문에, 게시글 작성시 필요한 항목들을 아래와 같이 파라미터에 담아 전송했습니다. Send 버튼을 보내면 이클립스 로그에 아래와 같이 새로운 게시글이 생성되었음을 알 수 있습니다.
PUT 방식 호출 테스트
PUT 방식을 사용하는 것으로는 게시글 수정이 있었습니다. 게시글 수정 시, 게시글 등록때와 마찬가지로 title과 contents 항목을 웹 요청의 바디에 파라미터를 담아 보내야 하므로 아래와 같이 테스트할 수 있습니다.
DELETE 방식 호출 테스트
마지막으로 DELETE 방식을 테스트하기 위해 위에서 만든 테스트용 글을 삭제해보도록 하겠습니다. 게시글 삭제의 경우, 따로 바디에 넣어 보낼 파라미터가 없기 때문에 URL만 적어 호출하면 됩니다.
'FRAMEWORK > Spring' 카테고리의 다른 글
[SpringBoot] 게시판 구현하기 18 (GCP 이용해 서버 구성하기) (0) | 2021.01.10 |
---|---|
[SpringBoot] 게시판 구현하기 17 (스프링 데이터 JPA 사용해보기) (2) | 2021.01.03 |
[SpringBoot] 게시판 구현하기 15 (RESTful 게시판 만들기) (0) | 2021.01.01 |
[SpringBoot] 게시판 구현하기 14 (존재하는 게시글에 파일 추가하기) - 책 응용편 (0) | 2021.01.01 |
[SpringBoot] 게시판 구현하기 13 (파일 삭제하기) - 책 응용편 (0) | 2020.12.31 |