🌐 Spring Boot 없이 IntelliJ 유료버전으로 전통적인 Spring MVC 프로젝트 구성하기
Spring Boot 없이 IntelliJ 유료버전으로 전통적인 Spring MVC 프로젝트를 구성하겠습니다.
1. IntelliJ에서 Maven 프로젝트 생성
- File → New → Project
- 좌측메뉴 Generators에서 Maven Archetype 선택
- name : 임의의 값 설정 예) spring-mvc-app
- archetype select box 선택
- maven-archetype-webapp 선택
- Advanced Settings 선택
- GroupId: 임의의 값 설정 예) com.example, ArtifactId: spring-mvc-app 입력
- Create 버튼 선택
- 프로젝트 생성 확인
[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)
- Run → Edit Configurations
- + 버튼 클릭 → Tomcat Server → Local
- Server 탭에서 Tomcat 경로 설정
- Deployment 탭에서:
- + 클릭 → Artifact
- spring-mvc-app:war exploded 선택
- Application context: '/' 로 설정
- OK 버튼 선택
9. 실행
- Maven 의존성 다운로드: 터미널에서 mvn clean compile 실행
- IntelliJ에서 Tomcat 서버 실행
- 브라우저에서 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 배포
- 개발 시: Exploded WAR를 사용하여 실시간 반영
- 운영 시: 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가 위치
- 데이터베이스 연동 담당
'Java > Spring Framework' 카테고리의 다른 글
| [Spring] 웹 요청 처리의 핵심, dispatcher-servlet.xml 완벽 분석 (Java Config 전환 포함) (6) | 2025.08.29 |
|---|---|
| [Spring] 스프링 MVC의 심장, web.xml 완벽 분석 (DispatcherServlet, 한글 필터) (2) | 2025.08.29 |
| [Maven] Spring 프로젝트의 설계도, pom.xml 완벽 해부 (2) | 2025.08.29 |
