-
Spring (7)현재/Spring 2021. 12. 24. 13:49
0. 지극히 개인적인 정리
1. Spring MVC
1) DispatcherServlet
(1) 단일인입점: 모든 request가 들어오는 입구
(2) DispatcherServlet -> frameworkServlet -> HttpServletBean -> HttpServlet
(3) Spring boot는 내장 tomcat 올리면서 바로 DispatcherServlet에 등록 -> 자동으로 servlet으로 등록
(4) frameworkServlet에 service method를 override 하고 있음
(5) DispatcherServlet.doDispatch() 호출됨
※ war vs jar
(1) war: jsp 사용 + 외장 서버인 경우, 주로 사용
(2) jar: 내장 tomcat을 사용할 경우 대체로 이용
2) resource 전달
(1) 정적 resource: path에 붙이면 바로 해당 정적 resource 열 수 있음
- resource/public
- resource/static
(2) view template
(3) http message 이용
2. annotation
1) @RequiredArgsConstructor
(1) final 붙은 멤버 변수만 사용하여 생성자를 자동 생성해줌
2) @RequestParam
(1) HttpServletRequest 객체와 같은 역할 수행
(2) 변수를 하나하나 받아서 객체를 생성하는 과정으로 코딩량이 증가
@PostMapping("/test") public String testRequestParam(@RequestParam String name , @RequestParam int seq , Model model){ TestItem ti = new TestItem(); ti.setName(name); ti.setSeq(seq); testItemRepo.testChk(ti); model.addAttribute("testItem", ti); return "redirect:/test/index"; }
3) @ModelAttribute
(1) 변수를 하나하나 받지 않고 한번에 객체를 만들어서 받으므로 코딩량 감소
(2) @ModelAttribute("가져올 데이터 이름") / 데이터 타입 / 가져온 데이터를 담을 변수
(3) 요청 parameter값을 property접근법(setXXX)으로 입력
(4) model.addAttribute() 기능이 포함되어 있음 -> Model에 @ModelAttribute로 지정한 객체를 자동으로 넣어줌
@PostMapping("/test2") public String testModelAttribute(@ModelAttribute("testItem")TestItem testItem , Model model){ testItemRepo.testChk2(testItem); // model.addAttribute("testItem", ti); // -> 생략 가능 return "redirect:/test/index2"; }
※ model에 담길 value에 대한 key값 명칭 지정 가능
- @ModelAttribute("test") Item item -> "test"로 이름 지정
- model.addAttribute("test", item); -> "test" 이름으로 model에 담김
※ @ModelAttribute 사용시 이름 지정 없이 데이터 타입 및 변수만 나열해도 됨 (생략 가능)
@PostMapping("/test2") public String testModelAttribute(@ModelAttribute TestItem testItem , Model model){ testItemRepo.testChk2(testItem); // model.addAttribute("testItem", ti); // -> 생략 가능 return "redirect:/test/index2"; }
※ @ModelAttribute 생략 가능
(1) 이렇게 되면 model에 담길 때 클래스명으로 담김
@PostMapping("/test3") public String testModelAttribute2(TestItem testItem){ testItemRepo.testChk3(testItem); return "redirect:/test/index3"; }
3. PRG
0) 문제가 불거진 이유
(1) client -> 상품 목록 조회 화면 이동 -> 상품 등록 등록 화면으로 이동 -> 상품 저장 -> 상품 상세 화면으로 이동
(2) 상품 저장 후 새로고침 반복 -> 새로고침을 한 만큼 상품이 등록(저장)됨
1) Post/Redirect/Get
(1) 새로고침은 마지막에 server에 전송한 데이터를 다시 전송
(2) 그러므로 상품을 저장한 후에 view template으로 이동하는 것이 아니라 redirect를 통해 화면을 아예 호출하면 됨
2) RedirectAttributes
(1) url 인코딩, pathVariable, query parameter 처리 가능
@PostMapping("/test3") public String testModelAttribute2(TestItem testItem , RedirectAttributes ras){ TestItem ti = testItemRepo.testChk3(testItem); ras.addAttribute("name", ti.getName()); ras.addAttribute("seq", ti.getSeq()); ras.addAttribute("status", true); // status값에 따라 html에 분기 처리 및 표시도 가능 return "redirect:/test/main/{seq}"; }
'현재 > Spring' 카테고리의 다른 글
Spring (8) (0) 2022.01.27 Spring (6) (0) 2021.12.09 Spring (5) (0) 2021.11.16 Spring (4) (0) 2021.11.10 Spring (3) (0) 2021.10.27