ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) 개발 - (7) Spring MVC 구조 및 설정파일
    Spring 2014.07.23 22:20

    상당히 오랜만에 글을 씁니다. 


    그동안 개인적으로 워낙 많은 일들이 있었고, 잠시 쉬는시간도 없어서 글을 아예 쓰지 못했네요. 


    그동안 제 글을 읽어주시고, 기다려주신 모든분들께 감사하다는 말씀을 드립니다.


    이번 글에서는 본격적인 스프링 MVC 구조 개발을 시작하도록 하겠습니다. 


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


    웹개발을 하다보면 MVC 패턴이란 말을 듣게 된다. 

    MVC란 Model-View-Controller의 약자로, 사용자 인터페이스와 비지니스 로직을 분리하여 웹 개발을 하는것을 가장 큰 장점으로 한다. 

    MVC 패턴도 MVC 모델 1과 MVC 모델 2로 나뉘어져 있는데, 요즘에는 MVC라고 하면 당연히 MVC 모델 2를 의미한다. 따라서 여기서는 MVC 모델 2 (이하 MVC)를 기준으로 진행한다.


    Model : 모델은 애플리케이션의 정보, 즉 데이터를 나타낸다.

    View : 뷰는 사용자에게 보여주는 인터페이스, 즉 화면을 이야기한다. 자바 웹 애플리케이션에서는 JSP를             의미한다.

    Controller : 컨트롤러는 비지니스 로직과 모델의 상호동작의 조정 역할을 한다. MVC2에서는 서블릿이 흐름을 제어하는 컨트롤러 역할을 수행한다. 


    사진 출처 : http://blog.daum.net/gunsu0j/165


    MVC 패턴에 대해서 장황하게 설명해도 쉽게 이해하기 어려운 관계로, 간단히 개념만 이야기하고 넘어간다. 실제 소스코드를 통해서 MVC 패턴에 대한 경험을 하는것이 훨씬 이해하는데 도움이 된다. 

    앞으로 하나씩 추가를 해나가면서 실제로 이러한 MVC 패턴이 어떻게 적용되는지를 보도록 하자.


    1. Spring 라이브러리 추가

    이전 글 (http://addio3305.tistory.com/36) 에서 pom.xml에 대해서 간단히 설명한 적이 있었다. pom.xml는 간단히 말해서 프로젝트에서 필요한 모든 라이브러리들을 관리할 수 있도록 구성되어 있다. 예전에는 어떠한 라이브러리를 사용하려고 하면, 라이브러리를 다운받아서 특정 폴더에 복사하여 사용했었다. 라이브러리가 파일 하나로 구성되어 있는 경우라면 몰라도, 하나의 라이브러리에 다양한 파일로 구성되어 있다. 스프링도 마찬가지로, 스프링 프레임워크에는 상당히 많은 파일이 존재한다. 


    다음은 GitHub에 올라와 있는 최신 스프링프레임워크 소스이다. 밑에서 보는것과 같이 수없이 많은 패키지가 존재함을 볼 수 있다.




    메이븐에서는 <dependency></dependency>라는 태그를 통해서 각 라이브러리를 추가할 수 있다.

    여기서 추가해야할 라이브러리가 굉장히 많은 관계로 각 라이브러리에 대한 자세한 설명은 생략하고 바로 pom.xml만 먼저 확인하고, 복사해서 붙여넣는것을 권장한다. 소스를 열어보면 여태까지와는 다르게 상당히 길기 때문에, 먼저 마음의 준비를 해야한다.


    pom.xml 소스보기


    pom.xml을 열어보았다면 상당히 긴 것에 놀랐을 것이라고 생각한다.



    사실 지금 여기에 있는 것들이 지금 당장 필요한 라이브러리들은 아니다. 그렇지만 앞으로 프로젝트를 하는데 있어서 필요한 대부분의 라이브러리들을 미리 추가해놓았다. (실제로 필자가 진행하는 프로젝트에서도 이정도는 기본으로 들어간다. 여기서 각 프로젝트의 특성에 맞는 라이브러리들이 추가된다.)

    원래는 각 기능을 하나씩 만들면서, pom.xml에도 필요한 라이브러리들을 추가해야 하지만, 그 일은 앞으로 설명해나가려고 한다.(정말로??????)

    일단 pom.xml을 간단히 설명하려 한다.


    첫번째로 <properties></properties> 태그는 변수의 개념으로 생각하면 된다. 우리가 프로그래밍을 하면서 어떠한 값은 상수 (java에서 final static 으로 선언)로 선언하는 경우가 많은데, 이는 그 변수는 여기저기서 많이 사용되는 변수이기 때문이다. 이러한 변수를 직접 소스 여기저기에 일반적인 값으로 써놓으면, 그 값을 변경해야 할 경우, 모든 소스에서 일일이 변경해야하는 경우가 발생한다. 이럴때, 상수로 선언해놓고, 그 하나만 변경하면 쉽게 값을 변경하면서도 다른 소스는 수정할 필요가 없다. 


    여기서도 마찬가지로 많이 사용되는 값은 변수로 지정하여, 추후 수정이 용이하도록 되어있다. 

    잠시 살펴보면 <org.springframework-version>3.2.4.RELEASE</org.springframework-version> 라는것을 볼 수 있는데, 이 글을 시작할때 Spring 3.2.4 버전을 사용하기 때문에, 이 값을 이렇게 선언하였다. 만약 스프링 버전을 변경하고 싶으면 이 변수만 바꿔주면 된다. (참고로 이 글을 작성중인 현재, 스프링의 최신 버전은 4.1.4 버전이다. 4.2.0은 아직 정식버전이 아니어서 이야기 하지 않는다.) 


    다음은 <repositories></repositories> 태그다. 

    이는 실제 라이브러리를 다운받을 저장소를 의미한다. 보통은 따로 설정할 필요가 없다. 하지만 프로젝트를 진행하다보면 인터넷에 연결할 수 없는 프로젝트도 상당히 많은데, 이럴때 내부 저장소를 만들어놓고, 개발자들은 내부저장소에서 라이브러리를 다운받도록 되어있다. 

    여기서는 인터넷에서 라이브러리를 받으면서, 추가로 전자정부 프레임워크의 기능 중 하나를 사용하기 위해서 전자정부 프레임워크 저장소도 같이 추가했다.


    그 다음으로 <dependencies><dependencies> 태그는 실제 라이브러리를 지정한다. 

    라이브러리는 다음과 같은 형태로 구성된다. 

     
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-web</artifactId>
    	<version>${org.springframework-version}</version>
    </dependency>
    

    여기서 <version>태그 안에 아까 우리가 위에서 지정한 프로퍼티를 사용한 것을 볼 수 있다. 라이브러리를 추가하는것은 별도 포스팅을 통해서 좀 더 자세히 설명할 예정이다.


    여기서는 pom.xml에 대해서 간단히 설명했는데, 좀 더 자세히 알고싶은 사람들은 인터넷에서 메이븐에 관련된 글을 읽어보는것을 추천한다.


    2. 설정파일 변경 (web.xml, action-servlet.xml 등등)

    이제 하나씩 설정을 하도록 하자.

    첫번째로 web.xml 파일을 열어보자.

    기존에 web.xml 파일에 대해서 간단히 설명하고, 수정했었다. (http://addio3305.tistory.com/39)

    여기서 몇가지 설정을 덧붙이려고 한다.


    1. UTF-8 설정

    다음을 web.xml에 추가한다.

    <filter>
    	<filter-name>encodingFilter</filter-name>
    <filter-class>
    		org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
    	<param-name>encoding</param-name>
    	<param-value>utf-8</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    	<filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>
    


    요즘에는 기본적으로 UTF-8로 인코딩한다. 뭐 한글을 아예 안쓸거면 안해줘도 상관없지만... 아마 그럴 사람은 없는걸로 생각한다.


    2. 그 외 설정파일 경로 설정

    기존 설정파일을 보면 <servlet>설정중에 <param-value>라는것이 있었다. 

    기존에는 servlet 설정파일이 action-servlet.xml 하나만 있었는데, 이제 또 추가되기 때문에, 확장성을 생각하여 특정 폴더에 있는 설정파일을 모두 읽어오는 방식으로 변경한다.

    <param-value> 태그를 다음과 같이 수정한다.


    <param-value>/WEB-INF/config/*-servlet.xml</param-value>


    이는 /WEB-INF/config/ 폴더안에 있는 -servlet.xml로 끝나는 모든 파일을 읽어오는것을 의미한다. 따라서 앞으로 설정파일을 추가할때는 XXXXXX-servlet.xml로 만들게 되면, 자동적으로 설정파일을 읽어들인다. 


    다음으로는 Spring 설정파일을 추가한다. 기존에 <context-param> 태그의 <param-value>태그안에는 아마 아무것도 작성되지 않았을 것이다. 이제 본격적인 스프링 설정파일을 읽어오기 위해서 다음과 같이 바꾼다.


    <param-value>classpath*:config/spring/context-*.xml</param-value>


    이는 앞에서 설명한것과 비슷하게 context-로 시작하는 모든 .xml 을 읽어오는것을 뜻한다. 

    여기서 지금 이렇게 추가하면 context-XXXXXX.xml 파일이 없기 때문에 에러가 날 것이다. 일단 작성만 해 놓고 주석처리하도록 한다. 

    여기까지 작성해서 완성된 web.xml은 다음과 같다.


    web.xml 보기



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


    오랜만에 작성한 이번글은 좀 짧습니다. 시간적인 여유도 부족하고, 이번글부터 한동안은 설정에 관련된 부분이라서 복잡하기도 하기 때문에 좀 짧게 작성하였습니다.

    앞으로 몇페이지에 걸쳐서 지루한 스프링 설정에 대해서 이야기를 하게 됩니다. 아마 처음에는 굉장히 보기 힘들고, 어려운 내용이 될것이라고 생각합니다. 많이 지루하기도 할거구요. 당장 눈으로 결과를 보기도 쉽지 않습니다. 

    그렇지만 제가 이런식으로 글을 써가는 것은, 인터넷에서 그냥 흔히 볼수있는 글이 아닌, 실제 프로젝트를 진행한 경험을 바탕으로 "실제 프로젝트에서는 이런식으로도 하는구나" 라는걸 보여주기 위함입니다. 물론 모든 프로젝트가 이렇게 진행되지 않고, 또 제가 작성하는 것보다 훨씬 높은 수준의 스프링 아키텍쳐가 잡혀있는 경우도 많이 있습니다. 그런 경험을 하신 분들이 보기에는 부족함이 많겠지만, 일단 제가 아는 한도내에서 최대한 편하게 개발을 하고, 이론적으로만 보고 배운 내용을 직접 실습해보는 기회가 되었으면 하는 바람입니다. 


    앞으로는 좀 더 자주 글을 쓰도록 하겠습니다~


    댓글 62

    • 이전 댓글 더보기
    • slaior 2016.08.20 19:17

      최근에 오라클10g용 repository로 등록했던
      <repository>
      <id>oracle</id>
      <name>ORACLE JDBC Repository</name>
      <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
      </repository>
      이 주소가 폐쇄되었네요. 프로젝트를 따라하시는 분들은
      <repository>
      <id>oracle</id>
      <name>ORACLE JDBC Repository</name>
      <url>http://maven.jahia.org/maven2</url>
      </repository>
      이 repository로 변경하면 됩니다.

    • ragoha92 2016.08.25 09:47

      oracle 11g 사용하시는 분들은
      <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.1.0.7.0</version>
      </dependency>
      를 하시고 위에는
      <repositories>
      <repository>
      <id>oracle</id>
      <name>ORACLE JDBC Repository</name>
      <url>http://maven.jahia.org/maven2</url>
      </repository>
      </repositories>
      를 사용하시면 됩니다.
      oracle 10g이하는 ojdbc14를 사용하고 11g이후에는 ojdbc6이라네요

      • WPJW 2016.09.03 09:48

        오라클관련 dependency 에 오류 떠서 보고 따라하니 해결됬네요 감사드립니다.
        초보라 잘모르는데 이런 dependency 최신 라이브러리 관련 설정은 어디서 볼수있는건가요?

      • 우와짱!! 2016.09.11 21:45

        오라클 때문에 계속 에러나서 헤매고 있었는데 어떻게 찾으셨지 ? 대단하십니다

      • 사이다 2017.01.22 13:45

        감사합니다 도움이 됐습니다

    • 감사합니다 2016.09.11 22:07

      개발은 하고 있지만 세팅에 너무 약해서 너무너무 많은 도움이 되고 있습니다.
      감사합니다 (* _ _ 꾸뻑

    • 쌩초보 2016.10.04 15:03

      pom.xml을 바꾸고 나서 서버를실행하면
      심각: Failed to detect ServletContainerInitializers for context with name [/first]
      java.io.IOException: java.lang.ClassNotFoundException: org.springframework.web.SpringServletContainerInitializer
      으로시작되는 에러가 발생이되는데..어디가문제인건가요..? 구글에도 나오는게없어서 대처를못하겠네요

    • yoon 2016.10.21 19:05

      이 방법대로 maven설정을 하면 마켓에서 에러가 뜹니다...

    • Favicon of https://bizdevelop.tistory.com BlogIcon 개기획자 2016.11.09 10:58 신고

      http://bizdevelop.tistory.com/12

      오라클 오류 나시는 분들 해결했습니다.

    • 뒹구르르 2017.01.23 15:13

      잘 봤습니다^^

    • ThankU 2017.02.01 22:37

      친절하고 디테일한 포스팅 감사드립니다. 복받으실거에요

    • KKH 2017.02.06 11:08

      pom.xml에서 저장하니까 빌드할때 무한 로딩이 걸리는데 왜그런걸까요;;(mysql-connector-java-5.1.31.jar부분에서 96%에서 무한 로딩이 걸리는데 ..

    • KKH 2017.02.06 11:29

      프로젝트 강제 종료후에 다시 들어와보니 정상적으로 다운로드는 끝까지 되네요..
      사용하지 않는 pom.xml DB쪽은 주석으로 막아두니 괜찮은것같네요 ...
      oracle 11g사용하는데 다른부분 막았다고 문제화 되지 않겠죠 ...?

    • 새벽두시 2017.03.20 21:46

      오라클 maven 주소가 또 안되네요 ㅠ_ㅜ

    • 댈댈하하 2017.03.21 16:34

      혹시나 servlet에서 맵핑 오류나시는 분들... action-servlet에 <mvc:default-servlet-handler /> 또는 <default-servlet-handler /> 이거 넣어주시면 될겁니다.. 전 이걸로 몇시간을 삽질했네요..

    • 2017.06.18 03:31

      처음 독학하는 사람입니다 오라클 부분에서 왜 자꾸 x표시가 뜰까요 ... ojdbc파일 은 어디서 받나요?.. 해결방법좀ㅠㅠ

      • 11 2017.07.06 14:14

        개인실습차원이라면
        오라클은 라이센스 문제로 maven에서 제공하지 않으므로 ojdbc6.jar파일을 별도로 다운 받은 다음 jar추가해서 진행하심되요...

        혹시 회사프로젝트에서 하게 될 경우 다른 방법을 찾으셔야하구요..

    • 개발3일차 2017.08.09 16:06

      pom.xml을 변경하니 오류가 엄청나게 많아 고민하고 삽질을 했었습니다. 다른 분들도 이럴거 같아
      개발 초보지만 제가 해결한 방법 하나 올려봅니다. 위의 내용을 복사 후 maven 안에 Repository 폴더 안에 있는 내용을 이클립스 종료 후 완전히 삭제하시고 이클립스 재실행 하셔서 해당 PROJECT 선택후 오른쪽 버튼에서 maven -> updateproject 를 해보세요!! 지웠다 깔았다 한 8번 반복해서 해결되지 않았던 문제가 저는 한방에 해결됐네요!! 모두들 열심히 따라해보아요!!

    • 원석크루 2018.10.07 04:53

      http://www.gm0604.kr/wordpress/?p=142
      자바클래스파일 버전과 스프링프레임워크 버전이 맞아야(?) 정상적으로 잘 작동하네요 블로그 참조해서 해결했습니다..ㅎ
      아그리고 관리자의 권한으로 이클립스 실행해주시고요 ㅎ

    • test 2018.11.23 13:46

      안되는거 너무 많음...요즘 버전과 많이 틀려서 헷깔리네요...보다가 포기

    • tod 2019.01.01 23:35

      개발3일차님 댓글 참조하여 1번 반복으로 한방에 pom.xml 오류 해결했네요~~~ 정말 설정은 해도해도 잊어먹고... 글쓴이님 스프링 설정 포스팅은 5년째 참고 하는것 같네요. ^^ 포스팅 올리신거 지우지 않으셨으면 좋겠습니다.

    • 초보개발자 2019.02.04 20:37

      설정한 대로 했는데, HTTP Status 404 – Not Found 이 부분이 왜나올까요...ㅠㅠ

    • 이썬 2019.03.21 16:55

      진짜 천재같아.. ㄳ합니당..

    • 조용현 2019.04.30 13:39

      와 암걸렷.. 아는게 없으니 설명보고도 힘드네요
      https://jujupapa.tistory.com/22
      이걸로 해결...이... 안되네요
      ojdbc6 받아서 jdk에 넣어버렸습니다...
      (이걸로 2일을 버렸으니.. 다신 pom으로 안받아야겠다..)

Designed by Tistory.