해당 글은 intelliJ 에서 스프링 MVC 를 해보고자 하는 저같은 초보!! 들에게 필요한 내용을 위주로 담고 있습니다.
고로 좀더 나이스한 설정법과 기타 미려한 내용들은 다 빠지고 ...

그야 말로 우선 가장 작은 단위를 만들어서 돌려보는것이 의의를 가지고 있습니다.

이렇게 한번 돌린것을 기반으로 변경해나가시면 훌륭한 프레임웍을 구성하실 수 있을거라 믿습니다.

참고


-------------------------------------------------------------------------------

1. File --> new Project --> create project from scratch


2. 프로젝트 이름정하고 아래 모듈이름도 정한다음...

모듈은 Maven Module 로 선택하고 

다음을 누른뒤 화면에서 Create from archetype 를 체크하면 프로토타입이 나온다.

(안나오면 언체크 한뒤 다시 체크하면됨)


org.apache.maven.archetypes:maven-archetype-webapp

위의것을 선택하면 기본 구조가 나온다.




3. pom.xml에 

 <properties>

        <java-version>1.6</java-version>

        <org.springframework-version>3.0.6.RELEASE</org.springframework-version>

        <org.aspectj-version>1.6.9</org.aspectj-version>

        <org.slf4j-version>1.5.10</org.slf4j-version>

    </properties>

추가하고  (일종의 변수이다...변수선언.. 이걸 한다고 해서 해당 버전으로 고정되는게 아니라 저걸 정의하는곳에 이용할뿐이다)

dependencies 아래에

 <dependency>

      <groupId>org.springframework</groupId>

      <artifactId>spring-webmvc</artifactId>

      <version>${org.springframework-version}</version>

    </dependency>


스프링 소스 홈페이지에 보면 maven 설정을 위한 내용이 있다. http://www.springsource.org/spring-framework#maven   

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-context</artifactId>
 <version>3.1.1.RELEASE</version> 

</dependency> 

추가하고, 오른쪽 메이븐프로젝트 사이드바에서 reimport를 하든지 이벤트로그에서 

Maven projects need to be imported: Import Changes Enable Auto-Import 에서 Import Changes를 선택하면된다.




4. web.xml

우선 web-app 태그에 값으로

version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

를 넣는다.

<web-app

  version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


 web-app 안에 서블릿 설정 추가


    <servlet>

        <servlet-name>example</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <load-on-startup>1</load-on-startup>

    </servlet>


    <servlet-mapping>

        <servlet-name>example</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>


 


5. src->main 아래에 디렉토리 java 생성하고 F4를 눌러서 프로젝트 구조를 띄운다음

오른쪽에서 좀전에 만든 java를 선택하고 마우스오른쪽 -->make directory as --> Source를 선택하여 소스디렉토리로 사용


6. 해당 소스디렉토리 이후레 패키지 생성 ex. com.sib.test


그리고 클래스를 하나 만들자

package com.sib.test;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;


/**

 * Created by IntelliJ IDEA.

 * User: nexGen

 * Date: 12. 3. 27

 * Time: 오후 2:29

 * To change this template use File | Settings | File Templates.

 */


@Controller

public class HelloWorldController {


    @RequestMapping("/helloWorld")

    public ModelAndView helloWorld() {

        ModelAndView mav = new ModelAndView();

        mav.setViewName("helloWorld");

        mav.addObject("message","Hello World");

        return mav;

    }

}



그리고 view 를 만들어두자.위에서 ViewName을 helloWorld로 했으니..

WEB-INF 밑에 views 디렉토리를 만들고 helloWorld.jsp를 추가

hello<br/>


${message}~~~



간단하게 만들었다.



7. 이제 web.xml에 스프링관련 설정.xml 을 추가하자.

서블릿이름-servlet.xml 을 하든지 아래처럼 명시적으로

<servlet> 안에 

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>

</init-param>


관리하기 쉽도록 명시적으로 처리하자.

해당 디렉토리를 만들고 파일도 만들면 web.xml에 있는 에러내용이 없어질것이다.

해서 만들어진 결과 

최종 web.xml

<!DOCTYPE web-app PUBLIC

 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

 "http://java.sun.com/dtd/web-app_2_3.dtd" >


<web-app

  version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Archetype Created Web Application</display-name>


    <servlet>

        <servlet-name>example</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>


    <servlet-mapping>

        <servlet-name>example</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>


</web-app>






빈의 오토스캔을 위해 servlet-context.xml에

<context:component-scan base-package="com.sib.test"/>

를 넣어야 하는데... context 태그를 쓰기위해서는 beans 선언에 추가할것이 있다.


