본문 바로가기
Lecture/Spring

[본격 게시판짜기 Part3.3 Spring MVC] Spring MVC 개요 및 설정하기

by cusmaker 2012. 9. 22.
반응형

- html 기초부터 spring까지! 게시판? 나도 만들수있다! 

(좋아요, View on, 댓글 환영합니다!!! ㅋㅋㅋ)


2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.1 Model2 MVC패턴] 뷰(View) 코드 분리

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.2 Model2 MVC패턴] Entity Beans의 사용

2012/07/12 - [Lecture/Jsp] - [본격 게시판짜기 Part2.3 Model2 MVC패턴] Controller구성

2012/07/13 - [Lecture/Jsp] - [본격 게시판짜기 Part2.4 Model2 MVC패턴] Model 구성

2012/07/16 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.5 Model2 MVC패턴] Model 구성2 - i-batis의 사용

2012/07/17 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.6 Model2 MVC패턴] Model 구성2 - i-batis의 사용2

2012/07/21 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.7 Model2 MVC패턴] i-batis의 queryForList 활용 Paging기능구현

2012/07/22 - [Lecture/Jsp] - [본격 게시판짜기 Part2.8 Model2 MVC패턴] count기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.9 Model2 MVC패턴] 파일업로드 기능추가

2012/07/28 - [Lecture/Jsp] - [본격 게시판짜기 Part2.10 Model2 MVC패턴] 파일다운로드/삭제 기능추가

2012/07/31 - [Lecture/Jsp] - [본격 게시판짜기 Part3.1 Spring MVC] Ajax란?

2012/08/28 - [Lecture/Jsp] - [본격 게시판짜기 Part3.2 Spring MVC] lightbox 적용하기


안녕하세요 cocy입니다. 

이번시간에는 드디어 현재까지 진행한 소스를 토대로

스프링 프레임워크를 적용하여 구성해 보도록 하겠습니다.


스프링에 관한 포스팅을 하기까지 다소 텀이 있었던 이유는,

아무래도 스프링이라는 거대한 프레임워크를 쉽게 설명드리기에는

제 실력도 부족하고, 제가 이해하고 있는 스프링에 대한 지식에 확신이 없었기때문입니다.


프레임워크를 안다고 하는것은

단지 사용법만 아는 것이 아닌,

프레임워크를 밑바닥부터 완전히 이해하고 동작원리를 잘 설명할 줄 알아야하는데,

아무래도 저는 아직 전자인듯 싶습니다.


해서, 일단은 제가 알고 있는, 제가 이해하고있는 범위의 개념들과

프레임워크의 구성방법, 그리고 사용방법을 포스팅하기로 결정하였습니다.

앞으로 포스팅 되는 내용들은 저의 주관적인 해석일 가능성이 크고, 정확하지 않을 수 있습니다.

모자란부분 이해부탁드리며, 별도로 책이나 검색을 통해 공부하시기를 권장합니다.


그럼 시작합니다!


스프링 프레임워크는 자바진영에서 만든 오픈소스 프레임워크로,

현존하는 프레임워크중 단연 제일 잘 나간다고 할 수 있겠습니다.

웹 어플리케이션 이외에도 일반적인 자바 어플리케이션의 개발에도 쓰이는 범용적인 프레임워크이며,

J2EE(Java Enterprise Edition)에서 지원하는 대부분의 기능들이 지원되고 있습니다.


제가 맘에 들었던 스프링의 정의중에 누군가 이렇게 정의하였었는데요,

"스프링은 프로그래밍의 좋은 습관이다."

스프링 프레임워크에서는 프로그래머가 아주 적은 노력으로도 효율적인 코드를 작성할 수 있도록 도와줍니다.

그것은 바로 어떠한 문제를 해결하는데 필요한 디자인패턴이나,

효율적이고 생산성 높은 코드를 만들기위한 방법론 등을

프레임워크를 사용하면서 아주 자연스럽게 습득 할 수 있게 도와줍니다.


스프링의 핵심 개념을 꼽으라면 단연 DI(Dependency Injection, 의존성 주입)이 있는데요,

단순히 설명하자면, 

스프링에서는 xml설정파일을 이용하여 각 모듈들을 연결시켜주고(xml 코드 조립),

각 모듈의 변경에 쉽게 대응 할 수 있도록 하여, 

모듈의 응집력은 높이고 결합도를 낮추어

어플리케이션의 유연한 구성을 도와줍니다.


스프링 아키텍쳐를 그림을 살펴보겠습니다.

※ 출처 : http://doc.javanb.com/spring-framework-reference-2-1-0/index.html


스프링의 Core는 스프링 컨테이너로써 각종 빈의 컨테이너역할을 합니다.

기존의 POJO 개발방식을 가능하게하며, 각종 유틸리티들을 지원합니다.


DAO와 ORM은 익숙하시죠? 

스프링에서는 물론 i-batis와 같은 ORM을 더욱 쉽게 사용할 수 있도록 지원하고 있습니다.


AOP는 저도 완벽히 이해를 하고 있진 않지만, 설명드리자면

스프링의 Core를 활용하여 어플리케이션을 개발하는 두가지 관점입니다.

