Home [Go] sql.Open()은 정말로 디비와의 커넥션을 만들까?
Post
Cancel

[Go] sql.Open()은 정말로 디비와의 커넥션을 만들까?

고 언어로 짜여진 서버사이드 코드를 보면 아래와 같은 코드를 빈번히 볼 수 있다.

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)
    }
  
    ...
}
This post is licensed under CC BY 4.0 by the author.

백준 6064 카잉달력, 이 문제를 풀지 못한 사람들을 위한 풀이

[번역/요약] 협업을 위한 REST API Best Practices