Fall in IT.

Go에서 _ "github.com/go-sql-driver/mysql"는 왜 필요한가? 본문

프로그래밍언어/Golang

Go에서 _ "github.com/go-sql-driver/mysql"는 왜 필요한가?

D.Y 2025. 9. 2. 11:13
반응형

Go 언어로 Database에 접근하려고 할때, 보통 이런 코드가 들어간다.

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

여기서 github.com/go-sql-driver/mysql은 MySQL 드라이버인데, 흥미로운 점은 _로 import 한다는 점이다.

“어? 명시적으로 사용하지 않는걸 반드시 임포트해야 동작하게 만들어놨다고..?” 란 의문이 생긴다.

이 부분에 대해서 그 이유와 동작 방식을 쉽게 풀어보겠다.

1. Blank Import (_)의 의미

Go에서 import _ “패키지”는 해당 패키지를 코드에서 직접 사용하지는 않지만, 패키지의 init() 함수는 실행되게 만든다.

즉, _를 붙이면 명시적으로 패키지를 호출하여 사용하진 않지만, side effect로 초기화 로직이 필요할때 사용할 수 있다.

2. MySQL 드라이버 패키지의 init() 함수

github.com/go-sql-driver/mysql 안의 어떤 로직을 실행하기 위해서 사용하는걸까? 찾아봤다.

driver.go 라는 파일안에 아래와 같은 코드가 들어있다.

var driverName = "mysql"

func init() {
	if driverName != "" {
		sql.Register(driverName, &MySQLDriver{})
	}
}

이 코드는 database/sql 패키지에 “mysql” 드라이버를 등록시켜주는 역할을 한다.

Go의 표준 라이브러리 database/sql은 DB에 접근하는 공통 인터페이스만 제공하고 MySQL, Postgres 와 같은 DB에 직접적으로 연결할 수 없다. 그래서 구체적인 드라이버는 직접 등록해서 사용할 수 있도록 Register 메서드를 제공하고 있고 이 메서드를 각 DB 벤더들은 초기화 함수를 통해서 등록되도록 구현해놓은 것이다.

이렇게 등록되면, sql.Open(”mysql”, “…”) 호출 시 “mysql” 이름을 찾아서 해당 드라이버를 사용하게 된다.

3. 꼭 필요할까?

만약, 제거한다면?

db, err := sql.Open("mysql", "...")

여기서 “mysql” 드라이버를 못 찾게된다. 왜냐하면 등록 과정이 실행되지 않았기 때문이다. 즉, DB 연결 시점에서 “unknown driver: mysql “ 에러가 발생한다.

4. 정리

  • _ “github.com/go-sql-driver/mysql” 패키지는 직접 쓰는게 아니라 초기화 코드를 실행시키기 위한 설정이다.
    • Go 표준 라이브러리 database/sql의 설명이다.
    • Package sql provides a generic interface around SQL (or SQL-like) databases.
    • The sql package must be used in conjunction with a database driver. See https://golang.org/s/sqldrivers for a list of drivers.
  • 초기화 덕분에 특정 드라이버가 등록되고 DB 호출이 가능해진다.
  • 따라서 명시적으로 사용되는 패키지는 아니지만 필수 import 해야하는 패키지다.

참고

반응형
Comments