개발/Go

[Gin] Go + Gin + GORM으로 백엔드 만들기 (기초부터 CRUD까지)

devhooney 2025. 5. 24. 13:39
728x90

Go로 웹 백엔드를 만들 때 가장 많이 사용되는 조합 중 하나가 바로 Gin + GORM이다.
Gin은 가볍고 빠른 웹 프레임워크이고, GORM은 Go 언어에서 가장 널리 쓰이는 ORM(Object Relational Mapping) 라이브러리다.

이번 글에서는 Gin + GORM을 사용해 MySQL 기반의 간단한 백엔드 서버를 만드는 방법을 초보자도 이해할 수 있도록 하나하나 설명해보려 한다.

 

 

 

 

📌 목차
GORM이란?
프로젝트 설정 및 설치
데이터베이스 연결
모델 정의
마이그레이션 (자동 테이블 생성)
CRUD 예제
Gin과 연동하여 REST API 만들기
마무리 및 참고 자료

 

 


 

 

728x90

 

 

 

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

728x90