학습
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("데이터베이스에 성공적으로 연결되었습니다.") // 성공 메시지 출력
}
실행 결과
데이터베이스에 성공적으로 연결되었습니다.
코드 한 줄씩 동작 설명
package main: Go 프로그램의 메인 패키지를 정의합니다.import: 필요한 패키지를 가져옵니다.github.com/lib/pq는 PostgreSQL 드라이버입니다.connStr: 데이터베이스 연결 정보를 저장합니다.sql.Open: 데이터베이스에 연결을 시도합니다. 이때 드라이버 이름과 연결 문자열을 전달합니다.log.Fatal(err): 에러가 발생하면 바로 로그에 기록하고 프로그램을 종료합니다.defer db.Close(): 함수가 종료될 때 DB 연결을 해제합니다.db.Ping(): 데이터베이스와의 연결이 유효한지 확인합니다.fmt.Println: 성공 메시지를 출력합니다.- 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
- 데이터베이스 연결은 애플리케이션의 데이터 영속성을 보장합니다.
- DB 드라이버와 ORM을 통해 데이터베이스와 효과적으로 소통할 수 있습니다.
- 항상 에러를 체크하고, 연결 해제를 잊지 말아야 합니다.
- SQL 쿼리 최적화
- ORM 사용법 (예: GORM)
- 트랜잭션 관리
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 연결 해제 안 하기
func main() {
db, err := sql.Open("postgres", connStr)
// defer db.Close()를 잊음
}
defer db.Close() // 항상 연결 해제를 잊지 말 것
실수 2: 에러 처리 소홀
_, err := db.Exec("...")
// err를 체크하지 않음
if err != nil {
log.Fatal(err) // 항상 에러를 체크하여 적절히 처리
}
6. 정리
다음에 학습하면 좋은 주제: