타임리프
1. 개요
1. 개요
타임리프는 자바 기반의 XML, XHTML, HTML5 템플릿 엔진이다. 개발자 다니엘 페르난데스가 만들었으며, 아파치 라이선스 2.0 하에 배포되는 오픈 소스 소프트웨어이다. 주로 스프링 프레임워크 기반의 MVC 웹 애플리케이션에서 뷰 계층을 구성하는 데 사용되지만, 서블릿 API에 강하게 의존하지 않아 웹 및 비웹 환경 모두에서 동작할 수 있다.
이 엔진의 주요 목표 중 하나는 자바서버 페이지(JSP)를 완전히 대체하는 것이며, '내추럴 템플릿'이라는 독특한 개념을 구현한다. 이는 템플릿 파일을 웹 브라우저에서 직접 열었을 때도 정상적인 웹 페이지로 표시되고, 서버를 통해 렌더링되면 동적 데이터로 치환되는 특징을 말한다. 이로 인해 디자이너와 개발자가 동일한 파일을 편리하게 협업할 수 있는 환경을 제공한다.
타임리프는 모듈화된 기능 세트인 '방언'을 기반으로 하며, 표준 방언과 스프링 통합을 위한 스프링 MVC 방언을 기본 제공한다. 또한 국제화 지원, 구성 가능한 템플릿 캐시, 다양한 템플릿 모드(XML, XHTML, HTML5)를 지원하여 높은 확장성과 유연성을 가진다. 안정화 버전은 2024년 12월 9일 기준으로 3.1.3이다.
2. 특징
2. 특징
타임리프는 자바 기반의 템플릿 엔진으로, 웹 애플리케이션의 뷰 레이어를 구축하는 데 주로 사용된다. 가장 큰 특징은 내추럴 템플릿 개념을 구현하여, 템플릿 파일을 웹 브라우저에서 직접 열어도 프로토타입으로 올바르게 표시된다는 점이다. 이는 서버 사이드에서 처리되기 전에도 정적인 HTML 문서로서의 가독성을 유지함을 의미하며, 프론트엔드 개발자와 백엔드 개발자 간의 협업을 용이하게 한다.
이 엔진은 XML, XHTML, HTML5를 포함한 다양한 템플릿 모드를 지원하며, 서블릿 API에 강하게 의존하지 않아 웹 및 비웹(오프라인) 환경 모두에서 작동할 수 있다. 기능은 모듈화된 방언을 기반으로 구성되어 있으며, 기본적으로 스탠다드 방언과 스프링 프레임워크 애플리케이션을 위한 스프링스탠다드 방언이 제공된다. 개발자는 필요에 따라 사용자 정의 방언을 확장하여 생성할 수 있어 높은 확장성을 자랑한다.
성능 측면에서는 구성 가능한 파싱된 템플릿 캐시를 통해 입출력을 최소화하고, 자동 DOCTYPE 변환 및 선택적 검증 기능을 제공한다. 또한 완전한 국제화 지원을 포함하고 있어 다국어 애플리케이션 개발에 적합하다.
3. 템플릿 모드
3. 템플릿 모드
타임리프는 다양한 템플릿 모드를 지원하여 서로 다른 마크업 언어와 문서 유형을 처리할 수 있다. 주요 템플릿 모드로는 XML, XHTML 1.0 및 1.1, 그리고 HTML5가 있다. 각 모드는 특정한 구문 분석 규칙을 가지며, 특히 HTML5 모드는 XML 형식의 코드와 레거시 기반의 비XML HTML5 코드를 모두 처리할 수 있다. 레거시 코드는 자동으로 정리되어 올바른 XML 형식으로 변환된다.
이러한 템플릿 모드는 템플릿 엔진의 핵심 기능인 방언과 결합되어 작동한다. 방언은 평가, 반복 등의 기능을 정의하며, 이러한 기능은 템플릿의 태그와 속성에 연결되어 적용된다. 타임리프는 표준 방언과 스프링 프레임워크 애플리케이션을 위한 SpringStandard 방언을 기본으로 제공한다.
템플릿 모드는 웹 애플리케이션의 뷰 레이어뿐만 아니라 오프라인 환경에서도 동작한다. 이는 타임리프가 서블릿 API에 강하게 의존하지 않는 설계 덕분이다. 또한, 선택적으로 DTD 검증을 지원하며, 자동 DOCTYPE 변환 기능을 통해 템플릿과 생성된 결과 코드의 유효성을 보장할 수 있다.
4. 기본 방언
4. 기본 방언
타임리프는 방언(Dialect)이라는 모듈화된 기능 세트를 기반으로 하여 그 기능을 확장한다. 방언은 템플릿에서 사용할 수 있는 평가, 반복, 조건부 처리와 같은 기능을 정의하며, 이러한 기능들은 템플릿의 특정 태그나 속성에 연결되어 적용된다. 이 구조 덕분에 개발자는 핵심 엔진을 변경하지 않고도 필요에 맞게 기능을 추가하거나 교체할 수 있다.
타임리프는 두 가지 기본 방언을 제공한다. 첫 번째는 Standard Dialect(표준 방언)로, 타임리프의 핵심 기능을 담당한다. 이 방언은 th:text, th:each, th:if와 같은 속성들을 정의하여 변수 평가, 반복문, 조건문 등을 처리한다. 두 번째는 SpringStandard Dialect(스프링 표준 방언)이다. 이는 스프링 프레임워크 애플리케이션, 특히 스프링 MVC와 완벽하게 통합되도록 설계된 방언으로, 구문은 표준 방언과 동일하지만 스프링 표현 언어(SpEL) 통합 및 스프링의 의존성 주입 컨텍스트와의 연동과 같은 추가 기능을 포함한다.
이러한 모듈식 아키텍처는 높은 유연성과 확장성을 보장한다. 개발자는 특정 도메인이나 요구사항에 맞춰 사용자 정의 방언을 만들어 표준 기능을 확장하거나 완전히 새로운 방언을 생성할 수 있다. 결과적으로 타임리프는 단순한 템플릿 엔진을 넘어서, 필요에 따라 맞춤 구성이 가능한 템플릿 엔진 프레임워크로도 사용될 수 있다.
5. 스프링 프레임워크 통합
5. 스프링 프레임워크 통합
타임리프는 스프링 프레임워크와의 완전한 통합을 주요 특징으로 제공한다. 이를 위해 스프링 전용 방언인 SpringStandard 방언을 기본으로 포함하고 있으며, 이 방언은 스프링의 표현 언어와 데이터 바인딩 기능을 완벽하게 지원한다. 개발자는 스프링 빈을 템플릿 내에서 직접 참조하거나, 스프링 시큐리티와의 통합을 통해 권한 기반 화면 구성을 손쉽게 구현할 수 있다.
스프링 MVC 애플리케이션에서 타임리프를 뷰 리졸버로 설정하면, 컨트롤러가 전달하는 모델 속성들을 템플릿에서 자연스럽게 사용할 수 있다. 또한 폼 바인딩, 메시지 소스를 이용한 국제화, 스프링 부트의 자동 구성 지원 등을 통해 웹 애플리케이션 개발 생산성을 크게 높인다. 이 통합은 서블릿 API에 대한 의존성을 최소화하는 타임리프의 설계 철학과도 잘 맞아떨어진다.
6. 예제
6. 예제
타임리프는 내추럴 템플릿 개념을 구현하여, 템플릿 파일을 웹 브라우저에서 직접 열어도 정상적인 HTML 페이지로 표시되도록 설계되었다. 이는 개발 과정에서 디자이너와 개발자 간의 협업을 용이하게 한다. 예를 들어, 서버 사이드에서 동적으로 데이터를 주입하기 전의 정적 프로토타입 파일도 완전한 형태로 확인할 수 있다.
기본적인 사용 예로, 스프링 MVC 애플리케이션의 컨트롤러가 모델에 allProducts라는 이름의 상품 목록을 추가했다고 가정한다. 타임리프 템플릿에서는 다음과 같이 표준 방언의 속성을 사용해 이 데이터를 반복 처리하고 표시할 수 있다.
```html
<table>
<thead>
<tr>
<th th:text="#{msgs.headers.name}">Name</th>
<th th:text="#{msgs.headers.price}">Price</th>
</tr>
</thead>
<tbody>
<tr th:each="prod : ${allProducts}">
<td th:text="${prod.name}">Oranges</td>
<td th:text="${#numbers.formatDecimal(prod.price,1,2)}">0.99</td>
</tr>
</tbody>
</table>
```
이 예제에서 th:each는 반복문 역할을 하며, th:text는 태그의 내용을 동적으로 평가한 값으로 치환한다. ${...}는 모델 속성을 참조하는 변수 표현식이며, #{...}는 국제화 메시지를 가져오는 표현식이다. 또한 #numbers.formatDecimal과 같은 유틸리티 오브젝트를 활용하여 숫자 서식 지정과 같은 복잡한 처리를 간결하게 수행할 수 있다.
이 코드는 서블릿 컨테이너에서 렌더링되면 동적 데이터로 채워진 HTML 테이블을 생성한다. 동시에, 템플릿 파일 자체를 브라우저에서 직접 열면 th:* 속성은 무시되고 기본값으로 작성된 "Oranges", "0.99" 같은 정적 내용이 표시되어 프로토타입으로 기능한다. 이렇게 템플릿 엔진의 강력한 기능과 정적 프로토타이핑의 장점을 동시에 제공하는 것이 타임리프의 주요 특징이다.
7. 라이선스
7. 라이선스
타임리프는 아파치 라이선스 2.0에 따라 배포되는 오픈 소스 소프트웨어이다. 이 라이선스는 아파치 소프트웨어 재단이 관리하는 허용적 자유 소프트웨어 라이선스로, 사용자에게 상당한 자유를 부여한다.
아파치 라이선스 2.0 하에서는 타임리프를 자유롭게 사용, 수정, 배포할 수 있으며, 수정된 소스 코드를 공개하지 않고도 상용 제품에 포함하여 배포하는 것이 가능하다. 다만, 라이선스 사본과 저작권 고지를 배포물에 포함시켜야 하며, 소스 코드를 수정한 경우에는 변경 사항을 명시적으로 표시해야 하는 의무가 있다.
이러한 허용적 라이선스 정책은 타임리프가 기업 환경을 포함한 다양한 자바 웹 애플리케이션 프로젝트에서 널리 채택되는 데 기여했다. 특히 스프링 프레임워크 생태계와의 긴밀한 통합을 추구하는 데도 장벽이 되지 않는다. 라이선스에 대한 자세한 문의는 타임리프 공식 웹사이트를 통해 확인할 수 있다.
