지금까지 RESTful 게시판으로 변경되는 방법을 살펴봤다. 컨트롤러를 제외하면 서비스나 매퍼, SQL의 변경은 없었는데, 이것만 가지고서는 REST API로 만들었다고 보기는 어렵다.

일반적인 애플리케이션은 백엔드 서버와 클라이언트로 나눠진다. 여기서 클라이언트는 웹 페이지가 될 수도 있고 안드로이드나 iOS 앱리 될 수도 있다.

일반적으로 웹 페이지를 개발하는 웹 개발자를 프런트엔드 개발자라고 하는데 백 엔드 서버는 이러한 클라이언트의 요청을 수행하는 API를 만든다.

여태까지 하나의 애플리케이션에서 Thymeleaf와 jQuery를 이용해서 화면을 개발했다. 그리고 이를 실행하기 위한 로직도 같이 포함된 구조였지만 이는 REST API라고 보기 어렵다. 왜냐하면 API와 화면이 구분된건 아니기 때문이다. 하나의 주소에서 비지니스 로직도 처리하고 화면도 호출했었다.

이 절에서는 앞에서 만든 게시판 기능을 REST API로 변경해서 실제 애플리케이션 개발에서 프런트와 백엔드가 어떻게 나뉘는지 살펴보자.

 

 

 

REST API 개발하기

 

먼저 controller 패키지에 RestBoardApiController 클래스를 생성하고 다음 코드를 작성하자. 대부분의 코드는 RestBoardController 클래스와 비슷하다. REST API 에 대해서 간단히 살펴보기 때문에 REST API의 기본이 되는 게시글 목록 조회, 게시글 상세 내용 조회, 작성, 수정, 삭제 API만 작성한다.

 

RestBoardApiController

board\src\main\java\board\board\controller\RestBoardApiController.java

package board.board.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
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_433(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)
	public String deleteBoard(@PathVariable("boardIdx") int boardIdx) throws Exception{
		boardService.deleteBoard(boardIdx);
		return "redirect:/board";
	}
}

 

15: 앞에서 사용했던 @Controller 어노테이션 대신 @RestController 라는 어노테이션을 사용한다. 

@RestController 어노테이션은 @Controller 와 @ResponseBody 어노테이션을 합친 어노테이션이다.

@RestController 어노테이션을 사용하면 해당 API의 응답 결과를 웹 응답 바디(Web response body)를 이용해서 보내준다. 일반적으로 서버와 클라이언트 통신에 JSON 형식을 사용한다. @RestController 어노테이션을 이용하면 결괏값을 JSON 형식으로 만들어 준다.

 

22,23: 게시글 목록을 조회하고 그 결과를 반환한다. 기존에는 ModelAndView 클래스에 게시글 목록 조회 결과를 담아서 뷰에 보냈던 것과 달리 조회 결과를 바로 API의 응답 결과로 사용한다. 게시글 목록 조회는 List<BoardDto>형식이고 이를 바로 JSON 형태로 반환한다. 

 

27.38: GET과 POST의 주요한 차이점 중 하나는 GET은 요청 주소에 파라미터를 같이 보내는 것이고 POSt는 GET과 달리 파라미터를 HTTP 패킷의 바디에 담아서 전송한다는 것이다. @RequestBody 어노테이션은 메서드의 파라미터가 반드시 HTTP 패킷의 바디에 담겨 있어야 한다는 것을 나타낸다.

POST나 PUT을 사용하는 메서드에서는 @RequestBody 어노테이션을 사용해야 한다. 반대로 GET 메서드는 @RequestParam 어노테이션을 사용한다.

 

 

 

REST API 테스트하기

앞선 만든 API를 테스트하기 위해서는 웹 페이지가 아니기 때문에 API를 테스트하는데 필요한 툴을 사용한다.

포스트맨을 사용해보자.

 

게시글 목록 조회의 결과가 json array 형식으로 된 것을 볼 수 있다.

 

 

 

 

POST로 변경후 메시지를 보내 게시글 등록도 할 수 있다.

 

 

 

 

 

7장을 마치며

기존에 만들었던 게시판을 REST 형식으로 변경해보았다. 둘의 차이점을 확실하게 인지 할 수 있도록 연습하자.

 

 

'Spring Boot > 5. RESTful 게시판' 카테고리의 다른 글

RESTful 게시판으로 변경하기  (0) 2022.11.22
REST란?  (0) 2022.11.22
복사했습니다!