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 구동원리
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’클래스 교체
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"; }
- ModelAndView에 객체를 담고
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의 구동원리
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.