[Servlet] 서블릿 웹 애플리케이션 폴더 구조

artp·2025년 5월 16일
0

web

목록 보기
5/9
post-thumbnail

1. 서블릿 프로젝트 폴더 구조

서블릿 프로젝트 폴더 구조는 서블릿 컨테이너가 애플리케이션을 인식하는 기준입니다.
→ 구조가 어긋나면 배포, 실행이 불가능합니다.

프로젝트/
├── 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 파일

2. 주요 폴더 및 파일 상세 설명

webapp/

  • 정적 리소스(HTML, JS, CSS, 이미지 등)의 루트 디렉토리
  • 사용자(브라우저)가 직접 접근 가능한 웹 자원 디렉토리
    • webapp/css/style.css
    • webapp/js/main.js
    • webapp/images/logo.png
  • 예:
    • http://localhost:8080/index.html
    • http://localhost:8080/css/style.css

index.html

  • 웹 애플리케이션의 기본 진입 페이지
  • 특별한 설정이 없으면 Tomcat이 자동으로 첫 페이지로 처리
  • <welcome-file-list>(web.xml)에서 설정 가능

WEB-INF/

  • 브라우저에서 직접 접근 불가(보안 디렉토리)
  • 주요 역할:
    • web.xml: 서블릿 매핑, 필터, 초기화 파라미터 등
    • classes/: 컴파일된 자바 클래스(.class) 저장
    • lib/: JDBC 드라이버, 외부 라이브러리 JAR 파일
  • 예:
    • WEB-INF/classes/com/example/HelloServlet.class
    • WEB-INF/lib/gson-2.10.jar
  • 브라우저에서 아래 주소는 모두 차단됨
    • http://localhost:8080/WEB-INF/web.xml
    • http://localhost:8080/WEB-INF/classes/

WEB-INF는 반드시 보안 디렉토리로 활용하여 사용자가 직접 접근할 수 없도록 설계해야 합니다.

META-INF/

  • JAR/WAR 아카이브의 메타 정보 디렉토리
  • 주로 context.xml 등 서버 설정 파일 저장
  • Tomcat 등 WAS가 context 설정, 데이터소스 연결 등에 사용
  • 복수 앱 배포, 서버 세팅이 복잡할 때 주로 활용

3. 서블릿 클래스 배치 – 서블릿 방식 vs Maven 방식

서블릿 프로젝트에서 .java 파일은 .class컴파일된 후 서블릿 컨테이너가 인식할 수 있는 위치에 배치되어야 합니다.
이때 사용하는 빌드 방식에 따라 컴파일 결과물의 저장 위치가 달라집니다.

전통적인 서블릿 프로젝트

  • 주로 Eclipse의 Dynamic Web Project를 사용할 때 적용됩니다.
  • .java 파일을 저장하거나 실행하면 Eclipse가 자동으로 컴파일을 수행하고,
    webapp/WEB-INF/classes/ 디렉토리에 .class 파일을 생성합니다.
  • Tomcat은 이 위치를 그대로 읽어 서블릿 클래스를 로딩합니다.

예:

package com.example;
public class HelloServlet extends HttpServlet { ... }

→ 컴파일 결과 파일 경로:

webapp/WEB-INF/classes/com/example/HelloServlet.class
  • WAR 파일을 만들려면 수동으로 Export → WAR file 기능을 사용해야 합니다.


Maven 기반 프로젝트

  • Maven은 표준 프로젝트 구조(Maven이 공식적으로 권장하고 자동으로 인식하는 디렉토리 구조)를 따르며, 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
  • 이 WAR를 webapps/에 배포하면 Tomcat이 자동으로 압축 해제하고 실행합니다.

참고: Maven 표준 프로젝트 디렉토리 구조

프로젝트/
├── pom.xml                      ← Maven 설정 파일
└── src/
    ├── main/
    │   ├── java/                ← 애플리케이션 소스 코드 (.java)
    │   ├── resources/           ← 설정 파일, 메시지, 정적 리소스
    │   └── webapp/              ← 웹 자원 (JSP, HTML, CSS 등)
    └── test/
        ├── java/                ← 테스트 코드 (.java)
        └── resources/           ← 테스트용 설정 파일

MVN 빌드 명령어

명령어설명
mvn compile.java → .class로 컴파일 (target.classes 생성)
mvn package.class, 정적 자원 포함 → .war로 패키징
mvn clean이전 빌드 결과(taget 폴더 전체) 삭제

