Top

스프링 부트 + jsp + IntelliJ 조합에서의 404 에러 이슈

기존에 진행하던 프로젝트에 일정 때문에 새롭게 투입되게 되었다.

그래서 개발 환경을 구성했는데 이클립스에서는 잘 돌아가던 프로젝트 소스가 IntelliJ에서는 아래와 같이 404 에러가 발생했다.

이 문제를 해결하기 위해 진행했던 내용을 기록으로 남겨본다.

 

1. 에러 발생 내역


버전 정보

SpringBoot : 1.5.2

IntelliJ : 14.1.6

 

IntelliJ의 Spring Boot Configuration으로 실행하거나, main 클래스를 직접 실행한 경우는 jsp 파일을 찾지 못하고 404 에러를 발생

 

하지만 신기하게도 maven의 spring-boot:run 프로파일을 통해서 실행하는 경우에는 jsp 파일을 잘 찾는다.

 

2. 테스트 내용


검색을 해보면 SpringBoot는 기본적으로 jsp를 지원하지 않는다.

그래서 이를 우회해서 jsp를 사용할 수 있게 하는 방법들이 여러 블로그들에 설명되어 있다.

 

1) pom.xml에 디펜던시 추가

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
</dependency>

 

스프링 부트에 내장된 tomcat에는 jsp 엔진(?)이 포함되어 있지 않기 때문에 tomcat-embed-jasper를 추가하고

jstl을 해석하기 위해서 jstl 디펜던시도 추가해준다.

이 단계에서 의견이 분분한게 이 두개의 디펜던시를 provided로 하느냐 마느냐인데, 여러 글들을 확인해보면 어떤 사람은 provided로 하니까 잘 됐다고 하고, 어떤 사람은 provided를 제외했더니 잘된다고 하는 상황이기 때문에 두가지를 다 테스트 해보기 바란다.

 

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
	<scope>provided</scope>
</dependency>

 

2) 정확한 jsp 파일의 경로 지정

원래 스프링 부트에서 지정하는 template이나 static 폴더가 아니라 아래와 같은 경로에 jsp 파일이 위치해야 한다.

(정확히 저 위치여야만 하는 기술적인 이유가 있는지는 확신이 없지만 대부분이 저 경로로 해서 jsp 파일 구동에 성공했기 때문에 시간이 남아돌지 않는다면 정석대로 하는것을 추천한다)

“src/main/webapp/WEB-INF/jsp”에 jsp 파일 위치

 

3) 뷰 경로 지정

앞서 말했듯이 스프링 부트에서 jsp를 기본 지원하지 않기 때문에 아래와 같은 정보를 application.properties에 설정해서

스프링 부트에게 jsp 뷰의 경로를 알려주어야 한다.

 

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

“application.properties”에 jsp 경로 설정

혹은 main 함수에 아래와 같이 jsp 경로 설정

@Bean
public InternalResourceViewResolver setupViewResolver() {

    InternalResourceViewResolver resolver = new InternalResourceViewResolver();

    resolver.setPrefix("/WEB-INF/view/");
    resolver.setSuffix(".jsp");
    return resolver;
}

 

이렇게 설정한 후 컨트롤러에 @RequestMapping에 return 값으로 해당하는 jsp 파일을 지정해주면

jsp 파일이 성공적으로 로딩되는 것을 확인할 수 있다.

단 mvn spring-boot run으로 실행하는 경우에만 제대로 실행된다.

 

3. 결론


IntelliJ가 톰캣 모듈을 로딩하는 방식이 달라서 그런건지 main 직접 실행이나 spring boot configuration으로는 jsp 파일을 정상적으로 실행하는데 실패하고 말았다.

사실 main을 직접 실행해서 하고 싶은 것은 debug 모드를 사용하기 위해서였으므로 할 수 없이 remote debugging을 통해서 개발하는 수 밖에 없다.

(스프링 부트 내장 서버를 사용하지 않고 war로 빌드해서 톰캣에 얻어서 사용하는 방법도 있다.)

 

1) 리모트 디버깅을 위한 pom.xml 설정

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <jvmArguments>
            -Dfile.encoding=UTF-8 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
        </jvmArguments>
        <arguments>
            <argument>--spring.profiles.active=dev</argument>
        </arguments>
    </configuration>
</plugin>

 

2) 리모트 디버깅 설정

IntelliJ에서 run>eding configuration 실행

좌측위에 + 버튼 클릭해서 remote 선택

이름을 적당한 이름으로 변경하고

settings의 transport를 socket으로 설정

 

3) 디버깅

스프링 부트 프로젝트를 spring-boot run으로 실행하고, 위에서 설정한 remote 디버깅을 실행하면 spring-boot 프로젝트를 디버깅 할 수 있다.

 

참고

https://stackoverflow.com/questions/44794588/intellij-run-configuration-spring-boot-vs-maven-issues

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-jsp-limitations

kaze

Test

5 Comments
  • Rarekinel

    main 돌려서 하는 이슈를 해결하셨나요?
    내장톰캣쓰는데 디펜던시를 추가해줬음에도 불구하고 JSP 파일이 작동을 안합니다.
    해결하셨다면 피드백좀 꼭 부탁드립니다.

    2018-07-03 at 1:55 pm Reply
    • kaze

      Intellij 14.x 버전에서는 main으로 실행하는 것은 실패했습니다.
      그런데 2018.1.4 버전으로 해보니 별다른 걸 하지 않아도 main으로도 잘 돌아가더군요
      maven이나 spring boot run으로 실행하는게 싫으시고 꼭 main으로 실행하고 싶다면
      Intellij를 버전업해서 해보세요~

      2018-08-02 at 9:30 am Reply
  • k2b

    org.apache.tomcat.embed
    tomcat-embed-jasper
    compile

    2018-09-08 at 10:58 am Reply
    • k2b

      tomcat-embed-jasper
      compile

      2018-09-08 at 10:58 am Reply
  • k2b

    pom.xml에
    tomcat-embed-jasper
    scope을 compile 로 하면 잘되는듯 합니다.

    2018-09-08 at 11:00 am Reply

Post a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.