2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Go에서 데이터베이스 쿼리를 실행하는 방법은 무엇인가요?

_____
Q: Go에서 데이터베이스 쿼리를 실행하려면 어떤 패키지를 사용해야 하나요?
A: Go에서는 표준 라이브러리의 `database/sql` 패키지를 주로 사용하며, 각 데이터베이스에 맞는 드라이버를 함께 사용해야 합니다. 예를 들어 MySQL은 `github.com/go-sql-driver/mysql`, PostgreSQL은 `github.com/lib/pq` 같은 드라이버가 있습니다.

Q: 데이터베이스에 연결하는 기본적인 방법은 어떻게 되나요?
A: `sql.Open(driverName, dataSourceName)` 함수를 사용해 데이터베이스 연결을 초기화합니다. 예를 들어:
```go
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname")
if err != nil {
log.Fatal(err)
}
defer db.Close()
```
`db` 객체를 통해 쿼리를 실행합니다.

Q: 쿼리를 실행하는 함수에는 어떤 것이 있나요?
A: 주요 함수는 세 가지입니다.
- `db.Query(query, args...)`: 여러 행(row)을 반환하는 SELECT 쿼리 실행
- `db.QueryRow(query, args...)`: 단일 행(row)을 반환하는 SELECT 쿼리 실행
- `db.Exec(query, args...)`: INSERT, UPDATE, DELETE 같은 데이터 변경 쿼리 실행

Q: SELECT 쿼리를 실행하고 결과를 읽는 예제는 어떻게 작성하나요?
A: `db.Query`를 사용해 여러 행을 받고, `rows.Scan`으로 각각 필드를 읽습니다. 예:
```go
rows, err := db.Query("SELECT id, name FROM users WHERE age > ?", 30)
if err != nil {
log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Println(id, name)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
```

Q: 단일 행 결과를 가져올 때는 어떻게 하나요?
A: `db.QueryRow`를 사용하고 `Scan`으로 결과를 저장합니다:
```go
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = ?", 1).Scan(&name)
if err != nil {
if err == sql.ErrNoRows {
fmt.Println("No user found")
} else {
log.Fatal(err)
}
}
fmt.Println(name)
```

Q: INSERT, UPDATE, DELETE 같은 쿼리 실행 후 결과를 확인하려면?
A: `db.Exec`를 사용하며, 반환되는 `sql.Result`에서 영향을 받은 행 수나 마지막 삽입 ID를 얻을 수 있습니다:
```go
res, err := db.Exec("UPDATE users SET active = ? WHERE id = ?", true, 1)
if err != nil {
log.Fatal(err)
}
rowsAffected, err := res.RowsAffected()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d rows updated\n", rowsAffected)
```

Q: 쿼리 실행 시 SQL 인젝션 공격을 막으려면 어떻게 해야 하나요?
A: 쿼리문에 직접 값을 붙이지 말고 반드시 `?` 플레이스홀더를 이용해 파라미터를 전달하세요. 예:
```go
db.Query("SELECT * FROM users WHERE name = ?", username)
```

Q: 트랜잭션 내에서 쿼리를 실행하려면 어떻게 해야 하나요?
A: `db.Begin()`으로 트랜잭션을 시작하고, `tx.Exec` 또는 `tx.Query`로 쿼리를 실행합니다. 트랜잭션 완료 시 `tx.Commit()` 또는 `tx.Rollback()` 을 호출합니다. 예:
```go
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", 100, 1)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
err = tx.Commit()
if err != nil {
log.Fatal(err)
}
```

Q: 데이터베이스 연결은 어떻게 관리해야 하나요?
A: `sql.DB`는 내부적으로 커넥션 풀을 관리합니다. 애플리케이션 전체에서 `sql.DB` 객체를 재사용하고, 프로그램 종료 시 `defer db.Close()`로 연결을 정리하세요.

Q: 쿼리 실행 시 발생한 오류는 어떻게 처리하나요?
A: 쿼리 함수들은 오류를 리턴하므로, 항상 오류를 체크하여 적절한 예외 처리를 해야 합니다. 예를 들어, `sql.ErrNoRows`일 경우 결과가 없다는 의미로 별도 처리할 수 있습니다.
Go에서 데이터베이스 쿼리를 실행하는 방법은 Go의 `database/sql` 패키지를 사용하여 수행할 수 있습니다.

이 패키지는 SQL 데이터베이스와의 상호작용을 위한 표준 인터페이스를 제공합니다.

