코딩을 하다 보면 특정 패턴에 의해 반복적인 코드생성이 일어나며 대부분의 경우 Copy and Paste로 작업이 이루어진다. 이를 개선할 수 있는 쉽고 효율적인 작업 방법은 없을까?..
여기 하나의 대안으로 JET를 소개한다.

JET(java Emitter Templates) 란 JSP 문법을 사용하여 생성하려는 코드 템플릿을 쉽게 작성할 수 있도록 도와주는 코드 생성 라이브러리이다.

JET 빌더는 Template Container에 포함된 JET 템플릿 파일을 java class 파일로 자동 변환시킨다. 이때 생성된 class에는 JET 템플릿에 작성된 소스코드를 문자열로 반환하는 generate 메서드를 포함한다.
Generate 메서드를 포함한 java class 변환까지가 JET에서 지원하는 기능이다. 파일 생성은 지원하지 않는다. 우리는 generate 메서드를 호출하여 얻어낸 소스코드를 별도의 Launcher를 구현하여 파일로 생성하거나 console에 출력하여 필요에 맞게 활용하면 되겠다.

이해를 돕기 위해 간단한 JET Project를 구현하여 JET 템플릿 생성과 템플릿을 활용한 파일생성을 해보자. 여기서는 Spring mvc 기반의 Resource를 생성하는 템플릿을 작성하겠다.

우선 개발중인 프로젝트라는 가정하에 Resource 생성이 필요한 Maven Project를 생성하였다.

이제 JET를 사용하기 위한 Java Project를 생성한다.
(기타 Maven Project, Plugin Project에서도 동일하게 적용 가능하다)

생성된 Java Project에서 JET를 사용하기 위해 convert 작업을 해준다.
- File > New > Other… 클릭 후 아래와 같이 Convert Projects to JET Projects 선택

- JET 기능을 사용할 프로젝트 체크 후 Finish클릭

아래와 같이 프로젝트에 templates 폴더가 추가된 것을 볼 수 있다.
- JET 빌더에서는 templates 폴더에서 확장자가 jet로 끝나는 파일을 Java 클래스 파일로 자동 변환한다.

프로젝트의 properties > JET Settings를 선택하여 변환된 java 소스파일을 저장할 Root를 지정.
- Template Containers : jet 템플릿 파일용 컨테이너
- Source Container : jet 템플릿 파일이 변환되어 생성된 java 소스 파일용 컨테이너

이제 templates 하위에 jet템플릿 파일을 생성해보자. Jet로 끝나는 확장자를 지정해야만 템플릿소스가 자동 생성되며 확장자는 java 소스 코드를 생성하는 템플릿은 .javajet, 일반 텍스트 생성 템플릿은 .txtjet와 같이 생성할 파일타입+jet로 지정하는 것이 일반적이다.

간단한 동작 테스트를 위해 JET 템플릿에 아래와 같이 지시자 및 생성될 문구를 작성하였다.
- Package : 변환된 java 소스가 생성될 패키지 (Source Container에 src를 지정하였기 때문에 변환된 java 소스는 src하위의 generator패키지에 저장됨.)
- Class : 변환되어 생성되는 java 파일명

작성한 파일을 저장하면 자동으로 generator 패키지에 ResourceGenerator.java 파일이 생성된다.
ResourceGenerator.java 소스를 살펴보면 JET 템플릿에 작성한 “JET Project~” 문구를 generate 메서드를 호출하여 String 타입으로 받을 수 있도록 되어있다.

JET 템플릿 소스가 정상적으로 java 소스로 변환되는 것을 확인해 보았으니 이제 기존의 ResourceTemplate.javajet 파일에 아래와 같이 기본적인 CRUD를 포함한 Resource 템플릿을 생성 해보자.
아래 작성한 소스코드를 살펴보면 JSP의 스크립틀릿, 표현식 문법을 동일하게 사용하였다.
- 스크립틀릿 : <% java code %>
- 표현식 : <%=변수%>
- 스크립틀릿, 표현식 외에 작성된 코드는 문자열 그대로 출력된다.

수정한 JET 템플릿을 저장하면 ResourceGenerator.java 가 자동으로 수정된다.
템플릿이 완성되었으니 이제 템플릿을 호출하여 원하는 위치에 Resource 파일을 생성하도록 작성해보자.
사용자 정보를 다루는 리소스를 생성한다는 가정하에 아래와 같이 파일 생성 위치와 리소스 생성에 필요한 argument정보를 받아 파일을 생성하도록 작성하였다.

작성된 소스를 실행시킨 후 SimpleProject를 새로고침하면 아래와 같이 UserResource.java 파일이 생성된 것을 확인할 수 있다.

위에서 생성한 Resource 생성 템플릿 외에도 명명규칙이 정의 되고 생성 패턴이 있다면 얼마든지 JET 템플릿을 통해 반복적인 코드생성을 효율적으로 처리할 수 있을 것이다.

얼마 전 동일한 패턴에 사용하는 객체와 인터페이스만 다른 프로젝트 소스를 반복해서 생성하는 업무 개선을 위한 개발지원 도구 프로젝트를 진행하였다. 이때 JET를 처음 접하게 되었고 JET + Plug-in Project를 통해 프로젝트 생성부터 jar파일을 분석하여 필요한 소스파일을 자동생성해주는 플러그인 개발을 하였다.

진행하였던 프로젝트와 마찬가지로 Plug-in Project 에 JET를 접목시키면 보다 고도화된 기능의 소스생성 플러그인 구현이 가능하다. 하지만 플러그인 구현이 다소 부담스러울 수 있을 뿐만 아니라 특수한 case가 아닌 경우 소스생성 프로젝트의 복잡도가 높아질수록 수정이 번거롭고 활용도가 떨어진다.
실제 개발소스가 아닌 개발자의 편의를 위한 템플릿인 만큼 작성과 수정이 간편해야 할 것이다.

namoosori
안녕하세요. 나무소리 입니다. 나무소리는 넥스트리(주)의 교육 브랜드 입니다.넥스트리가 지난 20년 동안 쌓아온 개발 및 교육 경험들을 나무소리를 통해 많은 분들과 공유 하려고 합니다.앞으로 저희 나무소리를 통해 보다 나은 교육을 경험 하실 수 있도록 구성원 모두 최선을 다하겠습니다.