Go 준비된 명령문: 안내와 예제
Emily Parker
Product Engineer · Leapcell

Go에서 database/sql
패키지는 준비된 명령문에 대한 강력한 지원을 제공합니다. 이는 동일한 SQL 명령문을 여러 번 효율적이고 안전하게 실행하는 데 유용합니다. 준비된 명령문은 SQL Injection 공격을 방지하고 데이터베이스가 반복되는 쿼리에 대한 실행 계획을 최적화하도록 하여 성능을 향상시킬 수 있습니다.
Key Takeaways
- 준비된 명령문은 SQL Injection을 방지하여 보안을 향상시킵니다.
- 반복 사용을 위해 쿼리 실행을 최적화하여 성능을 향상시킵니다.
- 적절한 리소스 관리 (명령문 닫기, 오류 처리)가 필수적입니다.
준비된 명령문이란 무엇입니까?
준비된 명령문은 다양한 매개변수를 사용하여 여러 번 실행할 수 있는 미리 컴파일된 SQL 명령문입니다. 이 접근 방식은 SQL 로직을 데이터와 분리하여 보안 및 성능을 향상시킵니다.
Go에서 준비된 명령문 사용
-
필요한 패키지 가져오기
필요한 패키지를 가져오는 것으로 시작하십시오.
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" // MySQL 드라이버 )
-
데이터베이스 연결 설정
sql.Open
을 사용하여 데이터베이스에 대한 연결을 만듭니다.sql.Open
은 즉시 연결을 설정하지 않고 나중의 사용을 위해 데이터베이스 핸들을 준비합니다.db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname") if err != nil { // 오류 처리 panic(err) } defer db.Close()
-
명령문 준비
Prepare
메서드를 사용하여 준비된 명령문을 만듭니다. 이 메서드는 서로 다른 매개변수를 사용하여 여러 번 실행할 수 있는sql.Stmt
객체를 반환합니다.stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)") if err != nil { // 오류 처리 panic(err) } defer stmt.Close()
이 예에서
?
는 실행 중에 제공될 매개변수의 자리 표시자 역할을 합니다. 정확한 자리 표시자 구문은 사용되는 데이터베이스 드라이버에 따라 다를 수 있습니다. 예를 들어 PostgreSQL은$1
,$2
등을 자리 표시자로 사용합니다. (go.dev) -
준비된 명령문 실행
Exec
메서드를 사용하여 서로 다른 매개변수 집합으로 준비된 명령문을 실행합니다._, err = stmt.Exec("Alice", 30) if err != nil { // 오류 처리 panic(err) } _, err = stmt.Exec("Bob", 25) if err != nil { // 오류 처리 panic(err) }
Exec
에 대한 각 호출은 제공된 매개변수로 준비된 명령문을 실행합니다. -
준비된 명령문으로 데이터 쿼리
준비된 명령문은 데이터 쿼리에도 사용할 수 있습니다. 다음은 준비된 명령문을 사용하여 데이터를 검색하는 방법의 예입니다.
queryStmt, err := db.Prepare("SELECT id, name, age FROM users WHERE age > ?") if err != nil { // 오류 처리 panic(err) } defer queryStmt.Close() rows, err := queryStmt.Query(20) if err != nil { // 오류 처리 panic(err) } defer rows.Close() for rows.Next() { var id int var name string var age int err = rows.Scan(&id, &name, &age) if err != nil { // 오류 처리 panic(err) } fmt.Printf("ID: %d, Name: %s, Age: %d\n", id, name, age) } if err = rows.Err(); err != nil { // 오류 처리 panic(err) }
이 예에서 준비된 명령문은 지정된 나이보다 많은 모든 사용자를 선택하는 데 사용됩니다.
Query
메서드는 명령문을 실행하고rows.Next()
를 사용하여 결과를 반복합니다. 각 행의 열은Scan
메서드를 사용하여 변수로 읽습니다.
FAQs
실행 계획을 재사용하여 SQL Injection을 방지하고 성능을 향상시킵니다.
예, INSERT
, UPDATE
, DELETE
및 SELECT
작업에 사용할 수 있습니다.
리소스 누수 및 불필요한 데이터베이스 로드가 발생할 수 있습니다.
모범 사례
-
명령문 닫기: 데이터베이스 리소스를 확보하려면 항상
stmt.Close()
를 사용하여 준비된 명령문을 닫으십시오. 명령문을 준비한 직후에defer stmt.Close()
를 사용하면 더 이상 필요하지 않을 때 닫히도록 할 수 있습니다. -
오류 처리: 데이터베이스 작업 중에 발생하는 문제를 처리하고 관리하기 위해 강력한 오류 처리를 구현하십시오.
-
연결 관리:
sql.DB
는 연결 풀을 관리합니다. 동일한 명령문을 여러 번 실행하는 응용 프로그램에서 특히 명령문을 한 번 준비하고 재사용하는 것이 효율적입니다.
이러한 단계와 모범 사례를 따르면 Go에서 준비된 명령문을 효과적으로 활용하여 안전하고 효율적인 데이터베이스 응용 프로그램을 작성할 수 있습니다.
Leapcell은 Go 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 따라 지불하십시오. 요청이나 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 지표 및 로깅.
손쉬운 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 제로 운영 오버헤드 — 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 저희를 팔로우하십시오: @LeapcellHQ