하나는 핵심 관심 사항과, 또하나는 공통 관심 사항인데 이 두가지를 분리하여 개발 할 수 있게끔 도와주는 역할을 합니다.


JEE와 WEB은 웹개발에 있어 필요한 기능들을 지원하는 부분으로

json, jsp, pdf, excel, pdf view등 일반적인 뷰 이외의 마임타입의 뷰를 구성하거나,

velocity와같은 라이브러리를 연동하여 동적인 뷰를 구성할 수 있게 도와줍니다.


그럼 설명은 이정도로 하고 스프링 환경 셋팅에 들어가 보도록 하겠습니다.

일단 사용할 프레임워크 라이브러리들을 받아야겠죠?

다음의 주소로 가서 다운로드 합니다. 현재 3.1버전이 릴리즈되어있습니다.


http://www.springsource.org/download


다운로드 하기위해 정보를 입력하고,

다운로드 페이지에서 최신 버전을 받으시면 됩니다.



다운로드가 완료되면

압축을 풀고 libs폴더로 이동하여

모든 jar파일을 복사하고

board 프로젝트의 WEB-INF > lib 폴더에 추가해줍니다. (복붙)

많은 파일들이 추가되면서 프로젝트가 한층 더 무거워졌습니다.

이중에서 쓰이지 않는 모듈도 분명 존재할 것인데요,,,

그 부분에 대해선 또다른 개발 배포도구인 maven같은 도구로 사용하지 않는 모듈에 대한 제어가 가능합니다만,,

지금은 일단 모두 추가하고 작업하도록 하겠습니다.




추가가 끝나셨으면 이제 web.xml 설정입니다.

기존에 Model2에서 진행했던 구성은 잊으시고, 

스프링 설정 파일 내용으로 새로 구성한다고 생각하시면 됩니다.

설정은 최대한 복잡하지 않도록 하나의 패키지안에 넣도록 하겠습니다.

WebContent > WEB-INF > web.xml

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <display-name>board</display-name>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

  <!-- 데이터베이스 설정파일 -->

  <context-param>

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

    <param-value>classpath:/spring/board/config/dataSource.xml</param-value>

  </context-param>

  <!-- jstl 지역화 설정 -->

<context-param>

<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>

<param-value>resources.application</param-value>

</context-param>

  <listener>

    <listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

  </listener>

  <!-- spring 설정파일 -->

  <servlet>

    <servlet-name>dispatcher</servlet-name>

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

    <init-param>

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

      <param-value>

classpath:/spring/board/config/dispatcher-servlet.xml

</param-value>

    </init-param>

  </servlet>


 <!--  Restful 서비스 -->

  <servlet-mapping>

    <servlet-name>dispatcher</servlet-name>

    <!-- <url-pattern>*.do</url-pattern> -->

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

  </servlet-mapping>

 <!-- 인코딩 설정 -->

  <filter>

    <filter-name>encodingFilter</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>EUC-KR</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encodingFilter</filter-name>

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

  </filter-mapping>

</web-app>

일단 추가해야되는 부분 중점으로 설명드리겠습니다.

다른부분에 관해선 사용시에 하나하나씩 진행하겠습니다.


우선

데이터베이스 설정파일 부분에

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

    <param-value>classpath:/spring/board/config/dataSource.xml</param-value>

이부분입니다.


데이터베이스 설정파일을 로드하는 부분이며

classpath를 적을 경우 src를 바라보며, 적지않을경우엔 WebContent경로를 바라봅니다.

저희는 스프링에서 i-batis를 사용 할 것이므로 src안에 설정대로 패키지와 파일을 만들어주시기바랍니다.

내용은 다음과 같습니다.

src > spring.db.config > dataSource.xml

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

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

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

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

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

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

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

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

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

    <!-- database 계정정보 및 드라이버정보 -->

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"

destroy-method="close" p:driverClass="core.log.jdbc.driver.OracleDriver"

p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:xe" p:user="board"

p:password="board" />

<!-- 트랜젝션 매니져 -->

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager"

p:dataSource-ref="dataSource" />

<!-- ibatis SqlmapConfig -->

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"

p:dataSource-ref="dataSource" p:configLocation="classpath:spring/board/config/sqlMapConfig.xml" />


</beans>  

이전에 만들었던 SqlMapConfig.properties 파일을 대신해 주는 역할을 합니다.

보실부분은 역시 

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"

p:dataSource-ref="dataSource" p:configLocation="classpath:spring/board/config/sqlMapConfig.xml" />

이부분에서 sqlMapConfig.xml 파일을 재정의 해주셔야합니다.

대부분의 설정이 스프링에의해 관리되므로 

내용은 더욱 간단해지며 다음의 내용을 넣으시면됩니다.

src > spring.db.config > sqlMapConfig.xml

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

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

<settings useStatementNamespaces="false" />

<sqlMap resource="com/board/db/sqlmaps/Board.xml" />

</sqlMapConfig> 

기존에 만들었던 Board.xml을 사용합니다.


그 다음은 다시 web.xml로 돌아와서 스프링 설정파일 부분의 

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

    <param-value>classpath:/spring/board/config/dispatcher-servlet.xml</param-value>

