서블릿 프로젝트 폴더 구조는 서블릿 컨테이너가 애플리케이션을 인식하는 기준입니다.
→ 구조가 어긋나면 배포, 실행이 불가능합니다.
프로젝트/
├── pom.xml ← Maven 설정 파일 (Maven 프로젝트)
└── src/
└── main/
├── java/ ← 자바 소스 (.java)
│ └── com/example/
│ └── HelloServlet.java
├── resources/ ← 설정파일, 메시지 등
└── webapp/ ← 웹 자원의 루트 디렉토리
├── index.html ← 초기 접속 페이지
├── js/ ← JavaScript 파일
├── css/ ← CSS 파일
├── images/ ← 이미지 파일
├── META-INF/ ← 메타 정보 폴더
└── WEB-INF/ ← 서블릿 관련 설정 및 클래스 저장 폴더
├── web.xml ← 서블릿 설정 파일
├── classes/ ← 컴파일된 자바 클래스
└── lib/ ← 라이브러리 JAR 파일
webapp/css/style.css webapp/js/main.js webapp/images/logo.pnghttp://localhost:8080/index.html http://localhost:8080/css/style.css<welcome-file-list>(web.xml)에서 설정 가능
WEB-INF/classes/com/example/HelloServlet.classWEB-INF/lib/gson-2.10.jar http://localhost:8080/WEB-INF/web.xml http://localhost:8080/WEB-INF/classes/WEB-INF는 반드시 보안 디렉토리로 활용하여 사용자가 직접 접근할 수 없도록 설계해야 합니다.
서블릿 프로젝트에서 .java 파일은 .class로 컴파일된 후 서블릿 컨테이너가 인식할 수 있는 위치에 배치되어야 합니다.
이때 사용하는 빌드 방식에 따라 컴파일 결과물의 저장 위치가 달라집니다.
.java 파일을 저장하거나 실행하면 Eclipse가 자동으로 컴파일을 수행하고,webapp/WEB-INF/classes/ 디렉토리에 .class 파일을 생성합니다.예:
package com.example;
public class HelloServlet extends HttpServlet { ... }
→ 컴파일 결과 파일 경로:
webapp/WEB-INF/classes/com/example/HelloServlet.class



src/main/java에 위치한 소스 코드를 target/classes로 컴파일합니다.mvn package 명령을 실행하면 .class 파일들과 정적 자원을 묶어 WAR 파일을 자동 생성하며, 이 WAR 내부에는 WEB-INF/classes 구조가 포함됩니다.예:
컴파일 전
src/main/java/com/example/HelloServlet.java
mvn compile 실행 후
target/classes/com/example/HelloServlet.class
mvn package 실행 후
target/myapp.war
└── WEB-INF/
└── classes/
└── com/example/HelloServlet.class
webapps/에 배포하면 Tomcat이 자동으로 압축 해제하고 실행합니다.프로젝트/
├── pom.xml ← Maven 설정 파일
└── src/
├── main/
│ ├── java/ ← 애플리케이션 소스 코드 (.java)
│ ├── resources/ ← 설정 파일, 메시지, 정적 리소스
│ └── webapp/ ← 웹 자원 (JSP, HTML, CSS 등)
└── test/
├── java/ ← 테스트 코드 (.java)
└── resources/ ← 테스트용 설정 파일
| 명령어 | 설명 |
|---|---|
| mvn compile | .java → .class로 컴파일 (target.classes 생성) |
| mvn package | .class, 정적 자원 포함 → .war로 패키징 |
| mvn clean | 이전 빌드 결과(taget 폴더 전체) 삭제 |
우클릭 → Run As → Maven build… 로 실행 가능


target/
├── classes/ ← 컴파일된 .class 파일 저장소
│ └── com/example/HelloServlet.class
├── myapp.war ← 전체 프로젝트를 패키징한 WAR 파일
└── 기타 빌드 관련 파일
mvn compile 또는 mvn package 명령어를 실행하면, 모든 빌드 결과물이 target/ 폴더 안에 생성됩니다.target/ 폴더는 실행 가능한 산출물(.class, .war 등)을 저장하는 Maven의 전용 빌드 디렉토리입니다.classes/ 디렉토리는 src/main/java에 있던 자바 소스 파일이 컴파일되어 생성된 .class 파일들이 들어가는 곳입니다.WEB-INF/classes/로 인식하고 클래스 로딩에 사용합니다.즉, Maven은 결과물이 생성되는 위치만 다를 뿐, 최종적으로 생성된 WAR 파일은 전통 서블릿 프로젝트와 구조적으로 완전히 동일합니다.
이 구조는 Java 웹 애플리케이션의 표준 WAR 파일 구조입니다.
WAR(WEB Application Archive) 파일은 하나의 웹 애플리케이션을 배포 가능한 단위로 압축(패키징)한 형태입니다.
myapp.war
├── index.html
├── css/
├── js/
├── images/
├── META-INF/
└── WEB-INF/
├── web.xml
├── classes/
└── lib/
http://localhost:8080/myapp 으로 접속 가능http://localhost:8080/ 으로 바로 접근 가능| 구분 | 전통적인 서블릿 프로젝트 | Maven 기반 프로젝트 |
|---|---|---|
| 클래스 결과 위치 | webapp/WEB-INF/classes | target/classes |
| 빌드 방식 | IDE 자동 컴파일 | Maven 빌드 (mvn compile 등) |
| WAR 생성 | 수동 export | mvn package로 자동 생성 |
| 실행 기준 디렉토리 | webapp/ | target/ |
| 폴더/파일 | 역할 | 브라우저 접근 가능 |
|---|---|---|
| webapp/ | 정적 리소스, 루트 디렉토리 | O |
| index.html | 기본 진입 페이지 | O |
| css/, js/, images/ | 사용자 자원 디렉토리 | O |
| WEB-INF/ | 설정, 클래스, 라이브러리 저장소 | X |
| META-INF/ | 메타 정보 디렉토리 | X |
| WEB-INF/classes/ | (전통 방식) 컴파일된 클래스 위치 | X |
| target/ | (Maven) 빌드 결과 저장소 | X (로컬 전용) |