IMCAT.DEV
로그인 가입
Go 중급 데이터베이스

Go 데이터베이스 연결 (Database Connection)

Go 데이터베이스 연결 (Database Connection) — 중급

데이터베이스 연결 (Database Connection)

1. 도입 (왜 배워야 하는가)

데이터베이스 연결은 현대의 웹 애플리케이션 개발에서 필수적인 요소입니다. 사용자가 입력한 데이터를 저장하고, 이를 불러오는 과정은 모든 애플리케이션에서 빈번하게 발생합니다. 예를 들어, 쇼핑몰에서는 사용자가 장바구니에 담은 상품 정보를 저장하고, 결제 시 이를 불러오는 등의 작업이 필요합니다.

만약 데이터베이스 연결을 제대로 이해하지 못한다면, 데이터의 영속성을 보장할 수 없고, 이는 곧 사용자 경험을 저하시킬 수 있습니다. 데이터가 유실되거나 올바르게 관리되지 않으면, 사용자 신뢰를 잃게 되며, 애플리케이션의 가치는 떨어지게 됩니다.

2. 핵심 개념 설명

  • 데이터베이스: 데이터를 저장하고 관리하는 시스템. 예를 들어, 쇼핑몰의 모든 상품 정보, 사용자 정보 등을 저장하는 큰 서랍장과 같습니다.
  • DB 드라이버: 데이터베이스와 애플리케이션 간의 통신을 가능하게 해주는 소프트웨어. 드라이버는 자동차의 엔진과 같아서, 엔진이 없으면 자동차가 움직이지 못하는 것과 비슷합니다.
  • ORM (Object-Relational Mapping): 데이터베이스의 데이터를 객체 지향 프로그래밍 언어의 객체로 매핑해주는 방법. 마치 외국어를 번역해서 이해하기 쉽게 바꿔주는 번역가와 같습니다.
  • 용어설명
    데이터베이스데이터를 저장하는 시스템
    DB 드라이버데이터베이스와 통신을 담당하는 소프트웨어
    ORM데이터베이스의 데이터를 객체로 매핑하는 기술

    3. 기본 코드 예제

    데이터베이스에 연결하는 가장 기본적인 코드 예제를 살펴보겠습니다.

    package main
    
    import (
        "database/sql"
        "fmt"
        "log"
        _ "github.com/lib/pq" // PostgreSQL 드라이버
    )
    
    func main() {
        // 데이터베이스 연결 문자열
        connStr := "user=username dbname=mydb sslmode=disable"
        
        // 데이터베이스에 연결
        db, err := sql.Open("postgres", connStr)
        if err != nil {
            log.Fatal(err) // 연결 오류 발생 시 로그를 남김
        }
        defer db.Close() // 함수 종료 후 DB 연결 해제
    
        // 연결 확인
        err = db.Ping()
        if err != nil {
            log.Fatal(err) // 핑 오류 발생 시 로그를 남김
        }
    
        fmt.Println("데이터베이스에 성공적으로 연결되었습니다.") // 성공 메시지 출력
    }

    실행 결과

    데이터베이스에 성공적으로 연결되었습니다.

    코드 한 줄씩 동작 설명

    1. package main: Go 프로그램의 메인 패키지를 정의합니다.
    2. import: 필요한 패키지를 가져옵니다. github.com/lib/pq는 PostgreSQL 드라이버입니다.
    3. connStr: 데이터베이스 연결 정보를 저장합니다.
    4. sql.Open: 데이터베이스에 연결을 시도합니다. 이때 드라이버 이름과 연결 문자열을 전달합니다.
    5. log.Fatal(err): 에러가 발생하면 바로 로그에 기록하고 프로그램을 종료합니다.
    6. defer db.Close(): 함수가 종료될 때 DB 연결을 해제합니다.
    7. db.Ping(): 데이터베이스와의 연결이 유효한지 확인합니다.
    8. fmt.Println: 성공 메시지를 출력합니다.
    9. 4. 실전 활용 예제

      예제 1: 사용자 등록

      쇼핑몰에서 사용자가 회원가입할 때, 사용자 정보를 데이터베이스에 저장하는 예제입니다.

      func registerUser(db *sql.DB, username string, password string) error {
          _, err := db.Exec("INSERT INTO users (username, password) VALUES ($1, $2)", username, password)
          return err
      }

      상황 설명: 사용자가 회원가입 양식에 정보를 입력하면, 해당 함수가 호출되어 데이터베이스에 사용자 정보를 저장합니다.

      예제 2: 상품 조회

      쇼핑몰에서 사용자가 상품 목록을 조회할 때, 데이터베이스에서 상품 정보를 가져오는 예제입니다.

      func getProducts(db *sql.DB) ([]Product, error) {
          rows, err := db.Query("SELECT id, name, price FROM products")
          if err != nil {
              return nil, err
          }
          defer rows.Close()
      
          var products []Product
          for rows.Next() {
              var product Product
              if err := rows.Scan(&product.ID, &product.Name, &product.Price); err != nil {
                  return nil, err
              }
              products = append(products, product)
          }
          return products, nil
      }

      상황 설명: 사용자가 상품 목록 버튼을 클릭하면, 해당 함수가 호출되어 데이터베이스에서 모든 상품 정보를 조회합니다.

      5. 흔한 실수와 주의사항

      실수 1: DB 연결 해제 안 하기

    10. 잘못된 코드:
    11. func main() {
          db, err := sql.Open("postgres", connStr)
          // defer db.Close()를 잊음
      }
    12. 올바른 코드:
    13. defer db.Close() // 항상 연결 해제를 잊지 말 것

      실수 2: 에러 처리 소홀

    14. 잘못된 코드:
    15. _, err := db.Exec("...")
      // err를 체크하지 않음
    16. 올바른 코드:
    17. if err != nil {
          log.Fatal(err) // 항상 에러를 체크하여 적절히 처리
      }

      6. 정리

    18. 데이터베이스 연결은 애플리케이션의 데이터 영속성을 보장합니다.
    19. DB 드라이버와 ORM을 통해 데이터베이스와 효과적으로 소통할 수 있습니다.
    20. 항상 에러를 체크하고, 연결 해제를 잊지 말아야 합니다.
    21. 다음에 학습하면 좋은 주제:

    22. SQL 쿼리 최적화
    23. ORM 사용법 (예: GORM)
    24. 트랜잭션 관리