Dokumen ini mencatat seluruh modul, konsep, dan aplikasi yang telah berhasil dipelajari dan dibangun dalam sesi latihan Go (Golang).
Pengembang: Kevin Pratama
Waktu Pembelajaran: ~17 Jam
Lokasi Proyek: d:\prog\belajar-go
GitHub Repository: https://github.com/mazkev/belajar-go
Dokumentasi Silabus Lengkap: SYLLABUS.md
-
[TICKET-101]Soft Delete Implementation: Mengintegrasikangorm.DeletedAtpada entityTodountuk fitur pemulihan data (Audit Trail / Soft Delete). -
[TICKET-102]Dashboard Summary Statistics Endpoint: Menambahkan endpointGET /api/v1/todos/statsuntuk mengembalikan ringkasan statistik todo (total, completed, pending, priority breakdown). -
[TICKET-103]Export Todos to CSV File Endpoint: Menambahkan endpointGET /api/v1/todos/export/csvyang memicu streaming unduhan file CSV (todos-export.csv) menggunakan paket standarencoding/csv&bytes.Buffer. -
[TICKET-104]Change Password Feature Endpoint: Menambahkan endpointPUT /api/v1/auth/change-passwordyang memverifikasi password lama dengan Bcrypt dan memperbarui password baru yang di-hash. -
[TICKET-105]Bulk Delete Todos Endpoint: Menambahkan endpointDELETE /api/v1/todos/bulkuntuk menghapus banyak todo sekaligus berbasis SQLWHERE id IN ? AND user_id = ?dan pembersihan Redis cache. -
[TICKET-106]Restore Deleted Todo Endpoint: Menambahkan endpointPUT /api/v1/todos/:id/restoreyang menggunakan GORMUnscoped()untuk memulihkan tugas yang terhapus (deleted_at = NULL).
Dalam waktu sekitar 17 jam, pencapaian yang telah berhasil dikuasai meliputi:
- Setup & Fondasi:
go.mod, VS Code Extension, Global Cache tanpanode_modules. - Sintaks Dasar: Variabel, Pointer
&, Loopfor,switch-casetanpa break manual. - OOP khas Go:
struct, Method Receiver(p *Produk), Multiple Return Values. - Error Handling: Penanganan error eksplisit khas Go (
if err != nil). - Modular Sub-Package: Hak akses Public (Capitalized) vs Private (lowercase).
- Konkurensi & Multithreading:
Goroutines,Channels,sync.WaitGroup. - JSON & File System:
json.Marshal,json.Unmarshal,os.ReadFile,os.WriteFile. - Aplikasi CLI Todo List: Persistensi data JSON lokal.
- Production-Grade Clean Architecture: Pemisahan layer
config,models,repositories,services,controllers,middlewares,utils. - Database Relasional & ORM: Integrasi SQLite (
todos.db) & GORM (gorm.io/gorm) dengan Auto-Migration & Soft Delete (gorm.DeletedAt). - Autentikasi & Keamanan: Bcrypt Password Hashing & JWT Token (
github.com/golang-jwt/jwt/v5). - Gin Web Framework: Refactoring REST API ke Gin Framework (
github.com/gin-gonic/gin) dengan Route Grouping/api/v1& RESTful URL Path Parameters. - User Ownership & Foreign Key: Menghubungkan entity
TodokeUser(user_idForeign Key) yang didapatkan secara otomatis dari klaim JWT Token. - Private Todos Query Filter: Memfilter query
SELECT * FROM todos WHERE user_id = ?sehingga setiap user hanya bisa melihat daftar tugas miliknya sendiri secara privat. - Ownership Authorization Validation: Mengamankan endpoint update & delete dengan query ganda
WHERE id = ? AND user_id = ?. - Pagination & Search Filtering: Fitur Paginasi (
?page=1&limit=5) dan Pencarian SQL LIKE (?search=keyword) dengan metadata total data. - Automated Unit Testing: Pengujian otomatis dengan paket bawaan
testinguntuk Bcrypt Hashing & JWT Token (go test ./utils/... -v). - GORM Database Auto-Migration: Menambahkan kolom
priority,avatar, dandeleted_atsecara dinamis ke database SQLite tanpa kehilangan data lama. - Redis Caching Integration: Mengintegrasikan Redis Client (
github.com/redis/go-redis/v9) dengan pola Cache Hit / Cache Miss & Graceful Fallback (MaxRetries: -1). - Swagger API Documentation UI: Mengintegrasikan Gin Swagger (
github.com/swaggo/gin-swagger) dihttp://localhost:8080/swagger/index.html. - Uber Zap Structured Logging: Mengintegrasikan Uber Zap Logger (
go.uber.org/zap) & Gin Middleware untuk mencatat pencatatan log JSON terstruktur (status, method, path, latency). - Environment Variable Management: Mengamankan rahasia sensitif (JWT Secret, DB Name, Port, Redis Addr) di file
.env(github.com/joho/godotenv) & menyembunyikannya dari Git via.gitignore. - Production Graceful Shutdown: Penghentian server HTTP secara anggun menggunakan
http.Server, Goroutines,os/signal,syscall.SIGINT/SIGTERM, dancontext.WithTimeout(5s). - Dynamic Multi-Database Switcher: Berpindah database secara dinamis antara SQLite dan MySQL (
gorm.io/driver/mysql) hanya dengan mengubahDB_DRIVERdi.env. - Automated MySQL Database Creation: Membuat database MySQL secara otomatis (
CREATE DATABASE IF NOT EXISTS) dari kode Go tanpa perlu SQL GUI manual. - Module-First Domain Architecture (DDD Structure): Refactoring struktur folder menjadi Domain/Module First Layout (
modules/auth&modules/todo). - User Profile & Admin User List: Endpoint
GET /api/v1/auth/me(profil diri) danGET /api/v1/auth/users(daftar seluruh user terdaftar). - File Upload & Static File Server: Fitur unggah foto avatar (
POST /api/v1/auth/avatar) dengan validasi ukuran (< 2MB) & ekstensi (.jpg/.png), penamaan file unik, dan penyajian file statis (r.Static("/uploads", "./uploads")). - Rate Limiting Security Middleware: Proteksi anti-spamming/DDoS menggunakan Token Bucket Algorithm (
golang.org/x/time/rate) per Client IP Address dengan respon HTTP429 Too Many Requests. - Automated Database Seeder: Script generator data dummy otomatis (
go run main.go --seed) yang menggunakan GORM Batch Insert untuk menghasilkan 10 User & 50 Todo dummy dalam waktu < 1 detik. - Vanilla HTML/JS Single-Page Client: Aplikasi web frontend interaktif (
public/index.html) yang disajikan di root URLhttp://localhost:8080(r.StaticFile("/", "./public/index.html")). - Docker Containerization: Multi-Stage Build
Dockerfile(~20MB app binary) &docker-compose.ymluntuk mengorkestrasi Backend Go dan Redis Server secara super ringan & 100% offline vendor build. - Air Live Reload Tool: Integrasi hot reload server instant menggunakan
air(github.com/air-verse/air).
d:\prog\belajar-go\
├── config/
│ ├── database.go # Dynamic DB Switcher (SQLite/MySQL), Variadic InitDB & Auto-Create DB
│ ├── redis.go # Koneksi Client Redis & Ping Healthcheck (MaxRetries: -1 Fallback)
│ └── logger.go # Inisialisasi Uber Zap Production JSON Logger
├── docs/
│ └── docs.go # Embedded Swagger OpenAPI Specification
├── modules/
│ ├── auth/ # 📦 MODUL AUTH (Mandiri & Terisolasi)
│ │ ├── model.go # Struct Entity User (dengan Avatar field)
│ │ ├── repository.go # Query Database User (Create, FindByEmail, FindByID, Update, FindAll)
│ │ ├── service.go # Logika Bisnis Auth, GetProfile, ChangePassword, UpdateAvatar, GetAllUsers
│ │ └── controller.go # Gin Handler Register, Login, ChangePassword, UploadAvatar, GetAllUsers
│ └── todo/ # 📦 MODUL TODO (Mandiri & Terisolasi)
│ ├── model.go # Struct Entity Todo (dengan GORM DeletedAt Soft Delete)
│ ├── repository.go # Query Database Todo (FindByUserID, Create, Update, Delete)
│ ├── service.go # Logika Bisnis Todo (Redis Caching, RestoreTodo, BulkDelete, GetTodoStats & ExportTodosCSV)
│ └── controller.go # Gin Handler REST API Todo List, RestoreTodo, BulkDelete, GetTodoStats & ExportTodos
├── public/
│ └── index.html # 🎨 INTERACTIVE HTML/JS FRONTEND CLIENT (dengan Tombol Download CSV)
├── seeder/
│ └── seeder.go # 🌾 PACKAGE DATABASE SEEDER (Batch Insert Data Dummy)
├── middlewares/
│ ├── auth_middleware.go # Gin JWT Auth Middleware (Set user_id ke Context)
│ ├── logger_middleware.go # Gin Uber Zap Middleware (Mencatat HTTP Method, Status, Latency)
│ └── rate_limiter_middleware.go # Gin Rate Limiter Anti-Spam Middleware (HTTP 429 Protection)
├── uploads/ # 🖼️ FOLDER LOKAL PENYIMPANAN FILE UPLOAD
├── utils/
│ ├── jwt.go # Helper Bcrypt Hashing & JWT Signing/Validation
│ └── jwt_test.go # Unit Test Otomatis untuk Bcrypt & JWT Token Validation
├── Dockerfile # 🐳 Multi-Stage Build Docker Deployment Setup (-mod=vendor)
├── docker-compose.yml # 🐳 Docker Compose Orchestration (Go + Redis)
├── SYLLABUS.md # 📚 Dokumentasi Silabus 11 Modul & Pengertian Aplikasi Lengkap
├── .env # Variabel Konfigurasi Rahasia (Tersembunyi dari Git)
├── .env.example # Template Panduan Konfigurasi Rahasia
├── test.http # VS Code REST Client Test Suite (Gin Version)
└── main.go # Gin Router, CLI Flag --seed, Init Configs, Swagger & Shutdown