TypeScript ν νλ¦Ώ 리ν°λ΄λ‘ νμ -μΈμ΄ν SQL 쿼리 μμ±μ κ°λ ₯ν¨μ νμ©νμΈμ. κ²¬κ³ νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ λ°μ΄ν°λ² μ΄μ€ μνΈμμ©μ μμ μκ² κ΅¬μΆν μ μμ΅λλ€.
TypeScript ν νλ¦Ώ 리ν°λ΄ SQL λΉλ: νμ -μΈμ΄ν 쿼리 μμ±
νλ μννΈμ¨μ΄ κ°λ°μμ λ°μ΄ν° 무결μ±μ μ μ§νκ³ μ ν리μΌμ΄μ μ μ λ’°μ±μ 보μ₯νλ κ²μ λ§€μ° μ€μν©λλ€. λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©ν λ, μλͺ»λ νμμ SQL μΏΌλ¦¬λ‘ μΈν΄ λ°μνλ μ€λ₯μ μ μ¬μ±μ μλΉν μ°λ € μ¬νμ λλ€. νμ μ€ν¬λ¦½νΈλ κ°λ ₯ν νμ μμ€ν μ ν΅ν΄ ν νλ¦Ώ 리ν°λ΄ SQL λΉλλ₯Ό μ¬μ©νμ¬ μ΄λ¬ν μνμ μννλ κ°λ ₯ν μ루μ μ μ 곡ν©λλ€.
λ¬Έμ μ : μ ν΅μ μΈ SQL 쿼리 μμ± λ°©μ
μ ν΅μ μΌλ‘ SQL 쿼리λ μ’ μ’ λ¬Έμμ΄ κ²°ν©μ μ¬μ©νμ¬ κ΅¬μ±λ©λλ€. μ΄ μ κ·Ό λ°©μμ μ¬λ¬ λ¬Έμ μ μ·¨μ½ν©λλ€:
- SQL μΈμ μ μ·¨μ½μ : μ¬μ©μ μ λ ₯μ SQL 쿼리μ μ§μ ν¬ν¨νλ©΄ μ ν리μΌμ΄μ μ΄ μ μμ μΈ κ³΅κ²©μ λ ΈμΆλ μ μμ΅λλ€.
- νμ μ€λ₯: 쿼리μ μ¬μ©λ λ°μ΄ν° νμ μ΄ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§μμ μμλλ νμ κ³Ό μΌμΉνλ€λ 보μ₯μ΄ μμ΅λλ€.
- ꡬ문 μ€λ₯: μλμΌλ‘ 쿼리λ₯Ό μμ±νλ©΄ λ°νμμλ§ λ°κ²¬λλ ꡬ문 μ€λ₯λ₯Ό λ°μμν¬ κ°λ₯μ±μ΄ 컀μ§λλ€.
- μ μ§λ³΄μ λ¬Έμ : 볡μ‘ν 쿼리λ μ½κ³ , μ΄ν΄νκ³ , μ μ§λ³΄μνκΈ° μ΄λ €μμ§λλ€.
μλ₯Ό λ€μ΄, λ€μ μλ°μ€ν¬λ¦½νΈ μ½λ μ€λν«μ μ΄ν΄λ³΄κ² μ΅λλ€:
const userId = req.params.id;
const query = "SELECT * FROM users WHERE id = " + userId;
μ΄ μ½λλ SQL μΈμ μ
μ μ·¨μ½ν©λλ€. μ
μμ μΈ μ¬μ©μλ userId λ§€κ°λ³μλ₯Ό μ‘°μνμ¬ μμμ SQL λͺ
λ Ήμ μ€νν μ μμ΅λλ€.
ν΄κ²°μ± : νμ μ€ν¬λ¦½νΈ ν νλ¦Ώ 리ν°λ΄ SQL λΉλ
νμ μ€ν¬λ¦½νΈ ν νλ¦Ώ 리ν°λ΄ SQL λΉλλ νμ -μΈμ΄ννκ³ μμ ν λ°©μμΌλ‘ SQL 쿼리λ₯Ό μμ±νλ λ°©λ²μ μ 곡ν©λλ€. νμ μ€ν¬λ¦½νΈμ νμ μμ€ν κ³Ό ν νλ¦Ώ 리ν°λ΄μ νμ©νμ¬ λ°μ΄ν° νμ μ μ½ μ‘°κ±΄μ κ°μ νκ³ , SQL μΈμ μ μ·¨μ½μ μ λ°©μ§νλ©°, μ½λ κ°λ μ±μ ν₯μμν΅λλ€.
ν΅μ¬ μμ΄λμ΄λ ν νλ¦Ώ 리ν°λ΄μ μ¬μ©νμ¬ SQL 쿼리λ₯Ό μμ±ν μ μλ ν¨μ μΈνΈλ₯Ό μ μνμ¬, λͺ¨λ λ§€κ°λ³μκ° μ μ ν μ΄μ€μΌμ΄ν(escape)λκ³ κ²°κ³Ό μΏΌλ¦¬κ° κ΅¬λ¬Έμ μΌλ‘ μ¬λ°λ₯΄λλ‘ λ³΄μ₯νλ κ²μ λλ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ λ°νμμ΄ μλ μ»΄νμΌ νμμ μ€λ₯λ₯Ό ν¬μ°©ν μ μμ΅λλ€.
νμ μ€ν¬λ¦½νΈ ν νλ¦Ώ 리ν°λ΄ SQL λΉλ μ¬μ©μ μ΄μ
- νμ μμ μ±: λ°μ΄ν° νμ μ μ½ μ‘°κ±΄μ κ°μ νμ¬ λ°νμ μ€λ₯μ μνμ μ€μ λλ€.
- SQL μΈμ μ λ°©μ§: λ§€κ°λ³μλ₯Ό μλμΌλ‘ μ΄μ€μΌμ΄ννμ¬ SQL μΈμ μ μ·¨μ½μ μ λ°©μ§ν©λλ€.
- κ°λ μ± ν₯μ: ν νλ¦Ώ 리ν°λ΄μ 쿼리λ₯Ό λ μ½κ² μ½κ³ μ΄ν΄ν μ μκ² λ§λλλ€.
- μ»΄νμΌ νμ μ€λ₯ κ°μ§: λ°νμ μ μ ꡬ문 μ€λ₯μ νμ λΆμΌμΉλ₯Ό μ‘μλ λλ€.
- μ μ§λ³΄μμ±: 볡μ‘ν 쿼리λ₯Ό λ¨μννκ³ μ½λ μ μ§λ³΄μμ±μ ν₯μμν΅λλ€.
μμ : κ°λ¨ν SQL λΉλ λ§λ€κΈ°
κΈ°λ³Έμ μΈ νμ μ€ν¬λ¦½νΈ ν νλ¦Ώ 리ν°λ΄ SQL λΉλλ₯Ό λ§λλ λ°©λ²μ μ€λͺ ν΄ λ³΄κ² μ΅λλ€. μ΄ μμ λ ν΅μ¬ κ°λ μ 보μ¬μ€λλ€. μ€μ ꡬνμμλ μ£μ§ μΌμ΄μ€ λ° λ°μ΄ν°λ² μ΄μ€λ³ κΈ°λ₯μ λν λ μ κ΅ν μ²λ¦¬κ° νμν μ μμ΅λλ€.
import { escape } from 'sqlstring';
interface SQL {
(strings: TemplateStringsArray, ...values: any[]): string;
}
const sql: SQL = (strings, ...values) => {
let result = '';
for (let i = 0; i < strings.length; i++) {
result += strings[i];
if (i < values.length) {
result += escape(values[i]);
}
}
return result;
};
// Example usage:
const tableName = 'users';
const id = 123;
const username = 'johndoe';
const query = sql`SELECT * FROM ${tableName} WHERE id = ${id} AND username = ${username}`;
console.log(query);
// Output: SELECT * FROM `users` WHERE id = 123 AND username = 'johndoe'
μ€λͺ :
- νκ·Έλ ν
νλ¦Ώ 리ν°λ΄ ν¨μλ₯Ό λνλ΄κΈ° μν΄
SQLμΈν°νμ΄μ€λ₯Ό μ μν©λλ€. sqlν¨μλ ν νλ¦Ώ λ¬Έμμ΄ μ‘°κ°κ³Ό 보κ°λ κ°λ€μ μνν©λλ€.sqlstringλΌμ΄λΈλ¬λ¦¬μescapeν¨μλ 보κ°λ κ°λ€μ μ΄μ€μΌμ΄ννμ¬ SQL μΈμ μ μ λ°©μ§νλ λ° μ¬μ©λ©λλ€.- `sqlstring`μ
escapeν¨μλ λ€μν λ°μ΄ν° νμ μ λν μ΄μ€μΌμ΄ν μ²λ¦¬λ₯Ό ν©λλ€. μ°Έκ³ : μ΄ μμ λ λ°μ΄ν°λ² μ΄μ€κ° μλ³μμ λ°±ν±(`)μ μ¬μ©νκ³ λ¬Έμμ΄ λ¦¬ν°λ΄μ μμλ°μ΄ν(')λ₯Ό μ¬μ©νλ€κ³ κ°μ νλ©°, μ΄λ MySQLμμ μΌλ°μ μ λλ€. λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ μμ€ν μ λ§κ² μ΄μ€μΌμ΄ν μ²λ¦¬λ₯Ό μ‘°μ ν΄μΌ ν©λλ€.
κ³ κΈ κΈ°λ₯ λ° κ³ λ €μ¬ν
μμ μμ κ° κΈ°λ³Έμ μΈ ν λλ₯Ό μ 곡νμ§λ§, μ€μ μ ν리μΌμ΄μ μμλ μ’ μ’ λ κ³ κΈ κΈ°λ₯κ³Ό κ³ λ €μ¬νμ΄ νμν©λλ€:
νλΌλ―Έν°ν λ° μ€λΉλ ꡬ문(Prepared Statements)
μ΅μ μ 보μκ³Ό μ±λ₯μ μν΄μλ κ°λ₯ν ν νλΌλ―Έν°νλ 쿼리(μ€λΉλ ꡬ문μ΄λΌκ³ λ ν¨)λ₯Ό μ¬μ©νλ κ²μ΄ μ€μν©λλ€. νλΌλ―Έν°νλ 쿼리λ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€κ° 쿼리 μ€ν κ³νμ 미리 μ»΄νμΌν μ μμ΄ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. λν λ°μ΄ν°λ² μ΄μ€κ° λ§€κ°λ³μλ₯Ό SQL μ½λμ μΌλΆκ° μλ λ°μ΄ν°λ‘ μ·¨κΈνκΈ° λλ¬Έμ SQL μΈμ μ μ·¨μ½μ μ λν κ°μ₯ κ°λ ₯ν λ°©μ΄μ± μ μ 곡ν©λλ€.
λλΆλΆμ λ°μ΄ν°λ² μ΄μ€ λλΌμ΄λ²λ νλΌλ―Έν°νλ 쿼리λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€. λ κ²¬κ³ ν SQL λΉλλ κ°μ μλμΌλ‘ μ΄μ€μΌμ΄ννλ λμ μ΄λ¬ν κΈ°λ₯μ μ§μ νμ©ν΄μΌ ν©λλ€.
// Example using a hypothetical database driver
const userId = 42;
const query = "SELECT * FROM users WHERE id = ?";
const values = [userId];
db.query(query, values, (err, results) => {
if (err) {
console.error("Error executing query:", err);
} else {
console.log("Query results:", results);
}
});
λ¬Όμν(?)λ λ§€κ°λ³μ `userId`μ νλ μ΄μ€νλμ λλ€. λ°μ΄ν°λ² μ΄μ€ λλΌμ΄λ²κ° λ§€κ°λ³μλ₯Ό μ¬λ°λ₯΄κ² μ΄μ€μΌμ΄ννκ³ λ°μ΄νλ‘ λ¬Άμ΄ SQL μΈμ μ μ λ°©μ§ν©λλ€.
λ€μν λ°μ΄ν° νμ μ²λ¦¬
ν¬κ΄μ μΈ SQL λΉλλ λ¬Έμμ΄, μ«μ, λ μ§, λΆλ¦¬μΈμ ν¬ν¨ν λ€μν λ°μ΄ν° νμ μ μ²λ¦¬ν μ μμ΄μΌ ν©λλ€. λν null κ°μ μ¬λ°λ₯΄κ² μ²λ¦¬ν μ μμ΄μΌ ν©λλ€. λ°μ΄ν° 무결μ±μ 보μ₯νκΈ° μν΄ λ°μ΄ν° νμ λ§€νμ νμ -μΈμ΄ν μ κ·Ό λ°©μμ μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
λ°μ΄ν°λ² μ΄μ€λ³ ꡬ문
SQL ꡬ문μ λ°μ΄ν°λ² μ΄μ€ μμ€ν (μ: MySQL, PostgreSQL, SQLite, Microsoft SQL Server)λ§λ€ μ½κ°μ© λ€λ₯Ό μ μμ΅λλ€. κ²¬κ³ ν SQL λΉλλ μ΄λ¬ν μ°¨μ΄μ μ μμ©ν μ μμ΄μΌ ν©λλ€. μ΄λ λ°μ΄ν°λ² μ΄μ€λ³ ꡬνμ ν΅νκ±°λ λμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μ νλ κ΅¬μ± μ΅μ μ μ 곡ν¨μΌλ‘μ¨ λ¬μ±ν μ μμ΅λλ€.
볡μ‘ν 쿼리
μ¬λ¬ JOIN, WHERE μ , νμ μΏΌλ¦¬κ° ν¬ν¨λ 볡μ‘ν 쿼리λ₯Ό μμ±νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. μ μ€κ³λ SQL λΉλλ μ΄λ¬ν 쿼리λ₯Ό λͺ ννκ³ κ°κ²°ν λ°©μμΌλ‘ ꡬμ±ν μ μλ μ μ°ν μΈν°νμ΄μ€λ₯Ό μ 곡ν΄μΌ ν©λλ€. 쿼리μ λ€λ₯Έ λΆλΆμ κ°λ³μ μΌλ‘ ꡬμΆν λ€μ ν¨κ» κ²°ν©ν μ μλ λͺ¨λμ μ κ·Ό λ°©μμ μ¬μ©νλ κ²μ κ³ λ €νμΈμ.
νΈλμμ
νΈλμμ μ λ§μ μ ν리μΌμ΄μ μμ λ°μ΄ν° μΌκ΄μ±μ μ μ§νλ λ° νμμ μ λλ€. SQL λΉλλ νΈλμμ μμ, 컀λ°, λ‘€λ°±μ ν¬ν¨νμ¬ νΈλμμ μ κ΄λ¦¬νλ λ©μ»€λμ¦μ μ 곡ν΄μΌ ν©λλ€.
μ€λ₯ μ²λ¦¬
κ²¬κ³ ν μ ν리μΌμ΄μ μ ꡬμΆνλ €λ©΄ μ μ ν μ€λ₯ μ²λ¦¬κ° μ€μν©λλ€. SQL λΉλλ λ¬Έμ λ₯Ό μ μνκ² μλ³νκ³ ν΄κ²°νλ λ° λμμ΄ λλ μμΈν μ€λ₯ λ©μμ§λ₯Ό μ 곡ν΄μΌ ν©λλ€. λν μ€λ₯λ₯Ό κΈ°λ‘νκ³ κ΄λ¦¬μμκ² μ리λ λ©μ»€λμ¦λ μ 곡ν΄μΌ ν©λλ€.
μ§μ SQL λΉλλ₯Ό λ§λλ κ²μ λμ
μ§μ SQL λΉλλ₯Ό λ§λλ κ²μ΄ κ·μ€ν νμ΅ κ²½νμ΄ λ μ μμ§λ§, μ μ¬ν κΈ°λ₯μ μ 곡νλ νλ₯ν μ€νμμ€ λΌμ΄λΈλ¬λ¦¬κ° μ¬λ¬ κ° μμ΅λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ λ€μν κΈ°λ₯κ³Ό μ΄μ μ μ 곡νλ©°, μλΉν μκ°κ³Ό λ Έλ ₯μ μ μ½ν΄ μ€ μ μμ΅λλ€.
Knex.js
Knex.jsλ PostgreSQL, MySQL, SQLite3, MariaDB, Oracleμ μν μΈκΈ° μλ μλ°μ€ν¬λ¦½νΈ 쿼리 λΉλμ λλ€. νμ -μΈμ΄ν λ°©μμΌλ‘ SQL 쿼리λ₯Ό μμ±νκΈ° μν κΉλνκ³ μΌκ΄λ APIλ₯Ό μ 곡ν©λλ€. Knex.jsλ νλΌλ―Έν°νλ 쿼리, νΈλμμ , λ§μ΄κ·Έλ μ΄μ μ μ§μν©λλ€. λ§€μ° μ±μνκ³ μ ν μ€νΈλ λΌμ΄λΈλ¬λ¦¬μ΄λ©°, Javascript/Typescriptμμ 볡μ‘ν SQL μνΈμμ©μ μν μ΅κ³ μ μ νμΈ κ²½μ°κ° λ§μ΅λλ€.
TypeORM
TypeORMμ νμ μ€ν¬λ¦½νΈμ μλ°μ€ν¬λ¦½νΈλ₯Ό μν κ°μ²΄-κ΄κ³ν λ§€νΌ(ORM)μ λλ€. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° μμΉμ μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©ν μ μκ² ν΄μ€λλ€. TypeORMμ MySQL, PostgreSQL, SQLite, Microsoft SQL Server λ±μ ν¬ν¨ν λ€μν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ§μν©λλ€. SQLμ μ§μ μ μΌλ‘ μΌλΆ μΆμννμ§λ§, λ§μ κ°λ°μκ° μ μ©νκ² μ¬κΈ°λ νμ μμ μ± λ° μ ν¨μ± κ²μ¬ κ³μΈ΅μ μ 곡ν©λλ€.
Prisma
Prismaλ νμ μ€ν¬λ¦½νΈμ Node.jsλ₯Ό μν νλμ μΈ λ°μ΄ν°λ² μ΄μ€ ν΄ν·μ λλ€. GraphQLκ³Ό μ μ¬ν 쿼리 μΈμ΄λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©ν μ μλ νμ -μΈμ΄ν λ°μ΄ν°λ² μ΄μ€ ν΄λΌμ΄μΈνΈλ₯Ό μ 곡ν©λλ€. Prismaλ PostgreSQL, MySQL, SQLite, MongoDB(MongoDB 컀λ₯ν°λ₯Ό ν΅ν΄)λ₯Ό μ§μν©λλ€. Prismaλ λ°μ΄ν° 무결μ±κ³Ό κ°λ°μ κ²½νμ κ°μ‘°νλ©°, μ€ν€λ§ λ§μ΄κ·Έλ μ΄μ , λ°μ΄ν°λ² μ΄μ€ μΈνΈλ‘μ€νμ , νμ -μΈμ΄ν 쿼리μ κ°μ κΈ°λ₯μ ν¬ν¨ν©λλ€.
κ²°λ‘
νμ μ€ν¬λ¦½νΈ ν νλ¦Ώ 리ν°λ΄ SQL λΉλλ νμ -μΈμ΄ννκ³ μμ ν SQL 쿼리λ₯Ό μμ±νλ κ°λ ₯ν μ κ·Ό λ°©μμ μ 곡ν©λλ€. νμ μ€ν¬λ¦½νΈμ νμ μμ€ν κ³Ό ν νλ¦Ώ 리ν°λ΄μ νμ©νμ¬ λ°νμ μ€λ₯μ μνμ μ€μ΄κ³ , SQL μΈμ μ μ·¨μ½μ μ λ°©μ§νλ©°, μ½λ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€. μ§μ SQL λΉλλ₯Ό λ§λ€λ κΈ°μ‘΄ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ , λ°μ΄ν°λ² μ΄μ€ μνΈμμ©μ νμ μμ μ±μ ν΅ν©νλ κ²μ κ²¬κ³ νκ³ μ λ’°ν μ μλ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μ€μν λ¨κ³μ λλ€. νμ νλΌλ―Έν°νλ 쿼리λ₯Ό μ¬μ©νκ³ μ¬μ©μ μ λ ₯μ μ μ ν μ΄μ€μΌμ΄ννμ¬ λ³΄μμ μ΅μ°μ μΌλ‘ μκ°ν΄μΌ ν©λλ€.
μ΄λ¬ν κ΄νμ μ±νν¨μΌλ‘μ¨ λ°μ΄ν°λ² μ΄μ€ μνΈμμ©μ νμ§κ³Ό 보μμ ν¬κ² ν₯μμμΌ μ₯κΈ°μ μΌλ‘ λ μ λ’°ν μ μκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€. μ ν리μΌμ΄μ μ 볡μ‘μ±μ΄ μ¦κ°ν¨μ λ°λΌ νμ -μΈμ΄ν SQL 쿼리 ꡬμ±μ μ΄μ μ λμ± λΆλͺ ν΄μ§ κ²μ λλ€.