이클립스에서는 잘 돌아가던 프로젝트 소스가 IntelliJ에서는 아래와 같이 404 에러가 발생
1. 에러 발생 내역
There was an unexpected error (type=Not Found, status=404).
/WEB-INF/jsp/hello.jsp
버전 정보
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에 디펜던시 추가
스프링 부트에 내장된 tomcat에는 jsp 엔진(?)이 포함되어 있지 않기 때문에 tomcat-embed-jasper를 추가하고
jstl을 해석하기 위해서 jstl 디펜던시도 추가해준다.
이 단계에서 의견이 분분한게 이 두개의 디펜던시를 provided로 하느냐 마느냐인데, 여러 글들을 확인해보면 어떤 사람은 provided로 하니까 잘 됐다고 하고, 어떤 사람은 provided를 제외했더니 잘된다고 하는 상황이기 때문에 두가지를 다 테스트 해보기 바란다.
2) 정확한 jsp 파일의 경로 지정
원래 스프링 부트에서 지정하는 template이나 static 폴더가 아니라 아래와 같은 경로에 jsp 파일이 위치해야 한다.
(정확히 저 위치여야만 하는 기술적인 이유가 있는지는 확신이 없지만 대부분이 저 경로로 해서 jsp 파일 구동에 성공했기 때문에 시간이 남아돌지 않는다면 정석대로 하는것을 추천한다)
“src/main/webapp/WEB-INF/jsp”에 jsp 파일 위치
3) 뷰 경로 지정
앞서 말했듯이 스프링 부트에서 jsp를 기본 지원하지 않기 때문에 아래와 같은 정보를 application.properties에 설정해서
스프링 부트에게 jsp 뷰의 경로를 알려주어야 한다.
“application.properties”에 jsp 경로 설정
혹은 main 함수에 아래와 같이 jsp 경로 설정
이렇게 설정한 후 컨트롤러에 @RequestMapping에 return 값으로 해당하는 jsp 파일을 지정해주면
jsp 파일이 성공적으로 로딩되는 것을 확인할 수 있다.
단 mvn spring-boot run으로 실행하는 경우에만 제대로 실행된다.
3. 결론
IntelliJ가 톰캣 모듈을 로딩하는 방식이 달라서 그런건지 main 직접 실행이나 spring boot configuration으로는 jsp 파일을 정상적으로 실행하는데 실패하고 말았다.
사실 main을 직접 실행해서 하고 싶은 것은 debug 모드를 사용하기 위해서였으므로 할 수 없이 remote debugging을 통해서 개발하는 수 밖에 없다.
(스프링 부트 내장 서버를 사용하지 않고 war로 빌드해서 톰캣에 얻어서 사용하는 방법도 있다.)
1) 리모트 디버깅을 위한 pom.xml 설정
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
'IT칼럼 > JAVA' 카테고리의 다른 글
Calendar 날짜를 기준으로 요일 정보 받아오기 (0) | 2019.04.06 |
---|---|
Spring Boot + MyBatis 에서 SQL Result 로그찍기 (0) | 2019.03.30 |
isPalindrome (0) | 2019.03.08 |
Comparable vs Comparator (0) | 2018.11.04 |
BigInteger, BigDecimal example (0) | 2018.11.04 |