개요

golang을 통해 MySQL의 데이터베이스에 쿼리를 날리는 방법을 알아본다. 

 

필요 모듈

DB의 연동과 관련된 database/sql 모듈과 MySQL 드라이버인 go-sql-driver/mysql 모듈을 임포트한다. 
드라이버는 기본 모듈이 아니므로 go get github.com/go-sql-driver/mysql 명령을 통해 먼저 다운로드 한다. 

golang에서는 import 순서가 중요하므로 database/sql이 sql드라이버보다 앞서서 선언되어야한다. 

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

 

DB 연동

golang에서의 DB 연동은 별도의 datasource를 설정 하는 과정 없이, db 접속 정보만 가지고 진행할 수 있다. 

연동을 편리하게 하기 위해 DB 정보를 담은 구조체를 만든다. 

type dbInfo struct {
   user         string
   pwd          string
   url          string
   engine       string
   database     string
}

아래와 같이 db 정보를 초기화하여 선언한다. 

var db1 = dbInfo{"root","mypassword","localhost:3306","mysql","test"}

 

쿼리를 날릴 함수를 작성한다. 

dataSource는 DB와 애플리케이션간의 커넥션을 설정할 때, sql 드라이버가 알아들을 수 있는 모양으로 DB 접속 정보를 작성한다. 실제로 정보를 주입하면 root:mypassword@tcp(localhost:3306)/test 의 형태로 주어진다.

DB 엔진 정보와 접속 정보를 입력하면 connection이 생긴다. 

func dbQuery(db dbInfo,query string) (count int) {
   dataSource := db.user+":"+db.pwd+"@tcp("+db.url+")/"+db.database
   conn,err := sql.Open(db.engine,dataSource)

 

golang의 nil은 null을 의미한다. sql.Open을 호출해서 어떤 에러가 반환되면 Fatal 로그를 남긴다.

defer은 Java의 finally 블럭과 같이 function이 다 끝났을 때 수행할 행동을 정의한다. connection을 닫아줄 수 있도록 conn.Close()를 호출하도록 작성한다.  

   if err != nil {
      log.Fatal(err)
   }
   defer conn.Close()

 

conn.QueryRow(query)를 통해 쿼리를 수행한다. query의 값은 SQL문을 그대로 사용할 수 있으며, placeholder의 경우 DB 엔진마다 다르다.(MySQL:?, Postgres:$1 등)

Scan(&colname)은 해당 row의 Column 이름을 찾겠다는 의미이다. SELECT COUNT(*) 등의 쿼리를 수행했을 경우 &count로 값을 받을 수 있다.  

connection과 마찬가지로 Query 수행 중 에러 발생 시 행동을 if err != nil 블럭 내부에 선언할 수 있다. 

   err = conn.QueryRow(query).Scan(&count)
   if err != nil {
      log.Fatal(err)
   }
   fmt.Println(count)
   return count
}

 

main 함수에서 쿼리를 수행하면 쿼리 결과를 얻을 수 있다. 

func main() {
   result := dbQuery(db1,query)
   print(result)
}

 

go run dbMonitoring.go
Query Result: 3