코딩하는 털보

Spring Framework - 11 본문

IT Study/Spring Framework

Spring Framework - 11

이정인 2020. 12. 18. 18:58

스프링 부트에서 JSP 사용하기

의존성 추가 (maven)

jstl, jsp 사용을 위한 의존성 추가가 필요하다.

        <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>

WAR 프로젝트

스프링 부트 프로젝트에서 jsp를 사용하려면 WAR 패키지 설정으로 생성해야 한다.
WAR 패키지 설정의 스프링 부트 프로젝트의 특징은 @SpringBootApplication 클래스 외에
WebApplicationInitializer를 구현한 ServletInitializer 클래스가 웹서버 배포를 위해 추가로 생성된다.

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoJspApplication.class);
    }

}

Controller 생성

메서드의 리턴(String)으로 jsp view를 찾을 수 있도록 생성

@Controller
public class EventController {

    @GetMapping("/events")
    public String getEvents(Model model) {
        Event event1 = new Event();
        event1.setName("study 1");
        event1.setStart(LocalDate.of(2020,10,10));
        Event event2 = new Event();
        event2.setName("study 2");
        event2.setStart(LocalDate.of(2020,10,20));

        List<Event> events = List.of(event1,event2);

        model.addAttribute("events",events);
        model.addAttribute("message","Study Harder");

        return "events/list";
    }
}

jsp view 생성

jsp view는 webapp 디렉토리에 있어야하며 스프링 부트가 이 디렉토리를 미리 만들어주지 않기 때문에 직접 생성해야 한다.
webapp/WEB-INF/jsp/events/list.jsp
태그 선언을 통해 core 라이브러리 사용

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Events</title>
</head>
<body>
    <h1>이벤트 목록</h1>
    <h2>${message}</h2>
    <table>
        <tr>
            <th>이름</th>
            <th>시작</th>
        </tr>
        <c:forEach items="${events}" var="event">
            <tr>
                <td>${event.name}</td>
                <td>${event.start}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

application.properties 설정

viewResolver가 view를 찾을 수 있도록 prefix/suffix 설정

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

패키징

스프링 부트 애플리케이션은 Maven이 따로 설치되어있지 않더라도 mvnw 명령을 통해
Maven으로 빌드할 수 있다.

./mvnw package

빌드가 완료되면 WAR 파일이 생성된다. (target/???-0.0.1-SNAPSHOT.war)

실행

java -jar

WAR파일도 java -jar 를 통해 독립적으로 실행할 수 있다.

java -jar target/*-0.0.1-SNAPSHOT.war

@SpringBootApplication 클래스의 SpringApplication.run 이 사용되며,
스프링 부트 애플리케이션의 내장 톰캣이 사용된다.

서블릿 컨테이너에 배포하는 경우

ServletInitializer 클래스가 있기 때문에 톰캣 등 웹서버에 배포할 수 있다.
SpringBootServletInitializer를 사용하여 실행된다.
내장 톰캣을 사용하는게 아니고 별개의 웹서버에 서블릿을 등록하여 실행된다.

참고로, 스프링 부트는 몇가지 제약 사항때문에 jsp 사용을 피하길 권고한다.

  • JAR 프로젝트로 만들 수 없다.
  • WAR는 java -jar로 실행할 수는 있지만, "실행가능한 jar 파일"은 지원하지 않는다.
  • 언더토우 서블릿 컨테이너는 jsp를 지원하지 않는다.
  • Whitelabel 에러 페이지를 error.jsp로 오버라이딩할 수 없다.
Comments