Apache Velocity를 활용한 템플릿 처리 과정에서 생성되는 로그 파일의 저장 위치를 변경하는 방법을 다룹니다. 기본적으로 velocity.log는 애플리케이션 루트 디렉터리에 생성되어 배포 환경에서 파일 관리가 어려운 문제가 있습니다.
로그 경로 설정 방식
VelocityEngine 초기화 시 Properties 객체를 통해 로그 출력 경로를 지정할 수 있습니다. RUNTIME_LOG 속성에 원하는 파일 경로를 설정하면 됩니다.
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import java.util.Properties;
public class TemplateEngineFactory {
private static final String LOG_PATH = "var/log/velocity-engine.log";
public VelocityEngine createEngine() {
VelocityEngine engine = new VelocityEngine();
// 리소스 로더 설정
engine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
engine.setProperty("classpath.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 로그 경로 설정
Properties cfg = new Properties();
cfg.setProperty(VelocityEngine.RUNTIME_LOG, LOG_PATH);
engine.init(cfg);
return engine;
}
}
통합 유틸리티 클래스
실제 프로젝트에서 재사용 가능한 형태로 구성한 예제입니다. 인코딩 설정과 함께 로그 경로를 외부에서 주입받을 수 있도록 구성했습니다.
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Properties;
public class VelocityTemplateProcessor {
private static String logDestination = "var/log/velocity.log";
private static final String ENCODING = StandardCharsets.UTF_8.name();
public static void configureLogPath(String path) {
logDestination = path;
}
public Template loadTemplate(String resourcePath) {
VelocityEngine ve = new VelocityEngine();
// 클래스패스 리소스 로딩 설정
ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
ve.setProperty("classpath.resource.loader.class",
ClasspathResourceLoader.class.getName());
Properties params = new Properties();
params.setProperty(VelocityEngine.INPUT_ENCODING, ENCODING);
params.setProperty(VelocityEngine.OUTPUT_ENCODING, ENCODING);
params.setProperty(VelocityEngine.RUNTIME_LOG, logDestination);
ve.init(params);
return ve.getTemplate(resourcePath);
}
public void render(Template tmpl, VelocityContext ctx, String outputFile) {
try (PrintWriter pw = new PrintWriter(outputFile, ENCODING)) {
tmpl.merge(ctx, pw);
pw.flush();
} catch (IOException ex) {
throw new RuntimeException("템플릿 렌더링 실패: " + ex.getMessage(), ex);
}
}
}
주의사항
로그 디렉터리는 미리 생성되어 있어야 하며, 쓰기 권한이 필요합니다. 상대 경로를 사용할 경우 애플리케이션 실행 위치 기준으로 경로가 결정됩니다. 운영 환경에서는 절대 경로나 환경 변수 기반 설정을 권장합니다.