IT/development

[Spring]spring REST(Representational State Transfer)

알 수 없는 사용자 2022. 11. 27. 07:19
반응형

목차

    spring REST(Representational State Transfer)

    • Rest는 "Representational State Transfer"의 약어로 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에
      전송방식을 결합해서 원하는 작업을 지정함
      스프링에서는 @RequestMapping, @ResponseBody와 같은 REST방식의 데이터 처리를 위한 여러 종류의 어노테이션과 기능을 제공함
      REST와 관련해서 알아둘 필요가 있는 어노테이션은 아래와 같음

    • @RestController: Controller가 REST방식을 처리하기 위함을 명시함
    • @ResponseBody: 일반적인 JSP와 같은 뷰로 전달되는 것이 아니라 데이터 자체를 전달하기 위한 용도에 사용
    • @PathVariable: URL 경로에 있는 값을 parameter로 추출하려고 할 때 사용
    • @CrossOrigin: Ajax의 크로스 도메인 문제를 해결해주는 어노테이션
    • RequestBody: JSON 데이터를 원하는 타입으로 바인딩 처리

     

    REST Conroller의 반환 타입

    @RestController는 JSP와 달리 순수한 데이터를 반환하는 형태이므로 다양한 포맷의 데이터를 전송할 수 있음
    주로 많이 사용하는 형태는 일반 문자열이나 JSON, XML 등을 사용함

    위 Controller는 일반 문자열을 반환하는 예제임, @Getmapping에 사용된 produces 속성은 해당 메서드가 생산하는 MIME 타입을 의미함
    위와 같이 문자열로 직접 지정할 수도 있고, produces 메서드내의 MediaType이라는 클래스를 이용할 수도 있음

    위의 실행결과는 아래와 같음

    개발자도구를 이용해 브라우저에 전송된 데이터의 produces 속성값이 컨트롤러에서 지정한 'text/plain'인걸 확인할 수 있음

    REST Controller의 반환타입은 문자열, VO 객체, 컬렉션타입의 객체(list, map 등)도 가능함

    ResponseEntity 타입

    REST 방식으로 호출하는 경우는 화면 자체가 아니라 데이터 자체를 전송하는 방식으로 처리되기 때문에 데이터를 요청한 쪽에서
    정상적인 데이터인지 비정상적인 데이터인지를 구분할 수 있는 확실한 방법을 제공해야 하는데
    이때 ResponseEntity는 데이터와 함께 HTTP 헤더의 상태 메시지 등을 같이 전달하는 용도로 사용함
    HTTP의 상태코드와 에러 메시지등과 함께 데이터를 전달할 수 있기 때문에 받는 입장에서 확실히 결과를 알 수 있음
    아래는 예제임

    check method는 반드시 parameter의 값으로 'height', 'weight'를 전달 받음, 이 때 height의 값이 150보다 작으면
    502(bad gateway)상태코드와 데이터를 전송, 그렇지 않다면 200(ok)코드와 데이터를 전송함

    아래는 브라우저에서 호출한 결과값임

    위는 브라우저에 전송된 데이터이고

    위는 브라우저에 전송된 상태코드임, parameter값으로 height가 150이므로 정상적으로 200상태코드가 전송되었음

     

    @RestController에서 parameter

    RestController는 기존의 @Controller에서 사용하던 일반적인 타입이나 사용자가 정의한 타입(class)을 사용함
    여기에 추가로 몇 가지 어노테이션을 이용하는 경우가 있음
    @PathVariable: 일반 컨트롤러에서도 사용이 가능하지만 REST 방식에서 자주 사용된다고 함, URL 경로의 일부를 paraemter로 사용할 때 이용
    @RequestBody: JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 주로 사용

    @PathVariable
    예전에 URL의 '?' 뒤에 추가되는 쿼리 스트링(query string)이라는 형태로 parameter를 이용해서 전달되던 데이터들이
    REST 방식에서는 경로의 일부로 차용되는 경우가 많음

    Spring MVC에서는 @PathVariable 어노테이션을 이용해서 URL 상에 경로의 일부를 parameter로 사용할 수 있음
    http://localhost:9595/sample{sno}
    http://localhost:9595/sample/{sno}/page/{pno}
    위의 URL에서 '{}'로 처리된 부분은 Controller의 method에서 변수로 처리가 가능함
    @PathVariable은 '{}'의 이름을 처리할 때 사용함, REST 방식에서는 URL 자체에 데이터를 식별할 수 있는 정보들을 표현하는 경우가 많으므로
    다양한 방식으로 @PathVariable이 사용됨
    아래는 예제 method임

    @PathVariable을 적용하고 싶은 경우에는 '{}'를 이용해서 변수명을 지정하고, @PathVariable을 이용해서 지정된 이름의 변숫값을 얻을 수 있음
    값을 얻을 때에는 int, double과 같은 기본 자료형은 사용할 수 없음

    아래는 브라우저에서 호출한 결과값임

    위와 같이 호출하면 cat과 pid 변수의 값으로 처리되는 것을 확인할 수 있음

    @RequestBody

    @RequestBody는 전달된 요청(Request)의 내용(body)을 이용해서 해당 parameter의 타입으로 반환을 요구함
    내부적으로 HttpMessageConverter 타입의 객체들을 이용해서 다양한 포맷의 입력 데이터를 변환할 수 있음
    대부분의 경우에는 JSON 데이터를 서버에 보내서 원하는 타입의 객체로 변환하는 용도로 사용되지만, 경우에 따라서는 원하는 포맷의 데이터를 보내고
    이를 해석해서 원하는 타입으로 사용하기도 함
    변환을 위한 예제를 위해서 VO로 사용할 Ticket 클래스를 생성했다고 가정함

    아래는 Ticket을 사용하는 Controller 예제임

    위의 method는 다른 예제와 다르게 @PostMapping이 적용되었는데 이것은 @RequestBody가 말 그대로 요청(Request)한 내용(body)을 처리하기 때문에
    일반적인 parameter 전달방식을 사용할 수 없기 때문임
    이 경우에는 JUnit 기반의 테스트에서는 MockMVC를 이용할 수 있음

    아래는 jUnit 기반의 테스트 예제임

    위의 testConvert()는 SampleController에 작성해 둔 convert()를 테스트하기 위해 작성한 것임
    SampleController의 convert()는 JSON으로 전달되는 데이터를 받아서 Ticket 타입으로 변환함, 이를 위해서 해당 데이터가 JSON이라는 것을
    명시해 줄 필요가 있어서 MockMvc의 contentType으로 전달하려는 데이터가 JSON이라는 것을 명시함
    Gson 라이브러리는 Java 객체를 JSON 문자열로 변환하기 위해서 사용하였음

    아래는 위의 코드를 실행한 결과값임

    첫번 째는 테스트코드에서 JSON타입으로 담은 데이터이고, 두번 째는 테스트코드에서 전달한 JSON 타입 문자열을 Ticket타입으로 객체로 변환한 값임

    jUnit을 이용하는 방식 외에도 Tomcat을 구동한다면 REST 방식으로 테스트할 수 있는 여러가지 도구들이 존재함
    Mac or 리눅스 등을 이용한다면 간단히 curl(https://curl.haxx.se/)같은 도구를 이용할 수 있고, Java나 각종 언어로 개발된 라이브러리 이용 가능
    최근에는 브라우저에서 직접 REST 방식을 테스트 할 수 있는 도구들이 꽤 많은데 Chrome 브라우저 앱 스토어에서 'Rest client'로 검색하면
    꽤 많은 크롬 확장 프로그램을 볼 수 있음, 여기서는 'Restlet Client'를 이용해서 테스트를 진행 하였음
    'Restlet Client'를 설치하면 크롬 브라우저 주소창 우측 옆에 아이콘을 통해 실행 가능하며 아래는 실행한 화면임

    테스트를 위해 전송방식을 POST방식, url은 http://localhost:9595/sample/ticket, body안의 내용을 입력, contentType을 JSON으로 입력한 후
    Send를 누르면 Controller로 전송이 됨

    아래는 Controller에서 전달받은 결과값임

    Restlet Client에서 전송한 JSON 데이터가 Ticket 타입으로 변환됨이 확인됨

     

    출처: 코드로 배우는 스프링 웹 프로젝트(개정판)

     

    반응형