날아라쩡글이의 블로그입니다.

RestController , 정형화된 응답 본문

중앙 HTA (2106기) story/spring java framwork story

RestController , 정형화된 응답

날아라쩡글이 2022. 1. 7. 08:12
반응형

완전한 Rest는 자원의 이름으로 구분하여 해당자원의 상태(자원)을 주고 받는 것이다. 
HTTP URL을 사용해서 자원의 이름을 명시하고 HTTP method를 사용해서 해당자원의 대한 작업을 지정하는 것이다. 

지난번에는 RestController로 JSON을 올리는 방식을 진행했다. 그러면 삭제를 진행하면 어떻게 될까? 요청JSON을 올리면 응답데이터로 뭔가가 와야한다. 1. 방금 삭제한 것을 다시 내려준다. 2. 삭제 데이터에 대한 성공과 실패여부를 내려줘야한다. 

삭제를 진행하게되면 우리는 지운 데이터가 다시 내려오는 것을 원치 않는 다 그렇기 때문에 삭제가 성공 혹은 실패에 대한 내용을 내려주는 것이 좋다. 모든 응답을 정형화해서 내려주는 것이 좋다. 

  • true - 잘못된 내용이다. JSON텍스트가 아니기 때문이다. 
  • ok - 잘못된 내용이다. 
  • fail - 잘못된 내용이다. 
  • 내용은 JSON의 형태로 응답데이터를 정형화하면 된다. 
    • JSON은 Object 표기법과 Array표기법으로 
    • {
         "status" : "ok"
         "error"  : null  or "에러가 났습니다."
         "item"   : [value, value]  or null
      }
    • 처럼 정형화된 데이터를 내려주는 것이 좋다. 
  • 먼저 정형화된 데이터를 내려주려면 getter/setter에 담을 수 있게 DTO를 만들어 준다.
  • ResponseDto<T> : 객체가 들어갈 <T> 를 클래스에 작성해준다. 
    • private String status;
      private String error;
      private List<T> items;  //items는 여러개가 들어갈 Array형태로 List<T>로 작성해주면 된다. 
    • 응답의 형태를 정형화시켰다는 것이 중요하다. 앞으로는 응답의 형태는 Response<T>로 내려간다. 
    • getter/setter메소드를 만들어준다. 생성자는 만들지 않아도 된다. 

장바구니에서 삭제하고 응답JSON데이터를 받기 

  • 이전에 요청데이터를 위하여 Book객체를 받은 것을 기억할 것이다. 
  • 먼저 vo객체를 작성하고, Controller를 rest로 작성, Dao작성, Service는 try로 성공하면 객체를 던지고, catch가 일어나면 해당 Exception으로 묶고 throw new로 RuntimeException으로 메세지를 던지는 부분을 완성 하는 것까지 작성하였다. 
  • 삭제를 통해 응답데이터를 보내는 방법 또한 객체가 있다. 
    • 이전 delete, update, insert가 void였기 때문에 놀랄수 있지만 우리는 위에서 response(응답)으로 객체를 설정하였다. 
  • public ResponseDto<?> delete(int no)으로 메소드를 설정한다. ResponstDto의 <?>에는 ?는 아무 객체가 와도 상관없다는 의미다. 
    • 먼저 SessionUtil을 사용해서 세션객체에 저장된 인증된 사용자 정보를 조회한다. 
      • 거의 모든 메소드에서는 SessionUtils에 저장된 사용자 정보를 조회할 수 있다고 해도 무방하다. 
  • if(user == null) {
    ResponseDto<?> response = new ResponseDto<>();
    response.setStatus("FAIL");
    response.setError("로그인된 사용자가 아닙니다.");
    return response;
    } //if문으로 항상 사용자 확인이 들어가고 
  • try {
    //성공한 경우 내려질 내용
    cartItemService.deleteCartItem(user.getNo(), no);
    response.setStatus("OK");
    return response;

    } catch(RuntimeException e) {//실패할 경우 던져질 내용
    ResponseDto<?> response = new ResponseDto<>();
    response.setStatus("FAIL");
    response.setError(e.getMessage());
    return response;
    }
  • try 와 catch문으로 성공할 경우 실패할 경우를 작성해준다. 
    • 성공할 경우에는 response를 set으로 내려보낼 내용을 작성하고 return 값을 넣으면 된다. 
    • 실패할 경우에는 Service에서 throw new에 작성한 message를 getMessage메소드를 사용해서 내려보내면 된다. 
  • 그리고 html문서에서 삭제 버튼을 클릭했을 때 실행될 이벤트 핸들러 함수를 등록한다. 
    • $("#table-cart-items button.btn-outline-danger").click(function(){
      //아이디가 table인 자손의 button중에서 클래스가 danger인것을 클릭하면
    • var $btn = $(this); //해당 엘리먼트를 저장하는 변수를 선언하고, 
    • var itemNo = $btn.attr('data-item-no'); //해당엘리먼트를 저장한 변수의 속성을 itemNo에 저장해서 
    • $.getJSON("/rest/cart/delete.do",{no:itemNo},function(response){
      //getJSON이라는 메소드를 이용해서 데이터를 내려받는다. 
    • 여기서 getJSON메소드
      • $.getJSON( 호출할 경로, RestController의 매개변수이름 : 해당하는 변수이름, 함수 (응답이름) )
    • 로 구성되어 있다. 그리고 호출할 경로 = restController가 작동, 삭제가 되는 메소드가 동작한 것이다.
    • 만약 if (response.status == 'OK') { //status가 OK이면 삭제 완료, 클릭 버튼의 가까운 tr을 지울 예정이다. 
      • $(this).closest().remove(); //이건 틀린것이다. response.status가 this에 들어가 있다. 
      • $btn.closest('tr').remove(); //아까 담아뒀던 해당 변수를 불러와서 가까운 tr을 삭제한다.
        } else { //혹은 false
        $("#span-error").text(response.error); //에러메세지를 아이디가 span-error인 모달창에서 error메세지를 출력한다.
        errorInfoModal.show(); //그리고 해당하는 모달창을 보여준다. 
    • var errorInfoModal = new bootstrap.Modal(document.getElementById('modal-info-error'), {
            keyboard: false
         });// 위에서 모달창을 생성했다. 이 모달창을 보여주는 것이다. 

AJAX는 화면의 특정부분이 화면의 갱신 없이 전송을 받고, 변경이 될 수 있도록 reloading 없이 화면을 변경할 수 있다. 
AJAX는 JSON으로 내려오는 것이 다루기 쉽다. 

  • pom.xml에 JackSon의 의존성을 걸어둔다. 
  • @RestController는 핸들러메소드의 반환값을 JSON으로 변환해준다. 
  • JSON을 다루는 Controller와 JSP의 Controller는 분리해서 사용하는 것이 좋다. 
반응형
Comments