1강 - Spring MVC 란
[Spring MVC 프로세스]
1. 사용자 요청이 오면 톰캣은 Dispatcher에게 URL에 해당하는 페이지를 요청한다.
2. 디스패처 서블릿에서는 해당 URL에 대한 Controller 를 찾아서 해당 요청에 대한 CRUD 작업을 진행하고
디스패처 서블릿에게 반환한다.
==> 디스패처 서블릿과 Controller의 url mapping이 사전에 이루어져야 디스패처가 클라이언트로부터
들어온 요청 URL을 보고 해당하는 Controller를 찾을 수 있다.
(**-servlet.xml 에서 설정)
3. 디스패처 서블릿은 반환한 데이터를 기반으로 뷰로 출력한다.
Spring MVC는 Dispatcher 라이브러리를 사용하는것!
=> MVC를 지원하는 Spring 라이브러리 DispatcherServlet을 설정해서 사용한다.
정리. (비트교육센터에서 배운것을 토대로 설정 정리)
1) 모든 요청의 URL을 Dispatcher가 받아들일 수 있게 설정
(Dispatcher 라이브러리를 쓸 수 있게 사전에 아래의 dependency를 Maven 프로젝트 pom.xml에 추가
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
)
2) web.xml 에서 모든 URL을 디스패처가 받을 수 있게 설정
(1번에서 추가한 Dispatcher 라이브러리를 사용)
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3) 컨트롤러를 관리할 수 있는 컨테이너(ApplicationContext)를 지원하는 라이브러리 추가
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
4) spring-core, spring-context, spring-web, spring-aop, spring-beans, spring-expression 를 사용하기위한 라이브러리 추가
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
2강 - 실습환경 준비하기
3강 - 메이븐을 이용한 기본 웹 프로젝트 생성하기
4강 - Dispatcher Servlet 라이브러리 설정하기
(Srping Dispatcher를 Front 컨트롤러로 설정하기)
5강 - Dispatcher-servlet.xml 파일
톰캣과 Dispatcher를 맵핑 할때 이전에 배웠던 어노테이션 방법을 사용해서 연결하려고 했는데
어노테이션 방법으로 하려면 기존에 소스가 존재해야하기에 불가능하다.
(DispatcherServlet.class 는 외부에서 가져온 것이기 때문이다.)
따라서 web.xml 파일에서 url 맵핑을 통해서 연결해주어야 한다.
위의 설정을 하고 index.jsp 를 실행하면 에러가 발생한다.
왜? 톰캣에서 dispatcher 서블릿에게 index.jsp를 요청하는데 그 요청을 받을 dispatcher 서블릿이 존재하지 않기 때문
근본 에러에서 /WEB-INF/dispatcher-servlet.xml 을 찾는다.
dispatcher-servlet.xml 은 무엇일까?
이전에 모든 요청에 대한 처리하는 서블릿 name을 dispatcher로 설정했었다. (위로 세번 스크롤 해보면 있음...)
그리하여 톰캣에서 요청이 들어올때 "설정한 서블릿 name:" + "-servlet.xml" 을 하여
/WEB-INF/dispatcher-servlet.xml 에서 맵핑된 url 정보를 찾는다.
그러면 dispatcher-servlet에서는 어떤 정보를 담아야할까?
6강 - 스프링 컨트롤러 IndexController 작성하기
dispatcher-servlet.xml 파일에 IndexController 의 객체를 /index 라는 url 값으로 맵핑하여 컨테이너에 담아준다.
Dispatcher 에서 Controller 를 사용하기 위해서는 약속된 함수가 있어야 한다.
예를 들면, /index url 요청(request)이 넘어올때 디스패처 서블릿에서 AController 컨트롤러에 넘기고
그 요청에 대한 처리는 handleRequest 함수에서 요청에 대한 응답(response) 를 처리하여
다시 서블릿에 넘기고 서블릿은 view로 넘어간다.
/index 요청시 프로세스 정리
7강 - View 페이지를 위한 위치
web.xml servlet 맵핑 설정 "/" 으로 해줌으로써 클라이언트의 요청을 모두 dispatcher(dispatcher-servlet.xml)이 받는다.
※ 절대경로 와 상대경로
클라이언트의 요청에 대해서 view 페이지를 forwarding 하기 위해서 jsp 파일의 uri를 써줘야하는데
이때 반드시 절대경로로 써주어야 한다.
mv.setViewName("/WEB-INF/view/index.jsp"); //forwarding
//URL을 WEB-INF/view/index.jsp 는 상대경로
//URL을 /WEB-INF/view/index.jsp 는 절대경로
==> 경로를 설정해줄때 반드시 절대경로로 해주는게 URL 맵핑 오류가 발생하지 않는다.
8강 - ViewResolver 사용하기
mv.setViewName("/WEB-INF/view/index.jsp");
==> view를 forwarding 하기 위한 uri 경로 지정이 번거롭다.
쉽게 지정하는 방법이 없을까?
dispatcher-servlet.xml 파일에서 ViewResolver 를 bean 설정을 함으로써 "/WEB-INF/view/ .jsp" 의 틀을 만들어서
new ModelAndView("index"); 매개변수로 index를 보내면 ViewResolver 은 "/WEB-INF/view/index.jsp" 로 만들어준다.
9강 - HTML 파일 설정하기
10강 - 정적 파일 서비스 하기
원칙: Spring 에서는 정적 파일을 막아두었다.
=> 정적파일 실행을 막아둔 것을 mvc:resources 를 등록함으로써 정적파일을 쓸 수 있게 설정할 수 있다.
※ "/*" vs "/" 차이
case1) "/"
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
=>정적인 파일의 실행을 막는다. ( jsp 파일 실행은 가능 )
case2) "/*"
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
=> 정적인 파일의 실행을 막는다. + jsp 파일의 실행도 막는다.
mvc:resource 를 활용하여 정적인 파일을 쓸 수 있게 설정할 수 있는데
dispatcher-servlet.xml 에서 mvc:resource 를 등록해야한다.
<mvc:resources location="/resource/" mapping="/resource/**"> </mvc:resources>
해석: /resource/images/aa.png , /resource/image/abc.png 등과 같이 resource 하위 요청 url은
/resource/ 폴더에서 찾아라!
images, js, css 각각의 location 을 지정하는 것 보다 정적 파일들을 static 폴더에 만들어서 넣어준 다음
아래와 같이 만들어 준다.
ex. <mvc:resources location="/static/" mapping="/**"> </mvc:resources>
해석: 모든 요청 url 은 /static/ 폴더에서 찾아라!
위와 같이 설정했을때 스프링은 어떻게 이미지(정적파일)을 찾을까?
banner1.svg 이미지를 실행했을때 URL 은 http://localhost:8080/static/images/banner2.svg 로 호출한다.
이 말은 mapping="banner2.svg" 는 /static 뒤의 /와 맵핑 됨을 알 수 있다.
[쉽게 정리]
<mvc:resources location="/static/" mapping="/**"> </mvc:resources>
/static/ + "/**" ==> /static + /images/banner2.svg
11강 - 공지사항 컨트롤러 추가하기
12강 - Detail 컨트롤러 추가와 View 페이지 집중화의 필요성
==> html 에서 header와 footer 와 같은 공통 부분의 경우는 하나로 관리할 수 없을까?
다음 강의에서 하나로 관리할 수 있게 만들어 보겠다.
13강 - 페이지 공통분모 집중화
위와 같이 공통 분모에 jsp의 기능중 하나인 include page를 사용할 수 있다.
하지만 include page의 문제점이 있다.
=> 각각의 페이지마다 include page를 해주어야하는 번거로움이 생긴다.
이것을 보완하기 위해서 공통분모의 틀을 한번 만들고, 새로운 페이지를 만들때
그 틀 안에 메인 내용만 구현하게 해주면 된다.
==> content와 layout을 나누어 하는 방식이 "타일즈" 라고 한다.
출처: 뉴렉처
www.youtube.com/watch?v=9Tmzt6Q9WI8&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=27
'스프링 프레임워크' 카테고리의 다른 글
Spring MVC (스프링 웹 MVC) 25강 ~ 41강 (0) | 2021.04.12 |
---|---|
Spring MVC (스프링 웹 MVC) 14강 ~ 24강 (0) | 2021.03.24 |
뉴렉처[스프링 프레임워크_AOP] 1강 ~8강 (2) | 2021.03.11 |
뉴렉처[스프링 프레임워크] 16강~17강 (0) | 2021.03.02 |
뉴렉처[스프링 프레임워크] 10강~15강 (0) | 2021.02.25 |