한바다
[톰캣실행오류]Starting Tomcat v10.1 Server at localhost' has encountered a problem 본문
[톰캣실행오류]Starting Tomcat v10.1 Server at localhost' has encountered a problem
한바다주인공 2025. 4. 8. 19:21
📘 톰캣 서버가 정상적으로 시작되지 못한 오류 📘
'Starting Tomcat v10.1 Server at localhost' has encountered a problem.
Server Tomcat v10.1 Server at localhost failed to start.

✅ 위와 같은 오류의 원인은 여러가지가 있을 수 있다
🧩 1. [포트 충돌]
해결 방법1
- Eclipse > servers 뷰에서 Tomcat 더블 클릭
- 아래쪽의 Ports 섹션 확인
- HTTP/1.1의 포트를 8081, 9090 등 다른 숫자로 변경 후 저장 후 서버 재시작!

해결 방법2
- CMD 관리자 권한으로 열고 아래와 같은 명령어를 입력하여 해당포트를 종료시킨다!

🧩 2. [이전 실행 기록 충돌] – 캐시 문제
- 서번 완전히 제거 : Server 탭에서 톰캣 우클릭 → Delete(Remove only)

- Workspace 클릭 : 상단메뉴 Project > Clean
- 서버 재추가 : Servers 탭 → 우클릭 → New → Server → Tomcat선택 → 다시 설정
🧩 3. [톰캣 설정 파일 손상]
- 톰캣 폴더 안의 conf/server.xml 열기
- <Connect port="8080".../>라인을 찾기
- 포트가 다른 곳에서 이미 사용 중인 포트인지 확인

🧩 4. [환경 변수 / JAVA 설정 문제]
- JDK 경로가 잘못됐거나 누락되었는지 확인
- 이클립스에서 window > preferences > Java > Installed JREs 확인
- 올바른 JDK가 선택되어 있는지 확인

📘 추가로 콘솔 에러창을 확인하니 java.lang.IllegalArgumentException:오류를 확인하였다


❗ 핵심 오류 원인:
java.lang.IllegalArgumentException:
이름이 [ProductController]과 [ch08.ProductController]인 두 서블릿들 모두
url-pattern [/pcontrol]에 매핑되어 있는데, 이는 허용되지 않습니다.
즉 URl매핑이 중복 된 것이다
🔁 @WebServlet("/pcontrol")이 중복 선언됨
: 같은 URL에 연결된 서블릿이 프로젝트 안에 두개 이상 존재
🔁 web.xml과 @WebServlet 둘 다 같은 URL로 매핑됨
: 즉 설정이 겹침
ProductController 서블릿을 생성할 시 url매핑에서 '/pcontro'로 저장을 하고 아래 코드에서
@WebServlet 중복 등록이 되었다!!

✅ 해결 방법
프로젝트 우클릭> New > Servlet 에서 'Create Servlet'에서 작성한 부분은 수정이 안된다고 하여
(한 번 생성한 서블릿은 해당 팝업창으로 다시 수정할 수는 없고 해당창은 서블릿 새로 만들 때만 사용 가능하고,
이후에는 수정이 불가)

컨트롤러에서 작성한 WebServlet 어노테이션을 주석 처리 하니 정상적으로 톰캣이 작동 하였다.
더불어 📄 web.xml에 아래와 같은 <url-pattern>에서 같은 경로를 지정하고 있는지 확인한다
<servlet>
<servlet-name>ProductController</servlet-name>
<servlet-class>ch08.ProductController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProductController</servlet-name>
<url-pattern>/pcontrol</url-pattern>
</servlet-mapping>
🔧 해결법:
위와 같을 시 @WebServlet을 사용할 거면 web.xml의 해당 서블릿 매핑은 사용한다
즉 둘 다 쓰지 말고 한쪽만 사용 한다
▶ 위와 같이 정리 된 후 서버 클릭 후 재 시작한다!
📘 위 오류가 해결이 된 후 두번째 오류가 발생 하였다!


상품목록이 떠야 하는데 F12를 눌러보니 console에서도 에러가 발생하고 있었다.
즉 실제 JSP화면이 빈 테이블만 보이는 현상이었다
🔍 원인 분석
JSP는 정상적으로 열리지만, 해당코드 반복문에서 <c:forEach>가 실행되지 않아 데이터가 보이지 않는 상태였다.
<c:forEach var="p" varStatus="i" items="${projects}">
✅ 🔍 핵심 원인: 변수 이름 불일치 (projects → product)
👉 jsp에서는 ${project}를 찾는데, Controller에서는 아래와 같이 product라는 이름으로 코딩이 되어 있었다.
request.setAttribute("product", service.findAll());
✅ 해결 방법
JSP에서 item="${product}"로 수정한다
<c:forEach var="p" varStatus="i" items="${product}">
▶ 이렇게 하면 컨트롤러에서 넘긴 product라는 이름으로 리스트를 JSP에서 잘 받을 수 있다
🧠 더불어 MVC구조에서 JSP는 직접 실행하는 게 아니라, 컨트롤러를 통해 데이터를 받아야 동작한다!
서블릿 실행에서 톰캣은 항상 서블릿 또는 web.xml을 통해 실행되어야 한다
request.setAttribute 데이터를 JSP에 전달하려면 컨트롤러에서 먼저 세팅해줘야 한다