자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미한다.
REST는 Client와 Server 사이의 통신 방식 중 하나이며, HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을
최대한 활용한 아키텍처 스타일이다.
REST가 필요한 이유는 최근에 서버 프로그램은 다양한 브라우저와 여러 모바일 디바이스에서도 통신이 가능하기 때문이다.
과거에는 브라우저에 모든 데이터를 완성된 HTML 형태로 전송했지만, 다양한 브라우저와 여러 디바이스가 생겨남에 따라서 서버의 역할은 점점 더 순수한 데이터만을 요구하고 처리하는 형태로 진화하고 있다.
1) 자원(Resource)
ex) /boards/123 은 게시물 중에 123번이라는 고유한 의미를 가지는 구분자
2) HTTP Method( GET, POST, PUT, DELETE )
3) 표현(Representation of Resource) : JSON 혹은 XML를 통해 보통 데이터를 주고 받음
REST 방식에서 가장 먼저 기억해야 하는 점은 서버에서 전송하는 것이 순수한 데이터라는 것이다.
기존의 Controller에서 Model에 데이터를 담아서 JSP 등과 같은 View로 전달 하는 방식이 아니므로 기존의 Controller와는 조금 다르게 동작한다.
스프링 4에서부터는 @Controller 외에 @RestController라는 어노테이션이 추가되었다.
@RestController 나오기 이전에는 @Controller와 메서드 선언부에 @ResponseBody를 이용해서 동일한
결과를 만들 수 있었다.
추가 라이브러리
jackson-databind, jackson-dataformat-xml, gson, junit, spring-test
주의할 점은 기존의 @Controller는 문자열을 반환하는 경우에는 JSP파일의 이름으로
처리하지만, @RestController의 경우에는 순수한 데이터가 된다
@RestController
@RequestMapping("/sample")
@Log4j
public class SampleController {
// produces속성은 해당 메서드가 생산하는 MIME 타입을 의미한다. 생략 가능
@GetMapping(value="/getText", produces = "text/plain; charset=UTF-8")
public String getText() {
log.info("MIME TYPE: " + MediaType.TEXT_PLAIN_VALUE);
return "hello";
}
}
결과페이지
Response Headers Content-Length: 5 Content-Type: text/plain;charset=UTF-8 // Date: Mon, 08 Jun 2020 13:28:21 GMT
@PathVariable 어노테이션이란 아래와 같이 URI의
일부를 변수로 전달할 수 있다.
@GetMapping("/dir/{encodedId}")
public String searchDirection(@PathVariable("encodedId") String encodedId) {
// ...
}
REST 방식으로 호출하는 경우는 화면 자체가 아니라 데이터 자체를 전송하는 방식으로 처리되기 때문에 데이터를 요청한 쪽에서는 정상적인 데이터인지 비정상적인 데이터인지를 구분할 수 있는 확실한 방법을 제공해야만 한다.
ResponseEntity는 데이터와 함께 HTTP 헤더의 상태 메시지 등을 같이 전달하는 용도로 사용한다.
HTTP의 상태 코드와 에러 메시지 등을 함께 데이터를 전달할 수 있기 때문에 받는 입장에서는
확실하게 결과를 알수 있다.
Referrence
https://minchul-son.tistory.com/546
http://www.newlecture.com