Template Engine nedir ve nerelerde kullanılır?

Bu flood’da Template Engine'lerin ne işe yaradığını ve nerelerde kullanıldığını anlatacağım.

Template Engine adından da anlaşılacağı üzere bir template'i kendisine geçilen veriler ile harmanlayarak bir sonuç üretir. Aşağıdaki örnekte bir şablon, Python'daki en popüler Template Engine olan Jinja2 ile iki farklı veri seti kullanılarak render edilmiştir.

Template Engine'lerin ilk ve belki de en yoğun kullanım alanı dinamik web sayfaları oluşturmaktır. Web'in ilk günlerinde dinamik web sayfaları, kullanılan yazılım dilinin sunduğu metin işleme olanakları ile aşağıdaki örneğe benzer biçimde oluşturuluyordu.

Bu şekilde yazılan okuması, test edilmesi zor ve hata yapmaya açık kodlar sebebiyle ölçeği giderek artan web sitelerinin bu yöntemle geliştirilmesi zorlaşmıştır. Tam bu noktada MVC (Model View Controller) adı verilen ve hala kullanmakta olduğumuz paradigma ortaya çıkmıştır.

MVC'de özet olarak kullanıcıdan kullanıcıya değişen dinamik veri Model katmanında, kullanıcıya gösterilecek HTML'in oluşturulması View katmanında ve bu iki katman arasındaki koordinasyon ve iş akışları Controller katmanında bulunmaktadır.

Tahmin edileceği üzere Template Engine burada View katmanında görev alır ve Controller'dan gelen verileri ilgili Template'i kullanarak render ederler. Oluşan çıktı (genellikle HTML) kullanıcıya gösterilir.

Template Engine'ler şablonları render etmenin yanı sıra şablonların birbirini içermesine de olanak tanırlar. Bu sayede şablonlar birbirini içerebilir ve birden fazla yerde kullanılan kodların çoklanmasına gerek kalmaz.

Kullanılan web framework’ler genellikle bir default Template Engine ile birlikte gelir. Bu Template Engine ilgili framework'e özel olabildiği gibi popüler Template Engine'lerden biri de olabilir. En bilinenler Mustache, HandlebarsJS ve Jinja2'dur.

Popüler Python web framework'lerinden Flask default olarak Jinja2 Template Engine'ini kullanır. Jinja2 ise başka bir Python web framework'ü olan Django'nun Template Engine'inden esinlenilerek ortaya konmuştur.

Bazı görüşler Template Engine'de if, for, vb logic kurmaya yardımcı olacak blokların olmaması gerektiğini savunur. Bu görüş temel olarak MVC katmanlı mimarisinde View katmanında veri manipülasyonu yapılmaması ilkesine dayanır. Mustache bu kamptaki bir Engine'dir.

Template Engine'lerin kullanıldığı bir alan da Static Site Generator'lardır. Jekyll, Hugo ve Gatsby araçları örnek olarak verilebilir. gokhansengun.com gibi statik içerikli siteler konfigürasyon dosyaları ve konvansiyonlar kullanılarak bu araçlar ile oluşturulabilir.

Sayılan Static Site Generator araçlarının temelinde birer Template Engine bulunur. Belirlenen konvansiyona göre hazırlanan şablonlar render edilerek HTML dosyaları oluşturulup kullanıcıya gösterilir. Aşağıda benim bloğumda blogları listeleyen kısım verilmiştir.

Bloğumun Jekyll altyapısı için https://gokhansengun.com/blogun-teknik-altyapisi/ ve kaynak kodu için https://github.com/gokhansengun/gokhansengun.github.io linklerine bakılabilir.

Template Engine'ların en önemli kullanım alanlarından biri başta Ansible, vb Configuration Management araçları olmak üzere genel olarak DevOps araçlarıdır. Template Engine'ler, girdi olarak sağlanacak verilerin dinamik olması gereken durumlarda hayat kurtarıcıdır.

Aşağıda Kubernetes Cluster kurulumun senaryosunda Etcd servis adresleri bir başka servisin konfigürasyonuna sağlanmak üzere aşağıdaki gibi oluşturulmuştur. Verilen şablon Ansible tarafından Jinja2 kullanılarak render edilip servise sağlanmaktadır.

Son olarak Confd, consul-template gibi araçlar yine Template Engine'ler kullanarak çalışma zamanında değişebilecek bilgileri Service Discovery araçları veya başka araçlardan alarak render ederek uygulamalara sağlayabilirler.