IDE에서의 실행

  • Eclipse에서는 Maven 명령어를 직접 입력하지 않아도,
    우클릭 → Run As → Maven build… 로 실행 가능
  • Goals에 compile, package, clean 등을 입력하면 CLI와 동일하게 동작


4. Maven 빌드 결과와 WAR 파일 구조

빌드 결과 예시

target/
├── classes/                            ← 컴파일된 .class 파일 저장소
│   └── com/example/HelloServlet.class
├── myapp.war                           ← 전체 프로젝트를 패키징한 WAR 파일
└── 기타 빌드 관련 파일
  • Maven 프로젝트에서 mvn compile 또는 mvn package 명령어를 실행하면, 모든 빌드 결과물이 target/ 폴더 안에 생성됩니다.
    • target/ 폴더는 실행 가능한 산출물(.class, .war 등)을 저장하는 Maven의 전용 빌드 디렉토리입니다.
  • classes/ 디렉토리는 src/main/java에 있던 자바 소스 파일이 컴파일되어 생성된 .class 파일들이 들어가는 곳입니다.
    • Tomcat이나 서블릿 컨테이너는 이 디렉토리를 WEB-INF/classes/로 인식하고 클래스 로딩에 사용합니다.
  • myapp.war는 Maven의 package 명령으로 생성된 웹 애플리케이션 아카이브(= 패키지, 여러 개의 파일과 폴더를 하나의 파일로 묶어 놓은 것)입니다.
    • 이 WAR 파일을 Tomcat 등의 WAS(Web Application Server)에 배포하면 자동으로 압축 해제되어 실행됩니다.
  • 이 WAR 파일 내부 구조는 전통적인 서블릿 방식(WEB-INF, META-INF 포함)과 완전히 동일한 형태로 압축되어 있기 때문에, 서블릿 컨테이너는 전통적인 방식과 동일하게 해석하여 실행할 수 있습니다.

즉, Maven은 결과물이 생성되는 위치만 다를 뿐, 최종적으로 생성된 WAR 파일은 전통 서블릿 프로젝트와 구조적으로 완전히 동일합니다.

WAR 파일 구조

이 구조는 Java 웹 애플리케이션의 표준 WAR 파일 구조입니다.
WAR(WEB Application Archive) 파일은 하나의 웹 애플리케이션을 배포 가능한 단위로 압축(패키징)한 형태입니다.

myapp.war
├── index.html
├── css/
├── js/
├── images/
├── META-INF/
└── WEB-INF/
    ├── web.xml
    ├── classes/
    └── lib/
  • Tomcat의 webapps/ 디렉토리는 톰캣이 웹 애플리케이션을 배포하기 위해 자동으로 인식하는 배포 전용 폴더입니다 (톰캣 내부의 배포 디렉토리).
  • 즉, myapp.war 파일을 이 디렉토리에 복사하기만 해도 별도의 설정 없이 서버가 자동으로 인식하여 압축을 해제하고 실행합니다.
  • 압축이 해제되면 Tomcat은 내부적으로 이 WAR 파일의 구조에 따라 애플리케이션을 실행하게 되며, 브라우저에서 접근 가능한 경로(= context path)는 파일 이름을 기준으로 자동 설정됩니다.
  • context path는 WAR 파일 이름 기준:
    • myapp.war을 webapps/에 복사 → http://localhost:8080/myapp 으로 접속 가능
    • ROOT.war로 이름을 지정하면 → 기본 루트 경로(/) 로 설정되어 http://localhost:8080/ 으로 바로 접근 가능
      • ROOT.war는 하나의 톰캣 서버당 단 하나만 가능하며, 기본 홈페이지 역할을 하게 됩니다.

5. 서블릿 방식 vs Maven 방식 비교

구분전통적인 서블릿 프로젝트Maven 기반 프로젝트
클래스 결과 위치webapp/WEB-INF/classestarget/classes
빌드 방식IDE 자동 컴파일Maven 빌드 (mvn compile 등)
WAR 생성수동 exportmvn package로 자동 생성
실행 기준 디렉토리webapp/target/

6. 폴더 구조 요약 정리

폴더/파일역할브라우저 접근 가능
webapp/정적 리소스, 루트 디렉토리O
index.html기본 진입 페이지O
css/, js/, images/사용자 자원 디렉토리O
WEB-INF/설정, 클래스, 라이브러리 저장소X
META-INF/메타 정보 디렉토리X
WEB-INF/classes/(전통 방식) 컴파일된 클래스 위치X
target/(Maven) 빌드 결과 저장소X (로컬 전용)
profile
donggyun_ee

0개의 댓글