Spring Study -3주차-

ChapJun·2021년 12월 9일
0

컨트롤러에서 파라미터를 받는 방법

@RequestParam

  • 쿼리 파라미터를 컨트롤러의 메서드 인자로 바인딩 합니다.
  • 요청 파라미터를 메소드에서 1:1로 받기 위해 사용한다.
  • @RequestParam을 사용하면 기본적으로 반드시 해당 파라미터가 전송되어야 한다.
  • 속성
    • required : ( default : true ) 반드시 필요하지 않은 경우라면 false로 설정 !!
    • defaultValue : required 속성이 false라면 대체해줄 값 설정

@RequestBody

@RequestBody는 http 요청의 body 부분으로 JSON 형태의 데이터를 받을 때 Java 객체로 매핑할 수 있게해주는 어노테이션이다.

  • @RequestBody를 사용하면 요청 본문의 JSON, XML, Text 등의 데이터가 적합한 HttpMessageConverter를 통해 파싱되어 Java 객체로 변환 된다. (역직렬화)
  • @RequestBody를 사용할 객체는 필드를 바인딩할 생성자나 setter 메서드가 필요없다.
  • 직렬화를 위해 기본 생성자는 필수다. (ObjectMapper 사용하여 객체로 전환)

@ModelAttribute

  • @ModelAttribute를 사용하면 HTTP 파라미터 데이터를 Java 객체에 맵핑한다.
  • 따라서 객체의 필드에 접근해 데이터를 바인딩할 수 있는 생성자 혹은 setter 메서드가 필요하다.
  • Query String 및 Form 형식이 아닌 데이터는 처리할 수 없다.
  • name 속성으로 지정한 명칭으로 화면에서 사용가능하다.

메소드의 @ModelAttribute

  • 어떤 컨트롤러 클래스 안에있는 특정 메소드에 @ModelAttribute 어노테이션이 붙어 있으면 해당 컨트롤러 클래스의 모든 @RequestMapping 어노테이션이 붙은 메소드가 호출될 때마다 그 메소드 호출 전에 @ModelAttribute가 붙은 메소드가 일단 먼저 호출되고 그 이후 @RequestMapping이 붙은 메소드가 호출되는데 이때 @ModelAttribute 메소드 실행 결과로 리턴되는 객체(데이터)는 자동으로 @RequestMapping 어노테이션이 붙은 메소드의 Model에 저장이되고 그 이후에 View에서 @ModelAttribute 메소드가 반환한 데이터를 사용할수 있다.

@SessionAttributes

@SessionAttributes를 사용하면 @ModelAttribute또는 model.addAttribute()를 사용해서 객체를 저장할 경우 세션에 저장이 되도록 지정할 수 있습니다. 이 경우는 세션이 파괴되거나 SessionStatus 객체를 사용해서 명시적으로 지울때까지 동일한 세션에서는 계속 사용할 수 있습니다.

어떤 경우에 session scope에 객체를 저장해두고 쓰면 좋을까요? 가장 먼저 떠오르는게 등록폼에서 입력해야할 정보가 아주 많을 경우 페이지를 나눠서 작성하는 경우가 되겠습니다. 입력한 정보가 세션에 저장되어 있으면 이전/다음 으로 등록폼들 사이를 왔다갔다 하면서 작성하는 것도 가능합니다.

@SessionAttributes를 사용할 때 주의할 점이 있는데, 사용후에는 SessionStatus객체의 setComplete() 메소드를 사용해서 해제해 주어야 하는 것입니다. 그렇지 않으면 세션에 계속 남아 있게 됩니다.

이 해제와 관련해서 생각해 봐야 할 문제가 있는데, 작업시 성공하면 세션에서 제거하게되는데, 사용자가 중도에 다른 메뉴를 클릭해서 빠져 나가게 되면 세션에 저장된 객체가 그대로 남게 됩니다. 세션에 제거되지 않고 남아있는 객체들로 문제가 되지 않을지 생각을 해봐야 할 것 갈습니다.

// 세션에 order 객체 저장
@SessionAttributes("order") 

// 비어있는 order 객체 생성 
// 이 행위를 안할시 processDesign에서 생성 및 추가 해줘야함 -> 이전으로 돌아왔을 때 초기화가 됨
// model.addAttribute("order", new Order());
@ModelAttribute(name = "order") 
    public Order order() {
        return new Order();
} 
 @PostMapping()
    public String processDesign(@Valid Taco design, Errors errors, @ModelAttribute Order order) {

        if(errors.hasErrors()) {
            return "design";
        }

        log.info("Processing design : " + design);

        Taco savedTaco = tacoService.saveTaco(design);
        order.addDesign(savedTaco);

        log.info("Current Order : " + order);

        return "redirect:/orders/current"; // 상대경로로 재접속
    }    
2021-12-09 23:54:13.697  INFO 18712 --- [nio-7777-exec-8] c.e.t.controller.DesignTacoController    : Current Order : Order(id=null, deliveryName=null, deliveryStreet=null, deliveryCity=null, deliveryState=null, deliveryZip=null, ccNumber=null, ccExpiration=null, ccCVV=null, placedAt=null, tacos=[Taco(id=1, name=타코의이름은뭘까, ingredients=[Ingredient(id=FLTO, name=Flour Tortilla, type=WRAP), Ingredient(id=COTO, name=Corn Tortilla, type=WRAP)], createdAt=Thu Dec 09 23:54:13 KST 2021)])

2021-12-09 23:54:13.705  INFO 18712 --- [nio-7777-exec-9] c.e.t.controller.OrderController         : Order(id=null, deliveryName=null, deliveryStreet=null, deliveryCity=null, deliveryState=null, deliveryZip=null, ccNumber=null, ccExpiration=null, ccCVV=null, placedAt=null, tacos=[Taco(id=1, name=타코의이름은뭘까, ingredients=[Ingredient(id=FLTO, name=Flour Tortilla, type=WRAP), Ingredient(id=COTO, name=Corn Tortilla, type=WRAP)], createdAt=Thu Dec 09 23:54:13 KST 2021)])

- 직렬화

  • Java에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술
  • 범용적인 API나 데이터를 변환하여 추출할 때 많이 사용된다.
  • Java Object → Json Data 변환

- 역직렬화

  • byte로 변환된 Data를 원래대로 변환하는 기술을 역직렬화(Deserialize)라고 부른다.
  • Json → Java Object 변환
profile
Chap Chap

0개의 댓글