Spring

📅 2025년 4월 14일 - Spring 프로젝트에서 HttpServletRequest 오류 해결하기

upwardtrend 2025. 4. 14. 22:53

오늘은 Spring MVC 프로젝트를 진행하면서 발생한 치명적인 오류, 바로 HttpServletRequest 클래스를 찾을 수 없다는 문제를 해결한 과정을 정리해보았습니다. Spring과 톰캣의 버전 차이로 인한 문제였고, 이를 해결하기 위해 많은 삽질을 했지만 그만큼 배움도 많았던 하루였습니다.


🔧 에러 발생 상황

프로젝트를 실행하자마자 아래와 같은 에러 메시지가 출력되었습니다.

java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest

그리고 DispatcherServlet 초기화에 실패하며 컨텍스트 로딩 자체가 안 되는 현상까지 이어졌습니다.


🧠 원인 분석

Spring 6부터는 javax.servlet가 아닌 jakarta.servlet 패키지를 사용합니다. 반면 기존 코드는 아래처럼 작성되어 있었습니다.

// 기존 코드 (잘못된 import)
import javax.servlet.http.HttpServletRequest;

이는 Tomcat 10 이상을 사용할 경우 문제가 됩니다. Tomcat 10은 jakarta.servlet.* 패키지를 기본으로 사용하기 때문에 javax.servlet.*는 더 이상 사용할 수 없습니다.


🛠️ 해결 방법

1. pom.xml에 의존성 추가 또는 변경

<!-- javax.servlet-api 제거하고 jakarta.servlet-api로 대체 -->
<dependency>
  <groupId>jakarta.servlet</groupId>
  <artifactId>jakarta.servlet-api</artifactId>
  <version>6.0.0</version>
  <scope>provided</scope>
</dependency>

2. Controller 코드 수정

MemberController.java의 import 구문을 다음과 같이 수정합니다.

// 변경 전
import javax.servlet.http.HttpServletRequest;

// 변경 후
import jakarta.servlet.http.HttpServletRequest;

추가로 HttpServletResponse, HttpSession 등도 같이 사용 중이면 모두 jakarta.servlet로 변경해주어야 합니다.

3. 서버 재시작 및 캐시 정리

  • 이클립스: Project > Clean 클릭
  • 톰캣: 완전 종료 후 다시 시작

🧪 테스트 결과

모든 클래스를 jakarta.servlet.*으로 변경하고 서버를 재시작하니 정상적으로 DispatcherServlet이 초기화되고 컨트롤러가 잘 작동했습니다.


📝 느낀 점 (부족했던 부분)

이번 오류는 생각보다 간단한 문제였지만, 에러 메시지를 정확히 해석하지 못해서 오래 걸렸습니다. 처음에는 코드 자체의 문제라고 생각했는데, 실제로는 Spring과 Tomcat의 버전 불일치 문제였습니다.

또한 jakarta.servlet으로 변경된 사실을 미처 모르고 javax.servlet만 검색했던 것도 원인이었습니다. 앞으로는 라이브러리 변경 사항이나 공식 문서 변경점을 먼저 확인해야겠다고 다짐했습니다.


🔁 개선할 점

  1. 라이브러리 버전 체크 습관화: 사용 중인 프레임워크 버전에 따라 의존성도 최신에 맞춰야 합니다.
  2. 에러 메시지 분석력 향상: stack trace에서 핵심 원인을 빠르게 파악하는 훈련이 필요합니다.
  3. Spring 버전 업그레이드 시 호환성 문서 체크 필수

✅ 마무리 정리

항목 해결 내용

문제 HttpServletRequest 클래스를 찾을 수 없음
원인 Spring 6 + Tomcat 10 환경에서 javax.servlet 사용
조치 pom.xml에서 jakarta.servlet-api로 변경, import 구문 수정
결과 정상 실행됨

이번 경험을 통해 Spring과 Tomcat 버전이 어떻게 연관되어 있고, javax.servlet와 jakarta.servlet의 차이점이 얼마나 중요한지를 확실히 이해하게 되었습니다. 이 글이 같은 문제로 고민하는 다른 분들에게 도움이 되었으면 좋겠습니다.