본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 MySQL / MariaDB 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인가요?

by 밝음의기둥 2025. 1. 24.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 MySQL / MariaDB 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인지 간략히 알아보았습니다.


질문 >

Go 에서 MySQL / MariaDB 와 연동하려면, 어떤 모듈을 사용하는 것이 가장 효율적인가요?

답변 >

Go에서 MySQL 또는 MariaDB와 연동하려면, 효율적이고 널리 사용되는 라이브러리를 선택하는 것이 중요합니다. 아래는 가장 인기 있는 MySQL/MariaDB 클라이언트와 사용 방법입니다.


1. go-sql-driver/mysql

특징:

  • Go에서 가장 널리 사용되는 MySQL 드라이버.
  • 표준 database/sql 패키지와 호환.
  • MySQL 및 MariaDB 지원.

설치:

go get -u github.com/go-sql-driver/mysql

사용 예제:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // MySQL 데이터베이스 연결 설정
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 연결 확인
    if err := db.Ping(); err != nil {
        panic(err)
    }
    fmt.Println("Connected to MySQL!")

    // 데이터 조회 예제
    rows, err := db.Query("SELECT id, name FROM users")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name string
        if err := rows.Scan(&id, &name); err != nil {
            panic(err)
        }
        fmt.Printf("ID: %d, Name: %s\\n", id, name)
    }
}


2. gorm

특징:

  • Go용 ORM(Object-Relational Mapping) 라이브러리.
  • 코드 가독성과 생산성을 높이는 데 도움.
  • MySQL/MariaDB뿐만 아니라 다양한 데이터베이스 지원 (PostgreSQL, SQLite, 등).

설치:

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

사용 예제:

package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type User struct {
    ID   uint   `gorm:"primaryKey"`
    Name string `gorm:"size:100"`
}

func main() {
    // MySQL 데이터베이스 연결 설정
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    fmt.Println("Connected to MySQL with GORM!")

    // 자동 마이그레이션
    db.AutoMigrate(&User{})

    // 데이터 생성
    db.Create(&User{Name: "Alice"})

    // 데이터 조회
    var users []User
    db.Find(&users)
    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s\\n", user.ID, user.Name)
    }
}


3. sqlx

특징:

  • database/sql을 확장한 라이브러리.
  • 더 간단한 API를 제공하며, 구조체 매핑 기능이 추가됨.
  • 성능은 database/sql과 유사.

설치:

go get github.com/jmoiron/sqlx

사용 예제:

package main

import (
    "fmt"
    "github.com/jmoiron/sqlx"
    _ "github.com/go-sql-driver/mysql"
)

type User struct {
    ID   int    `db:"id"`
    Name string `db:"name"`
}

func main() {
    // MySQL 데이터베이스 연결 설정
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
    db, err := sqlx.Connect("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()

    fmt.Println("Connected to MySQL with sqlx!")

    // 데이터 조회
    var users []User
    err = db.Select(&users, "SELECT id, name FROM users")
    if err != nil {
        panic(err)
    }

    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s\\n", user.ID, user.Name)
    }
}


4. ent

특징:

  • 코드 생성 기반 ORM 라이브러리.
  • 스키마 정의를 코드로 관리.
  • 타입 안정성 높은 쿼리 지원.

설치:

go get entgo.io/ent/cmd/ent

사용:

  • 스키마 생성:
go run entgo.io/ent/cmd/ent init User

  • 사용자 스키마 정의:
package schema

import "entgo.io/ent/schema/field"

// User holds the schema definition for the User entity.
type User struct {
    ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name"),
    }
}

  • 코드 생성:
go generate ./...

  • 사용:
package main

import (
    "context"
    "fmt"
    "myproject/ent"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    client, err := ent.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
    if err != nil {
        panic(err)
    }
    defer client.Close()

    ctx := context.Background()

    // 데이터 생성
    user, err := client.User.Create().SetName("Bob").Save(ctx)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Created user: %v\\n", user)
}


5. 라이브러리 비교

라이브러리 주요 특징  적합한 경우
go-sql-driver/mysql 기본 SQL 드라이버, 경량, 성능 최적화. SQL 쿼리를 직접 작성하는 경우.
gorm 풍부한 기능의 ORM, 자동 마이그레이션, 구조체 중심 개발 지원. 생산성을 중요하게 생각하고 ORM이 필요한 경우.
sqlx database/sql 확장, 구조체 매핑, 간결한 API 제공. 성능과 간결성을 동시에 고려하는 경우.
ent 타입 안전성 높은 코드 생성 기반 ORM. 스키마를 코드로 관리하고 싶을 때.

6. 결론

  • SQL을 직접 제어해야 한다면 go-sql-driver/mysql이나 sqlx를 사용하세요.
  • ORM을 사용해 생산성을 높이고 싶다면 gorm 또는 ent를 추천합니다.
  • MariaDB와 MySQL은 대부분의 라이브러리에서 동일하게 지원되므로, 데이터베이스 특성에 따라 적합한 클라이언트를 선택하세요.


🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형