Spring Boot에서 JSP를 쓰면 안 되는 진짜 이유 (Thymeleaf 마이그레이션 후기)

오늘은 실무에서 자주 마주치게 되는 Spring Boot와 JSP 조합의 문제점에 대해 이야기해 보려고 합니다. 제가 SI 프로젝트를 하면서 경험한 내용을 바탕으로, 왜 Spring Boot 공식 문서에서 JSP 사용을 권장하지 않는지 쉽게 설명해 드릴게요.

스프링 부트에서 JSP와 Thymeleaf 비교 이미지


1. Spring Boot에서 JSP를 쓰면 안 좋은 이유

1.1. JAR 패키징이 안 돼요

Spring Boot의 가장 큰 매력은 뭘까요? 바로 "JAR 파일 하나로 어디서든 실행 가능하다"라는 점입니다. 그런데 JSP를 사용하면 이 장점이 사라져요.

$ java -jar myapp.jar

위 명령어 한 줄로 애플리케이션을 실행할 수 있는 편리함이 JSP를 쓰면 사라집니다. JSP는 JAR 패키징에서 제대로 작동하지 않기 때문에 WAR 파일로 배포해야 하고, 이는 별도의 설정을 필요로 합니다.

저는 실제 현장에서 JSP를 사용하면서 WAR 파일로 배포해야 하는 점 때문에 배포 과정이 상당히 복잡해지는 걸 경험했습니다. 그리고 클라우드 환경이나 Docker 컨테이너에 배포할 때 까다롭다고 하네요.


1.2. 개발 환경이 복잡해져요

JSP를 쓰려면 특정 폴더 구조를 따라야 하고, 별도의 라이브러리 의존성도 추가해야 합니다. 프로젝트 설정이 복잡해지죠.

dependencies {
compileOnly 'org.apache.tomcat.embed:tomcat-embed-jasper'
implementation 'javax.servlet:jstl:1.2'
}

그리고 application.properties에는 이런 설정도 추가해야 합니다:

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

최초 JSP 환경을 세팅할 때 귀찮기도 하고, 각 의존성이나 설정이 무슨 역할을 하는지도 신경 쓰이죠.


1.3. 일부 WAS와 호환성 문제가 있어요

Spring Boot는 여러 WAS를 선택할 수 있는 장점이 있습니다. 그런데 JSP는 일부 WAS와 호환성 문제가 있어요.

예를 들어, Undertow는 JSP를 공식적으로 지원하지 않습니다. 또한 최근 각광받고 있는 GraalVM 네이티브 이미지와도 호환성 문제가 있습니다.

MSA 아키텍처에서 Undertow가 높은 성능으로 인해서 많이 선호되는 추세인데 JSP를 사용한다면 Undertow를 포기하거나 많은 고민을 해야 할 수 있어요.


1.4. Hot Reload가 제대로 안 돼요

개발할 때 코드를 변경하면 자동으로 반영되는 Spring Boot Devtools의 Hot Reload 기능은 개발 생산성에 큰 도움이 됩니다. 하지만 JSP는 이 기능이 제대로 작동하지 않아요.

// JSP 파일 수정 후
// 브라우저 새로고침해도 변경사항이 반영 안 됨
// 서버를 재시작해야 함

화면 수정 작업이 잦아지다 보면 계속해서 서버 재시작 되는 로그가 보이는 게 큰 스트레스를 줍니다. 저는 다행히 대부분의 화면이 iframe으로 되어 있어서 해당 frame만 새로고침 하면서 개발했었습니다. 하지만 이마저도 아래와 같은 설정을 application.properties에 또 추가해야 했습니다.

server.jsp-servlet.init-parameters.development=true


1.5. 비즈니스 로직과 화면 코드가 섞일 가능성이 높아요

JSP는 자바 코드를 직접 삽입할 수 있어서 편리하지만, 이것이 오히려 독이 될 수 있습니다. 스크립틀릿(Scriptlet)이라고 하죠.

<%
// 이런 코드가 JSP에 직접 들어가는 경우가 많았어요
List<User> users = userService.findAllUsers();
for(User user : users) {
// ...
}
%>

JSP의 대표적인 단점 중 하나입니다. 과거에는 이 문제 때문에 JSTL이 많이 사용되기도 했었습니다. 안 쓰면 되긴 하지만 저는 스크립틀릿이 하나도 들어가지 않은 JSP 프로젝트는 보지 못한 것 같습니다.


2. Thymeleaf는 어떤 점이 좋을까요?

Spring Boot 공식 문서에서는 JSP 대신 Thymeleaf 같은 템플릿 엔진을 권장합니다. 이유가 뭘까요?


2.1. JAR 패키징이 가능해요

Thymeleaf는 JAR 패키징을 완벽하게 지원합니다. 따라서 Spring Boot의 가장 큰 장점인 "단일 JAR 파일로 배포"가 가능해집니다.

$ java -jar myapp.jar  // 이렇게 간단하게 실행 가능!

