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

RestController 본문

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

RestController

날아라쩡글이 2022. 1. 6. 09:09
반응형

AJAX처리를 위해 RestController설정방법과 자바객체를 json텍스트로, json형식의 텍스트를 자바객체로 변환시키는 라이브러리 의존성 추가 

maven에서 jackson을 검색하고 databind의 의존성을 추가한다.

  • <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.1</version>
    </dependency>
  • 방법이 2가지가 존재한다. 
    • 첫번째는 restController의 패키기지를 만들어서 @RestController어노테이션을 붙이고 @RequestMapping("/rest/book")으로 경로를 설정하는 방법이 있다. 
    • 두번째는 일반 @Controller의 어노테이션을 붙이고 return의 객체 앞에 @ResponseType을 붙이고 작성하는 방법이다. 
  • 요청핸들러 메소드가 반환하는 값을 응답메소지의 body에 포함시킨다. 
  • jackson-databind 라이브러리가 프로젝트에 포함되어 있으면 요청핸들러 메소드가 반환하는 값을 json형식의 텍스트로 변환한 다음 응답메세지의 body부에 포함시켜서 클라이언트로 보낸다. 
  • @RestController를 사용하는 대신 아래와 같이 적어도 동일하게 동작한다.
    • @Controller //@RestController 대신 @Controller를 적었다. 
       @RequestMapping("/rest/book")
         public class BookRestController{
         @Autowired
        BookService bookservice;
         @GetMapping("/detail.do")
         public @ResponseBody Book detail(int no) { //@ResponseBody이렇게 반환타입 앞에 어노테이션을 붙여야한다.
         Book book = bookService.getBookDetail(no);
          return book;
          }
    • @GetMapping("/detail.do")
      @ResponseBody //요청핸들러 메소드에 붙인다. 
       public  Book detail(int no) { //@ResponseBody이렇게 반환타입 앞에 어노테이션을 붙여야한다.
       Book book = bookService.getBookDetail(no);
         return book;
         }
          //응답객체에 정보를 보내는 방법이다.
    •  어노테이션이나 restController라고 따로 지정하지 않으면 book/detail.jsp를 찾는다. Book을 반환하는 것이 아닌 경로로 인식해서 jsp페이지를 찾아간다. 
    • @RestController
      @RequestMapping("/rest/book")
      public class BookRestController {

      @Autowired
      private BookService bookService;

      @GetMapping("/detail.do")
      public Book detail(int no) {
      //restController는 반환값이 객체를 보내주기 때문에 String이 아닌 객체의 이름을 붙인다. 
      //요청할 때 rest/book.do?no=로 받나오면 된다. 
      //객체를 JSON으로 변환해주는 라이브러리가 필요하다. 
      Book book = bookService.getBookDetail(no);
      return book; //그정보를 그대로 보내준다. 값이 들어있는 객체를 전달하면 끝이다.
      }
    • 이제 modal창으로 값을 표현할 예정이기 때문에 JSON의 형태로 값을 주면 된다. 
    • 이벤트 핸들러 함수를 이용한다. 
    • $(function(){
      //지정된 모달을 생성한다. 
      var bookInfoModal = new bootstrap.Modal(document.getElementById('modal-info-book'), {
            keyboard: false
         });
      //장바구니 테이블안에 있는 a태그를 선택한 경우 실행된 이벤트 핸들러함수를 등록한다.
      $("#table-cart-items a").click(function(){
      event.preventDefault();//a태그에서 클릭이벤트가 발생하면 링크된 페이지로 이동하는 기본동작이 일어나지 않게 한다.
      //지금 이벤트가 발생한 그 엘리먼트의 data-book-no 속성값을 조회한다.
      var bookNo = $(this).attr("data-book-no");
      //JSON을 획득하기 위한 메소드를 사용하고, no를 전달한다. 
      //아래의 요청은 "http://localhost/rest/book/detail.do?no=100"와 같은 형태의 요청을 서버로 보낸다.
      //서버로부터 성공적인 응답이 오면 function(응답데이터){...} 함수가 실행된다.
      //jQuery는 서버로부터 성공적인 응답이 오면 응답컨텐츠(json형식의 텍스트)를 자바스크립트 객체나 배열로 변환한 다음, 함수를 실행할 때 전달한다.
      $.getJSON('/rest/book/detail.do',{no:bookNo},function(book){ //아이디가 길면 충돌이 덜 일어난다. 
      //응답으로 받은 책정보를 모달창 테이블의 각 칸에 표시한다.
      $("#span-book-created-date").text(book.createdDate);
      $("#span-book-updated-date").text(book.updatedDate || '');//null이면 뒤의 값이 표시된다.
      $("#span-book-title").text(book.title);
      $("#span-book-author").text(book.author);
      $("#span-book-publisher").text(book.publisher);
      $("#span-book-price").text(book.price.toLocaleString());
      $("#span-book-discountPrice").text(book.discountPrice.toLocaleString());
      $("#span-book-pub-date").text(book.pubDate);
      $("#span-book-stock").text(book.stock.toLocaleString());
      //모달을 화면에 표시한다. 
      bookInfoModal.show();
      })

      });
      });
      • JSON으로 날짜형식을 보낼때 vo객체에
      • @JsonFormat(pattern = "yyyy년 M월 d일")
        private Date pubDate;
        private int stock;
        @JsonFormat(pattern = "yyyy년 M월 d일")
        private Date updatedDate;
        @JsonFormat(pattern = "yyyy년 M월 d일")
      • 설정을하면 유니코드가 아닌 이 형식으로 올라간다. 
    • Rest(Representational State Transfer)
      • 자원을 이름(자원의 표현, URL)으로 구분하여 해당 자원 상태(정보)를 주고 받는 것
      • HTTP URL을 사용해서 자원의 이름을 명시하고, HTTP Method를 사용해서 해당 자원에 대한 작업을 지정하는 것이다. 
반응형
Comments