본문 바로가기

Programing/OpenSource

메시지 템플릿 방식 및 구현 기술 조사

존 벤틀리의 생각하는 프로그래밍(원서명: Programming Pearls)의 컬럼3에 "폼 레터 프로그래밍"이 있다.

일종의 메시지를 구성하는 템플릿에 대한 이야기이다.

2022년 메시지 발송 관련 개발을 하면서 메시지 템플릿을 어떻게 할지 조사한 적이 있었다.

 

결과적으로는 "{{ mustache }}" 형태로 변수를 치환하는 Moustache 문법 방식을 채택했다.
비개발자들도 템플릿 문법에 거부감없이 사용할 수 있어야 했던 것이 가장 큰 이유였다.
기존의 마케터 분들이 사용하는 Braze의 Webhook Templates과 유사했기에 추가적인 학습 비용을 낮출 수 있었기 때문이다.
물론, {% Directives %} 를 사용하기도 한다.

Webhook Templates 예시

구현체로는 Pebble Templates을 사용했다.

 

Java, Kotlin, JavaScript, Solution 등 템플릿 형태 리스트업

변수 형태 구현 엔진 부가 기능
{{variation}}
  1. Mustache.java (Java)
  2. Handlebars.java (Java)
  3. Trimou (Java)
  4. Gmelius (solution)
  5. Meteor Blaze (JS)
  6. Braze (solution)
    1. Webhook
    2. Email Template
 
{{ variation }}

{{variation}} 형태도 동작 허용

  1. Pebble (Java)
  • 다른 템플릿 끼어넣기
    1. 예) header, footer
${variation}

#{variation}

Thymeleaf

카카오 알림톡
  1. Apache FreeMarker (Java)
  2. Thymeleaf(Java)
  3. Kotlin String templates
  4. JS Template literals
  5. 카카오 알림톡 (solution)
    • #{variation}
  1. FreeMarker Template Language (FTL)
  2. Thymeleaf Standard Dialect:
    1. Variable Expressions: ${...}
    2. Selection Variable Expressions: *{...}
    3. Message Expressions: #{...}
    4. Link URL Expressions: @{...}
    5. Fragment Expressions: ~{...}
$References

#Directives
Apache Velocity (Java) Velocity Template Language (VTL)
<variation> stringtemplate4 (Java)  
@variation Rocker (Java) bindable 맵 필요

 

Performance

https://github.com/fizzed/template-benchmark

성능으로는 Rocker가 가장 뛰어났으나 문법상 Pebble을 선택했다.

 

Pebble 관련 보안 취약점

  • CVE-2022-37767 관련 2022-09-12 checkmarx에 보고됨
    • INCORRECT AUTHORIZATION IN PEBBLE
    • IntelliJ IDEA 상에도 inpection
    • PebbleTemplates GitHub 에도 이슈가 등록되어 있음
      • #494: Checking access to all methods of unsafe classes
      • #625: Vulnerability CVE-2022-37767
  • CVE-2021-29425 관련 MVN repository for 3.1.5
    • Apache Commons IO before 2.7 - FileNameUtils.normalize 
  • 3.2.2 버전에서는 취약점 해소