• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

REST

14 May 2019

Reading time ~3 minutes

REST


REST(Representational State Transfer)

  • 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식
  • 로이 필딩(Roy Fielding)의 박사학위 논문에서 소개됨
  • REST는 네트워크 아키텍처 원리의 모음
    • 네트워크 아키텍처 원리란 자원을 정의하고 자원에 대한 주소를 지정하는 방법 전반
    • 간단한 의미로 웹 상의 자료를 HTTP 위에서 SOAP나 쿠키를 통한 세션 트래킹 같은 별도의 전송 계층 업시 전송하기 위한 아주 간단한 인터페이스를 말함
  • REST의 원리를 따르는 시스템 == RESTful

REST 아키텍처에 적용되는 6가지 제한 조건

  • 클라이언트/서버 구조
  • 무상태(Stateless)
  • 캐시 처리 가능(Cacheable)
  • 계층화
  • Code on demand
  • 인터페이스 일관성

RESTful

  • WEB - GET, POST
    • 요청을 모아서 처리할 수 없다
    • 행위에 대한 식별이 어렵다
      • some.do, blahblah.do
  • RESTful API - GET,POST,PUT,DELETE
    • 기존의 URI와 다르다
    • WEB은 확장자까지 명시하여 원하는 자원을 요청
      • RESTful은 확장자를 사용하지 않는다
      • 요청을 모아서 처리할 수 있다
    • 행위에 대한 식별이 쉬워진다(상/중/하 식으로 분류가 가능)
    • form은 get/post만 처리 가능
    • put,delete는 ajax로 처리함
      • 요청값으로 JSON을 전달하고 응답 또한 JSON으로 되기 때문
<!-- 일반 WEB -->
<a href="요청uri.확장자">

<form method="get|post" action="some.do">
    <input type="submit"/>
</form>

<!-- RESTful -->
<a href="a/b/c">

<form action="a/b/c" method="get|post">
    <input type="submit"/>
</form>
  • RESTful은 URL을 가지고 자원을 식별
기존 WEB : http://sist.co.kr/admin/insert.do?이름=값
RESTful : http://sist.co.kr/상위개념/하위개념/요청대상/?파라미터
  • Spring은 RESTful을 지원
@Controller(...) // view 중심
// 응답 데이터가 JSP로 응답

@RestController(...) // 데이터 중심
// 응답 데이터가 JSON, XML
// 웹브라우저에서 보여줄 수 없다
// 가공 필요 => JavaScript로 가공
  • AJAX로 PUT 요청을 보낼 때 예
    • 전달할 Object는 JSON.stringify()를 통해 문자열로 변환 후 전달
$.ajax({
    url:"class4/group1/member",
    dataType:"put",
    data: JSON.stringify({ 이름:"값" }),
    ...
});
  • HTTP body(payload)에 JSON이 담겨서 전달됨
    • @RequestBody를 사용해서 전달된 HTTP Body에 저장되어 전달된 JSON을 받을 수 있다
    • JSONParser를 이용해서 전달된 문자열 JSON을 Parsing해서 JSONObject 만들어 사용
// 그룹 맴버를 업데이트하기 위한 요청, parameter로 받으면 한개만 받을 수 있다
// JSON으로 넘어오면 여러 parameter를 전달 받을 수 있다
// form태그로는 JSON을 넘길 수 없다, AJAX로 JSON을 전달가능!

@PutMapping(value="class4/group1/member")
public String method(@RequestBody String json) {
    // JSONSimple에서 제공하는 JSONParser를 사용
    JSONParser jp = new JSONParser(json);

    // JSONParser는 JSON 형태의 문자열을 잘라내서 JSONObject로 생성
    JSONObject jo = jp.parse();

    jo.get("이름"); // 값 반환
    ...
  • RESTful하게 멤버를 추가하는 요청 예
    • class4의 1조 회원 추가
<form action="class4/group1/add" method="get">
    <input type="..."/>
    ...
</form>
  • 요청을 모아서 처리할 수 없다
    • uri가 group1/jaechan-add, group1/something-add, … 등등
    • 다양한 요청을 한 메소드에서 처리할 수 있다
    • uri 가 의미적으로 더 명확해짐
@Controller
class Test {

    @GetMapping(value="class4/group1/{id}")
    public String insert(VO) {
...

REST API

  • URI는 정보의 자원을 표현
    • 리소스명은 동사보다는 명사를 사용
  • 자원에 대한 행위는 HTTL Method(GET, POST, PUT, DELETE)로 표현
  • GET - 자원을 조회할 때 사용(retrieve)
  • POST - 자원을 추가할 때 사용(create)
  • PUT - 자원을 변경할 때(update)
  • DELETE - 자원을 삭제할 때(delete)

Spring에서 REST 사용 예

05

  • 우선 일반적인 WEB의 GET/ POST 방식
<!-- index.jsp -->
      
<a href="method/get">GET방식</a>
<form action="method/post" method="post">
      <input type="submit" value="post 전송"/>
</form>
<form action="method/put" method="put"><!-- form으로 put/delete 요청 안됨 -->
      <input type="submit" value="put 전송"/>
</form>
<!-- get.jsp -->
      
<h2>GET 방식요청</h2>
<br/>
<a href="javascript:history.back()">뒤로</a>

01

...
<form action="method/post" method="post">
      <input type="submit" value="post 전송"/>
</form>
...
...
      @PostMapping("/method/post")
      public String postProcess() {
            return "post";
      }
...

02

  • PUT은 form태그로 요청할 수 없다
    • put이라 써도 get으로 처리됨

03

  • PUT은 AJAX로 요청
<script type="text/javascript">
      $(function() {
            
            $("#put").click(function() {
                  $.ajax({
                        url:"method/put",
                        type:"put",
                        dataType:"json",
                        error:function(xhr) {
                              alert("코드 : "+xhr.status+", 메시지 :  "+xhr.statusText);
                              alert(xhr.responseText);
                        },
                        success:function(json) {
                              alert(json.put);
                        }
                  });
            });
      }); // ready
</script>
...
<input type="button" id="put" value="put 전송"/>
...
      @ResponseBody
      @PutMapping(value="/method/put",  produces="application/json;charset=UTF-8")
      public String putProcess() {
            return "{ \"put\":\"ppppput\" }";
      }
...

04

  • 출처
    • 위키
    • REST API 제대로 알고 사용하기


TILREST