오늘은 몰랐으면 내일은 알면 된다
2022-12-15 (4) REST 본문
앱의 시대가 열리면서 서버는 점차 순수 데이터를 제공하는 역할로 바뀌어왔다.
웹의 URI 또한 의미가 약간 달라져, 과거에는 페이지를 이동하더라도 브라우저의 주소는 변화하지 않는 방식을 선호했지만, 최근의 웹페이지들은 대부분 페이지를 이동하면 브라우저 내의 주소 역시 같이 이동하는 방식을 사용한다.
REST는 Representational State Transfer의 약어로, 하나의 URI는 하나의 고유한 Resource를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정한다.
/boards/123은 게시물 중에서 123번이라는 고유한 의미를 가지도록 설계하고, 이에 대한 처리는 요청시 GET, POST 등의 추가적인 정보를 통해서 결정한다.
요청을 보낼때, request body에 처리에 필요한 정보를 담아서 보내기 때문에 GET과 DELETE 요청은 body가 필요하지 않을수도 있다.(없어야 한다는 것은 아니다)

/board?boardNo=123 처럼 queryString으로 보내는 것이 아니라는 말이다. URI 자체가 고유한 resource를 의미하게 된다.
즉, uri path 자체가 식별자의 역할을 하기 때문에 uri만 봐도 어떤 자료를 요청하는지 알 수 있다.
REST를 위해 알아두어야 할 어노테이션은 다음과 같다.
| 어노테이션 | 기능 |
| @RestController | Controller가 REST 방식을 처리하기 위한 것임을 명시 |
| @ResponseBody | 일반적인 JSP와 같은 뷰로 전달되는 게 아니라 데이터 자체를 전달하기 위한 용도 |
| @PathVariable | URL 경로에 있는 값을 파라미터로 추출하려고 할 때 사용 |
| @CrossOrigin | Ajax의 크로스 도메인 문제를 해결해주는 어노테이션 |
| @RequestBody | JSON 데이터를 원하는 타입으로 바인딩 처리 |
https://ko.wikipedia.org/wiki/REST
REST - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 대한민국의 힙합 음악가에 대해서는 R-EST 문서를 참고하십시오. REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프
ko.wikipedia.org
실습에서 작성한 Controller를 RESTful 하게 변경해보자.

먼저 boarddetail을 변경해보자. 메소드 선언부가 다음과 같이 바뀐다.
@GetMapping(value = "/board/{boardNo}", produces = "application/json;charset=utf-8")
@ResponseBody
public ResponseEntity<?> boardDetail(@PathVariable int boardNo) throws FindException {
boardList는 다음과 같이 바꿀 수 있다.
@GetMapping(value = "/board/list/{currentPage}", produces = "application/json;charset=utf-8")
@ResponseBody
public ResponseEntity<?> boardList(@PathVariable int currentPage) throws FindException {
board/가 반복되기 때문에 컨트롤러의 선언부에 다음과 같이 지정해놓을 수 있다.
@Controller
@RequestMapping("board/*")
public class RepBoardRestController {
글 수정도 바꿔보자.
@PutMapping(value = "{boardNo}", produces = "application/json;charset=utf-8")
@ResponseBody
public ResponseEntity<?> boardModify(
@RequestPart(required = false) List<MultipartFile> files,
@RequestPart(required = false) MultipartFile file,
RepBoard rb, HttpSession session) throws ModifyException {
Customer c = new Customer();
c.setId((String) session.getAttribute("loginedId"));
rb.setBoardC(c);
service.modify(files, file, rb);
return new ResponseEntity<>(HttpStatus.OK);
}
JSON문자열을 받기 위해서는 RequestBody 어노테이션을 붙여야한다.
요청을 보낼때는 JSON 문자열만 보내거나, FormData로 보내거나 둘 중 하나여야한다.
@RequestPart 와 @RequestBody를 한 메소드에서 혼용할 수 없다는 뜻이다.
파일IO가 필요하면 FormData를 써야하겠다.
FormData 안에 JSON 문자열을 넣어서 보내는 것은 가능하다.
그리고 Multipart 요청은 POST로만 가능하다.
https://mangkyu.tistory.com/218
[HTTP] HTML 폼(form) 요청이 GET, POST만 가능하고 PATCH, PUT, DELETE은 불가능한 이유
최근에 Multipart/form-data 형태의 데이터를 다루어야 했는데, PATCH나 PUT는 요청이 정상적으로 처리되지 않는 것을 확인했습니다. 그래서 어째서인지 이유를 찾아 보게 되었고, 이번에는 관련 내용에
mangkyu.tistory.com
'Java > JAVA 개발자 양성과정' 카테고리의 다른 글
| 2022-12-16 (2) AOP (0) | 2022.12.16 |
|---|---|
| 2022-12-16 (1) MyBatis 동적 SQL (0) | 2022.12.16 |
| 2022-12-15 (3) 스프링 MVC 프로젝트의 기본 구성 (0) | 2022.12.15 |
| 2022-12-15 (2) 트랜잭션 처리 (0) | 2022.12.15 |
| 2022-12-15 (1) Controller Advice (0) | 2022.12.15 |