본문 바로가기

스프링 프레임워크

Spring MVC (스프링 웹 MVC) 1강 ~ 13강

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 서블릿이 존재하지 않기 때문

 

index.jsp 요청에 따른 서블릿이 존재하지 않기에 발생하는 오류

 

근본 에러에서 /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-servlet.xml 파일에서 /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을 나누어 하는 방식이 "타일즈" 라고 한다.

 

Layout 과 Content의 집중화

 

출처: 뉴렉처
www.youtube.com/watch?v=9Tmzt6Q9WI8&list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T&index=27