728x90
반응형
Golang(Gin 프레임워크 사용)으로 백엔드를 사용하던중 WSL2에 올려놓은 MySQL에 연결을 하려고하니 계속 다음과 같은 에러가 발생했습니다.
로컬에서는 mysql이 잘 접속되는 상황이 었습니다.
하지만 -h로 호스트 주소를 지정할 경우에는 똑같이 에러메시지가 발생하는 것을 볼 수 있었습니다.
그런데 -h 옵션을 주었을때 127.0.0.1이 아닌 localhost를 주었을 때는 접속이 되는 상황이었습니다.
그래서 localhost와 127.0.0.1로 접속시도시 차이점에 대해 찾아보았더니 localhost로 접속 시도시 유닉스 소켓을 통해 mysql에 연결하고 127.0.0.1로 연결시도시 TCP/IP로 연결하게 됩니다.
그래서 Go 코드에서 TCP연결이 아닌 Socket 연결을 하도록 다음과 같이 변경한 후 연결을 시도해보면 연결이 잘되는 것을 볼 수 있습니다.
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
// socket 연결을 위한 데이터를 세팅해두는 구조체
type ConnPath struct {
// db 계정이름
username string
// db 계정 패스워드
password string
// Socket 파일 위치
socketPath string
// 연결할 데이터베이스 이름
database string
}
// Mysql을 Scoket으로 연결하기 위해 사용하는 함수
func GetSocketConn() string {
connInfo := ConnPath{
username: "root",
password: "root",
socketPath: "/var/run/mysqld/mysqld.sock",
database: "gomusic",
}
conn := connInfo.username + ":" + connInfo.password +
"@unix(" + connInfo.socketPath + ")" + "/" +
connInfo.database + "?charset=utf8"
return conn
}
func main() {
conn, err := sql.Open("mysql", GetSocketConn())
if err != nil {
log.Fatal(err)
}
fmt.Println(conn)
}
다음과 같이 socket 연결을 하도록 코드를 수정하면 잘 연결되는 것을 확인할 수 있습니다.
Golang에서 MySQL에 소켓 연결을 하고 싶을 경우 다음과 같은 방법을 사용해서 연결하면 됩니다.
$USERNAME:$PASSWORD@unix($SocketPath)/$DBName?charset=utf8
- $USERNAME : DB 사용자 계정명 (ex : root)
- $PASSWORD : DB 사용자 계정의 패스워드
- $SocketPath : MySQL 소켓 위치(ex : /var/run/mysqld/mysqld.sock)
- $DBName : 사용할 데이터베이스 이름
반응형
'Go' 카테고리의 다른 글
[gRPC] gRPC의 등장배경과 gRPC 이전의 통신 (0) | 2021.12.22 |
---|