Application Servers & Java

ServletException – Could not resolve view with name 'index'

midworker 2025. 5. 20. 21:51
반응형

Spring MVC 기반 웹 애플리케이션에서 다음과 같은 오류가 발생하는 경우가 있습니다.


에러 메시지

javax.servlet.ServletException: Could not resolve view with name 'index' in servlet with name 'servlet'

원인 분석

이 오류는 Spring MVC가 컨트롤러에서 반환한 뷰 이름 "index"실제 물리적 템플릿 파일로 매핑하지 못했을 때 발생합니다.

흔한 원인

  1. 해당 뷰 파일(JSP, Thymeleaf 등)이 존재하지 않음
  2. 뷰 리졸버(ViewResolver) 설정 오류
  3. 접두어(prefix) 또는 접미어(suffix)가 잘못 설정됨
  4. 템플릿 경로 오타 또는 디렉토리 누락

예를 들어, 다음 컨트롤러가 있다고 가정할 때:

@GetMapping("/")
public String index() {
    return "index";
}

Spring은 "index"라는 이름을 가지고 다음과 같이 경로를 해석합니다:

  • JSP 환경: /WEB-INF/views/index.jsp
  • Thymeleaf 환경: classpath:/templates/index.html

하지만 해당 파일이 존재하지 않으면 예외가 발생합니다.


해결 방법

1. 뷰 파일 존재 여부 확인

  • JSP 환경: /WEB-INF/views/index.jsp가 실제 존재하는지 확인
  • Thymeleaf 환경: src/main/resources/templates/index.html 파일이 있는지 확인

2. ViewResolver 설정 확인

JSP 예시 (Spring Boot 외 일반 설정):

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

Spring Boot + Thymeleaf 예시:

spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html

3. 리턴 값과 실제 파일명 일치 확인

컨트롤러에서 반환하는 뷰 이름이 실제 파일명과 정확히 일치하는지 확인합니다.

return "index"; // → /WEB-INF/views/index.jsp 또는 templates/index.html

대소문자 구분, 확장자 누락, 경로 오타 등을 철저히 점검해야 합니다.


4. Redirect 혹은 Forward 전략 고려

특정 페이지를 직접 출력하는 것이 아니라면, 뷰 이름 대신 redirect 또는 forward를 명시할 수도 있습니다.

return "redirect:/home";
return "forward:/WEB-INF/views/index.jsp";

결론

이 에러는 대부분 뷰 파일 누락이나 뷰 리졸버 설정 오류에서 기인합니다.
정확한 뷰 경로와 이름, 설정을 점검하는 것만으로도 빠르게 문제를 해결할 수 있습니다.
개발 초기 설정 단계나 파일 구조 변경 시 꼭 점검해야 할 항목 중 하나입니다.


반응형