Java/Spring
Spring MVC Project 구현 스프링 디렉토리 구조
상상모음
2025. 4. 30. 16:06
1. Spring MVC 구현 절차 요약
1. Maven 프로젝트 생성 (또는 Gradle)
- Web Project로 설정 (war packaging)
- pom.xml에 필요한 의존성 추가 (Spring MVC, JSTL, Servlet API 등)
2. web.xml 설정
- DispatcherServlet 등록
- ContextConfigLocation 등록 (Spring Bean 설정 XML)
3. Spring 설정 파일 작성
- servlet-context.xml: Spring MVC 설정 (ViewResolver, component-scan, messageConverters 등)
- root-context.xml: 일반 Bean 등록용 (선택)
4. Controller 생성
- @Controller + @RequestMapping으로 URL 매핑
5. View (JSP) 생성
- 보통 /WEB-INF/views/ 아래 JSP 배치
2. 디렉토리 구조 설명
전통적인 Spring MVC 프로젝트의 대표적인 구조입니다:
project-root/
│
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/app/
│ │ │ └── HomeController.java ← 컨트롤러 클래스
│ │ ├── resources/
│ │ │ └── log4j.xml (옵션)
│ │ └── webapp/
│ │ ├── WEB-INF/
│ │ │ ├── views/
│ │ │ │ └── home.jsp ← JSP 뷰 파일
│ │ │ ├── spring/
│ │ │ │ ├── servlet-context.xml ← Spring MVC 설정
│ │ │ │ └── root-context.xml ← Bean 설정
│ │ │ └── web.xml ← 서블릿 설정
│ │ └── static/ ← 정적 자원(css, js 등, 선택사항)
│ │
├── target/ ← 빌드 결과물
│
├── pom.xml ← Maven 설정
3. 주요 파일 설명
web.xml
<web-app>
<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/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>
</web-app>
web.xml 파일은 Spring MVC에서 DispatcherServlet을 수동으로 등록하고
Spring의 전역 Bean 설정을 초기화.
Spring MVC는 전통적으로 web.xml (배포 서술자, deployment descriptor)을 통해
웹 애플리케이션의 서블릿, 리스너, 필터, 초기화 파라미터 등을 정의합니다.
이 파일은 톰캣 같은 서블릿 컨테이너가 웹앱을 구동할 때 가장 먼저 읽는 구성 파일입니다.
최상단 선언부
<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">
version="2.5": 이 web.xml이 Servlet 2.5 스펙을 따른다는 뜻입니다.
XML 네임스페이스와 스키마 정보는 문법 검증용.
context-param: 전역 Spring 설정 등록
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
역할: Spring의 전역 애플리케이션 컨텍스트를 로딩할 때 사용하는 XML 파일을 지정합니다.
이 파일에는 보통 DAO, Service, Datasource 등 비-web 관련 Bean들을 등록합니다
ContextLoaderListener: 전역 컨텍스트 초기화
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Spring의 리스너 클래스.
위의 <context-param>에서 지정한 설정 파일을 읽어 전역 ApplicationContext를 생성합니다.
여러 DispatcherServlet에서 공유되는 Bean들을 여기에 등록합니다.
DispatcherServlet 설정
<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>
DispatcherServlet은 Spring MVC의 핵심 서블릿입니다.
contextConfigLocation은 해당 서블릿 전용 설정 파일을 지정합니다.
여기엔 ViewResolver, Controller, HandlerMapping 등의 웹 관련 Bean이 등록됩니다.
load-on-startup=1은 서버 시작 시 이 서블릿을 가장 먼저 초기화하라는 뜻입니다 (1은 우선순위 값).
서블릿 매핑
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
해당 서블릿이 어떤 URL 요청을 처리할지를 지정합니다.
/은 모든 요청을 처리하겠다는 의미이며, 정적 자원은 서블릿 컨테이너가 기본으로 처리합니다.
예: /hello, /user/list, /css/style.css 등
전체 흐름 요약
1.WAS는 web.xml을 읽고, ContextLoaderListener로 root-context.xml을 로딩합니다.
2.그 다음, DispatcherServlet을 초기화하고, 이 서블릿은 자신의
context (servlet-context.xml)를 로딩합니다.
3.클라이언트의 모든 요청은 /으로 매핑된 DispatcherServlet이 받아서 처리합니다.
4.DispatcherServlet은 요청을 컨트롤러에 전달하고, 뷰를 반환받아 응답합니다.
context-param과 ContextLoaderListener는 선택 사항이지만, 여러 서블릿에서 Bean을 공유하려면 필수입니다.
Spring Boot에서는 web.xml이 필요 없고, Java Config를 사용합니다 (@SpringBootApplication 등).
web.xml 방식은 Spring Framework 5 이후부터 거의 사용하지 않지만, 기초 학습이나 레거시 유지보수에는 여전히 중요합니다.
servlet-context.xml
servlet-context.xml은 Spring MVC의 핵심 설정 파일로, 웹 요청 처리와 관련된 설정들을 포함하고 있습니다.
이 설정 파일은 DispatcherServlet이 로딩하는 서블릿 전용 ApplicationContext로, 웹 계층(Controller, View 등)을 위한 Bean 설정이 주로 포함
최상단부 beans, mvc, context 네임스페이스를 선언하고 스키마 위치를 지정합니다.
이 설정은 Spring의 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/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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
@Controller, @RequestMapping, @ResponseBody, @Valid, @InitBinder 등의 어노테이션 기반 MVC 기능 활성화.
내부적으로 RequestMappingHandlerMapping, RequestMappingHandlerAdapter 등의 Bean을 등록합니다.
예전에는 일일이 등록했지만, 이 태그 하나로 해결합니다.
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
정적 리소스 (예: CSS, JS, 이미지)를 /resources/** 경로로 매핑.
실제 리소스 파일은 /webapp/resources/ 디렉토리에 있어야 합니다.
/resources/style.css 같은 요청은 컨트롤러를 거치지 않고 직접 리소스를 서빙하게 됩니다.
<!-- 뷰 리졸버 설정s views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
JSP를 View로 사용할 때 사용되는 설정입니다.
컨트롤러가 "home"을 반환하면 실제 경로는 /WEB-INF/views/home.jsp가 됩니다.
ViewResolver는 View 이름을 JSP 파일로 변환합니다.
<context:component-scan base-package="com.example.app" />
@Controller, @Service, @Repository, @Component 등의 어노테이션이 붙은 클래스를 스캔합니다.
이 설정이 없으면 어노테이션만 붙여도 Spring이 인식하지 못합니다.
웹 계층에서는 특히 @Controller 빈을 스캔하는 데 중요합니다.
</beans:beans>
전체 흐름 요약
클라이언트 요청 → DispatcherServlet이 받음
servlet-context.xml 설정에 따라:
컨트롤러 찾기 (@Controller)
핸들러 어댑터 설정
ViewResolver를 통해 JSP로 응답 구성
정적 리소스는 /resources/** 설정에 의해 직접 응답
root-context.xml 예제
root-context.xml의 역할
웹 계층을 제외한 모든 전역 Bean들을 관리합니다.
예:
DB 연결 설정 (DataSource)
트랜잭션 설정
DAO, Service 계층 빈 등록
외부 라이브러리 관련 Bean
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- Root Application Context: service, repository bean 설정 -->
<!-- @Service, @Repository 등을 스캔 -->
<context:component-scan base-package="com.example.app" />
<!-- 예: 데이터베이스 설정, 트랜잭션 설정 등을 여기에 작성 -->
<!-- 예제: DataSource Bean -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/exampledb" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<!-- 예: MyBatis SqlSessionFactory 설정 -->
<!--
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
-->
<!-- 예: 트랜잭션 매니저 설정 -->
<!--
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
-->
</beans>
구성 팁
서비스 계층에 @Service, DAO에 @Repository 어노테이션을 붙이고, root-context.xml에서 스캔 설정을 해두면 자동 등록됩니다.
MyBatis, Hibernate 등 ORM 프레임워크를 사용하는 경우 설정을 여기 포함시킵니다.
설정이 길어질 경우 XML을 여러 개로 분리해도 됩니다 (예: datasource-context.xml, mybatis-context.xml 등).
🆚 servlet-context.xml과 비교
| 항목 | root-context.xml | servlet-context.xml |
| 로딩 주체 | ContextLoaderListener | DispatcherServlet |
| 용도 | 전역 Bean (Service, DAO 등) | 웹 관련 Bean (Controller, View 등) |
| 주로 포함하는 요소 | DB 설정, 트랜잭션, 서비스 Bean | ViewResolver, HandlerMapping, Controller |
Controller
@Controller
public class HomeController {
@RequestMapping("/")
public String home() {
return "home"; // → /WEB-INF/views/home.jsp
}
}
결론
스프링 MVC 수동 구현은 다음 3가지가 핵심입니다:
- web.xml → DispatcherServlet 등록
- servlet-context.xml → ViewResolver 및 component-scan 설정
- @Controller 클래스에서 JSP로 데이터를 전달
Spring Boot와 달리 XML 설정이 많고 복잡하지만, 구조를 명확하게 이해하는 데 도움이 됩니다.