준비된 문
매개변수화된 쿼리 실행하기
준비된 문은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
준비된 명령문이란
준비된 명령문은 SQL 텍스트를 데이터베이스에 한 번 보내 구문 분석과 실행 계획 수립을 수행한 다음, 서로 다른 매개변수로 여러 번 실행합니다. 반복 쿼리에서는 더 빠르고 주입 공격에도 더 안전합니다.
매개변수 자리 표시자
사용자 입력을 연결하여 SQL을 만들지 마십시오. 자리 표시자를 사용하면 드라이버가 값을 별도로 전송합니다. PostgreSQL은 $1, $2를 사용하고, MySQL과 SQLite는 ?를 사용합니다.
SELECT * FROM users WHERE age > $1 AND city = $2이것이 주입을 막는 이유
매개변수는 SQL 텍스트와 분리되어 전송되므로 데이터베이스는 매개변수를 코드가 아닌 순수한 데이터로만 처리합니다. " OR 1=1과 같은 악의적인 값도 실행 가능한 SQL이 아니라 리터럴 문자열이 됩니다.
db.Prepare
Prepare는 풀에 연결된 *sql.Stmt를 반환합니다. 그런 다음 인수와 함께 명령문에서 Exec 또는 Query를 호출합니다.
stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES($1, $2)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()명령문 실행하기
각 자리 표시자에 해당하는 인수를 사용해 stmt.Exec을 호출하십시오. 삽입과 갱신에서는 Exec이 영향을 받은 행 수와 마지막 삽입 ID가 포함된 sql.Result를 반환합니다.
res, err := stmt.Exec("Ada", 36)
if err != nil {
log.Fatal(err)
}
n, _ := res.RowsAffected()
fmt.Println("inserted", n)반복문에서 재사용하기
재사용할 때 이점이 생깁니다. 한 번 준비한 뒤 반복문 안에서 여러 번 실행하십시오. 데이터베이스는 각 호출에 대해 구문 분석된 실행 계획을 재사용합니다.
for _, u := range users {
if _, err := stmt.Exec(u.Name, u.Age); err != nil {
log.Fatal(err)
}
}암시적 준비
db.Query나 db.Exec에 인수를 직접 전달해도 자리 표시자를 안전하게 사용하며, 드라이버가 내부적으로 준비할 수 있습니다. 명시적으로 Prepare하는 것은 주로 반복 실행에서 중요합니다.
실행 가능한 매개변수 바인딩 시뮬레이션
실제 준비된 문을 사용하려면 데이터베이스가 필요합니다. 이 실행 가능한 예제는 안전한 매개변수 바인딩을 시뮬레이션하여 값이 쿼리 텍스트와 분리된 상태로 유지되는 방식을 보여 줍니다.
package main
import "fmt"
func execPrepared(query string, args ...interface{}) string {
return fmt.Sprintf("EXEC %q with args %v", query, args)
}
func main() {
q := "INSERT INTO users(name, age) VALUES($1, $2)"
people := [][2]interface{}{{"Ada", 36}, {"Lin", 41}}
for _, p := range people {
fmt.Println(execPrepared(q, p[0], p[1]))
}
}컨텍스트 변형
PrepareContext와 stmt.ExecContext를 사용하면 준비된 호출이 다른 database/sql 기능과 마찬가지로 시간 제한과 취소를 준수합니다.
Stmt는 항상 닫기
*sql.Stmt는 데이터베이스의 리소스를 점유합니다. 작업을 마치면 stmt.Close()를 지연 호출하도록 설정하십시오. 문을 누수시키면 서버 측 준비된 문 개수 제한을 초과할 수 있습니다.
문과 연결 풀링
*sql.DB에서 준비한 문은 연결 풀의 모든 연결에서 작동합니다. 라이브러리가 문이 할당된 연결에서 문을 다시 준비합니다. 일반적으로 이 작업을 직접 관리할 필요는 없습니다.
간단히 확인하기
준비된 문에 대한 이해도를 확인해 보십시오.
복습
준비된 문을 배웠습니다:
- Prepare는 한 번 파싱하고 여러 번 실행합니다
- 자리 표시자($1 또는 ?)는 값을 데이터로 유지하여 인젝션을 차단합니다
- stmt.Exec은 영향을 받은 행 수를 반환하며, defer stmt.Close()를 사용합니다
- 반복문에서 재사용하고, 기한에는 컨텍스트 변형을 사용합니다
자주 묻는 질문
“준비된 문” 강의는 무료인가요?
네 — “준비된 문” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“준비된 문”에서 뭘 배우나요?
매개변수화된 쿼리 실행하기 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“준비된 문” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.