🌐 Spring Boot 없이 IntelliJ 유료버전으로 전통적인 Spring MVC 프로젝트 구성하기

Spring Boot 없이 IntelliJ 유료버전으로 전통적인 Spring MVC 프로젝트를 구성하겠습니다.

1. IntelliJ에서 Maven 프로젝트 생성

  1. File → New → Project
  2. 좌측메뉴 Generators에서 Maven Archetype 선택
  3. name : 임의의 값 설정 예) spring-mvc-app
  4. archetype select box 선택 
  5. maven-archetype-webapp 선택
  6. Advanced Settings 선택 
  7. GroupId: 임의의 값 설정 예)  com.example, ArtifactId: spring-mvc-app 입력
  8. Create 버튼 선택
  9. 프로젝트 생성 확인 
[INFO] Archetype repository not defined. Using the one from [org.apache.maven.archetypes:maven-archetype-webapp:1.5] found in catalog remote
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: C:\Users\사용자명\AppData\Local\Temp\archetype2tmp
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: spring-mvc-app
[INFO] Parameter: packageName, Value: com.example
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\Users\사용자명\AppData\Local\Temp\archetype2tmp\spring-mvc-app2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.405 s
[INFO] Finished at: 2025-08-29T15:11:57+09:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

2. pom.xml 설정

<?xml version="1.0" encoding="UTF-8"?>
<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>com.example</groupId>
    <artifactId>spring-mvc-app</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring.version>5.3.21</spring.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
    <dependencies>
        <!-- Spring Core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- Spring Context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- Spring Web MVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        
        <!-- Servlet API -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        
        <!-- JSP API -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</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>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
            </plugin>
        </plugins>
    </build>
</project>

3. 디렉토리 구조 생성

다음 디렉토리들을 생성하세요:

spring-mvc-app/
├── pom.xml                           # Maven 설정 파일
├── src/
│   └── main/
│       ├── java/                     # Java 소스 코드
│       │   └── com/example/
│       │       └── controller/       # Spring MVC 컨트롤러
│       ├── resources/                # 설정 파일, 프로퍼티 파일
│       └── webapp/                   # 웹 리소스
│           ├── WEB-INF/              # 외부 접근 차단 디렉토리
│           │   ├── web.xml          # 웹 애플리케이션 설정
│           │   ├── dispatcher-servlet.xml  # Spring 설정
│           │   └── views/           # JSP 파일들
│           └── index.jsp            # 정적 웹 파일
└── target/                          # Maven 빌드 결과물

4. web.xml 설정

src/main/webapp/WEB-INF/web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    
    <display-name>Spring MVC Application</display-name>
    
    <!-- Spring DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- Character Encoding Filter -->
    <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>

5. Spring 설정 파일

src/main/webapp/WEB-INF/dispatcher-servlet.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">
    
    <!-- Component Scan -->
    <context:component-scan base-package="com.example.controller" />
    
    <!-- Enable MVC -->
    <mvc:annotation-driven />
    
    <!-- View Resolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- Static Resources -->
    <mvc:default-servlet-handler />
</beans>

6. Controller 클래스

src/main/java/com/example/controller/MainController.java:

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
    
    @GetMapping("/main")
    public String main(Model model) {
        model.addAttribute("message", "Hello World");
        return "main";
    }
    
    @GetMapping("/")
    public String home() {
        return "redirect:/main";
    }
}

7. JSP 파일

src/main/webapp/WEB-INF/views/main.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Spring MVC Hello World</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin-top: 100px;
        }
        h1 {
            color: #4CAF50;
        }
    </style>
</head>
<body>
    <h1>${message}</h1>
    <p>Spring MVC without Spring Boot</p>
    <p>현재 시간: <%= new java.util.Date() %></p>
</body>
</html>

8. Tomcat 서버 설정 (IntelliJ)

  1. Run → Edit Configurations
  2. + 버튼 클릭 → Tomcat Server → Local
  3. Server 탭에서 Tomcat 경로 설정
  4. Deployment 탭에서:
    • + 클릭 → Artifact
    • spring-mvc-app:war exploded 선택
    • Application context: '/' 로 설정
    • OK 버튼 선택 

9. 실행

  1. Maven 의존성 다운로드: 터미널에서 mvn clean compile 실행 
  2. IntelliJ에서 Tomcat 서버 실행
  3. 브라우저에서 http://localhost:8080/main 접속

