ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @RestController에서 파라미터
    Spring_FrameWork 2018. 11. 28. 12:46

    RestController 는 기존의 @Controller에서 사용하던 일반적인 타입이나 사용자가 정의 한 타입(클래스)를 사용합니다. 여기에 추가로 몇가지 어노테이션을 이용하는 경우가 있다.

    • @PathVariable: 일반 컨트롤로에서도 사용이 가능하지만 REST 방식에서 자주 사용됩니다. URL 경로의 일부를 파라미터로 사용할때 이용
    • @RequestBody : JSON 데이터를 원하는 타입의 객체로 변환 해야 하는 경우 주로 사용

    1. @PathVariable 

    REST 방식에서 URL 내에 최대한 많은 정보를 담으려고 노력합니다. 예전에는 ?뒤에 추가되는 쿼리 스트링이라는 형태로 파라미터를 이용해서 전달되던 데이터들이 REST방식에서는  경로의 일부로 차용되는 경우가 많습니다.

    스프링 MVC에서는 @PathVariable 어노테이션을 이용해서 URL상에 경로의 일부를 파라미터로 사용할수 있다.

    • http://localhost:8080/sample/{sno}
    • http://localhost:8080/sample/{sno}/page/{pno}

    위의 URL에서 {}로 처리된 부분은 컨트롤러의 메서드에서 변수로 처리가 가능합니다 . @PathVariable은 {}이름을 처리할때 사용합니다.

    REST방식에서는 URL 자체 데이터를 식별할수 있는 정보들을 표현하는 경우가 많으므로 다양한 방식으로 @ PathVariable이 사용됩니다 .

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

    브라우저에서 ‘/sample/product/begs/1234’로 호출하면cat과 pid 변수값으로 처리가 되는 것을 확인할 수있다.

    16.3.2 @RequestBody
    @RequestBody는 전달된 요청(request)의 내용(body)을 이용해서 해당 파라미터의 타입으로 변환을 요구합니다. 내부적으로 HttpMessageConverter 타입의 객체들을 이용해서 다양한 포맷의 입력 데이터를 변환 할수 있습니다. 대부분의 경우 JSON 데이터를 서버에 보내서 원하는 타입의 객체로 변환하는 용도로 사용되지만, 경우에 따라서는 원하는 포맷의 데이터를 보내고 , 이를 해석해서 원하는 타입으로 사용하기도 합니다. 
    변환을 위한 예제를 위해서 'org.zerock.domain' 패키지에  Ticket 클래스를 정의한다.



    Ticket  클래스는 번호 (tno) 소유주 (owner) 등급(grade)을 지정합니다.

    Ticket을 사용하는 예제는 SampleController에 추가합니다. 


    SampleController의 다른 메서드와 달리 @PostMapping이 적용된 것을 볼수 있는데, 이것은 @RequestBody가 말그대로  요청 (request)한 내용(body)을 처리하기 때문에 일반적인 파라미터 전달방식을 사용할 수 없기 때문입니다.
    convert()에 대한 테스트는 테스트 방식을 바꿔서 테스트한다 

    REST 방식의 테스트
    위와 같이 get 방식이 아니고 Post등의 방식으로 지정되어 있으면서  JSON 형태의 데이터를 처리하는 것을 브라우저에서 개발하려면 많은 시간과 노력이 들어간다
    @RestController를 쉽게 테스트할 수 있는 방법은 주로  REST 방식의 데이터를 전송하는 방식의 데이터를 전송하는 툴을 이용하거나 Junit와 spring-test를 이용해서 테스트 하는 방식을 고려할 수 있습니다. 
    JUnit 기반의 테스트
    JUnit을 이용하는 방식은 Part 3에서 진행했던 방법을 그대로 이용하지만 JSON데이터를 테스트해야 하므로 차이점 위주로 알아두는 것이 좋다. 

    package org.zerock.controller;



    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;

    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;


    import org.junit.Before;

    import org.junit.Test;

    import org.junit.runner.RunWith;

    import org.springframework.beans.factory.annotation.Autowired;

    import org.springframework.http.MediaType;

    import org.springframework.test.context.ContextConfiguration;

    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    import org.springframework.test.context.web.WebAppConfiguration;

    import org.springframework.test.web.servlet.MockMvc;

    import org.springframework.test.web.servlet.setup.MockMvcBuilders;

    import org.springframework.web.context.WebApplicationContext;

    import org.zerock.domain.Ticket;


    import com.google.gson.Gson;


    import lombok.Setter;

    import lombok.extern.log4j.Log4j;


    @RunWith(SpringJUnit4ClassRunner.class)

    //test for Controller

    @WebAppConfiguration


    @ContextConfiguration({"file:src/main/webapp/WEB-INF/spring/root-context.xml",

    "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml"})

    //Java Config

    @Log4j

    public class SampleControllerTests {

    @

    Setter(onMethod_ = {@Autowired})

    private WebApplicationContext ctx;

    private MockMvc mockMvc;

    @Before

    public void setup() {

    this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();

    }

    @Test

    public void testConvert() throws Exception {

    Ticket ticket = new Ticket();

    ticket.setTno(123);

    ticket.setOwner("Admin");

    ticket.setGrade("AAA");

    String jsonStr = new Gson().toJson(ticket);

    log.info(jsonStr);

    mockMvc.perform(post("/sample/ticket")

    .contentType(MediaType.APPLICATION_JSON)

    .content(jsonStr))

    .andExpect(status().is(200));

    }

    }


    convert()메서드를 테스트하기 위해서 작성 

    SampleController의 convert() 는 JSON으로 전달되는 데이터를 받아서 TIcket으로 변환합니다 . 

    이를 위해서는 해당 데이터가 JSON이라는 것을 명시해 줄 필요가 있습니다. MockMvc 는 

     contentType()을 이용하여 전달하는 데이터가 무엇인지 알려 줄수 있습니다. 코드네 Gson 라이브러리는 Java 객체를 Json  문자열로 변환하기 위해서 사용합니다 .


     위의 코드를 실행하면 다음과 같이 전달되는 JSON 문자열이 Ticket 타입의 객체로 변환 된것을 볼 수 있습니다 . 





    기타 도구 


    Junit을 이용하는 방식 외에도 Tomcat을 구동하면 REST 방식을테스트 할수 있는 방법이 존재한다 

    Mac이나 리눅스는 curl(https://curl.haxx.se/)같은 도구를 이용할 수도 있고 , Java나 강종 언어로 개발된 라이브러리가 이용가능하다


    최근에는 브라우저에서 직접 REST 방식을 태스트할수 있는 도구들있다 

    크롬 브라우저 앱스토에서 'REST client'검색 

    이런식으로 테스트 가능하다 .

    'Spring_FrameWork' 카테고리의 다른 글

    오류)junit test log가 안찍힐때  (0) 2018.12.04
    Ajax 댓글 처리  (0) 2018.11.29
    RESTController의 반환 타입  (0) 2018.11.28
    BoardMapper.xml에서Criteria처리  (0) 2018.11.28
    페이징 처리  (0) 2018.11.28
Designed by Tistory.