고 언어로 짜여진 서버사이드 코드를 보면 아래와 같은 코드를 빈번히 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
func main() {
...
conn, err := sql.Open(config.DBDriver, config.DBSource)
if err != nil {
log.Fatal("fail to connect db: ", err)
}
...
}
위 코드만 봤을 때 우리는 아! 이 부분에서 에러가 발생하면 디비와의 연결이 되어있지 않은 상태인 거구나!
라고 생각하기 쉽다.
하지만!! db.Open()
에서 반환되는 에러는 디비와의 커넥션과는 무관하다!!
문서를 읽어보면 아래처럼 설명한다.
1
Open may just validate its arguments without creating a connection to the database. ...
Open()
메서드는 인자 값들의 유효성만 검증해 줄 뿐 실제 디비와 커넥션을 이루어주지는 않는다.
그렇다면 디비와의 연결이 보장되었다는 걸 알고 싶으면 어떻게 해야 할까?
사실 위문장 뒤에 한 문장이 더 숨겨져있다.
1
2
3
Open may just validate its arguments without creating a connection to the database.
To verify that the data source name is valid, call Ping.
실제 디비와의 커넥션이 잘 이루어져 있는지 확인하려면 Ping()
메서드를 사용해야 하나보다.
그래서 기존의 코드를 알맞은 의도와 방법으로 수정하면 아래와 같이 수정할 수 있겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main() {
...
conn, err := sql.Open(config.DBDriver, config.DBSource)
if err != nil {
log.Fatal("invalid db: ", err)
}
defer conn.Close()
if err := conn.Ping(); err != nil {
log.Fatal("cannot connect to db: ", err)
}
...
}