ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글