Spring에서 GET 요청을 복잡한 객체에 매핑합니다.

하고 싶은 것(목적)



Spring의 GET 요청 (URL 매개 변수)을 복잡한 객체 (Bean)에 매핑합니다.
  • 중첩 구조
  • 목록 구조

  • 결론



    Mapping용 주석을 사용하지 마십시오.
    또는@ModelAttribute 를 사용한다.

    ※변수명과 URL 파라미터의 키를 맞출 필요가 있습니다.

    환경



    Spring Boot:2.1.6

    기타 사용 라이브러리



    lombok

    텍토 검증 소스



    매핑 대상



    상위 객체
    @Data
    @ToString
    public class ComplexBean {
      private String hoge;
      private ChildBean childBean;
      private List<ItemBean> itemBeans;
    }
    

    중첩을 위한 자식 객체
    @Data
    @ToString
    public class ChildBean {
      private String piyo;
    }
    

    목록용 객체
    @Data
    @ToString
    public class ItemBean {
      private String fuga;
    }
    

    @Data , @ToString 는 lombok의 주석@ToString 는 검증용

    컨트롤러


    @RestController
    public class DemoRestController {
    
      @GetMapping(value = "/param")
      @ResponseBody
      public String getParam(@RequestParam ComplexBean bean) {
        System.out.println(bean.toString());
        return bean.toString();
      }
    
      @GetMapping(value = "/model")
      @ResponseBody
      public String getModel(@ModelAttribute ComplexBean bean) {
        System.out.println(bean.toString());
        return bean.toString();
      }
    
      @GetMapping(value = "/direct")
      @ResponseBody
      public String getDirect(ComplexBean bean) {
        System.out.println(bean.toString());
        return bean.toString();
      }
    }
    

    검증



    Restlet Client - REST API Testing을 사용하여 각 엔드포인트에 액세스

    확인할 URL 매개변수


    hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2

    결과


    @RequestParam 를 사용하는 경우
    ( http://localhost:8080/param?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2 )
    매핑 정보가 부족하기 때문에 구문 분석 할 수 없어 오류가 발생합니다.
    Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required ComplexBean parameter 'bean' is not present]
    


    @ModelAttribute 를 사용하는 경우
    ( http://localhost:8080/model?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2 )
    예상대로 매핑됩니다.


    주석이 없는 경우
    ( http://localhost:8080/direct?hoge=hoge&childBean.piyo=piyo&itemBeans[0].fuga=fuga0&itemBeans[2].fuga=fuga2 )
    예상대로 매핑됩니다.


    요약



    다음 구조를 가진 URL 매개변수에서도
    - 중첩 구조
    - 목록 구조

    Mapping용 주석을 사용하지 마십시오.
    또는@ModelAttribute 를 사용한다.

    그렇다면 매핑할 수 있지만 GET의 요청으로 이런 객체에 매핑하지 않으면 안되는 시점에서 설계를 재검토하자.
    덧붙여 검증과 같이 배열 번호를 날렸을 경우는 날려진 가지번호는 null 가 설정된다. (⇒ 하늘의 오브젝트가 되지 않는다)

    좋은 웹페이지 즐겨찾기