이렇게 하면 클라우드 환경이나 Docker 컨테이너에 배포할 때 편리합니다.


2.2. 웹 브라우저에서 직접 템플릿 확인이 가능해요

Thymeleaf의 가장 큰 장점 중 하나는 "natural templates"입니다. 즉, 서버를 실행하지 않고도 웹 브라우저에서 템플릿을 열어볼 수 있어요.

<span th:text="${welcome}">Hello, World!</span>

위 코드를 서버 없이 브라우저에서 열면 "Hello, World!"가 표시됩니다. 서버에서 실행하면 ${welcome} 변수의 값으로 대체됩니다. 이 덕분에 디자이너나 퍼블리셔와의 협업이 훨씬 편해집니다.


2.3. 비즈니스 로직과 완전히 분리돼요

Thymeleaf는 HTML에 특별한 속성을 추가하는 방식으로 동작하기 때문에, 자바 코드와 화면 코드가 완전히 분리됩니다.

<tr th:each="user : ${users}">
<td th:text="${user.name}">홍길동</td>
<td th:text="${user.email}">hong@example.com</td>
</tr>

이런 방식으로 코드를 작성하면 비즈니스 로직은 컨트롤러에, 화면 표시 로직은 템플릿에 분리되어 유지 보수가 훨씬 쉬워집니다.


3. 실무에서 경험한 마이그레이션 사례

제가 참여했던 한 프로젝트에서는 기존 시스템을 업그레이드하면서 JSP 기반 시스템을 Thymeleaf로 마이그레이션했습니다. 다행히 Thymeleaf의 초기 학습 비용은 그리 크지 않았습니다. 물론 고급 기능들을 많이 사용한다면 학습 비용이 더 커질 수도 있겠지만 기본 기능 위주로 사용했을 때에는 다들 별다른 어려움 없이 쉽게 적응했었습니다. 그리고 다음과 같은 이점도 경험하게 되었어요.

3.1. 배포 과정이 간단해졌어요

기존에는 WAR 파일을 빌드하고, 서버에 올리고, 재시작하는 복잡한 과정이 있었습니다. Thymeleaf로 전환한 후에는 JAR 파일 하나만 배포하면 되어 배포 과정이 단순해졌어요.


3.2. 개발 속도가 빨라졌어요

Hot Reload가 제대로 작동하고, 간단한 화면 수정 작업은 서버 실행 없이도 작업할 수 있어 개발 속도가 빨라졌습니다. 특히 UI 수정이 잦은 요구사항에서는 그 효과가 더 컸죠.


3.3. 코드 품질이 향상되었어요

비즈니스 로직과 화면 코드가 자연스럽게 분리되어 코드 품질이 향상되었습니다. 또한 Thymeleaf의 표현식이 더 명확해서 다른 개발자들이 코드를 이해하기 쉬워졌어요.


4. JSP를 쓰고 있다면 당장 바꿔야 할까요?

이미 JSP로 개발된 프로젝트라면 무조건 Thymeleaf로 바꿔야 한다고 말하긴 어렵습니다. 마이그레이션에는 비용과 시간이 들기 때문이죠. 그래도 다음과 같은 경우에는 전환을 고려해 볼 만합니다:

  1. 새 프로젝트를 시작할 때: 새 프로젝트라면 당연히 Thymeleaf나 다른 현대적인 템플릿 엔진을 선택하세요.
  2. 클라우드 환경으로 이전할 때: 클라우드 환경에서는 JAR 파일 배포가 훨씬 편리하므로 이때 전환을 고려해 보세요.
  3. 대규모 리팩토링이 필요할 때: 이미 코드 개선이 필요한 상황이라면 당연히 템플릿 엔진 전환도 함께 고려해 볼 수 있습니다.


5. 결론: 시대의 흐름을 따라가세요

개발 환경은 항상 변화합니다. JSP는 과거에 매우 혁신적인 기술이었지만, 이제는 더 나은 대안들이 많이 있습니다. Spring Boot의 철학은 "간단하고, 빠르게, 그리고 현대적으로" 개발하는 것입니다. 이런 철학과 JSP는 잘 맞지 않죠.

제 경험을 바탕으로 말씀드리자면, Spring Boot를 사용한다면 JSP보다는 Thymeleaf나 다른 현대적인 템플릿 엔진을 사용하는 것이 장기적으로 더 좋은 선택입니다. 물론 모든 상황에 맞는 단 하나의 정답은 없으니, 여러분의 프로젝트 상황에 맞게 판단하시기 바랍니다.

그리고 무엇보다, 기술 선택은 트렌드를 따르기보다는 실제 문제를 해결하는 데 초점을 맞추어야 합니다. Spring Boot에서 JSP를 사용하지 말라는 권고에는 이유가 있으니, 그 이유를 이해하고 결정하시면 좋겠습니다.

이 글이 여러분의 기술 선택에 도움이 되었으면 좋겠습니다. 궁금한 점이나 의견이 있으시면 댓글로 남겨주세요.


참고문서

다음 이전