0. 배경
- start.spring.io에서 Maven 기반으로 Spring Web dependency를 추가해 Spring MVC 프로젝트 생성하기
- DispatcherServlet을 Front Controller로 설정하기
- DispatcherServlet의 설정 정보를 담는 Configuration 클래스에서 addViewControllers() 메소드 오버라이드하기
- addViewControllers()를 사용하여 컨트롤러 없이 "/" URL에 대한 요청에 main.jsp 뷰를 응답으로 제공하기
1. 문제 상황
# WebMvcContextConfiguration.java
// 특정 URL에 대한 처리를 컨트롤러 클래스를 작성하지 않고 매핑할 수 있도록 해줌
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers가 호출됨");
registry.addViewController("/").setViewName("main"); // "/"로 요청이 들어오면 "main"이라는 뷰를 보여주도록 함
}
// 뷰 이름만으로는 실제 뷰 정보를 찾을 수 없기에, ViewResolver를 사용해야 함
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
// 뷰 이름 앞뒤로 붙여서 뷰 파일 경로를 찾음
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
- 위와 같이 코드를 작성하고 애플리케이션을 실행한 후 localhost:8080에 접속함
- 404 에러와 함께 설정한 파일 경로에 매핑할 수 없다고 함
2. 해결 과정
- 오타가 있는지, 파일을 잘못된 경로에 만들었는지 확인함 (이상 없음)
- main.jsp만 보여주지 못하는 것인지 확인하기 위해 index.html 을 만들어서 확인해봄 (index.html은 잘 출력됨)
- jsp 파일 관련해서 문제가 있구나
3. 원인
- Spring Boot 프로젝트에서 jsp를 사용하려면 "tomcat-embed-jasper" dependency를 추가해야 한다는 것을 발견
- pom.xml에 추가해줌
https://stackoverflow.com/questions/42154614/springboot-embedded-tomcat-and-tomcat-embed-jasper
springboot embedded tomcat and tomcat-embed-jasper
I sometimes see these following declaration in pom.xml... <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s...
stackoverflow.com
# pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mvcexam</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mvcexam</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
알아야 할 것
1. Spring Framework vs Spring Boot
2. web.xml vs pom.xml
구글링하면서 이런 개념들이 명확하지 않으니 헷갈렸다.
start.spring.io에서 Spring 프로젝트를 생성한 거라 따로 dependency를 추가할 것이 없다고 나도 모르게(?) 생각했다.
조만간 정리해야지..
'트러블슈팅' 카테고리의 다른 글
[MySQL] Docker로 Mac M1에 MySQL 설치하기 (0) | 2023.11.05 |
---|---|
[Spring Boot] Lombok cannot find symbol 에러 (0) | 2023.10.12 |
[JavaScript] addEventListener is not a function (0) | 2023.07.14 |
[Servlet] Maven 프로젝트 Tomcat 연동 Servlet 실행하기 (Intellij) (0) | 2023.06.21 |