본문 바로가기
Java/Spring Boot

Spring Boot + JSP 연동 (서버 재시작 없이 jsp 수정 사항 반영하기)

by 산코디 2023. 1. 4.

오늘은 스프링 부트에서 JSP 연동하는 방법과 서버 재시작 없이 JSP의 수정 사항 반영하는 방법에 대해 정리해 보려고 한다. 
스프링 부트로 개발 환경을 구축하게 되면 기본 템플릿 엔진으로 Thymeleaf를 사용하게 된다. 그러나 Thymeleaf가 아닌 JSP를 연동해야 하는 경우가 있다. 그런데 JSP를 연동하는 이유는 전통적인 웹 개발 방식이 익숙한 경우와 기존에 개발된 JSP 기반의 프로젝트를 마이그레이션하는 등 용이한 부분이 있고, 자바와 HTML을 쉽게 다루며 동적인 웹 페이지를 개발할 수 있다는 점이 있다.


스프링 부트와 JSP의 연동?

스프링 부트(Spring Boot)와 JSP(Java Server Pages)를 연동하는 것은 전통적인 방식으로 웹 애플리케이션을 개발하고 구축하는 방법 중 하나다. 


JSP (Java Server Pages)
JSP는 서버 측에서 동적 웹 페이지를 생성하기 위한 기술로, HTML 내에 자바 코드를 포함할 수 있으며, 이를 통해 동적 컨텐츠를 생성하고 웹 애플리케이션의 비즈니스 로직과 사용자 인터페이스를 통합할 수 있다.

스프링 부트와 JSP
스프링 부트에서 JSP를 사용하려면 spring-boot-starter-web 의존성을 추가하고, src/main/webapp/WEB-INF/views 디렉토리에 JSP 파일을 배치한다. 스프링 부트는 기본적으로 내장된 Tomcat을 사용하여 JSP를 처리하므로 별다른 설정 없이도 사용할 수 있다.

JSP 파일의 위치
스프링 부트에서 JSP 파일은 기본적으로 src/main/webapp/WEB-INF/views 디렉토리에 위치해야 하며, 이 디렉토리는 기존의 전통적인 웹 애플리케이션 구조를 따르며, 보안상의 이유로 JSP 파일에 직접적으로 접근할 수 없도록 한다.

컨트롤러와의 연동
JSP 파일은 스프링의 컨트롤러(Controller)에서 모델 데이터를 받아서 화면에 표시하는 데 사용되며, 컨트롤러는 모델 데이터를 JSP 파일에 전달하고, JSP는 이 데이터를 동적으로 렌더링하여 클라이언트에게 전송한다.


JSP는 비즈니스 로직과 뷰 템플릿이 혼합되어 있어 유지 보수가 어려울 수 있고, 보안 이슈가 발생할 수 있다. 또한, JSP의 사용은 서버 측에서의 렌더링으로 인해 성능 저하를 가져올 수 있다. 스프링 부트와 JSP를 함께 사용하는 것은 전통적인 웹 애플리케이션을 개발하는 데 유용할 수 있지만, 최신 트렌드에 맞춰 Thymeleaf나 React 등의 뷰 렌더링 기술을 고려하는 것도 좋다.


그러면 이제 스프링 부트와 JSP 연동하는 방법을 하나씩 정리해 보자.


pom.xml 라이브러리 추가
개발 환경의 프로젝트 관리 도구로 maven을 사용하여 세팅한다.

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

가장 먼저 스프링 부트 내의 pom.xml 파일에 위의 종속성(dependency)를 추가한다.

org.apache.tomcat.embed:tomcat-embed-jasper
해당 종속성은 내장형 Tomcat에 JSP를 렌더링하기 위한 Jasper 라이브러리를 포함한다. 스프링 부트는 내장된 Tomcat을 기본적으로 제공하며, 이 라이브러리를 추가함으로써 내장된 Tomcat이 JSP를 처리할 수 있도록 한다.

javax.servlet:jstl
JSTL(JavaServer Pages Standard Tag Library)은 JSP에서 반복문, 조건문 등을 사용할 수 있도록 지원하는 라이브러리다. 이 종속성은 JSP 페이지에서 JSTL 태그를 사용하기 위해 필요한 라이브러리를 지정한다. 버전 1.2는 JSTL의 표준 버전 중 하나로, 주로 스프링 부트와 함께 사용된다.


위와 같이 정의된 종속성은 Maven 빌드 도구를 사용하여 프로젝트를 빌드할 때 스프링 부트 프로젝트 내에서 JSP를 사용할 수 있도록 환경을 설정할 수 있다.


JSP 경로 생성

jsp 경로 생성 캡쳐 화면
jsp 경로 생성

- Spring Boot의 기본 경로 : src/main/resources/templates/
- JSP의 경로 : src/main/webapp/WEB-INF/jsp/views/

위와 같이 JSP 경로를 생성하는 것은 웹 애플리케이션에서 사용되는 JSP 파일의 경로를 쉽게 관리하기 위한 것이다. 주로 웹 애플리케이션에서는 여러 JSP 파일을 사용하고 이를 적절히 호출하거나 포함시켜야 한다. 이 때, JSP 경로 생성을 통해 경로를 동적으로 생성하고 유지보수를 용이하게 할 수 있다.

JSP 경로 설정
application.properties 또는 application.yml 파일에 아래 속성 추가

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

위의 설정은 스프링부트에서 JSP를 기본으로 지원하지 않기 때문에 JSP의 경로 정보를 설정해 주어야 한다.

spring.mvc.view.prefix=/WEB-INF/jsp/
이 설정은 JSP 파일의 경로(prefix)를 지정하며, 여기서 /WEB-INF/jsp/는 JSP 파일이 위치한 디렉토리를 나타낸다. 이 디렉토리는 일반적으로 보안상의 이유로 웹 브라우저에서 직접 접근할 수 없는 위치에 있다.

