{"id":35131,"date":"2025-11-26T02:02:00","date_gmt":"2025-11-25T23:02:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/"},"modified":"2025-11-26T02:02:00","modified_gmt":"2025-11-25T23:02:00","slug":"go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/","title":{"rendered":"Go full stack web app tutorial with sqlc and htmx. Part 1"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer <code>SPA (Single Page Application)<\/code> yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!<\/p>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, kullan\u0131c\u0131 beklentilerinin artmas\u0131yla birlikte giderek daha karma\u015f\u0131k hale geliyor. \u00d6zellikle geleneksel <code>SPA<\/code> mimarileri, frontend (genellikle React, Angular, Vue gibi JavaScript framework&#8217;leri) ve backend (API servisleri) aras\u0131ndaki keskin ayr\u0131m nedeniyle kendine \u00f6zg\u00fc zorluklar\u0131 beraberinde getiriyor. Her ne kadar bu ayr\u0131m, b\u00fcy\u00fck ekipler i\u00e7in i\u015f b\u00f6l\u00fcm\u00fc avantaj\u0131 sunsa da, pratik uygulamada bir\u00e7ok ba\u015f a\u011fr\u0131s\u0131na yol a\u00e7abilir. \u00d6rne\u011fin, frontend ve backend&#8217;in ayr\u0131 ayr\u0131 geli\u015ftirilmesi, s\u00fcrekli bir API kontrat y\u00f6netimi gerektirir. API versiyonlama, veri serile\u015ftirme\/deserile\u015ftirme, hata y\u00f6netimi ve her iki taraf i\u00e7in ayr\u0131 ayr\u0131 test yazma s\u00fcre\u00e7leri, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc uzatabilir ve maliyeti art\u0131rabilir.<\/p>\n<p>Ayr\u0131ca, JavaScript tabanl\u0131 frontend&#8217;lerde paket b\u00fcy\u00fckl\u00fc\u011f\u00fc, ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcresi (initial load time) ve karma\u015f\u0131k durum y\u00f6netimi gibi konular performans \u00fczerinde ciddi etkilere sahip olabilir. Taray\u0131c\u0131da \u00e7al\u0131\u015ft\u0131r\u0131lan JavaScript&#8217;in miktar\u0131 artt\u0131k\u00e7a, kullan\u0131c\u0131n\u0131n cihaz\u0131nda CPU ve bellek t\u00fcketimi de artar, bu da \u00f6zellikle d\u00fc\u015f\u00fck donan\u0131ml\u0131 cihazlarda veya yava\u015f internet ba\u011flant\u0131lar\u0131nda k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7abilir. Geli\u015ftiriciler, s\u00fcrekli olarak performans optimizasyonlar\u0131 ve kod b\u00f6lme gibi tekniklerle bu sorunlar\u0131n \u00fcstesinden gelmeye \u00e7al\u0131\u015f\u0131r, ancak bu da ek bir efor ve uzmanl\u0131k gerektirir. Backend taraf\u0131nda ise, mikroservis mimarileri her ne kadar \u00f6l\u00e7eklenebilirlik avantajlar\u0131 sunsa da, servisler aras\u0131 ileti\u015fim karma\u015fas\u0131, da\u011f\u0131t\u0131k i\u015flem y\u00f6netimi ve izlenebilirlik gibi operasyonel y\u00fckleri beraberinde getirir. Birden fazla mikroservisi y\u00f6netmek, geli\u015ftiricilerin farkl\u0131 teknolojiler ve diller aras\u0131nda s\u00fcrekli ba\u011flam de\u011fi\u015ftirmesini gerektirebilir, bu da odaklanmay\u0131 zorla\u015ft\u0131r\u0131r ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>\u0130\u015fte tam da bu noktada, Go, sqlc ve HTMX gibi ara\u00e7lar devreye giriyor. Bu \u00fc\u00e7l\u00fcn\u00fcn sundu\u011fu yakla\u015f\u0131m, frontend ve backend aras\u0131ndaki ayr\u0131m\u0131 minimalize ederek, monolitik bir yap\u0131 i\u00e7erisinde h\u0131zl\u0131, performansl\u0131 ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmeyi hedefliyor. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi API ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 azaltmak, JavaScript y\u00fck\u00fcn\u00fc hafifletmek ve geli\u015ftirici verimlili\u011fini art\u0131rmak bu kombinasyonun temel motivasyonlar\u0131 aras\u0131nda yer al\u0131yor. Bir d\u00fc\u015f\u00fcn\u00fcn; SQL sorgular\u0131n\u0131z\u0131 do\u011frudan Go kodunuzda tip g\u00fcvenli bir \u015fekilde y\u00f6netirken, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcz\u00fc neredeyse hi\u00e7 JavaScript yazmadan dinamik hale getirebiliyorsunuz. Bu, modern web geli\u015ftirmenin getirdi\u011fi bir\u00e7ok zorlu\u011fa kar\u015f\u0131 olduk\u00e7a cazip bir alternatif sunuyor.<\/p>\n<h2>Go, sqlc ve HTMX \u00dc\u00e7l\u00fcs\u00fc: Neden Bu Kombinasyon Tercih Edilmeli?<\/h2>\n<p>Web geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, do\u011fru teknoloji y\u0131\u011f\u0131n\u0131n\u0131 se\u00e7mek, projenin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Geleneksel yakla\u015f\u0131mlar\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131klara bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda olan geli\u015ftiriciler i\u00e7in Go, sqlc ve HTMX kombinasyonu, taze bir nefes niteli\u011findedir. Peki, bu \u00fc\u00e7l\u00fc neden bu kadar g\u00fc\u00e7l\u00fc ve neden tercih etmelisiniz? Bu sorunun cevab\u0131, her bir bile\u015fenin kendine \u00f6zg\u00fc avantajlar\u0131nda ve bu avantajlar\u0131n bir araya gelerek yaratt\u0131\u011f\u0131 sinerjide gizlidir. \u00d6ncelikle her birine k\u0131saca g\u00f6z atal\u0131m:<\/p>\n<ul>\n<li><strong>Go: Performans ve Basitli\u011fin Adresi<\/strong><br \/>Google taraf\u0131ndan geli\u015ftirilen Go (Golang), y\u00fcksek performans, e\u015fzamanl\u0131l\u0131k ve \u00f6l\u00e7eklenebilirlik gerektiren backend sistemleri i\u00e7in tasarlanm\u0131\u015f modern bir programlama dilidir. Statik tipli yap\u0131s\u0131 ve minimalist s\u00f6zdizimi sayesinde g\u00fcvenli, okunabilir ve h\u0131zl\u0131 kod yazmay\u0131 te\u015fvik eder. Dahili goroutine&#8217;ler ve kanallar sayesinde e\u015fzamanl\u0131 programlama Go&#8217;da olduk\u00e7a kolayd\u0131r, bu da y\u00fcksek trafikli web servisleri veya API&#8217;ler geli\u015ftirmek i\u00e7in ideal bir se\u00e7enek haline gelir.<\/li>\n<li><strong>sqlc: Type-Safe SQL Sorgular\u0131 Yazman\u0131n En H\u0131zl\u0131 Yolu<\/strong><br \/>Veritaban\u0131 etkile\u015fimleri, herhangi bir web uygulamas\u0131n\u0131n belkemi\u011fidir. sqlc, yazd\u0131\u011f\u0131n\u0131z SQL sorgular\u0131ndan Go kodu \u00fcreten bir ara\u00e7t\u0131r. Siz temiz ve standart SQL yazars\u0131n\u0131z, sqlc bu SQL sorgular\u0131n\u0131 analiz eder ve Go aray\u00fczleri, modelleri ve fonksiyonlar\u0131 olu\u015fturur. Bu sayede, veritaban\u0131 i\u015flemleriniz tamamen tip g\u00fcvenli hale gelir, derleme zaman\u0131 hatalar\u0131 yakalan\u0131r ve geli\u015ftirici, veritaban\u0131 ile etkile\u015fimde bulunurken g\u00fcvenle \u00e7al\u0131\u015f\u0131r. sqlc&#8217;nin performans\u0131, elle yaz\u0131lm\u0131\u015f SQL&#8217;e yak\u0131nken, developer deneyimi tip g\u00fcvenli\u011fi sayesinde \u00f6nemli \u00f6l\u00e7\u00fcde artar.<\/li>\n<li><strong>HTMX: JavaScript&#8217;siz \u0130nteraktif Aray\u00fczler M\u00fcmk\u00fcn m\u00fc?<\/strong><br \/>HTMX, <code>HTML<\/code>&#8216;i do\u011frudan sunucuyla etkile\u015fim kurabilecek yeteneklerle geni\u015fleten, k\u00fc\u00e7\u00fck, ba\u011f\u0131ml\u0131l\u0131ks\u0131z bir JavaScript k\u00fct\u00fcphanesidir. Temel felsefesi, sunucudan yaln\u0131zca <code>HTML<\/code> par\u00e7ac\u0131klar\u0131 al\u0131p, DOM&#8217;u g\u00fcncellemek i\u00e7in minimal JavaScript kullanmakt\u0131r. Bu sayede, b\u00fcy\u00fck JavaScript framework&#8217;lerinin getirdi\u011fi karma\u015f\u0131kl\u0131ktan, bundle boyutlar\u0131ndan ve \u00f6\u011frenme e\u011frisinden kurtulmu\u015f olursunuz. Form g\u00f6nderimlerini, dinamik i\u00e7erik y\u00fcklemeyi, sayfa yenileme olmadan listeleri g\u00fcncellemeyi, sadece <code>HTML<\/code> \u00f6znitelikleri (<code>hx-get<\/code>, <code>hx-post<\/code>, <code>hx-target<\/code>, <code>hx-swap<\/code> vb.) kullanarak yapabilirsiniz.<\/li>\n<\/ul>\n<p>Bu \u00fc\u00e7l\u00fcn\u00fcn bir araya gelmesiyle ortaya \u00e7\u0131kan sinerji, geli\u015ftirici verimlili\u011fini art\u0131r\u0131rken, son kullan\u0131c\u0131ya daha h\u0131zl\u0131 ve daha duyarl\u0131 bir deneyim sunar. Go g\u00fc\u00e7l\u00fc bir backend sa\u011flarken, sqlc veritaban\u0131 etkile\u015fimlerini g\u00fcvenli hale getirir ve HTMX, minimal \u00e7abayla zengin kullan\u0131c\u0131 deneyimleri sunar. Bu kombinasyon, \u00f6zellikle h\u0131zl\u0131 prototipleme, d\u00fc\u015f\u00fck maliyetli bak\u0131m ve y\u00fcksek performans gerektiren projeler i\u00e7in ideal bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r. B\u00f6ylece, SPA&#8217;lar\u0131n getirdi\u011fi bir\u00e7ok karma\u015f\u0131kl\u0131\u011f\u0131 a\u015farak, daha geleneksel ama modern bir yakla\u015f\u0131mla web uygulamalar\u0131 geli\u015ftirebiliriz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: HTMX&#8217;in sundu\u011fu &#8220;minimal JavaScript&#8221; yakla\u015f\u0131m\u0131, \u00f6zellikle SEO a\u00e7\u0131s\u0131ndan \u00f6nemli avantajlar sa\u011flayabilir. Sunucudan do\u011frudan render edilen HTML, arama motoru botlar\u0131 taraf\u0131ndan daha kolay ve eksiksiz bir \u015fekilde indekslenebilir, bu da sayfa performans\u0131n\u0131 ve s\u0131ralamas\u0131n\u0131 olumlu etkileyebilir.\n<\/div>\n<h2>Proje Ortam\u0131n\u0131 Kurma ve Veritaban\u0131 Etkile\u015fimi: sqlc ile \u0130lk Ad\u0131mlar<\/h2>\n<p>Art\u0131k teorik bilgilere sahibiz; \u015fimdi Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fc kullanarak ilk full stack web uygulamam\u0131z\u0131 olu\u015fturman\u0131n pratik ad\u0131mlar\u0131na ge\u00e7elim. Herhangi bir yaz\u0131l\u0131m geli\u015ftirme projesinde oldu\u011fu gibi, \u00f6ncelikle \u00e7al\u0131\u015fma ortam\u0131m\u0131z\u0131 haz\u0131rlamam\u0131z ve gerekli ara\u00e7lar\u0131 kurmam\u0131z gerekiyor. Bu b\u00f6l\u00fcmde, projemizin temel yap\u0131s\u0131n\u0131 olu\u015fturacak kurulumlar\u0131 ad\u0131m ad\u0131m ele alacak ve ard\u0131ndan sqlc ile tip g\u00fcvenli veritaban\u0131 sorgular\u0131m\u0131z\u0131 olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>PostgreSQL Veritaban\u0131 Nas\u0131l Haz\u0131rlan\u0131r ve \u015eema Olu\u015fturulur?<\/h3>\n<p>Verilerimizi saklamak i\u00e7in g\u00fc\u00e7l\u00fc ve g\u00fcvenilir bir ili\u015fkisel veritaban\u0131na ihtiyac\u0131m\u0131z var. PostgreSQL, bu t\u00fcr projeler i\u00e7in m\u00fckemmel bir se\u00e7imdir. Kurulumu basitle\u015ftirmek ve yerel geli\u015ftirme ortam\u0131n\u0131z\u0131 kirletmemek i\u00e7in Docker kullanmay\u0131 tercih edece\u011fiz. E\u011fer Docker kurulu de\u011filse, \u00f6ncelikle <a href=\"https:\/\/docs.docker.com\/get-docker\/\" target=\"_blank\">Docker&#8217;\u0131n resmi web sitesinden<\/a> i\u015fletim sisteminize uygun s\u00fcr\u00fcm\u00fcn\u00fc kurman\u0131z gerekmektedir.<\/p>\n<p>PostgreSQL konteynerini ba\u015flatmak i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\ndocker run --name go-fullstack-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres:13\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, PostgreSQL konteynerini arka planda ba\u015flatacak ve ana bilgisayar\u0131n\u0131z\u0131n 5432 portuna e\u015fleyecektir. Konteynerin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in <code>docker ps<\/code> komutunu kullanabilirsiniz. \u015eimdi Go projemiz i\u00e7in bir dizin olu\u015ftural\u0131m ve bu dizine ge\u00e7elim:<\/p>\n<pre><code>\nmkdir go-fullstack-app\ncd go-fullstack-app\ngo mod init go-fullstack-app\ngo get github.com\/lib\/pq\nmkdir -p db\/migration db\/query db\/sqlc\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, kullan\u0131c\u0131 bilgilerini saklayacak bir tabloya ihtiyac\u0131m\u0131z var. <code>db\/migration<\/code> dizininde <code>001_create_users_table.sql<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki SQL kodunu ekleyelim:<\/p>\n<pre><code>\n-- db\/migration\/001_create_users_table.sql\n\nCREATE TABLE users (\n    id SERIAL PRIMARY KEY,\n    username VARCHAR(50) UNIQUE NOT NULL,\n    email VARCHAR(100) UNIQUE NOT NULL,\n    password_hash VARCHAR(255) NOT NULL,\n    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP\n);\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015femay\u0131 veritaban\u0131m\u0131za uygulamak i\u00e7in <code>psql<\/code> kullanabiliriz (\u015fifre <code>mysecretpassword<\/code>):<\/p>\n<pre><code>\npsql -h localhost -p 5432 -U postgres -d postgres -f db\/migration\/001_create_users_table.sql\n<\/pre>\n<p><\/code><\/p>\n<h3>sqlc Konfig\u00fcrasyonu ve Tip G\u00fcvenli Sorgu \u00dcretimi<\/h3>\n<p>sqlc'nin \u00e7al\u0131\u015fabilmesi i\u00e7in bir yap\u0131land\u0131rma dosyas\u0131na ihtiyac\u0131 var. Proje dizininizin k\u00f6k\u00fcnde <code>sqlc.yaml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code>\nversion: \"2\"\nsql:\n  - engine: \"postgresql\"\n    queries: \".\/db\/query\/\"\n    schema: \".\/db\/migration\/\"\n    gen:\n      go:\n        package: \"db\"\n        out: \".\/db\/sqlc\"\n        sql_package: \"database\/sql\"\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, sqlc'ye PostgreSQL kullanaca\u011f\u0131n\u0131, SQL sorgular\u0131m\u0131z\u0131n <code>.\/db\/query\/<\/code> i\u00e7inde oldu\u011funu ve Go kodunu <code>.\/db\/sqlc\/<\/code> dizinine <code>db<\/code> paketi olarak \u00fcretece\u011fini s\u00f6yler. \u015eimdi sorgular\u0131m\u0131z\u0131 yazal\u0131m. <code>db\/query\/users.sql<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code>\n-- db\/query\/users.sql\n\n-- name: CreateUser :one\nINSERT INTO users (username, email, password_hash)\nVALUES ($1, $2, $3)\nRETURNING id, username, email, created_at;\n\n-- name: ListUsers :many\nSELECT id, username, email, created_at FROM users\nORDER BY created_at DESC;\n<\/pre>\n<p><\/code><\/p>\n<p>Bu dosyada iki temel sorgu tan\u0131mlad\u0131k: yeni kullan\u0131c\u0131 olu\u015fturmak (<code>CreateUser<\/code>) ve t\u00fcm kullan\u0131c\u0131lar\u0131 listelemek (<code>ListUsers<\/code>). Her sorgunun ba\u015f\u0131ndaki <code>-- name: SorguAd\u0131 :tip<\/code> yorumlar\u0131, sqlc'nin Go fonksiyonlar\u0131n\u0131 \u00fcretmesi i\u00e7in kullan\u0131l\u0131r. Son olarak, sqlc'den Go kodunu \u00fcretmesini isteyelim:<\/p>\n<pre><code>\nsqlc generate\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>db\/sqlc<\/code> dizini alt\u0131na <code>models.go<\/code>, <code>query.sql.go<\/code> ve <code>db.go<\/code> dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r. Art\u0131k Go kodunuzda <code>db\/sqlc<\/code> paketini i\u00e7e aktararak, veritaban\u0131 i\u015flemlerinizi tamamen tip g\u00fcvenli bir \u015fekilde ger\u00e7ekle\u015ftirebilirsiniz. Bu sayede, SQL s\u00f6zdizimi hatalar\u0131 veya yanl\u0131\u015f parametre kullan\u0131m\u0131 gibi sorunlar derleme zaman\u0131nda tespit edilebilir, bu da geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve hatalar\u0131 azalt\u0131r.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: sqlc ile \u00fcretilen Go kodunda <code>context.Context<\/code> kullan\u0131m\u0131 standartt\u0131r. Bu, veritaban\u0131 i\u015flemlerinin zaman a\u015f\u0131m\u0131, iptali gibi senaryolar\u0131 y\u00f6netmek i\u00e7in harika bir yoldur ve \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda kaynak y\u00f6netimini kolayla\u015ft\u0131r\u0131r.\n<\/div>\n<h2>Go Backend'i Olu\u015fturma: Sunucu, Handler'lar ve Veri \u0130\u015flemleri<\/h2>\n<p>Proje ortam\u0131m\u0131z\u0131 haz\u0131rlad\u0131\u011f\u0131m\u0131za ve sqlc ile tip g\u00fcvenli veritaban\u0131 etkile\u015fimlerimizi kurdu\u011fumuza g\u00f6re, \u015fimdi uygulamam\u0131z\u0131n backend taraf\u0131n\u0131 Go ile in\u015fa edelim. Bu b\u00f6l\u00fcmde, basit bir HTTP sunucusu kuracak, PostgreSQL veritaban\u0131na ba\u011flanacak ve sqlc taraf\u0131ndan \u00fcretilen kodlar\u0131 kullanarak kullan\u0131c\u0131 verilerini okuyup yazmak i\u00e7in temel HTTP handler'lar\u0131 olu\u015fturaca\u011f\u0131z. Amac\u0131m\u0131z, Go'nun h\u0131z\u0131n\u0131 ve basitli\u011fini kullanarak, HTMX ile etkile\u015fime girecek sa\u011flam bir API katman\u0131 olu\u015fturmak.<\/p>\n<h3>Temel Sunucu ve Veritaban\u0131 Ba\u011flant\u0131s\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Proje k\u00f6k dizininde <code>main.go<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m. Bu dosya, uygulamam\u0131z\u0131n ba\u015flang\u0131\u00e7 noktas\u0131n\u0131 i\u00e7erecek ve sunucumuzu, veritaban\u0131 ba\u011flant\u0131m\u0131z\u0131 ve route'lar\u0131m\u0131z\u0131 bar\u0131nd\u0131racak. Go'nun <code>net\/http<\/code> paketi, web sunucusu olu\u015fturmak i\u00e7in son derece yeteneklidir ve bu \u00f6rnek i\u00e7in yeterlidir.<\/p>\n<pre><code>\n\/\/ main.go\n\npackage main\n\nimport (\n\t\"context\"\n\t\"database\/sql\"\n\t\"fmt\"\n\t\"html\/template\" \/\/ HTML \u015fablonlar\u0131 i\u00e7in\n\t\"log\"\n\t\"net\/http\"\n\t\"os\"\n\n\t\"go-fullstack-app\/db\/sqlc\" \/\/ sqlc taraf\u0131ndan \u00fcretilen kodlar\n\t_ \"github.com\/lib\/pq\"     \/\/ PostgreSQL s\u00fcr\u00fcc\u00fcs\u00fc\n)\n\nvar templates = template.Must(template.ParseFiles(\"templates\/index.html\")) \/\/ \u015eablonu global olarak y\u00fckl\u00fcyoruz\n\nfunc main() {\n\tdbURL := os.Getenv(\"DATABASE_URL\")\n\tif dbURL == \"\" {\n\t\tdbURL = \"postgresql:\/\/postgres:mysecretpassword@localhost:5432\/postgres?sslmode=disable\"\n\t}\n\n\tconn, err := sql.Open(\"postgres\", dbURL)\n\tif err != nil {\n\t\tlog.Fatalf(\"Veritaban\u0131na ba\u011flan\u0131rken hata olu\u015ftu: %v\", err)\n\t}\n\tdefer conn.Close()\n\n\tif err = conn.Ping(); err != nil {\n\t\tlog.Fatalf(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 kontrol\u00fcnde hata olu\u015ftu: %v\", err)\n\t}\n\tlog.Println(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131l\u0131!\")\n\n\tqueries := sqlc.New(conn) \/\/ sqlc Query nesnesini olu\u015ftur\n\n\thttp.HandleFunc(\"\/\", homeHandler)\n\thttp.HandleFunc(\"\/users\", func(w http.ResponseWriter, r *http.Request) {\n\t\tusersHandler(w, r, queries)\n\t})\n\thttp.HandleFunc(\"\/register\", func(w http.ResponseWriter, r *http.Request) {\n\t\tregisterHandler(w, r, queries)\n\t})\n\n\tport := os.Getenv(\"PORT\")\n\tif port == \"\" {\n\t\tport = \"8080\"\n\t}\n\tlog.Printf(\"Sunucu http:\/\/localhost:%s adresinde \u00e7al\u0131\u015f\u0131yor...\", port)\n\tlog.Fatal(http.ListenAndServe(\":\"+port, nil))\n}\n\nfunc homeHandler(w http.ResponseWriter, r *http.Request) {\n\terr := templates.ExecuteTemplate(w, \"index.html\", nil)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t}\n}\n\n\/\/ ... usersHandler ve registerHandler fonksiyonlar\u0131 a\u015fa\u011f\u0131da tan\u0131mlanacak ...\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda, PostgreSQL ba\u011flant\u0131s\u0131n\u0131 kuruyoruz ve sqlc'nin \u00fcretti\u011fi <code>Queries<\/code> nesnesini kullanarak veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirecek bir temel haz\u0131rl\u0131yoruz. <code>homeHandler<\/code>, ilk etapta ana HTML \u015fablonumuzu servis edecek. <code>\/users<\/code> ve <code>\/register<\/code> yollar\u0131 i\u00e7in handler'lar\u0131 tan\u0131mlad\u0131k, ancak detaylar\u0131n\u0131 \u015fimdi ekleyece\u011fiz.<\/p>\n<h3>Kullan\u0131c\u0131 Kay\u0131t ve Listeleme Handler'lar\u0131 Nas\u0131l Geli\u015ftirilir?<\/h3>\n<p>\u015eimdi <code>usersHandler<\/code> ve <code>registerHandler<\/code> fonksiyonlar\u0131n\u0131 <code>main.go<\/code> i\u00e7ine ekleyelim. Bu handler'lar, gelen HTTP isteklerini i\u015fleyecek ve sqlc ile veritaban\u0131yla etkile\u015fime ge\u00e7ecek:<\/p>\n<pre><code>\n\/\/ main.go (\u00f6nceki kodun devam\u0131)\n\nfunc usersHandler(w http.ResponseWriter, r *http.Request, queries *sqlc.Queries) {\n\tctx := r.Context()\n\tusers, err := queries.ListUsers(ctx) \/\/ sqlc taraf\u0131ndan \u00fcretilen fonksiyon\n\tif err != nil {\n\t\thttp.Error(w, fmt.Sprintf(\"Kullan\u0131c\u0131lar listelenirken hata olu\u015ftu: %v\", err), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.Header().Set(\"Content-Type\", \"text\/html; charset=utf-8\")\n\t\/\/ HTMX sadece bu HTML par\u00e7ac\u0131\u011f\u0131n\u0131 bekliyor\n\tfmt.Fprintf(w, \"<div id=\\\"user-list\\\">\")\n\tif len(users) == 0 {\n\t\tfmt.Fprintf(w, \"<p>Hen\u00fcz kay\u0131tl\u0131 kullan\u0131c\u0131 bulunmuyor.<\/p>\")\n\t} else {\n\t\tfmt.Fprintf(w, \"<ul>\")\n\t\tfor _, user := range users {\n\t\t\tfmt.Fprintf(w, \"<li>ID: %d, Kullan\u0131c\u0131 Ad\u0131: %s, E-posta: %s<\/li>\",\n\t\t\t\tuser.ID, user.Username, user.Email)\n\t\t}\n\t\tfmt.Fprintf(w, \"<\/ul>\")\n\t}\n\tfmt.Fprintf(w, \"<\/div>\")\n}\n\nfunc registerHandler(w http.ResponseWriter, r *http.Request, queries *sqlc.Queries) {\n\tif r.Method != http.MethodPost {\n\t\thttp.Error(w, \"Sadece POST metodu kabul edilir.\", http.StatusMethodNotAllowed)\n\t\treturn\n\t}\n\n\tif err := r.ParseForm(); err != nil {\n\t\thttp.Error(w, fmt.Sprintf(\"Form verileri parse edilirken hata olu\u015ftu: %v\", err), http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tusername := r.FormValue(\"username\")\n\temail := r.FormValue(\"email\")\n\tpassword := r.FormValue(\"password\") \/\/ Ger\u00e7ek uygulamada \u015fifreyi hash'lemelisiniz!\n\n\tif username == \"\" || email == \"\" || password == \"\" {\n\t\thttp.Error(w, \"T\u00fcm alanlar\u0131 doldurman\u0131z gerekmektedir.\", http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tpasswordHash := password \/\/ \u015eimdilik basitle\u015ftiriyoruz, GER\u00c7EK UYGULAMADA G\u00dcVENL\u0130K \u0130\u00c7\u0130N HASH KULLANIN!\n\n\tctx := r.Context()\n\tnewUserParams := sqlc.CreateUserParams{\n\t\tUsername:    username,\n\t\tEmail:       email,\n\t\tPasswordHash: passwordHash,\n\t}\n\n\tuser, err := queries.CreateUser(ctx, newUserParams)\n\tif err != nil {\n\t\tlog.Printf(\"Kullan\u0131c\u0131 olu\u015fturulurken hata olu\u015ftu: %v\", err)\n\t\thttp.Error(w, \"<p style=\\\"color:red;\\\">Kullan\u0131c\u0131 kayd\u0131 ba\u015far\u0131s\u0131z! E-posta veya kullan\u0131c\u0131 ad\u0131 zaten mevcut olabilir.<\/p>\", http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.Header().Set(\"Content-Type\", \"text\/html; charset=utf-8\")\n\tfmt.Fprintf(w, \"<div id=\\\"response-area\\\" style=\\\"margin-top: 20px; padding: 10px; border: 1px solid #4CAF50; border-radius: 4px; background-color: #e8f5e9; color: #388e3c;\\\">\")\n\tfmt.Fprintf(w, \"<p>Kullan\u0131c\u0131 <b>%s<\/b> ba\u015far\u0131yla kaydedildi! ID: %d<\/p>\", user.Username, user.ID)\n\tfmt.Fprintf(w, \"<\/div>\")\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>usersHandler<\/code>, sqlc'nin <code>ListUsers<\/code> fonksiyonunu \u00e7a\u011f\u0131rarak veritaban\u0131ndaki t\u00fcm kullan\u0131c\u0131lar\u0131 \u00e7eker ve bunlar\u0131 bir HTML listesi olarak d\u00f6nd\u00fcr\u00fcr. <code>registerHandler<\/code> ise, POST iste\u011fiyle gelen form verilerini ayr\u0131\u015ft\u0131r\u0131r, yeni bir <code>sqlc.CreateUserParams<\/code> olu\u015fturur ve <code>CreateUser<\/code> fonksiyonu ile kullan\u0131c\u0131y\u0131 veritaban\u0131na kaydeder. Ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z durumlarda, HTMX'in hedefleyece\u011fi bir HTML par\u00e7ac\u0131\u011f\u0131 d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu noktada Go backend'imiz temel veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirmeye haz\u0131r. Bir sonraki ad\u0131mda, HTMX ile bu handler'lar\u0131m\u0131z\u0131 nas\u0131l etkile\u015fimli hale getirece\u011fimize odaklanaca\u011f\u0131z.<\/p>\n<h2>HTMX ile Frontend'i Canland\u0131rma: JavaScript'siz Dinamik Aray\u00fczler<\/h2>\n<p>Go backend'imiz ve sqlc ile tip g\u00fcvenli veritaban\u0131 etkile\u015fimlerimiz haz\u0131r oldu\u011funa g\u00f6re, s\u0131ra geldi kullan\u0131c\u0131 aray\u00fcz\u00fcne. HTMX, modern web uygulamalar\u0131nda JavaScript karma\u015fas\u0131ndan ka\u00e7\u0131nmak isteyenler i\u00e7in g\u00fc\u00e7l\u00fc ve basit bir alternatiftir. Bu b\u00f6l\u00fcmde, Go'nun <code>html\/template<\/code> paketiyle birlikte HTMX'i kullanarak, neredeyse hi\u00e7 JavaScript yazmadan dinamik ve interaktif aray\u00fczler olu\u015fturaca\u011f\u0131z.<\/p>\n<h3>HTML \u015eablonunu Haz\u0131rlama ve HTMX Entegrasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Go, HTML \u015fablonlar\u0131n\u0131 i\u015flemek i\u00e7in yerle\u015fik ve g\u00fcvenli bir <code>html\/template<\/code> paketi sunar. Bu paket, sunucudan dinamik HTML olu\u015fturmak i\u00e7in kullan\u0131l\u0131r ve XSS (Cross-Site Scripting) gibi g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 otomatik koruma sa\u011flar. \u0130lk olarak, bir HTML \u015fablon dosyas\u0131 olu\u015ftural\u0131m. Proje dizinimizin k\u00f6k\u00fcnde <code>templates<\/code> ad\u0131nda bir dizin a\u00e7al\u0131m ve i\u00e7ine <code>index.html<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code>\n<!-- templates\/index.html -->\n\n<!DOCTYPE html><body>\n    <div class=\"container\">\n        <h1>Yeni Kullan\u0131c\u0131 Kayd\u0131<\/h1>\n        <form hx-post=\"\/register\" hx-target=\"#response-area\" hx-swap=\"outerHTML\" hx-on::after-request=\"this.reset()\">\n            <div>\n                <label for=\"username\">Kullan\u0131c\u0131 Ad\u0131:<\/label>\n                <input type=\"text\" id=\"username\" name=\"username\" required>\n            <\/div>\n            <div>\n                <label for=\"email\">E-posta:<\/label>\n                <input type=\"email\" id=\"email\" name=\"email\" required>\n            <\/div>\n            <div>\n                <label for=\"password\">\u015eifre:<\/label>\n                <input type=\"password\" id=\"password\" name=\"password\" required>\n            <\/div>\n            <button type=\"submit\">Kaydol<\/button>\n        <\/form>\n\n        <div id=\"response-area\" style=\"margin-top: 20px; padding: 10px; border: 1px solid #ced4da; border-radius: 4px; background-color: #f8f9fa;\">\n            <!-- Kay\u0131t sonras\u0131 yan\u0131t buraya y\u00fcklenecek -->\n        <\/div>\n\n        <div id=\"user-list-container\">\n            <h2>Mevcut Kullan\u0131c\u0131lar<\/h2>\n            <button hx-get=\"\/users\" hx-trigger=\"load, click\" hx-target=\"#user-list\" hx-swap=\"outerHTML\">Kullan\u0131c\u0131lar\u0131 Y\u00fckle \/ Yenile<\/button>\n            <div id=\"user-list\">\n                <!-- Kullan\u0131c\u0131 listesi buraya y\u00fcklenecek -->\n            <\/div>\n        <\/div>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki HTML dosyas\u0131nda, HTMX k\u00fct\u00fcphanesini CDN \u00fczerinden dahil ettik ve form ile butonlara HTMX \u00f6znitelikleri (<code>hx-post<\/code>, <code>hx-get<\/code>, <code>hx-target<\/code>, <code>hx-swap<\/code>, <code>hx-on::after-request<\/code>) ekledik. Bu \u00f6znitelikler sayesinde, form g\u00f6nderimleri ve kullan\u0131c\u0131 listesi y\u00fckleme i\u015flemleri sayfa yenilenmeden, arka planda AJAX istekleriyle ger\u00e7ekle\u015fecek. Ayr\u0131ca, basit bir <code>@media (max-width: 600px)<\/code> kural\u0131 ile mobil uyumlu tasar\u0131m i\u00e7in CSS \u00f6rneklerini de dahil ettik.<\/p>\n<h3>Go Sunucusunda \u015eablonlar\u0131 Servis Etme<\/h3>\n<p><code>main.go<\/code> dosyam\u0131zda zaten \u015fablonu y\u00fcklemi\u015ftik ve <code>homeHandler<\/code> i\u00e7erisinde <code>index.html<\/code>'i servis ediyoruz. <code>usersHandler<\/code> ve <code>registerHandler<\/code> fonksiyonlar\u0131m\u0131z da HTMX'in bekledi\u011fi HTML par\u00e7ac\u0131klar\u0131n\u0131 d\u00f6nd\u00fcrecek \u015fekilde zaten d\u00fczenlenmi\u015fti. Bu sayede, Go sunucumuz HTMX ile sorunsuz bir \u015fekilde etkile\u015fime ge\u00e7ebiliyor.<\/p>\n<p>Uygulamay\u0131 tekrar \u00e7al\u0131\u015ft\u0131r\u0131n (<code>go run main.go<\/code>) ve <code>http:\/\/localhost:8080\/<\/code> adresine gidin. Kullan\u0131c\u0131 kay\u0131t formunu doldurun ve \"Kaydol\" butonuna t\u0131klay\u0131n. Sayfa yenilenmeden, \"Kaydol\" butonunun alt\u0131nda kay\u0131t sonucunu g\u00f6receksiniz. Ard\u0131ndan \"Kullan\u0131c\u0131lar\u0131 Y\u00fckle \/ Yenile\" butonuna t\u0131klayarak g\u00fcncel kullan\u0131c\u0131 listesini g\u00f6rebilirsiniz. Bu, HTMX'in g\u00fcc\u00fcn\u00fc g\u00f6steren basit ama etkili bir \u00f6rnektir. JavaScript yazmadan, sunucu taraf\u0131nda olu\u015fturulan HTML ile dinamik aray\u00fczler elde ettik!<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<dl>\n<dt>Go, sqlc ve HTMX kullanmak, geleneksel SPA framework'lerinden (React\/Vue) daha m\u0131 iyi?<\/dt>\n<dd>\"Daha iyi\" demek yerine \"farkl\u0131 bir yakla\u015f\u0131m\" demek daha do\u011fru olur. Geleneksel SPA'lar, zengin client-side etkile\u015fimler ve karma\u015f\u0131k durum y\u00f6netimi gerektiren uygulamalar i\u00e7in hala g\u00fc\u00e7l\u00fcd\u00fcr. Ancak bu \u00fc\u00e7l\u00fc, geli\u015ftirici verimlili\u011fini art\u0131rmak, JavaScript ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 azaltmak, daha h\u0131zl\u0131 ba\u015flang\u0131\u00e7 y\u00fckleme s\u00fcreleri sunmak ve backend taraf\u0131nda daha fazla kontrol sahibi olmak isteyen projeler i\u00e7in m\u00fckemmel bir alternatiftir. \u00d6zellikle SEO'nun kritik oldu\u011fu veya ekibin JavaScript uzmanl\u0131\u011f\u0131n\u0131n s\u0131n\u0131rl\u0131 oldu\u011fu durumlarda \u00e7ok avantajl\u0131 olabilir.<\/dd>\n<dt>sqlc, bir ORM (Object-Relational Mapping) arac\u0131 m\u0131d\u0131r?<\/dt>\n<dd>Hay\u0131r, sqlc bir ORM de\u011fildir. sqlc, yaz\u0131l\u0131 SQL sorgular\u0131n\u0131zdan tip g\u00fcvenli Go kodu \u00fcreten bir ara\u00e7t\u0131r. Yani, veritaban\u0131 \u015feman\u0131z ve sorgular\u0131n\u0131z \u00fczerinde tam kontrol\u00fcn\u00fcz olur. ORM'ler ise genellikle veritaban\u0131 tablolar\u0131n\u0131 kod objelerine e\u015fler ve SQL'i soyutlar. sqlc, ORM'lerin aksine \"SQL first\" yakla\u015f\u0131m\u0131n\u0131 benimser ve SQL'in t\u00fcm g\u00fcc\u00fcn\u00fc ve esnekli\u011fini koruman\u0131z\u0131 sa\u011flar.<\/dd>\n<dt>HTMX, t\u00fcm JavaScript ihtiya\u00e7lar\u0131m\u0131 kar\u015f\u0131layabilir mi?<\/dt>\n<dd>HTMX, bir\u00e7ok yayg\u0131n interaktif web \u00f6zelli\u011fi i\u00e7in yeterli olabilir (form g\u00f6nderimleri, dinamik i\u00e7erik y\u00fckleme, s\u0131ralama, filtreleme vb.). Ancak, karma\u015f\u0131k animasyonlar, \u00f6zel grafikler, client-side durum y\u00f6netimi gerektiren detayl\u0131 bile\u015fenler veya taray\u0131c\u0131 API'leriyle yo\u011fun etkile\u015fimler gibi durumlarda saf JavaScript veya daha kapsaml\u0131 bir JavaScript framework'\u00fc kullanman\u0131z gerekebilir. HTMX, JavaScript'i tamamen ortadan kald\u0131rmak yerine, <i>gerekti\u011finde<\/i> kullanma felsefesini destekler.<\/dd>\n<\/dl>\n<h2>Sonu\u00e7: Gelecek B\u00f6l\u00fcm \u0130\u00e7in Bir Bak\u0131\u015f<\/h2>\n<p>Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn modern web geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131kl\u0131klara nas\u0131l \u015f\u0131k ve performansl\u0131 bir \u00e7\u00f6z\u00fcm sundu\u011funu ad\u0131m ad\u0131m inceledik. Geleneksel SPA yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi API karma\u015fas\u0131 ve JavaScript y\u00fck\u00fc gibi zorluklara kar\u015f\u0131, bu kombinasyonun daha basit, daha h\u0131zl\u0131 ve daha g\u00fcvenli bir alternatif olu\u015fturabilece\u011fini g\u00f6rd\u00fck. PostgreSQL veritaban\u0131m\u0131z\u0131 Docker ile h\u0131zl\u0131ca kurduk, Go projemizi yap\u0131land\u0131rd\u0131k ve sqlc i\u00e7in gerekli konfig\u00fcrasyonlar\u0131 yapt\u0131k. Veritaban\u0131 \u015femam\u0131z\u0131 olu\u015fturup sqlc ile sorgular\u0131m\u0131z\u0131 Go koduna \u00e7evirdikten sonra, Go sunucumuzda temel HTTP handler'lar\u0131 yazarak backend'imizi aya\u011fa kald\u0131rd\u0131k. En nihayetinde, <code>html\/template<\/code> ile birlikte HTMX'i entegre ederek, kullan\u0131c\u0131 kay\u0131t formu ve dinamik kullan\u0131c\u0131 listesi gibi interaktif \u00f6zellikleri minimal \u00e7abayla hayata ge\u00e7irdik.<\/p>\n<p>Bu, \"Go full stack web app tutorial with sqlc and htmx\" serimizin yaln\u0131zca ilk b\u00f6l\u00fcm\u00fcyd\u00fc. \u0130kinci b\u00f6l\u00fcmde, bu temel yap\u0131y\u0131 daha da geli\u015ftirece\u011fiz. Kullan\u0131c\u0131 kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) sistemlerini Go taraf\u0131nda nas\u0131l uygulayabilece\u011fimizi, oturum y\u00f6netimini veya JWT (JSON Web Tokens) kullan\u0131m\u0131n\u0131 HTMX ile nas\u0131l entegre edebilece\u011fimizi inceleyece\u011fiz. Ayr\u0131ca, daha karma\u015f\u0131k form i\u015flemleri, canl\u0131 arama (live search) gibi geli\u015fmi\u015f HTMX \u00f6zelliklerini ve uygulaman\u0131n genel mimarisini daha mod\u00fcler hale getirme yollar\u0131n\u0131 ke\u015ffedece\u011fiz. \u015eimdilik, bu g\u00fc\u00e7l\u00fc kombinasyonun temellerini att\u0131n\u0131z ve full stack Go geli\u015ftirmenin keyfini \u00e7\u0131karmaya haz\u0131rs\u0131n\u0131z. Gelecek b\u00f6l\u00fcmde g\u00f6r\u00fc\u015fmek \u00fczere!<\/p>\n<p><\/body><br \/>\n```<\/p>\n","protected":false},"excerpt":{"rendered":"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor.&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1505],"tags":[],"class_list":{"0":"post-35131","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-sql-2","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Go full stack web app tutorial with sqlc and htmx. Part 1<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Go full stack web app tutorial with sqlc and htmx. Part 1\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-25T23:02:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Go full stack web app tutorial with sqlc and htmx. Part 1\",\"datePublished\":\"2025-11-25T23:02:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\"},\"wordCount\":2882,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"SQL\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\",\"name\":\"Go full stack web app tutorial with sqlc and htmx. Part 1\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-25T23:02:00+00:00\",\"description\":\"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Go full stack web app tutorial with sqlc and htmx. Part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Go full stack web app tutorial with sqlc and htmx. Part 1","description":"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/","og_locale":"tr_TR","og_type":"article","og_title":"Go full stack web app tutorial with sqlc and htmx. Part 1","og_description":"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!","og_url":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-25T23:02:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Go full stack web app tutorial with sqlc and htmx. Part 1","datePublished":"2025-11-25T23:02:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/"},"wordCount":2882,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["SQL"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/","url":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/","name":"Go full stack web app tutorial with sqlc and htmx. Part 1","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-25T23:02:00+00:00","description":"Modern web geli\u015ftirme s\u00fcre\u00e7leri, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar s\u00f6z konusu oldu\u011funda, genellikle zorlu ve zaman al\u0131c\u0131 olabiliyor. Frontend ve backend aras\u0131ndaki yo\u011fun JavaScript trafi\u011fi, API karma\u015fas\u0131 ve s\u00fcrekli ba\u011flam ge\u00e7i\u015fleri developer deneyimini olumsuz etkileyebilir. Bu makalede, Go, sqlc ve HTMX \u00fc\u00e7l\u00fcs\u00fcn\u00fcn bir araya geldi\u011fi, performans odakl\u0131 ve geli\u015ftirici dostu full stack web uygulamalar\u0131 nas\u0131l geli\u015ftirebilece\u011fimizi ad\u0131m ad\u0131m inceleyece\u011fiz. E\u011fer SPA (Single Page Application) yakla\u015f\u0131mlar\u0131n\u0131n getirdi\u011fi karma\u015fadan s\u0131k\u0131ld\u0131ysan\u0131z ve daha basit, daha h\u0131zl\u0131 bir alternatif ar\u0131yorsan\u0131z, do\u011fru yerdesiniz. Gelin, bu yeni nesil mimariye birlikte bir g\u00f6z atal\u0131m!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-full-stack-web-app-tutorial-with-sqlc-and-htmx-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Go full stack web app tutorial with sqlc and htmx. Part 1"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35131"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35131\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}