본문 바로가기
웹개발/스프링

스프링 4 MVC - part 2

by 인생여희 2020. 11. 11.

 

환경구축

- 이클립스 파일 -> NEW-> Other -> Maven -> MavenProject 선택

- create a simple project 체크

- Packaging 은 war 지정

- pom.xml 설정

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>sample.customer</groupId>
  <artifactId>web</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-RELEASE</version>

  <name>Spring MVC Sample</name>
  <properties>
    <org.springframework-version>4.2.6.RELEASE</org.springframework-version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.2.2.Final</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jcl</artifactId>
      <version>1.6.4</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.16</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils</artifactId>
      <version>1.9.2</version>
    </dependency>
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>mvc</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

 

 

비즈니스 로직의 Bean 정의

beans-biz.xml

<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
	    http://www.springframework.org/schema/beans
	    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

<!-- 1번 애플리케이션에서 사용할 서비스 클래스를 자동으로 DI 컨테이너에 등록하는 설정 -->
  <context:component-scan base-package="sample.customer.biz.service"/>







<!-- 2번 메시지 관리 설정
이 설정으로 DI컨테이너는 지정된 메시지 리소스 파일을 바탕으로 ReloadableResourceBundleMessageSource오브젝트를 작성해 준다.
ReloadableResourceBundleMessageSource 클래스는 
MessageSource 인터페이스의 구현 클래스를 메시지 리소스 파일의 정기적인 리로드 메시지 캐시 등을 지원하는 클래스이다. -->
  <bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:/META-INF/messages"/>
  </bean>



<!-- 3번 Bean 검증 설정이다. 
이설정 때문에 검증 처리를 실행하는 Validator 오브젝트가 DI 컨테이너에 등록된다. 
스프링 mvc가 백그라운드에서 검증처리를 자동으로 실행하므로 validator 오브젝트를 의식할 필요는 없다.
그리고 검증처리에서 오류가 발생했을 때, 오류 메시지를 관리하는 독자적은 구조를 만들 수 있다.
스프링에서는 MessageSource 오브젝트와 연계시킬 수 있다. -->

  <bean id="globalValidator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
  </bean>
  
  
  
</beans>

 

1번은 애플리케이션에서 사용할 서비스 클래스를 자동으로 DI 컨테이너에 등록하는 설정이다. 

 

2번은 메시지 관리 설정이다. 여기서 지정한 ReloadableResourceBundleMessageSource 클래스는 MassageSource 인터페이스의 구현 클래스를 메시지 리소스 파일의 형식으로 메시지를 기술한 프로퍼티 파일의 정기적인 리로드 메시지 캐시를 지원하는 클래스이다. 이 설정으로 DI컨테이너는 지정된 메시지 리소스 파일을 바탕으로 ReloadableResourceBundleMessageSource 오브젝트를 작성해 준다. Bean의 속성으로 basename 의 value는 메시지의 경로를 작성해준다. 

 

3번은 Bean 검증 설정이다. 이설정 때문에 검증 처리를 실행하는 Validator 오브젝트가 DI 컨테이너에 등록된다. 스프링 mvc가 백그라운드에서 검증처리를 자동으로 실행하므로 validator 오브젝트를 의식할 필요는 없다. 그리고 검증처리에서 오류가 발생했을 때, 오류 메시지를 관리하는 독자적은 구조를 만들 수 있다. 스프링에서는 MessageSource 오브젝트와 연계시킬 수 있다. 이것으로 Bean 검증에서 사용할 메시지도 스프링의 MessageSource 오브젝트로 한꺼번에 관리할 수 있다. 여기서 주의할 점은 3번의 bean id 를 globalValidator 으로 지정한 점이다. 이것은 나중에 스프링 MVC를 설정할 때 사용된다.

 

스프링 MVC 설정

다음은 스프링 MVC의 Bean 정의 파일을 만들어 보자. 다음은 스프링 MVC를 설정한 Bean 정의 파일이다. 

beans-services.xml

<?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:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	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.xsd
		http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">


<!--  애플리케이션이 사용하는 컨트롤러 클래스를 자동으로 DI 컨테이너에 등록하기 -->
  <context:component-scan base-package="sample.customer.web.controller"/>
  <context:component-scan base-package="sample.user.web.controller"/>

