Go로 웹 백엔드를 만들 때 가장 많이 사용되는 조합 중 하나가 바로 Gin + GORM이다.
Gin은 가볍고 빠른 웹 프레임워크이고, GORM은 Go 언어에서 가장 널리 쓰이는 ORM(Object Relational Mapping) 라이브러리다.
이번 글에서는 Gin + GORM을 사용해 MySQL 기반의 간단한 백엔드 서버를 만드는 방법을 초보자도 이해할 수 있도록 하나하나 설명해보려 한다.
📌 목차
GORM이란?
프로젝트 설정 및 설치
데이터베이스 연결
모델 정의
마이그레이션 (자동 테이블 생성)
CRUD 예제
Gin과 연동하여 REST API 만들기
마무리 및 참고 자료
1. GORM이란?
GORM은 Go 언어용 ORM(Object-Relational Mapping) 라이브러리로, SQL 문을 직접 쓰지 않고도 Go 코드로 데이터베이스를 다룰 수 있게 해준다.
공식 문서: https://gorm.io
대표적인 특징:
- 다양한 DB 지원 (MySQL, PostgreSQL, SQLite, SQL Server 등)
- 마이그레이션 기능
- Association (관계 매핑: has one, belongs to 등)
- 트랜잭션, hook, preload 등 다양한 기능 지원
2. 프로젝트 설정 및 설치
✅ 기본 디렉터리 구조
myapp/
├── main.go
├── models/
│ └── user.go
├── database/
│ └── connection.go
└── go.mod
✅ 필요한 패키지 설치
go mod init myapp
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
go get -u github.com/gin-gonic/gin
3. 데이터베이스 연결
// database/connection.go
package database
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
var DB *gorm.DB
func ConnectDB() {
dsn := "user:password@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local"
var err error
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("데이터베이스 연결 실패:", err)
}
}
dsn에는 DB 계정 정보와 DB명을 입력해야 한다.
4. 모델 정의
// models/user.go
package models
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string `gorm:"unique"`
Password string
}
참고: gorm.Model을 내장하면 ID, CreatedAt, UpdatedAt, DeletedAt 자동으로 포함됨
5. 마이그레이션
main.go나 초기화 로직에서 다음 코드를 실행하면, GORM이 자동으로 테이블을 생성해준다.
// main.go
package main
import (
"myapp/database"
"myapp/models"
)
func main() {
database.ConnectDB()
database.DB.AutoMigrate(&models.User{})
}
6. CRUD 예제
✅ Create
user := models.User{Name: "홍길동", Email: "hong@example.com", Password: "pass123"}
result := database.DB.Create(&user)
if result.Error != nil {
log.Println("생성 실패:", result.Error)
}
🔍 Read
var user models.User
database.DB.First(&user, 1) // ID가 1인 사용자 찾기
database.DB.Where("email = ?", "hong@example.com").First(&user)
✏️ Update
database.DB.Model(&user).Update("Name", "이몽룡")
database.DB.Model(&user).Updates(models.User{Name: "이몽룡", Email: "lee@example.com"})
🗑️ Delete
database.DB.Delete(&user)
database.DB.Delete(&models.User{}, 1) // ID 기준 삭제
7. Gin과 연동하여 REST API 만들기
🔧 전체 예제: 사용자 생성 API
// main.go
package main
import (
"github.com/gin-gonic/gin"
"myapp/database"
"myapp/models"
)
func main() {
r := gin.Default()
database.ConnectDB()
database.DB.AutoMigrate(&models.User{})
r.POST("/users", func(c *gin.Context) {
var user models.User
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": "잘못된 요청 형식입니다."})
return
}
if err := database.DB.Create(&user).Error; err != nil {
c.JSON(500, gin.H{"error": "사용자 생성 실패"})
return
}
c.JSON(200, user)
})
r.Run()
}
Postman이나 curl로 POST /users 요청을 보내면 DB에 사용자 정보가 저장된다.
8. 마무리 및 참고 자료
이번 글에서는 Go로 백엔드를 만들 때 GORM을 사용하는 기본적인 방법을 다뤘다.
GORM은 단순한 CRUD 뿐 아니라 아래와 같은 고급 기능도 제공하니, 실무에서 매우 유용하다.
- Soft Delete
- 관계 매핑 (1:N, N:M)
- Preloading
- 트랜잭션 처리
공식 문서에서 더 많은 내용을 확인할 수 있다:
🔗 https://gorm.io/docs
'개발 > Go' 카테고리의 다른 글
[Gin] GORM 고급 기능 완전 정복 - Soft Delete, Hook, 트랜잭션까지! (99) | 2025.05.28 |
---|---|
[Gin] GORM 관계 설정 완전 정복 - 1:N, N:1, N:M 예제로 배우기 (60) | 2025.05.26 |
[Gin] Gin 시작해보자! (95) | 2025.05.14 |
[Fiber] Fiber Template 사용하기 (2) | 2022.11.08 |
[Fiber] Fiber Routing과 Grouping (0) | 2022.11.07 |