Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
2024. 11. 5. 12:38ㆍWeb/Error
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
톰켓 <scope>provided</scope> 로 인해 에러 발생
해결 방안 : compile 로 설정 또는 주석 처리
설명
1. compile Scope
- 정의: compile 범위는 기본 범위이며, 이 의존성이 애플리케이션을 컴파일하고 실행하는 데 필요한 모든 클래스와 리소스를 포함합니다.
- 특징:
- Maven 프로젝트에 이 의존성이 추가되면, 해당 의존성은 컴파일 시점에 필요하고, 패키징할 때도 포함됩니다.
- 애플리케이션이 실행될 때 Tomcat 서버를 내장하여 실행할 수 있습니다. 이는 Spring Boot의 주요 기능 중 하나입니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>compile</scope>
</dependency>
위와 같이 설정하면, Spring Boot 애플리케이션이 실행될 때 Tomcat이 함께 내장되어 사용됩니다.
2. provided Scope
- 정의: provided 범위는 의존성이 컴파일 시점에 필요하지만, 실행 시에는 외부에서 제공된다는 것을 의미합니다. 즉, 이 의존성은 패키지에 포함되지 않습니다.
- 특징:
- 일반적으로 웹 애플리케이션 서버(예: Tomcat, Jetty)와 같은 환경에서 이미 제공되는 라이브러리입니다.
- 개발자는 이 범위를 설정하여 실제 서버 환경에서는 해당 라이브러리가 서버에 이미 존재하므로 패키지에 포함할 필요가 없음을 나타냅니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
이렇게 설정하면, 애플리케이션이 Tomcat과 같은 외부 서버에서 실행될 때 Tomcat이 제공되므로, Tomcat 라이브러리가 WAR 파일에 포함되지 않습니다.
요약
- compile: Tomcat을 내장하여 애플리케이션을 독립적으로 실행할 수 있도록 함. (JAR 파일로 패키징할 때 포함됨)
- provided: Tomcat이 외부 서버에서 제공되므로 애플리케이션 패키징 시 포함되지 않음. (WAR 파일로 패키징 시 사용됨)
권장 사용
- JAR 애플리케이션: spring-boot-starter-tomcat을 compile로 설정하여 독립적으로 실행하는 경우.
- WAR 애플리케이션: provided로 설정하여 외부 서버에서 실행되는 경우.
이 두 가지 설정을 혼합하여 사용하면, 프로젝트의 요구 사항에 맞춰 유연하게 개발할 수 있습니다.