우와한 개발자

[Spring] Spring Legacy Project 구조와 설정 파일 - pom.xml, web.xml, servlet-context.xml, root-context.xml

by 우와한개발자

1. Spring Legacy Project 기본 구조

SpringPrj
 ├ src/main/java
 │   └ com.example.myapp
 │      ├ controller
 │      ├ service
 │      ├ dao
 │      └ vo
 │
 ├ src/main/resources
 │
 ├ src/test/java
 ├ src/test/resources
 │
 └ src/main/webapp
    ├ resources
    │  ├ css
    │  ├ js
    │  └ images
    ├ WEB-INF
    │  ├ views
    │  ├ spring
    │  │  ├ root-context.xml
    │  │  └ servlet-context.xml
    │  └ web.xml
    └ index.jsp

pom.xml

 

2. 주요 폴더 설명

폴더 설명
src/main/java 자바 소스 코드 위치
controller 요청을 받는 컨트롤러
service 비즈니스 로직 처리
dao DB 접근 처리
vo, dto 데이터 전달 객체
src/main/resources properties, 설정 파일 등 리소스 위치
src/main/webapp 웹 자원 위치
resources CSS, JS, 이미지 같은 정적 자원
WEB-INF/views JSP 화면 파일 위치
WEB-INF/spring 스프링 설정 파일 위치

 

3. Spring 컨테이너 구성

  • Spring은 두 개의 컨테이너(ApplicationContext)로 나뉘어 동작
  • Spring Boot는 이 두 컨텍스트 설정을 자동으로 처리하기 때문에 servlet-context.xml, root-context.xml을 직접 작성하지 않아도 됨
구분 servlet-context root-context
정식 명칭 Servlet WebApplicationContext Root WebApplicationContext
등록 Bean Controller 등 웹 관련 Bean Service, DAO 등 공통 Bean
사용 범위 해당 컨텍스트에서만 사용 모든 컨텍스트에서 공유 가능
다른 컨텍스트 접근 root-context Bean 사용 가능 servlet-context Bean 사용 불가
root-context (공유)
 └ Service, DAO, DataSource ...
      ↑ 참조 가능
servlet-context (웹 전용)
 └ Controller, ViewResolver, 정적자원 ...

 

4. 기본 설정 파일

구분 pom.xml web.xml root-context.xml servlet-context.xml
역할 프로젝트 빌드 / 의존성 관리 웹 애플리케이션 배포 설정 공통 빈 설정 MVC 관련 빈 설정
주요 내용 라이브러리 의존성, Java 버전, 빌드 플러그인 등 DispatcherServlet 등록, URL 매핑, 에러페이지 등 Service, Repository, DB 연결 등 Controller, ViewResolver, 정적리소스 등
관리 주체 Maven Tomcat (서블릿 컨테이너) Spring Core Spring Web MVC
로딩 시점 빌드 시 서버 시작 시 가장 먼저 ContextLoaderListener 초기화 시 DispatcherServlet 초기화 시
위치 프로젝트 루트 WEB-INF/web.xml WEB-INF/spring/ WEB-INF/spring/appServlet/

1) pom.xml

  • Maven 프로젝트의 설정 파일
  • 필요한 라이브러리 의존성 관리
  • 자바 버전 설정
  • 빌드 방식 및 플러그인 설정
  • Spring, Servlet API, JSTL, MyBatis, Oracle/PostgreSQL 드라이버 같은 라이브러리를 pom.xml에 추가해서 사용.
<dependencies>
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.20</version>
    </dependency>

    <!-- Servlet API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!-- JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

<!-- 자바 버전 설정 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>11</source>
                <target>11</target>
            </configuration>
        </plugin>
    </plugins>
</build>

 

2) web.xml

  • 웹 애플리케이션의 전체적인 초기 설정 파일(웹 프로젝트의 시작점이 되는 설정 파일)
  • DispatcherServlet 등록 및 URL 매핑
  • 필터 설정 (예: 한글 인코딩 필터)
  • 시작 시 로딩 설정
<web-app>

    <!-- 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/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- URL 매핑 : 모든 요청을 DispatcherServlet이 처리 -->
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <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>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

 

3) servlet-context.xml

  • 웹 계층 관련 설정을 담당.
  • Controller Bean 등록 (컴포넌트 스캔)
  • ViewResolver 설정
  • 정적 자원(css/js/image) 매핑
<!-- Controller 컴포넌트 스캔 -->
<context:component-scan base-package="com.example.myapp.controller"/>

<!-- ViewResolver : 컨트롤러가 반환한 view name으로 JSP 경로 조합 -->
<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>

<!-- 정적 자원 매핑 -->
<mvc:resources mapping="/resources/**" location="/resources/"/>
  • 컨트롤러가 "home"을 반환하면 ViewResolver가 아래처럼 경로를 조합해 JSP를 찾음.
prefix = /WEB-INF/views/
suffix = .jsp
→ 최종 경로 : /WEB-INF/views/home.jsp

 

4) root-context.xml

  • 비즈니스 로직, DB, 공통 Bean 설정을 담당
  • 웹 화면보다는 내부 로직과 DB 관련 설정 중심 파일
  • Service · DAO Bean 등록
  • DataSource 설정
  • SqlSessionFactory / 트랜잭션 설정
  • 전역 공통 Bean 등록
<!-- Service, DAO 컴포넌트 스캔 -->
<context:component-scan base-package="com.example.myapp.service, com.example.myapp.dao"/>

<!-- DataSource 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
    <property name="username" value="scott"/>
    <property name="password" value="tiger"/>
</bean>

<!-- SqlSessionFactory 설정 (MyBatis) -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
</bean>

 

4. WEB-INF 특징

  • WEB-INF 아래 파일은 브라우저에서 직접 접근할 수 없음.
  • 그래서 JSP를 WEB-INF/views 아래 두고 컨트롤러가 ViewResolver를 통해 접근하게 만듦.
# 직접 접근 불가
<http://localhost:8080/WEB-INF/views/home.jsp>  → 404

# 컨트롤러를 통한 내부 이동만 가능
Controller → ViewResolver → /WEB-INF/views/home.jsp

 

전체 요청 흐름

브라우저 요청
   ↓
web.xml → DispatcherServlet 등록 확인
   ↓
DispatcherServlet
   ↓  (servlet-context.xml 참고)
Controller 실행
   ↓
Service / DAO 호출
   ↓  (root-context.xml 참고)
DB 처리 후 결과 반환
   ↓
Controller → view name 반환
   ↓
ViewResolver → /WEB-INF/views/*.jsp 경로 생성
   ↓
JSP 실행 → HTML 응답

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기