2016년 1월 3일 일요일

SPRING BOOT에서 JSP 사용하기

 JAVA 기반의 WEB 개발은 SPRING을 거의 쓰다시피 했는데 요즘은 SPRING BOOT를 쓰고 있다.

SPRING을 쓰면서 가장 크게 느꼈던 점은 PHP나 node.js로 웹개발을 할 때에 비해서 초기 세팅에 들어가는 노력이 너무 커서 캐주얼하게 쓸 엄두가 나지 않았다는 점인데 SPRING BOOT는 그 점에 있어서 매우 간편하게 웹개발을 할 수 있어서 장점이 많다.

SPRING FRAMEWORK를 기반으로 SPRING MVC 쓸 때와 달리 가장 큰 차이점은 boot는 static폴더와 templates 폴더가 있어서 리소스 파일(css 나 js)은 static 폴더에 템플릿(thymeleaf나 velocity 등등)은 templates 폴더에 넣으면 알아서 기본 설정된 경로로 잘 작동하게 해 준다는 점인데 아무래도 thymeleaf 나 velocity는 그다지 정이 가지 않아서 JSP를 애용하는 편.

SPRING BOOT 프로젝트를 만들기 위해서는 http://start.spring.io/ 에서 프로젝트 정보와 사용할 의존성 정보만 입력해주면 손쉽게 MAVEN 이나 GRADLE 프로젝트를 생성 가능하다. 이 프로젝트를 이클립스에서 IMPORT 하면 기본적인 설정이 끝난다.

그러나 SPRING BOOT 에서 JSP를 쓰려면 약간의 손을 봐줘야 한다.

1. spring-boot-starter-web 에 포함된 tomcat은 JSP엔진을 포함하지 않는다.

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

와 같이 jasper 및 jstl 을 의존성에 포함시켜줘야 JSP파일 구동이 가능하다.

2. JSP 파일은 SPRING BOOT 기본 templates 폴더 안에서 작동하지 않는다
위의 사항을 설정하고 나서 templates 폴더 안에 jsp 파일을 만들고 아무리 접속을 하려해도 404 Not found가 뜬다. view resolver의 prefix를 명시적으로 /templates 로 해도 마찬가지

http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-jsp-limitations
여기에 있는 JSP와 관련된 제약 사항과 관련이 있는 것 같은데, WAS에 대한 지식은 모자라서 원인을 정확히 설명할 수 없다. 어쨌거나간에 일반적인 웹프로젝트에서 사용했던 src/main/webapp/WEB-INF/ 폴더를 직접 만들어준 다음 그곳에 jsp파일을 넣어야한다. 나는 /WEB-INF/ 밑에 jsp 폴더를 하나 더 만들어봤다.
그런 뒤 application.properties에
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
를 추가 해 주고

@RequestMapping("/")
 public String index(){
  return "index";
 }
이런 함수를 컨트롤러에 추가 해 준 뒤에 src/main/webapp/WEB-INF/jsp/index.jsp 를 만들어 넣으면 localhost/ 에 접속했을 때 index.jsp를 정상적으로 불러올 수 있다.

댓글 10개:

  1. 아.. 이것때문에 삽질 엄청했는데.. 진짜 왜 이렇게 만들까요
    스프링하면서 온갖 정 다 떨어지네요 ㅜㅜ

    답글삭제
  2. 아.. 진짜 2시간 삽질했어요 감사합니다..

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
  4. 이클립스에서 JSP 파일 수정하고 바로 적용은 안되나요?
    SpringBoot를 재시작해야지 적용되요 ㅠㅠ

    답글삭제
  5. 감사합니다. 이 글 덕분에 한참을 헤메지 않아도 되었네요 :D

    답글삭제
  6. 왜 안될까 고민 많이 했는데 좋은글 감사합니다.

    답글삭제
  7. 삽질 해결했네요 ㄷㄷㄷ mustache 템플릿으로 html제어가 되서 jsp도 될 줄 알았는데 안되서 당황 ;; 좋은 글 감사합니다.

    답글삭제
  8. 허허... 딱 하나 적은 글인데 이 글 하나로 유입이 거의 2년째 되고 있다니 다들 감사합니다...

    답글삭제
  9. 감사합니다. 해결했습니다

    답글삭제
  10. 새로운 블로그는 https://springboot.cloud 입니다

    답글삭제