---
title: Logical Route Grouping
impact: MEDIUM
impactDescription: improves code organization and shared middleware management
tags: gin, go, routing, quality
---

## Logical Route Grouping

Use `RouterGroup` to organize routes logically (e.g., by version, resource, or access level). This allows applying middleware (like auth or logging) to a specific group of routes without repetition.

**Incorrect (flat and repetitive):**

```go
func RegisterRoutes(r *gin.Engine) {
    r.GET("/api/v1/users", AuthMiddleware(), GetUsers)
    r.POST("/api/v1/users", AuthMiddleware(), CreateUser)
    r.GET("/api/v1/users/:id", AuthMiddleware(), GetUser)
    r.GET("/health", HealthCheck)
}
```

**Correct (logical grouping):**

```go
func RegisterRoutes(r *gin.Engine) {
    // Public routes
    r.GET("/health", HealthCheck)
    
    // API v1 group
    v1 := r.Group("/api/v1")
    {
        // Auth required group
        auth := v1.Group("/")
        auth.Use(AuthMiddleware())
        {
            users := auth.Group("/users")
            {
                users.GET("/", GetUsers)
                users.POST("/", CreateUser)
                users.GET("/:id", GetUser)
            }
        }
    }
}
```

**Benefits:**
- Reduces code duplication for middleware application
- Provides clear structure of the API URL space
- Simplifies refactoring and versioning (e.g., adding `/v2` group)
- Improves readability of the main routing configuration

**Tools:** Gin