이제 "Hello World"가 출력되는 전통적인 Spring MVC 웹 애플리케이션이 완성되었습니다. JSP를 통해 동적 콘텐츠를 렌더링하고, Spring MVC의 컨트롤러가 요청을 처리합니다.


10. HTTP 요청 처리 과정

전체 흐름도

Client Request → Tomcat → DispatcherServlet → HandlerMapping → Controller → ViewResolver → JSP → Response

상세 처리 과정

1단계: 클라이언트 요청

브라우저에서 http://localhost:8080/main 요청

2단계: 서블릿 컨테이너 (Tomcat)

  • Tomcat이 HTTP 요청을 받음
  • web.xml을 확인하여 어떤 서블릿이 처리할지 결정
  • / 패턴이므로 DispatcherServlet으로 전달

3단계: DispatcherServlet 처리1

// 내부적으로 다음과 같은 과정을 거침
1. HandlerMapping을 통해 요청 URL에 맞는 컨트롤러 메소드 찾기
2. HandlerAdapter를 통해 컨트롤러 메소드 실행
3. 컨트롤러 실행 결과(ModelAndView) 받기
4. ViewResolver를 통해 뷰 이름을 실제 뷰로 변환
5. 뷰 렌더링 및 응답 생성


4단계: 컨트롤러 실행

@GetMapping("/main")
public String main(Model model) {
    model.addAttribute("message", "Hello World");  // 모델에 데이터 추가
    return "main";  // 뷰 이름 반환
}


5단계: 뷰 처리

  • ViewResolver가 "main"을 "/WEB-INF/views/main.jsp"로 변환
  • JSP 엔진이 JSP 파일을 처리
  • EL 표현식 ${message}를 "Hello World"로 치환

6단계: 응답 생성

  • 최종 HTML이 생성되어 클라이언트로 전송

 

11. Spring MVC 핵심 구성 요소

1. DispatcherServlet

// Spring이 제공하는 핵심 서블릿
public class DispatcherServlet extends FrameworkServlet {
    // 모든 HTTP 요청의 진입점
    // Front Controller 패턴의 구현체
}

2. HandlerMapping

  • URL과 컨트롤러 메소드를 매핑
  • @RequestMapping 어노테이션을 분석하여 매핑 정보 생성

3. Controller

@Controller  // Spring이 이 클래스를 컨트롤러로 인식
public class MainController {
    
    @GetMapping("/main")  // GET 요청 "/main"을 이 메소드가 처리
    public String main(Model model) {
        // 비즈니스 로직 처리
        model.addAttribute("message", "Hello World");
        // 뷰 이름 반환
        return "main";
    }
}

4. Model

  • 컨트롤러와 뷰 사이의 데이터 전달 객체
  • 뷰에서 사용할 데이터를 저장

5. ViewResolver

  • 컨트롤러가 반환한 뷰 이름을 실제 뷰 객체로 변환
  • JSP, Thymeleaf, FreeMarker 등 다양한 뷰 기술 지원

6. JSP와 EL(Expression Language)

JSP 태그들

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- JSP 페이지 설정 -->

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- JSTL 코어 태그 라이브러리 사용 -->


EL 표현식

${message}  <!-- model.addAttribute("message", "Hello World")로 설정한 값 출력 -->

7. 개발 및 배포 과정

Maven 빌드 과정

mvn clean compile  # 컴파일
mvn package        # WAR 파일 생성


생성되는 파일들

target/
├── classes/                    # 컴파일된 .class 파일들
├── spring-mvc-app-1.0-SNAPSHOT.war  # 배포용 WAR 파일
└── spring-mvc-app-1.0-SNAPSHOT/     # Exploded WAR (개발용)

Tomcat 배포

  1. 개발 시: Exploded WAR를 사용하여 실시간 반영
  2. 운영 시: WAR 파일을 Tomcat의 webapps 디렉토리에 배치

8. 전체 아키텍처 이해

이 프로젝트는 3-Tier Architecture를 따릅니다:

1. Presentation Layer (프레젠테이션 계층)

  • JSP, HTML, CSS, JavaScript
  • 사용자 인터페이스 담당

2. Business Layer (비즈니스 계층)

  • Spring MVC Controller
  • 비즈니스 로직 처리

3. Data Layer (데이터 계층)

  • 현재는 없지만, 보통 Repository, DAO가 위치
  • 데이터베이스 연동 담당

 

+ Recent posts