xmlns:context="http://www.springframework.org/schema/context"

를 하면 context 태그를 쓸 수 있다. 우선 아래를 참고해라


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:p="http://www.springframework.org/schema/p" 

    xmlns:context="http://www.springframework.org/schema/context"

    xsi:schemaLocation="

        http://www.springframework.org/schema/beans 

        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

        http://www.springframework.org/schema/context 

        http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:component-scan base-package="org.springframework.samples.petclinic.web"/>


    // ...


</beans>


결과 최종 servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:beans="http://www.springframework.org/schema/beans"

       xmlns:context="http://www.springframework.org/schema/context"


       xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/context

       http://www.springframework.org/schema/context/spring-context-3.0.xsd

       http://www.springframework.org/schema/mvc

       http://www.springframework.org/schema/mvc/spring-mvc.xsd">


       <context:component-scan base-package="com.sib.test"/>


    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <beans:property name="prefix" value="/WEB-INF/views/" />

        <beans:property name="suffix" value=".jsp" />

    </beans:bean>


</beans:beans>


 



tomcat에 소스를 deploy  해야한다.


그전에 maven 에서 소스를 package 해야한다. (war 생성)

compile 하고 package 해야하는지는.. 잘 모르겠고;


8. 우선 톰켓이 없으면 설정한다. 프로젝트 최상위에 마우스 선택후 Add Framework Support

--> application server --> tomcat


다음 상단에 play 바 왼쪽에 셀렉트 박스에서 톰켓을 선택하고 다시 선택하여 Edit Configurations 선택

--> deployement 탭을 선택하여 + 표시.. 선택 --> Artifact --> 나오는 war 선택


이제 서버기동!



3월 27, 2012 3:24:55 오후 org.springframework.web.servlet.FrameworkServlet initServletBean

정보: FrameworkServlet 'example': initialization started

3월 27, 2012 3:24:55 오후 org.springframework.context.support.AbstractApplicationContext prepareRefresh

정보: Refreshing WebApplicationContext for namespace 'example-servlet': startup date [Tue Mar 27 15:24:55 KST 2012]; root of context hierarchy

3월 27, 2012 3:24:55 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

정보: Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]

3월 27, 2012 3:24:56 오후 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons

정보: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@60bd76d7: defining beans [helloWorldController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.web.servlet.view.InternalResourceViewResolver#0]; root of factory hierarchy

3월 27, 2012 3:24:56 오후 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler

정보: Mapped URL path [/helloWorld] onto handler 'helloWorldController'

3월 27, 2012 3:24:56 오후 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler

정보: Mapped URL path [/helloWorld.*] onto handler 'helloWorldController'

3월 27, 2012 3:24:56 오후 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler

정보: Mapped URL path [/helloWorld/] onto handler 'helloWorldController'


servlet 'example'을 기동했고 mapping 정보를 읽어왔다.




http://localhost:8080/helloWorld


해보자. 나온다~




최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.



흐음.. 이게 벌써 몇번째 정리인지 모르겠다.

아무튼 스프링책을 다시 보면서 정리하는 중이니 역시 정리하겠다. 스프링 또한 여차 프레임웍처럼 스프링 MVC를 제공한다.

간단하게 정리하자면.. 이 모든것을 총괄하는 커맨드센터격는 DispatcherServlet 이다.

1. 기본흐름

클라이언트 ---- 요청 ----> DispatcherServlet 

DispatcherServlet ---- 처리할 컨트롤러 파악 ----> HandlerMapping
DispatcherServlet <---- 처리할 컨트롤러 파악 ---- HandlerMapping

DispatcherServlet ---- 처리요청 ----> Controller 
DispatcherServlet <---- ModelAndView 리턴 ---- Controller
DispatcherServlet ---- ModelAndView 결과를 보여줄 View 파악 ----> ViewResolver
DispatcherServlet <---- View 리턴 ---- ViewResolver
DispatcherServlet ---- 결과물 출력요청 ----> View


개발자는 컨트롤러와 클라이언트의 응답결과화면 보여줄 뷰화면을 만드는게 주이다.
보통은 DispatcherServlet , HandlerMapping, ViewResolver 는 기본 클래스를 쓴다.


하여
ㄱ. DispatcherServlet을 web.xml파일에 설정한다.
ㄴ. 컨트롤러를 작성한다.
ㄷ. ViewResolver를 설정한다. 이는 컨트롤러가 전달한 ModelAndView 값을 이용해서 만듬
ㄹ. 뷰 관련 템플릿(jsp etc...) 로 화면을 만든다.


아니면 개발 과정으로 설명하자면

ㄱ. 클라이언트의 요청을 받을 DispaatcherServlet 을 web.xml에 선언한다.
ㄴ. 클라이언트의 요청을 처리할 컨트롤러 클래스를 만든다.
ㄷ. 컨트롤러가 만든 ModelAndView 데이터를 이용해서 View를 처리할 ViewResolver를 설정한다. ( xml)
ㄹ. Velocity 나 JSP로 뷰를 작성한다.



2. DispatcherServlet 설정
web.xml을 설정하는 과정이다.
/WEB-INF/web.xml
 서블릿과 서블릿 맵핑 정보를 추가하면됨

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
// *.do로 들어오는 클라이언트요청을  dispatcher에서 처리함
<url-pattern>*.do</url-pattern>
<url-pattern>/game/*</url-pattern>
</servlet-mapping>
 
DispatcherServlet은 WEB-INF/ 디렉토리에 위치한 [서블릿이름]-servlet.xml 파일을 스프링 설정파일로 사용한다.

위의 경우 dispatcher 이므로 dispatcher-servlet.xml 파일을 설정파일로 사용한다.
해당 설정파일에는 Controller,ViewResolver,View 등의 빈을 설정한다.


3. Controller 구현
컨트롤러를 구현하려면 @Controller 어노테이션 을 해당 클래스에 적용한다.
@RequestMapping 어노테이션을 이용하면, 클라이언틔 요청을 처리할 메소드를 지정할 수 있다.

@Controller
public class HelloController {

@RequestMapping("/hello.do")
public ModelAndView hello() {
              ModelAndView mav = new ModelAndView();
mav.setViewName("hello");    // 뷰 이름이 hello (.jsp)
mav.addObject("greeting", getGreeting());
return mav;
        }
        ....
}



스프링 MVC는 ModelAndView 말고도 String,Map 등과 같은 타입을 이용해서 뷰이름과,정보를 보낼 수 있다.

당연히 해당 컨트롤러를 DispatcherServlet에서 찾을 수 있도록 스프링 컨테이너의 빈 으로 등록해주어야한다. 

스프링 2.5에서는 컨트롤러 어노테이션에 대해서 추가 작업이 필요하나 3.0에서는 변경되었다.

위의 맵핑에서 정의한 컨트롤러의 메소드에서 ModelAndView 로 결과를 리턴하는데 이 결과와 매칭되는 뷰 구현체를 찾기위해
ViewResolver를 사용한다.  스프링은 여러 벨로시티등의 여러가지 뷰 구현체를 지원하는데 jsp 를 사용할경우 
org.springframework.web.servlet.view.InternalResourceViewResolver 구현체를 빈으로 등록해주면된다.

in [서블릿이름]-servlet.xml 파일안에 
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
// ViewResolver 가 /WEB-INF/view/뷰이름.jsp 를 뷰 JSP로 사용.  위의 컨트롤러에서 view 이름을 hello로 잡았으므로 실제 리턴하는 파일은 
// /WEB-INF/view/hello.jsp 파일이다.  즉 [prefix]뷰이름[suffix] 가 된다.
</bean> 
  

이제 호출하면된다. 
http://localhost:8080/hello.html



자.. 그럼 다시 살펴보면 우선 web.xml에 DispatcherServlet 과 Mapping 설정을 해두었다.
사용자가 특정 url 요청을 하게 되면 Mapping 해두었던 설정에 따라 어떤 dispatcherServlet을 쓸지 확인하고 해당 dispatcherSerlvet 의 설정파일 [dispatcherServlet]-servlet.xml 파일을 읽어서 요청에 맞는 url 패턴을 가진 컨트롤러를 등록된 빈 에서 찾는다.

찾았으면 해당 컨트롤러에 가서 정의된 @RequestMapping 어노테이션중 맞는것을 찾아서 ModelAndView 를 만들고, 리턴한다.

그러면 이를 처리할 ViewResolver 를 찾아야 하는데 그건 [dispatcherServlet이름]-serlvet.xml 파일에 정의된 viewResolver 를 사용해서 

prefix/suffix를 이용한 url을 만든다. 사용자의 눈에는 그 url 이 보이진 않는다. viewResolver가 view를 찾아서 그걸 보여주기만 할뿐 주소의 변경은 없다.

해서 요청 url 패턴이 html 이었다면 .html로 요청한 주소는 그대로이고, viewResolver 에서 만든 주소(by prefix,suffix) 의 대상이 실제 보이게 된다.


'IT > 스프링' 카테고리의 다른 글

filter....  (0) 2012.01.10
DispatcherServlet... more  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09
weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06

+ Recent posts