Spring Study -3주차-
컨트롤러에서 파라미터를 받는 방법
@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 변환
Author And Source
이 문제에 관하여(Spring Study -3주차-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chapjun/Spring-Study-3주차-저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)