<!-- 스프링 MVC 어노테이션 이용 설정 -->
  <mvc:annotation-driven
    validator="globalValidator" enable-matrix-variables="true"/>

  <!-- Static Resource 설정 -->
  <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

  <!-- 뷰리졸버 설정 -->
  <mvc:view-resolvers>
    <mvc:jsp prefix="/WEB-INF/views/" suffix=".jsp"/>
  </mvc:view-resolvers>

</beans>

 

앞의 내용과 달라진 점이 아래와같은 스프링 MVC 커스텀 스키마를 도입한 점이다

xmlns:mvc="http://www.springframework.org/schema/mvc" 
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd” 

 

컨테이너 등록과 어노테이션 설정

우선 context:component-scan 으로 어플리케이션에서 사용하는 컨트롤러 클래스를 자동으로 DI 컨테이너에 등록하는 설정을 해준다. 어노테이션을 기반으로 하는 스프링 MVC에서는 컨트롤러 클래스에 @Controller 어노테이션을 설정하는 것이 규칙이고, 컨트롤러 어노테이션이 설정된 클래스는 context:component-scan 으로 읽어 올 수 있다. 

 

또 뒤에 나올 다양한 스프링 MVC 어노테이션을 사용하기 위한 설정이 mvc:annotation-driven 이다. 스프링 MVC에서 Bean을 검증을 사용하려면 앞에서 나온 Validation 오브젝트의 id를 validator 속성에 설정할 필요가 있으므로 이점도 주의해야 한다.

 

정적 리소스 파일 설정

mvc:resources 태그는 DispatcherServlet을 경유해 정적 리소스 파일(html, 이미지)에 액세스하기 위한 설정이다. 컨트롤러에 액세스 할 때는 URL 확장자에 do를 붙여준다. 그 밖의 URL로 액세스 할 때는 정적 리소스 파일에 액세스 한다는 식으로 규칙을 설정해 주면 문제 없다. 하지만 스프링 MVC는 컨트롤러를 실행할 URL을 자유롭게 설정할 수 있다는 장점이 있으므로 일반적으로는 스프링 MVC의 DispatcherServlet을 컨텍스트 루트 자체에 설정하는 일이 많다. 이렇게 하면 정적 리소스 파일에 직접 액세스 할 수가 없다. 그럴때에도 mvc:resources 태그를 설정하면 DispatcherServlet을 거쳐 정적 리소스 파일에 액세스 할 수있다. 구체적으로는 mapping 속성으로 URL경로를 설정하고 location 속성으로 웹 애플리케이션의 물리적인 경로를 설정한다. 덧붙여 위에는 정적 리소스 파일을 /WEB-INF/resources/ 디렉터리 아래에 둔 적적 파일에 URL 컨텍스트 경로/resources를 매핑 시켰는데, 정적 리소스 파일은 클래스 경로에 배치할 수도 있다. 그럴 때는 아래 처럼 classpath: 접두사를 붙여서 경로를 설정할 수도 있다.

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

DispatcherServlet을 거쳐 엑세스한 리소스 파일은 캐시를 유효하게 사용할 수도 있다. 아래처럼 cache-period 속성에 캐시 시간을 초 단위로 설정한다. (1시간 3600초).

<mvc:resources mapping="/resources/**" location="classpath:/resources/" cache-period="3600" />

 

뷰 리졸버

위의 설정으로 jsp용 InternalResourceViewResolver가 뷰 리졸버로 등록된다. 이 클래스는 접두사와 접미사로 뷰 오브젝트를 생성하는 UrlBasedViewResolver의 서브 클래스이다. DI 컨테이너에 뷰 리졸버 오브젝트를 등록할 수 있지만, 웹애플리케이션 안에서 뷰 리졸버 오브젝트를 사용하는것은 DispatcherServlet 이다. DispatcherServlet에 뷰리졸버를 인젝션 하려면 어떻게 해야 할까?

사실 DispatcherServlet은 웹 어플리케이션 시작시 뷰 리졸버를 인젝션할 필요가 없다. 또한, DispatcherServlet이 뷰 리졸버 오브젝트를 찾을 때 ,뷰 리졸버 인터페이스와 일치하는 오브젝트를 찾아 주므로 Bean정의에서 id를 지정할 필요도 없다.

 

파일경로

'웹개발 > 스프링' 카테고리의 다른 글

스프링 4 MyBatis 연동  (0) 2020.11.12
스프링 4 MVC - part 3  (0) 2020.11.11
스프링 4 MVC - part 1  (0) 2020.11.10
스프링 4 비즈니스 로직 설계와 트랜잭션  (0) 2020.11.09
스프링 4 DAO 구현  (1) 2020.11.08