[Spring] 스프링 xml 설정파일

스프링에서는 제어 반전으로 설정파일을 통해 객체를 정의하고 사용할 수 있다.
기본적인 스프링 설정 파일의 종류와 역할에 대해 알아보자.
 
프로젝트에서 확장자가 .xml로 끝나는 파일이 바로 설정파일이다.
Spring MVC 프로젝트의 설정파일은 다음과 같다.

📁 pom.xml
📁 web.xml
📁 servlet-context.xml
📁 root-context.xml

📁 pom.xml

  • Project Object Model

프로젝트 버전 관리, 빌드에 필요한 환경 설정, 라이브러리 의존성을 관리하는 메이븐 설정파일
 

<?xml version="1.0" encoding="UTF-8"?>
<project>
	<modelVersion>4.0.0</modelVersion>
	...
	<version>1.0.0-BUILD-SNAPSHOT</version>
    <dependencies>
		<dependency>...</dependency>
	</dependencies>
    <build>
        <plugins>
            <plugin>...</plugin>
        </plugins>
    </build>
</project>

<project>

프로젝트의 정보를 기술하는 태그
모든 설정은 이 태그 내에 작성해야 한다.

<project>
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.spring</groupId>
	<artifactId>muknolja</artifactId>
	<name>MukNolJa</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
    ...
</project>
  • <modelVersion>

pom.xml 파일의 버전

  • <groupId>

프로젝트의 3단계의 패키지 중 마지막을 제외한 패키지 정보

  • <artifactedId>

버전이 없는 jar파일의 이름. 마지막 패키지명을 작성해야 한다.

<dependencies>

프로젝트와 의존관계에 있는 라이브러리를 모아 관리하는 태그
 
프로젝트에서 사용하고 싶은 라이브러리의 정보를 <dependency>에 담아 의존성을 주입한다.
메이븐은 명시된 dependency가 현재 프로젝트 라이브러리에 존재하는지 확인하고, 없을 경우 mvn repository에서 다운받아 추가해준다.

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.6.1</version>
</dependency>

라이브러리 정보는 mvn-repository🔗에서 찾을 수 있다.

📁 web.xml

배포 서술자
웹 애플리케이션의 기본적인 설정 파일
  • WAS가 최초 구동될 때 읽어들여, 이에 해당하는 웹 애플리케이션을 설정한다.
  • 스프링에서 제공하는 설정 파일을 어디서 가져올 것인지 설정해주는 설정 파일의 설정 파일이다.
  • MVC 패턴에서 컨트롤러에 관련된 부분이다.

 

<?xml version="1.0" encoding="UTF-8"?>
<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 https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<context-param>...</context-param>
	
	<listener>...</listener>

	<servlet>...</servlet>		
	<servlet-mapping>...</servlet-mapping>

	<filter>...</filter>
	<filter-mapping>...</filter-mapping>
	
	<error-page>...</error-page>
</web-app>

<web-app>

web.xml 파일의 루트 엘리먼트
모든 웹 애플리케이션 설정은 해당 태그 내에 위치해야 한다.

<context-param>

root-context에 관한 설정을 하는 태그
STS 기본 설정파일 외에 사용자가 직접 컨트롤하는 xml 설정파일을 지정해줄 수 있다.

🤔 contextConfigLocation

설정파일의 위치를 알려주는 파라미터 contextConfigLocation에 대해 설정해주어야 한다.
개발자가 처음에 지정해주지 않을 경우, web.xml이 임의로 root-context.xml로 위치를 지정한다.
<init-param>과 달리 웹 애플리케이션의 모든 서블릿이 사용할 수 있는 전역변수이다.
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:root-context.xml</param-value>
</context-param>
  • <param-name>

파라미터 이름을 지정해줄 수 있다. 

  • <param-value>

파라미터 값. 직접 경로를 지정해줘도 되지만 classpath를 사용해도 된다.
src/main/resources를 의미한다.

<listener>

웹 애플리케이션이 시작하고 종료되는 시점에 실행할 메서드의 클래스를 지정하는 태그

🤔 ContextLoaderListener

스프링 설정파일을 읽어들이기 위한 ContextLoaderListener를 지정해주어야 한다.
앞서 <context-param>에서 설정파일의 경로를 명시해주었기 때문에, 리스너는 이 경로를 따라 설정파일을 읽어들일 수 있다.
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>

웹 애플리케이션의 요청을 처리하는 servlet-context와 관련된 설정을 하는 태그
<servlet><servlet-mapping>을 함께 사용해 서블릿과 url 패턴을 매핑하는 구조이다.
요청이 들어올 때 요청을 우선적으로 가로챌 Dispatcher Servlet을 지정한다.

