일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 오블완
- AWS
- replication lag
- 티스토리챌린지
- blank import
- typescript
- context7
- sqs fifo queue
- go-sql-driver
- Intellij
- AI
- RDS
- ssh 에이전트
- Infra
- javascript
- GoF
- goland
- esbuild
- redirect-gateway
- elasticsearch
- 캡슐화
- go
- Kubernetes
- 디자인패턴
- 2024 톨스토이문학상 수상
- 구조체
- authorizationpolicy
- GIT
- golang
- database/sql
- Today
- Total
Fall in IT.
Go에서 _ "github.com/go-sql-driver/mysql"는 왜 필요한가? 본문
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 해야하는 패키지다.
참고
'프로그래밍언어 > Golang' 카테고리의 다른 글
Go에서 context.WithValue() 안전하게 사용하기 (0) | 2025.09.03 |
---|---|
Go에서 DB 데이터를 도메인 엔티티로 복원 전략과 Java 비교 (0) | 2025.09.02 |
DB 업데이트, SQS 메시지 발송 트랜잭션으로 묶을 수 있을까? (4) | 2025.07.18 |
Go언어에서 구조체의 필드는 Public? Private? 어떤게 맞을까? (0) | 2025.03.29 |
Go 언어로 PubSub 모델 개발하기 (2) | 2024.11.24 |