[Spring MVC] No Mapping for GET WEB-INF/views/main.jsp

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를 추가할 것이 없다고 나도 모르게(?) 생각했다.

 

조만간 정리해야지..