🤔 Dispatcher Servlet

스프링에서는 Front-Controller 패턴에 따라 어떤 요청이 들어오든 일단 디스패처 서블릿이 받는다.
과거에는 모든 서블릿을 하나하나 web.xml에 등록해주어야 했으나 디스패처 서블릿이 모든 요청을 받으면서 간편해졌다.
디스패처 서블릿은 모든 요청을 핸들링하고 공통으로 필요한 작업을 처리한다.
그 후 핸들러 매핑에서 요청을 처리할 컨트롤러를 찾고 처리를 위임한다.
<servlet>
    <servlet-name>appServlet</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>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • <servlet-name>

서블릿에 붙일 이름을 지정할 수 있다.
<servlet><servlet-mapping><servlet-name>이 동일할 경우 서블릿과 url 패턴이 매핑된다.

  • <init-param>

<context-param>과 유사하나 모든 서블릿이 공용하는 전역변수가 아니라 서블릿 내에서 지역변수처럼 사용된다.
contextConfigLocation의 값으로 서블릿 설정파일의 경로를 입력한다.

  • <url-pattern>

지정한 서블릿으로 처리할 요청의 패턴을 정의한다.
*.do로 지정한다면 .do로 끝나는 모든 요청이 이 서블릿으로 처리된다.

<filter>

Dispatcher Servlet이 요청을 받기 전 거치는 부분이다.
요청을 받기 전 데이터에 Spring Security를 적용하거나 인코딩할 때 사용된다.
<servlet>과 마찬가지로 필터와 url 패턴을 매핑해서 특정 요청이 들어왔을 때 우선 필터를 거치도록 해야한다.

<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>/*</url-pattern>
</filter-mapping>

<error-page>

에러가 발생했을 때 적절한 페이지를 띄우도록 설정하는 태그
400, 500 등 에러 코드나 Exception 클래스를 페이지에 매핑할 수 있다.

<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/WEB-INF/views/error/error.jsp</location>
</error-page>

📁 servlet-context.xml

web.xml에서 작성한 Dispatcher Servlet의 설정을 기록하는 파일

  • 각각의 서블릿에서 사용되는 개별적인 bean들이 모인 공간
  • 요청과 관련된 객체 - 컨트롤러, 어노테이션, view resolver 에 관한 설정을 한다.
  • MVC 패턴에서 와 관련된 프론트엔드 설정파일
<?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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<annotation-driven />

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

	<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>
	
	<context:component-scan base-package="com.spring.muknolja" />
	
</beans:beans>

<annotation-driven>

스프링 MVC에서 어노테이션 사용을 가능하게 한다.
스캔한 페이지 내부 클래스 중 @Controller 어노테이션을 가진 클래스들을 컨트롤러로 로드하도록 한다.

<annotation-driven />

<resources>

이미지, 스타일시트, js파일 등 정적인 리소스들의 정보를 기술한다.

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

<beans:bean>

서블릿 컨텍스트에서 사용하는 bean을 생성하는 태그

🤔 ViewResolver

컨트롤러에서 요청을 처리한 결과를 클라이언트에게 렌더링해서 보여주는 객체
컨트롤러가 리턴한 문자열을 prefix, suffix와 합쳐 일치하는 경로의 뷰를 찾고 사용자에게 보여준다.
<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>

<context:component-scan>

패키지 내의 어노테이션을 스캔해서 bean으로 등록하는 태그
base-package 속성을 통해 스캔을 시작할 패키지 범위를 지정할 수 있다.

<context:component-scan base-package="com.spring.muknolja" />

📁 root-context.xml

웹 애플리케이션에서 모든 서블릿들이 공유하는 bean을 설정하는 파일

  • MVC 패턴에서 모델과 관련된 설정파일
  • MVC 설정 - Service, Repository와 관련된 여러 처리를 담당한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@localhost:orcl"/>
		<property name="username" value="NAME"/>
		<property name="password" value="PASS"/>
	</bean>
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis-config.xml"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSession"/>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

</beans>

DB 연결

datasource 설정

dataSource를 통해 스프링과 DB를 연결한다.
JDBC driver을 이용하여 Database Connection을 생성하는 과정이다.

  • datasource 빈을 등록하고 <property>에 관련 정보를 설정한다.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:orcl"/>
    <property name="username" value="NAME"/>
    <property name="password" value="PASS"/>
</bean>

SqlSessionFactory

MyBatis와 DB를 연동한다.

  • SqlSession을 사용하기 위해서는 SqlSessionFactory가 필요하다.
  • SqlSessionFactoryBean으로 SqlSessionFactory 빈을 생성하고 MyBatis 설정파일을 연결해준다.
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSession"/>
</bean>