- 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 저장
}
- 상품 관리 핵심 기능 구현 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": "상품이 성공적으로 등록되었습니다."})
}