이 부분입니다.

스프링 설정의 핵심을 담고있는 파일이라고 보시면됩니다.

다음과같은 내용으로 구성되어있습니다.

src > spring.board.config > dispatcher-servlet.xml

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

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

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

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

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

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

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

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

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

       

<!-- resources -->

<mvc:resources mapping="/resources/**" location="/resources/"/> 


<context:component-scan base-package="*" />

<context:annotation-config/>


<!-- 파일 업로드를 위한 멀티파트 리졸버 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>10000000</value> </property> </bean>


<!-- 파일 다운로드를 위한 빈네임 뷰 리졸버 -->

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

</bean>

<!-- view resolver -->

<bean id="viewResolver"

class="org.springframework.web.servlet.view.UrlBasedViewResolver">

<property name="viewClass"

value="org.springframework.web.servlet.view.tiles2.TilesView" />

</bean>

 

<!-- tiles Service-->

<bean id="tilesConfigurer"

class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">

<property name="definitions">

<list>

<value>classpath:/spring/board/view/template-*.xml</value>

</list>

</property>

<property name="preparerFactoryClass"

value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />

</bean>

<bean

class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

<property name="mediaTypes">

<map>

<entry key="do" value="text/html" />

<entry key="json" value="application/json" />

<entry key="jpeg" value="image/jpeg" />

<entry key="png" value="image/png" />

<entry key="gif" value="image/gif" />

<entry key="xml" value="application/xml" />

<entry key="rss" value="application/rss+xml" />

</map>

</property>

<property name="defaultViews">

<list>

<!-- JSON View -->

<bean

class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">

<property name="prefixJson" value="false" />

</bean>

</list>

</property>

<property name="ignoreAcceptHeader" value="true" />

</bean>


<bean

class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="alwaysUseFullPath" value="true" />

</bean>

<bean

class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

<property name="alwaysUseFullPath" value="true" />

<property name="cacheSeconds" value="0" />

</bean>


<bean id="messageSource"

class="org.springframework.context.support.ResourceBundleMessageSource">

<property name="basenames">

<list>

<value>messages.validation</value>

</list>

</property>

</bean>

</beans>

스프링에서는 개발자마다, 개발규모마다 많은 사용 방법이 있지만, 

제가 사용하는 설정 기준으로 진행 하도록 하겠습니다.

일단 나중에 설명드리겠지만 URL부분에서는 깔끔한 URL을 사용하여 요청하는 Restful 서비스를 사용하며,

어노테이션 기반의 빈등록으로 mapping정보를 담고있는 xml파일을 구성하지 않습니다.

또한 json이나 xml형식의 요청을 위해 ContentNegotiatingViewResolver, MappingJacksonJsonView 등을 사용합니다.

이정도로 설명은 생략하고, 필요한 부분의 구현이 있을때 설명 드리도록 하겠습니다.

지금 보셔야할 부분은 뷰를 구성할때 사용하는 설정파일을 로드하는 부분입니다.

<value>classpath:/spring/board/view/template-*.xml</value>

패키지를 생성하고 다음의 내용으로 채워주시기바랍니다.


src > spring.db.view > template-board.xml

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

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">


<tiles-definitions>

<definition name="list" template="/WEB-INF/board/list.jsp" />

</tiles-definitions>

눈치 채신 분도 있겟지만 Spring에서는 보안상의 이유로 

WEB-INF 안에 jsp페이지들을 구성하여 보관합니다.

다음 포스팅때 페이지들을 이동시키도록 하겠습니다.





여기서 잠깐!!

스프링에서 제공하는 jar파일들만가지고 구성하면 에러가 발생합니다.

여타 라이브러리들도 추가해주셔야하는데요, 대표적인 3가지 jar파일들입니다. 받아서 lib폴더에 넣어주세요.

각각의 사용방법은 나중에 알려드리겠습니다.


그리고!!!

스프링 2.5.6이상의 버전은

ibatis2.3 이상의 버전이 필요합니다.

기존에 lib폴더에서 ibatis 2 버전 관련 jar파일을 모두 삭제하시고

다음 파일을 lib 폴더에 넣으시기바랍니다.




이상으로 현재까지의 소스의 변동없는 선에서 구성을 하였는데요,

내용이 많은관계로 다음시간에 이어서 

필요없는 소스들의 삭제와,

나머지 설정들을 하도록 하겠습니다.


내용이 많이 복잡하고 어려울 수 있습니다.

적응하시려면 별도의 공부가 반드시 필요합니다.

꼭! 책한권 사서 보시는걸 추천드립니다.

추천할만한 책으로는 

 - 웹개발자를 위한 Spring 3.0 프로그래밍 , 최범균 저

 - 토비의 스프링 3.0 (워낙 유명한책)

등이 있습니다.


정상적으로 설정이 끝나고, 웹서버를 재시작하면 웹서버에 에러없이 index.jsp화면을 보실 수 있을겁니다.

location.href="list.do" 구문은 삭제해 주시기바랍니다.



수고하셨습니다!! 

 

다음글 스프링 설정2 >> http://cusmaker.tistory.com/132