spring.mvc.view.suffix=.jsp
이 설정은 JSP 파일의 확장자(suffix)를 지정하며, 여기서 .jsp는 JSP 파일의 확장자는 나타낸다.

위에서 생성한 경로의 prefix와 jsp의 확장자 정보 suffix로 설정을 주도록 한다.

반응형

Mapping Controller 생성

JSP 연동 설정은 끝이고, 연동이 잘 됐는지 확인하기 위해 Test Controller를 만들고 JSP와 연동되는 mapping 경로를 생성하였다.


controller package & class 생성

controller package & class 생성 화면
controller package & class 생성

위와 같이 com.demo.system.test 패키지를 생성하고 패키지 내에 TestController 파일을 생성하였다.


java controller 소스 코드

package com.demo.system.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

	@RequestMapping("/test")
	public String test () {
		return "views/test";
	}
}

위에서 설정한 jsp의 prefix, suffix의 경로 정보를 제외하고 mapping 경로를 세팅하였다.

src/main/webapp/WEB-INF/jsp/views/test.jsp

prefix, 경로, suffix

위와 같이 가운데의 경로 정보만 매핑할 수 있도록 한다.

test.jsp 소스 코드

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	Spring Boot + JSP 연동 테스트
</body>
</html>

jsp 소스는 간단하게 body 영역에 문구만 추가하였다.

JSP 연동 화면 테스트

JSP 연동 테스트를 위한 서버 실행 화면

설정이 모두 끝난 후 boot dashboard를 통해 프로젝트를 실행한다.

 

Spring Boot와 JSP 연동 화면 출력 테스트

생성한 경로로 연동이 잘 돼서 화면 출력이 된 것을 확인할 수 있다.

간단하게 JSP로 구성된 화면이지만 JSP 소스를 수정할 때마다 프로젝트를 매번 재시작을 해줘야 하는 번거로움이 있다.

그래서 다음 설정을 추가해 주면 재시작 없이 수정된 사항을 빠르게 테스트가 가능하다.


JSP 재시작 없이 수정 반영 설정

application.properties 또는 application.yml 파일에 아래 속성 추가

# ---------------------------
# jsp 재시작 없이 수정 반영 설정
# ---------------------------
# spring boot 3.x 버전 기준
spring.devtools.remote.restart.enabled=true
# spring boot 2.x 버전 기준
devtools.livereload.enabled=true
# spring boot 1.x 버전 기준
server.jsp-servlet.init-parameters.development=true

위의 설정은 각각의 스프링 부트 버전에 따라 JSP 파일을 수정했을 때 서버를 재시작하지 않고도 변경 사항이 즉시 반영되도록 하는 방법을 설정하는 값이다.

3.x 버전 기준 ( spring.devtools.remote.restart.enabled=true )
Spring Boot 3.x에서는 DevTools를 사용하여 원격으로 애플리케이션을 재시작할 수 있다. 이 설정은 변경된 코드를 감지하고 원격 서버에서 애플리케이션을 자동으로 다시 시작한다.

2.x 버전 기준 ( devtoolslivereload.enabled=true )
Spring Boot 2.x에서는 라이브 리로드 기능을 사용하여 JSP 파일을 수정할 때 브라우저를 새로 고침하지 않아도 변경 사항이 즉시 반영된다. 라이브 리로드는 브라우저와 서버 간의 연결을 유지하고, 변경 사항이 감지되면 자동으로 페이지를 다시 로드한다.

1.x 버전 기준 ( server.jsp-servlet.init-parameters.development=true )
Spring Boot 1.x에서는 JSP 개발 모드를 활성화하여 JSP 파일을 수정할 때 서버를 다시 시작하지 않고 변경 사항을 즉시 반영할 수 있다. 이 설정은 개발 중에만 사용되며, 프로덕션 환경에서는 권장되지 않는다.


해당 설정을 사용하면 JSP 파일을 수정하고 서버를 재시작하지 않아도 변경 사항을 빠르게 반영되어 개발 효율성을 높일 수 있다.

spring boot 3.x 버전의 설정 정보를 적용할 때에는 아래의 라이브러리도 같이 추가를 해야 한다!

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

 


실행 결과

Spring Boot + JSP 연동 재시작없이 설정 추가 후 테스트 화면

서버 재시작 없이 새로고침으로만 적용이 잘 되고 있는 화면을 확인할 수 있다.

 


마무리

오늘은 스프링 부트와 JSP 연동하는 방법, 재시작 없이 JSP의 수정 사항을 즉시 반영하는 방법에 대해서 정리해 봤다. 스프링 부트와 JSP는 정말 흔하고 다양한 업무 환경에서 꾸준히 사용되는 기술들이다. 요즘 새로운 기술이 많이 나오더라도 전통적인 방식을 구축하고 개발해 보는 것도 웹 애플리케이션의 업무 스킬을 향상시키는 데에 많은 도움이 된다.

JSP 개발을 안 한 지는 오래됐지만, 언제 다시 JSP를 개발하게 될지 모르니 이렇게 틈틈이 글로 작성해 정리해야겠다.

 


* Spring Boot 프로젝트 생성

https://sancode.tistory.com/32

 

Spring Boot 프로젝트 생성 시작하기

안녕하세요. java 프로젝트를 여러번 진행하다 보면 자주 마주하는 Spring Boot 관련하여 포스팅을 하였습니다. 개발 환경 - 운영체제 : mac - eclipse : eclipse 4.22.0 - 1. 이클립스 실행 먼저 사용하는 eclips

sancode.tistory.com

 

반응형