아래에서는 Go에서 데이터베이스 쿼리를 실행하는 방법을 단계별로 설명하겠습니다.

1. 데이터베이스 드라이버 설치 Go에서 특정 데이터베이스에 연결하기 위해서는 해당 데이터베이스에 맞는 드라이버를 설치해야 합니다.

예를 들어, MySQL을 사용하려면 `go-sql-driver/mysql` 패키지를 설치해야 합니다.

다음과 같이 설치할 수 있습니다: ```bash go get -u github.com/go-sql-driver/mysql ``` PostgreSQL을 사용하려면 `lib/pq` 드라이버를 설치할 수 있습니다: ```bash go get -u github.com/lib/pq ```

2. 데이터베이스 연결 데이터베이스에 연결하기 위해서는 `sql.Open` 함수를 사용합니다.

이 함수는 데이터베이스 드라이버 이름과 연결 문자열을 인자로 받습니다.

연결 문자열은 데이터베이스의 종류에 따라 다릅니다.

```go package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" // MySQL 드라이버 ) func main() { // 데이터베이스 연결 dsn := "user:password@tcp(127.0.0.1:330

6)/dbname" db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() // 연결 확인 if err := db.Ping(); err != nil { log.Fatal(err) } fmt.Println("데이터베이스에 성공적으로 연결되었습니다.

") } ```

3. 쿼리 실행 데이터베이스에 연결한 후, SQL 쿼리를 실행할 수 있습니다.

`db.Query` 또는 `db.Exec` 메서드를 사용하여 SELECT, INSERT, UPDATE, DELETE 쿼리를 실행할 수 있습니다.

SELECT 쿼리 SELECT 쿼리를 실행할 때는 `db.Query` 메서드를 사용합니다.

이 메서드는 결과를 반환하는 `*sql.Rows` 객체를 반환합니다.

```go rows, err := db.Query("SELECT id, name FROM users") if err != nil { log.Fatal(err) } defer rows.Close() for rows.Next() { var id int var name string if err := rows.Scan(&id, &name); err != nil { log.Fatal(err) } fmt.Printf("ID: %d, Name: %s\n", id, name) } if err := rows.Err(); err != nil { log.Fatal(err) } ``` INSERT, UPDATE, DELETE 쿼리 INSERT, UPDATE, DELETE 쿼리는 `db.Exec` 메서드를 사용하여 실행합니다.

이 메서드는 실행된 쿼리의 결과를 나타내는 `sql.Result` 객체를 반환합니다.

```go result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "John Doe") if err != nil { log.Fatal(err) } lastInsertID, err := result.LastInsertId() if err != nil { log.Fatal(err) } fmt.Printf("새로운 사용자 ID: %d\n", lastInsertID) ```

4. 트랜잭션 처리 Go의 `database/sql` 패키지는 트랜잭션을 지원합니다.

트랜잭션을 사용하려면 `db.Begin` 메서드를 호출하여 트랜잭션을 시작하고, `tx.Commit` 또는 `tx.Rollback` 메서드를 사용하여 트랜잭션을 완료하거나 취소합니다.

```go tx, err := db.Begin() if err != nil { log.Fatal(err) } _, err = tx.Exec("INSERT INTO users (name) VALUES (?)", "Jane Doe") if err != nil { tx.Rollback() // 오류 발생 시 롤백 log.Fatal(err) } err = tx.Commit() // 성공적으로 완료 if err != nil { log.Fatal(err) } ```

5. 에러 처리 Go에서는 에러 처리가 매우 중요합니다.

데이터베이스 쿼리를 실행할 때 발생할 수 있는 모든 에러를 적절히 처리해야 합니다.

위의 예제에서 보듯이, 각 쿼리 실행 후에는 에러를 체크하고, 필요에 따라 롤백하거나 로그를 남기는 등의 처리를 해야 합니다.



6. 마무리 Go에서 데이터베이스 쿼리를 실행하는 것은 `database/sql` 패키지를 통해 간단하게 수행할 수 있습니다.

데이터베이스 드라이버를 설치하고, 연결을 설정한 후, 다양한 SQL 쿼리를 실행할 수 있습니다.

트랜잭션 처리와 에러 처리를 통해 안정적인 데이터베이스 작업을 수행할 수 있습니다.

Go의 강력한 타입 시스템과 간결한 문법 덕분에 데이터베이스 작업을 효율적으로 수행할 수 있습니다.

작성자: 정주영 [비회원] | 작성일자: 1년 전 2024-09-19 01:50:41
조회수: 148 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.