포스트

Day82 실습프로젝트(Spring Web MVC)

Spring Framework

1. 라이브러리 적용

  • 버전에 따라 Jakarta와 Java로 나누니다.
  • ver 6.x : Jakarta EE 9
  • ver 5.x : Java EE 8
  • implementation 'org.springframework:spring-webmvc:5.3.39'

2. Spring Framework 구동원리

image

3. 스프링 프레임워크 적용

1) IOC 컨테이너 교체

  • 기존 ApplicationContext클래스 삭제
  • ApplicationContext : AppConfig 객체를 자동생성
  • ContextLoaderListener클래스 변경

    1
    2
    3
    4
    5
    6
    7
    8
    
    //기존
    ApplicationContext iocContainer = new ApplicationContext(ctx, AppConfig.class);
      
    /변경
    AnnotationConfigWebApplicationContext iocContainer = new AnnotationConfigWebApplicationContext();
    iocContainer.register(AppConfig.class);
    iocContainer.serSevletContext(ctx);
    iocContainer.refresh();
    

2) Front Controller 교체

  • 기존 DispatcherServlet클래스 삭제
  • DispatcherServlet : 클라이언트 요청이 들어오면 pageController에서 controller를 선택 후 requestHandler를 통해 실행할 메서드 선택
  • ContextLoaderListener클래스 변경

    1
    2
    3
    4
    5
    
    // 기존
    ServletRegistration.Dynamic servletRegistration = ctx.addServlet("app", dispatcherServlet);
      
    // 변경
    DispatcherServlet dispatcherServlet = new DispatcherServlet(iocContainer);
    

3) Filter 교체

  • 기존 CharacterEncodingFilter클래스 삭제

4) annotation 교체

  • AppConfig클래스 교체
    • @ComponentScan("bitcamp.myapp") : bitcamp.myapp 패키지 내에 있는 모든 클래스에서 @Component, @Service, @Repository, @Controller와 같은 애노테이션이 붙은 클래스들을 자동으로 스캔하고 빈으로 등록
    • @EnableWebMVC : MVC와 관련된 여러 설정을 자동으로 적용
    1
    2
    
    @ComponentScan("bitcamp.myapp") //bitcamp.myapp 패키지에 있는 모든 컴포넌트 생성
    @EnableWebMVC 
    
  • ‘Controller’클래스 교체
    • RequestMapping("URL") : 클라이언트가 보낸 해당 URL 요청을 보낼때 실행, Spring MVC에서도 사용가능
    • GetMapping("URL"), PostMapping("URL") : 클라이언트가 보낸 요청이 GET/POST에 따라 URL요청을 실행
    • 요청 파라미터와 요청 파라미터 핸들러와 동일하게 사용 image

5) Service 클래스 변경

  • annotation 패키지 변경

    1
    2
    3
    
      import bitcamp.myapp.annotation.Component;
          
      import org.springframework.stereotype.Component;
    

6) PageController 클래스 변경

  • 기존 객체를 Map에 담아 front controller에 전달

    1
    2
    3
    4
    5
    6
    7
    8
    
     public String view(@RequestParam("no") int projectNo, Map<String, Object> map) throws Exception {
        Project project = projectService.get(projectNo);
        map.put("project", project);
      
        List<User> users = userService.list();
        map.put("users", users);
        return "/project/view.jsp";
      }
    
  • Model을 적용하여 frontController에 전달한다.
    • model로 적용하기
    • model 객체를 넘겨서 frontController에 전달하고, String으로 ViewName을 리턴한다.
    1
    2
    3
    4
    5
    6
    7
    8
    
    public String view(int no, Model model) throws Exception{
      Project project = projectService.get(projectNo);
      model.setAttribute("project", project);
        
      List<User> users = userService.list();
      model.setAttribute("users", users);
      return "/project/view.jsp";
    }
    
    • ModelAndView
    • modelAndView를 통해 객체를 frontController에 전달하고, ViewName을 담아 리턴한다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    public ModelAndView view(int no) throws Exception{
      ModelAndView mv = new ModelAndView();
      Project project = projectService.get(projectNo);
      mv.addObject("project", project);
      
      List<User> users = userService.list();
      mv.addObject("users", users);
      mb.setViewName("/project/view.jsp");
      return mv;
    }
    
  • Session 대체
    • project에서 form1 -> fomr3 과정에서 session을 통해 기존 결과값을 전달
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
      @RequestMapping("/project/form2")
      public String form2(Project project, Map<String, Object> map, HttpSession session) throws Exception {
        session.setAttribute("project", project);
        //중략
        return "/project/form2.jsp";
      }
      
      @RequestMapping("/project/form3")
      public String form3(
              @RequestParam("member") int[] memberNos,
              HttpSession session) throws Exception {
      
        Project project = (Project) session.getAttribute("project");
        //중략
        return "/project/form3.jsp";
      }
      
      @RequestMapping("/project/add")
      public String add(HttpSession session) throws Exception {
        Project project = (Project) session.getAttribute("project");
        projectService.add(project);
        session.removeAttribute("project");
        return "redirect:list";
      }
    
  • ModelAndView를 통해 Session역할을 대체
    • ModelAndView에 객체를 담고 @ModelAttribut Class parameter을 통해 전달
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
      @PostMapping("/project/form2")
      public ModelAndView form2(Project project) throws Exception {
        // 중략
        // project 객체담기
        ModelAndView mv = new ModelAndView();
        mv.addObject("project", project);
        mv.addObject("users", users);
        mv.setViewName("project/form2");
        return mv;
      }
      
      @PostMapping("/project/form3")
      public String form3(
              int[] memberNos,
              @ModelAttribute Project project //프로젝트 객체 꺼내기 
              ) throws Exception {
      
        if (memberNos.length > 0) {
          ArrayList<User> members = new ArrayList<>();
          for (int memberNo : memberNos) {
            User user = userService.get(memberNo);
            members.add(user);
          }
          project.setMembers(members);
        }
      
        return "project/form3";
      }
      
      @PostMapping("/project/add")
      public String add(@ModelAttribute Project project, SessionStatus sessionStatus) throws Exception {
        projectService.add(project);
        sessionStatus.setComplete(); // 작업이 끝났으니 세션에 임시 보관했던 값을 제거하라. @SessionAttributes 에 등록된 이름의 값.
        return "redirect:list";
      }
    

7) AppConfig 클래스 변경

  • multipart Post 요청 : viewResolver메서드를 통해 표준 multipartResolver를 생성

    1
    2
    3
    4
    
      @Bean
      public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
      }
    
  • JSP 외부접근 차단 : internalResourceViewResolver 메서드를 통해 JSP 접근

    1
    2
    3
    4
    5
    6
    7
    
    @Bean
    public ViewResolver viewResolver(){
      InternalResourceViewResolver vr = new InternalResourceViewResolver();
      vr.setPrefix("/WEB-INF/jsp/"); //접두사 
      vr.setSuffix(".jsp");          //접미사
      return vr;
    }
    
  • internalResourceViewResolver의 구동원리

image

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.