Gin과 GORM을 활용한 빠른 상품 관리 시스템 개발

  1. Gin과 GORM의 효율적 결합 Go 언어 생태계에서 웹 애플리케이션 개발에 최적화된 두 도구인 Gin과 GORM의 협업은 특히 빠른 개발 주기를 요구하는 백엔드 시스템에서 유용합니다. Gin은 고성능의 경량 프레임워크로 인해 라우팅 및 미들웨어 처리가 빠르며, GORM은 ORM 기능을 통해 데이터베이스와의 상호작용을 간결하게 구현할 수 있습니다. 이 두 도구의 조합은 쇼핑몰 관리자 인터페이스 같은 시스템에서 실무 적용 시 훌륭한 결과를 보입니다.

다음은 기본 설정 코드 예시입니다:

package main

import (
    "github.com/gin-gonic/gin"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    // Gin 엔진 초기화
    router := gin.New()
    
    // 데이터베이스 연결 설정
    dbConfig := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dbConfig), &gorm.Config{})
    if err != nil {
        panic("데이터베이스 연결 실패")
    }
    
    // 모델 자동 마이그레이션
    db.AutoMigrate(&Item{})
    
    // 라우트 정의
    router.GET("/items", func(ctx *gin.Context) {
        // 조회 로직
    })
    
    router.Run(":8080")
}

type Item struct {
    gorm.Model
    Title       string  `gorm:"size:255;not null"`
    Description string  `gorm:"type:text"`
    Price       float64 `gorm:"type:decimal(10,2);not null"`
    Stock       int     `gorm:"default:0"`
    UniqueCode  string  `gorm:"size:50;uniqueIndex"`
    CategoryID  uint
    Status      bool    `gorm:"default:false"`
    PublishDate time.Time
    MediaLinks  string  `gorm:"type:text"` // JSON 형식으로 이미지 URL 저장
}
  1. 상품 관리 핵심 기능 구현 2.1 데이터 모델 설계 상품 관리 시스템의 핵심은 데이터 구조입니다. 다음과 같은 항목을 포함하는 모델을 설계합니다:
type Item struct {
    gorm.Model
    Title       string  `gorm:"size:255;not null"`
    Description string  `gorm:"type:text"`
    Price       float64 `gorm:"type:decimal(10,2);not null"`
    CostPrice   float64 `gorm:"type:decimal(10,2)"`
    Stock       int     `gorm:"default:0"`
    UniqueCode  string  `gorm:"size:50;uniqueIndex"`
    CategoryID  uint
    Status      bool    `gorm:"default:false"`
    PublishDate time.Time
    MediaLinks  string  `gorm:"type:text"` // JSON 형식으로 이미지 URL 저장
}

팁: 실제 배포 시 이미지 저장은 별도 테이블로 분리하는 것이 좋습니다.

2.2 상품 등록 API 사용자 입력을 처리하고 데이터베이스에 저장하는 기능은 다음과 같이 구현됩니다:

// 상품 등록 처리
func registerItem(ctx *gin.Context) {
    var input struct {
        Title       string  `json:"title" binding:"required"`
        Description string  `json:"description"`
        Price       float64 `json:"price" binding:"gt=0"`
        Stock       int     `json:"stock" binding:"gte=0"`
        UniqueCode  string  `json:"code" binding:"required,uuid"`
        CategoryID  uint    `json:"categoryId"`
    }
    
    if err := ctx.ShouldBindJSON(&input); err != nil {
        ctx.JSON(400, gin.H{"error": err.Error()})
        return
    }
    
    newItem := Item{
        Title:       input.Title,
        Description: input.Description,
        Price:       input.Price,
        Stock:       input.Stock,
        UniqueCode:  input.UniqueCode,
        CategoryID:  input.CategoryID,
    }
    
    if err := db.Create(&newItem).Error; err != nil {
        ctx.JSON(500, gin.H{"error": "상품 생성 실패"})
        return
    }
    
    ctx.JSON(201, gin.H{"message": "상품이 성공적으로 등록되었습니다."})
}

태그: Gin GORM CRUD go DB Modeling

6월 21일 18:09에 게시됨