ANACODER
98
2018-08-30 18:26:54 작성 2018-08-30 18:27:38 수정됨
15
4010

Restful API 궁금한거 재질문 올립니다..


안녕하세요, 스프링 부트 기반의 Restful API 서버를 구현하려고 하는데 궁금한점이 있어서 질문드립니다.


1. Ajax를 Restful API의 한 방법으로 받아들이기에는 옳지 않나요?

아까 답변을 받고, 지인에게 물어봤더니 아니라길래

자료 찾아보니까 진짜 다르게 받아들이는것 같더라구요..


2.

Restful API는 아래사진처럼

URI를 좀 더 깔끔(?)하게 이해할 수 있도록 하는 구조? 인터페이스? 라고 이해해도 될까요? 

(대신 URI를 요청할때, 해당 CRUD에 속하는 HTTP 메소드를 사용해야만 하구요)

(사진출처 https://www.joinc.co.kr/w/man/12/rest/about)


3. 저는 스프링기반 웹 개발을 해봤었는데

Controller를 통해서 URI요청에 따라 ServiceImpl을 통해 로직을 처리하고 

처리결과를 세션이나 모델에 저장하고 jsp파일을 리턴해서,

jsp파일에서 모델이나 세션에 저장된 결과값들을 불러와 보여주는것을 했었는데요

스프링 부트 기반 환경에서 Restful API를 구현한다는게 여기서 어떤식으로 구조를 변경해야 하는지 

제 머리로는 너무 부족해서 감이 오질 않습니다..  제가 생각한게 맞는지 판단좀 부탁드릴게요

(1번 Ajax를 사용해도 옳다고 가정했을 때 제 생각입니다)


RestController는 데이터의 로직을 처리하고 Controller는 뷰(jsp)를 처리하면 되는건가요?

그렇다면 데이터의 로직을 뷰(jsp)에서 Ajax로 RestController에 URI요청을 해서 결과를 받아오면 되나요?


예제를 찾아봐도 웹브라우저에 JSON형태나 TEXT를 리턴받은것을 보여줄뿐,

뷰(jsp)와 함께 구성한 예제는 찾을 수가 없네요.. 따끔한 조언 부탁드립니다

0
  • 답변 15

  • 안개짱
    2018-08-30 18:58:22

    restful api 는 ajax에서 사용하라고 만들어진것이 아닙니다.

    ajax 는 http method중에서 get 과post 만 지원 되는것으로 압니다.

    외부 시스템과 연계해야할 일이 없는 곳에서 굳이 restful api개발해서 사용할 이유가 없습니다.


    spring 이라면 차라리 controller와 service를 확실히 분리해서 만드는것이 좋습니다.

    추후에 외부 시스템과 연계할 일이 있을때 restcontroller는  규격만 맞추고 실제 로직은 이미 개발된  service를 이용하도록 하면 됩니다.

  • 즈루시
    2018-08-30 19:03:36

    음 제가 알고 있는 정보랑 좀 차이가 있는 것 같아 이 부분은 확인이 필요합니다

    ajax 는 http method중에서 get 과post 만 지원 되는것으로 압니다.


    html form은 get / post 만 지원, 

    put 이나 delete 같은 메소드는 ajax 와 같은 기술을 통해 가능(=지원) 으로 알고 있습니다.

  • 안개짱
    2018-08-30 19:08:10

    즈루시 // 그런가요? 제가 잘못 알고 있을수도요.

    예전 관련문서를 찾아본 기억이 있는데 잘못 봤을수 있겠습니다.

  • ANACODER
    98
    2018-08-30 19:50:04

    Restful API는 그러면 내부 시스템의 데이터 전달을 할때 사용되는건가요?

    그렇다면 게시판을 만든다고 할때, 다 오라클 디비에 저장되는데

    이런 경우에는 사용할 이유가 없다는 말씀이신가요?


    그렇다면.. 어떤 경우에 사용되는지 알 수 있을까요?

    클라이언트의 반응에 사용되는건가요?

  • rorokikaku
    38
    2018-08-30 19:55:25

    일단 ajax 와 restful 은 구분영역이 다른 것 같습니다.

    ajax는 비동기통신을 위한 라이브러리이고, 

    restful은 단순히 주소를  깔끔하게 표현하기 위한것 이상의 목적을 가지는 아키텍쳐입니다.

    잘 설명된 포스트가 있어 링크걸어요.

    https://nesoy.github.io/articles/2017-02/REST


  • 아야로
    1k
    2018-08-30 20:16:24 작성 2018-08-30 20:32:54 수정됨

    REST에 대해 오해하고 계십니다.

    "HTTP Method와 URL만으로 자원을 표현할 것" 이외에 어떠한 것도 생각할 필요가 없습니다.

    비동기로 쏘던 동기로 쏘던 REST와는 무관합니다.

    주소만 보고도 직관적으로 어떠한 자원에 대한 행위인지 깨달을 수 있다면 충분히 RESTful하다고 봅니다.

    예를들어 아래의 주소 모두 RESTful 합니다.

    GET    /board/1
    GET /board?no=1
    DELETE /board/1
    DELETE /board?no=1


    어떠한 폼을 불러와야 한다면 폼 역시 자원의 하나로 보고 아래와 같이 주소를 정의합니다.

    GET /board/form


    이를 비동기로 부르던 동기로 부르던 전혀 상관없습니다.

    ajax는 응답속도 향상으로 사용자 경험을 높이기 위한 기술이지 REST와는 관계가 없습니다.

    그저 기술동향에 맞추어 REST와 잘어우러 졌을 뿐입니다.


    참고로 HTML5를 지원하는 대부분의 현대 브라우저에서는 XMLHttpRequest를 통해 GET POST PUT PATCH DELETE 모두 지원합니다.


    ==========================


    스프링은 모든 응답을 메시지로 간주한다는점에서 REST를 바라보는 관점이 조금 독특합니다.

    Spring 컨트롤러에 @Controller 대신 @RestController를 선언할 경우 모든 응답을 뷰리졸버를 거치지 않고 메시지 컨버터로 직행시킵니다.

    (다시 말해 메시지 컨버터로 바로 직행하기 위해 메소드 마다@ResponseBody를 따로 써 줄 필요가 없습니다.)

    @RestController를 선언한 순간 해당 클래스의 모든 응답에 대해 뷰리졸버를 거치치 않기에 JSP로 직행하는것또한 불가능해집니다.

    별도의 메서드만 예외로 선언할 수 도 없기에 XXController, XXRestController와 같이 두 개의 컨트롤러를 동시에 작성하는 방법을 사용하기도 합니다.


    ===========


    추가로 오해하실까봐 하나 더 적자면 스프링에서의 모든 응답에 반드시 json을 써야하는것또한 아닙니다. 메시지 컨버터로 보낸다는 말은 모든 응답을 메시지로 간주한다는 것이지 json으로 간주한다는게 아닙니다.

    관리가 편하다보니 RESTful한 URL + 비동기 통신 + json 포맷 조합이 자주 쓰이는 것이지 이게 규정이다 이런게 아닙니다. 스프링에서의 응답 형식으로 json대신 xml, text, html 무얼 쓰든 개발자의 마음입니다. 

  • ANACODER
    98
    2018-08-30 20:31:17 작성 2018-08-30 20:42:27 수정됨

    Rest를 이해하는데 너무 어렵네요..


    아야로님 답변을 보고 든 생각인데요

    Http 메소드와 URL만으로 자원을 표현한다는게

    구체적으로 언제(?) 어떤 경우를 말씀하시는건지 궁금해요


    예를 들어 아이디와 패스워드를 입력하고 로그인버튼을 눌렀을 때, 

    아이디와 패스워드 정보를 오라클DB에 있는 회원정보와 비교를 할텐데

    GET메소드를 통해 URL에 아이디와 패스워드를 표현하여 서버에 요청하면 되는건가요?

    GET /login/별마로/1234

    즉, 이런식으로 URL을 보고 직관적으로 이해할 수 있게 하는 구조를 Restful하다고 볼 수 있을까요?


    p.s 아 그리고 제가 착각한건지 모르겠는데

    DELETE /board?no=1 앞에 "DELETE"는 단순히 Http Method를 의미하는건가요?

    저게 URL에 포함된것은 아니죠?


    ===============추가==============

    @RestController를 선언한 순간 해당 클래스의 모든 응답에 대해 뷰리졸버를 거치치 않기에 JSP로 직행하는것또한 불가능해집니다.

    =>>> 이래서 제가 Restful API방식의 URI 요청결과를 어떤식으로 뷰에 뿌려줄지 해결방법을 찾지 못했었습니다. 그래서 생각한게 Controller와 RestController를 따로 만들어, Controller에서 jsp를 뿌려주고 해당 jsp내부에서 Ajax를 통해 Restful한 URI를 RestController에 요청하려고 했었습니다.

    이게 맞을까요?..

  • 아야로
    1k
    2018-08-30 21:37:05 작성 2018-08-30 21:48:39 수정됨

    원칙적으로 REST는 상태를 저장하지 않습니다.

    따라서 엄밀히 가자면 인증토큰 방식의 아래의 URL을 사용하게 됩니다.

    GET    /access-token    // 인증 토큰을 발급받습니다.

    이때 아이디와 비밀번호를 헤더에 담아 전송하는데 Digest access authentication 방식을 사용합니다.

    간략한 흐름은 아래와 같습니다.

    0. HTTPS 기반에서
    
    1. 클라이언트가 서버에 GET /access-token 요청
    
    2. 서버는 해당 세션에 대한 난수를 생성해 저장한 후, 클라리언트에게 리턴
    
    3. 클라이언트는 서버로부터 받은 난수와 URL, ID, PASSWORD로 Hash값 생성
    
        HA1 = SHA256(ID:PASSWORD)
    
        HA2 = SHA256(GET:/access-token)
    
        response hash = SHA256(HA1:서버가 준 난수:HA2)
    
    4. 이렇게 생성된 hash와 ID, 난수를 헤더에 다시 담아 GET /access-token 으로 재요청
    
    5. 서버는 4에서 전달된 난수와 세션에 저장된 난수를 비교해 같은지 확인 한 후,
    
       전달받은 ID, 난수와 서버 DB에 있는 PASSWORD를 3번과 같은 방식으로 조합해 hash를 생성한 후 클라이언트가 보낸 response hash와 같은 결과가 나오는지 확인
    
    6. 인증토큰 발급


    조언을 드리자면 모든 API에 대해 반드시 REST를 지키는건 불가능에 가깝습니다.

    보안적인 문제가 있다면 REST를 파괴하는 한이 있더라도 유연하게 구성하셔야 합니다.

    하나의 예로 스프링 시큐리티에서의 로그인/아웃은 강제 로그아웃 공격을 막기위해 POST를 사용합니다.


    =====


    A. HTTP Method 맞습니다. URL에 포함된 거 아닙니다 ㅎㅎ


    =======


    A. 정답은 없습니다. 말씀하신 방법도 옳고 남이 하는 방법도 옳습니다.

    아래는 두개의 예제입니다.

    ㄱ. .jsp를 버리고 .html + .js를 사용.
    
    ㄴ. 모든 HTML, JS, CSS, image 파일을 정적자원으로 취급
    
    ㄴ. 클라이언트에선 www.yoursite.com/main.html 요청
    
    ㄷ. 전달받은 main.html 파일 내 JS에서 비동기로 REST API 요청
    
    ㄹ. 서버에선 가장 깔끔한 JSON 형태로 응답
    
    ㅁ. 클라이언트에선 응답받은 JSON파일로 main.html을 꾸밈
    ㄱ. MainController와 MainRestController 두 개로 구성
    
    ㄴ. 클라이언트에서 www.yoursite.com/main 요청
    
    ㄷ. MainController에서 JSP파일 응답
    
    ㄹ. 클라이언트 화면에서 버튼을 누르는 등의 동작에 따라 자바스크립트로 비동기 요청
    
    ㅁ. 이런 요청들에 대해 MainRestController에서 가장 깔끔한 JSON형식으로 응답
    
    ㅂ. 클라는 응답받은 데이터로 화면 꾸밈



     

  • ANACODER
    98
    2018-08-30 21:49:26 작성 2018-08-30 21:50:25 수정됨

    감사합니다. 정말 머리아프게 만드는 구조네요

    jsp에 뿌려주기 위해서  Controller, RestController 두개 만들고, Ajax를 통해 Restful하게 해봐야겠습니다

    구조 이해하고 결정하는데만 하루를 넘게썼네요 ㅠㅠ  정말로 감사합니다

  • 아야로
    1k
    2018-08-30 21:59:31

     별마로

    저 역시 수없이

    골머리를 앓았기에 팁 하나 드리자면

    구글 스프레드 시트로 API를 미리 작성해놓고 코드 작성에 돌입하는 방식이 시간을 많이 줄여주었습니다.

    생각날때마다 인터넷 열고 바로바로 수정할 수 있는 구글 DOC 많이 애용해주세요...

  • 안개짱
    2018-08-31 09:12:20

    즈루시 //

    덕분에 문서 다시 찾아보게 되었고 현재는 다른 method 도 가능하다는 것을 알았네요. 감사합니다.


    아야로 //

    정말 깔끔하게 잘 설명해 주셨네요. 덕분에 저도 다시한번 생각해보는 계기가되었습니다. 감사합니다.

  • OnLiU
    13
    2018-08-31 19:22:33

    웹에서 RESTful 방식 이전에는 SOAP 방식 등이 있었고, 지금도 다양한 방법이 있지만 RESTful 방식만 이해해도 웹에서는 일단 충분해요.

    SOAP 방식은 간단한 기능 조차도 작성할 것이 많았고 실제 데이터에 비해서 크기도 굉장히 커서 불편했고, 이것을 해결하고자 여러 시행착오를 겪는 중 표준적으로 쓰이는 것이 RESTful 방식이에요.

    get은 서버의 정보를 특정한 키워드에 따라 가져오기만 하자는 것이고, post는 무엇인가의 정보를 서버에 입력하고 싶을 때 쓰는 것이에요.

    초기에는 이것만 해도 충분했지만 사용하다 보면 여러 패턴이 생겨나기 마련이고 그 패턴 중에서 공통적으로 추가적으로 분리한 것이 put/patch/delete 등등이에요.

    한편, 웹은 언제나 url을 통해서만 데이터를 받아와서 렌더링을 해줬는데, 실시간성 통신의 필요성이 발생했어요.

    이 필요성을 해소하고자 한 것이 AJAX 기술이에요. 즉, AJAX랑 RESTful API는 개념 자체가 달라서 이해하고 나면 혼동할 이유가 전혀 없어요.

  • 프론트덕후
    960
    2018-09-03 09:47:51

    ajax는 기술이고

    restful은 철학입니다.

  • 파이리v
    212
    2019-01-24 01:40:49

    아야로

    검색하다 우연히 봤는데 너무 자세한 설명 감사합니다 덕분에 많은 부분을 정리할 수 있었습니다ㅎㅎ

  • 피자탕수육
    412
    2020-07-01 02:26:26
    큰도움 받고갑니다.
  • 로그인을 하시면 답변 을 등록할 수 있습니다.