데브코스 강의 도중에 발생한 문제
위 과정에서 발생한 오류를 해결했다.
강의에서는 tomcat 8 버전 사용을 권장.
하지만 이렇게 하면 서버 자체가 띄워지지 않는다.
http 500 status.
원인은 톰캣 버전과 SpringBoot 버전 호환성 문제.
최신 SpringBoot 버전인 3.1에서는 톰캣 10버전을 사용해야 한다고 함.
아울러 내 프로젝트는 java EE 10 버전, jdk 17 버전이기 때문에,
톰캣 버전을 8버전으로 낮춰서 쓰기 위해서는 변경해야 할 부분이 너무 많았다.
결국 톰캣 10버전을 사용하기로 결정.
네 종류의 서버 에러가 발생했다.
jsp 나 thymeleaf를 이용해서 직접 서블릿을 구현하고 등록하기 위해서 DispatcherServlet을 만들었다.
생성한 DispatcherServlet을 ServletContext에 등록했고, url 매핑도 했다.
하지만 서버에러 500이 발생했다.
원인은 매핑 때문이었다.
var servletRegistration = servletContext.addServlet("test", dispatcherServlet);
servletRegistration.addMapping("/");
servletRegistration.setLoadOnStartup(1);
2번째 줄 addMapping 에서 매핑을 "/" 이렇게만 해줘야 한다고 한다.
org.springframework.web.servlet.PageNotFound - No mapping for GET
콘솔에 이런게 떠 있었다.
단순히 생각해도 GET 매핑이 잘 못 되었다길래 컨트롤러를 이것저것 고치고 있었다.
삽질이었다.
원인은 으엄청 간단했다.
브라우저 url에 컨트롤러 requestmapping으로 설정한 경로로 접근하면 된다.
controller에 선언한 url mapping 위치로 이동해야 한다는 의미.
서버 띄울때 디폴트로 열리는 localhost:포트번호
이거 말고,
localhost:포트번호/url
이걸로 접근해야 한다는 말이다.
만약에 context-path를 설정했다면 url 이전에 해당 경로도 함께 적어주어야 한다.
호스트이름:포트번호/context-path/url
위 uri 형식으로 접근하면 된다.
나는 이 간단한 걸 몰라서 맞왜틀 오지게 함.
에러 메시지
java.lang.NoClassDefFoundError:
javax/servlet/jsp/tagext/TagLibraryValidator
원인은 톰캣 버전과 jstl 버전이 맞지 않기 때문에 발생하는 문제.
엄밀히 말하면,
우리가 사용하는 톰캣 10버전에서는 jstl 1.x 버전이 제대로 구동되지 않는다고 한다.
따라서 jstl 을 최신버전인 2.0으로 올려서 빌드 의존성을 추가해주면 된다.
// jstl
implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0'
이렇게 해주면 된다.
여담으로, 기존 javaEE 가 jakartaEE로 이름을 바꿨다고 한다.
기관명이 바뀐 것 뿐이므로, import 할 때 groupid가 javax가 아니라 jakarta 라고 놀랄 필요는 없다.
org.apache.jasper.JasperException:
절대 URI인 [http://java.sun.com/jsp/jstl/core]을(를), web.xml
또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다.
서버를 띄우면 브라우저에 이런 에러 메시지가 나온다.
원인은 톰캣 라이브러리에 jsp JAR 라이브러리가 없기 때문.
이렇게 톰캣 라이브러리에 jsp를 추가해주면 해결된다.
요는 사용하고 있는 jstl 라이브러리를 톰캣 라이브러리에 추가해주면 된다.
배포 설정에서 해당 라이브러리를 배포에 포함시키는 것도 잊지 말아야 한다.
노파심에 말하는데 모든 과정을 다 한 후에
404 에러
가 발생하거나, representation을 찾을 수 없다
메시지가 뜨면 브라우저 url 접근은 컨트롤러에 매핑한 주소로 접근해야 한다.
바보짓 ㄴㄴ