타임리프와 jar war

메이도·2023년 4월 9일

타임리프는 템플릿 엔진의 일종이며 스프링 버전이 올라가며 view 엔진이 JSP에서 thymeleaf로 변경됐다.

템플릿 엔진이란?

스프링 mvc 모델을 테스트를 위해 적용하며 궁금한 점이 생겼는데, 스프링부트 프로젝트의 resources 폴더 안의 static 폴더와 templates 폴더는 왜 나누는 것일까?

  • templates: thymeleaf 파일들을 두는 폴더로 thymeleaf를 사용할 시 가장 기본적으로 셋팅되는 위치이다
  • static: css와 js 같은 컨텐츠 들을 두는 폴더

js는 어떤 위치에 들어가는 것이 맞을지 고민했는데 static안에 따로 js 폴더를 만들어 그 안에 js 파일들을 두는게 좋은 것 같다.

타임리프에서 외부 js, css 파일 사용하는 법

  1. 스프링부트는 static 폴더가 기본 경로로 지정이 되어 타임리프 안의 파일에서 ../static/js/pay-test.js 와 같은 형태로 static 포함 경로를 적지 않아도 된다. 타임리프가 정적 웹 리소스를 자동으로 추가해준다.
<script  type = "text/javascript" src="/js/pay-test.js"></script>
  1. 타임리프의 th:src를 사용하기.
<script  type = "text/javascript" th:src="@{/js/pay-test.js}"></script>

참조: https://donghyeon.dev/spring/2019/07/02/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-static%EA%B3%BC-template-%EC%B0%A8%EC%9D%B4/
https://wonin.tistory.com/470

이렇게 만든 타임리프 안의 html 파일들이 컨트롤러와 매핑되지 않고 컨트롤러의 return 값이 그대로 string의 형태로 나오게 됐다.

타임리프 적용이 안될 때: @RestController -> @Controller로 변경하기

그러면 여기서 또 RestController와 Controller의 차이점이 뭔지 궁금하지!

RestController와 Controller

공부하기 전에는 Controller는 단순히 mvc 모델에서 사용하는 뷰 매핑용 컨트롤러이고, RestController은 post, get과 같은 rest api를 사용하는 컨트롤러를 의미한다 생각했다.
Controller에서는 json 객체를 반환하기 위해requestbody를 붙여야 하지만 RestController은 그러지 않아도 된다고 예전에 찾아봤었다.
하지만 실제로는 @Controller에서도 rest api를 사용해도 별 문제가 없기 때문에 다시 알아보기로 했다.

타임리프의 경우 스프링 mvc를 사용하는 웹 프로젝트의 일환이기 때문에 jar와 war의 차이도 찾아봤다.

jar과 war의 차이

항상 많이 검색했지만 잘 알지 못하는 부분이다.

jar: 클래스와 메타 데이터를 압축해 jre/jdk에서 실행할 수 있다. jar 파일에는 was가 내장되어 있다. 따라서 jar 파일로도 빌드를 할 수 있다. (원하는 구조로 파일 구성이 가능) -> java 어플리케이션이 동작하기 위한 아카이브 파일로 라이브러리의 형태로 배포 가능.
war: 서블릿, html, 자바, jsp 등 웹 어플리케이션 구동에 필요한 파일을 압축한 것으로 was나 웹서버에서 실행 가능하다. 외부 was를 쓰는 경우에는 war를 사용한다. (WEB_INF/META_INF 등의 정의된 구조를 사용) -> 웹 어플리케이션 배포용 아카이브 파일들. war도 java -jar을 통해 패키징한다.
참조:
https://mongsil1025.github.io/til/server/warjar/
https://ifuwanna.tistory.com/224

0개의 댓글