Skip to main content
Puri๋Š” ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ๋นŒ๋”์ด์ง€๋งŒ, ๋ณต์žกํ•œ SQL ํ‘œํ˜„์‹์ด ํ•„์š”ํ•  ๋•Œ๋Š” Raw SQL์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Raw ํ•จ์ˆ˜ ๊ฐœ์š”

Raw ํƒ€์ž… ํ•จ์ˆ˜

ํƒ€์ž…๋ณ„ Raw ํ•จ์ˆ˜ rawString, rawNumber

WHERE Raw

๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ whereRaw

CASE WHEN

์กฐ๊ฑด๋ถ€ ๊ฐ’ ์„ ํƒ CASE ํ‘œํ˜„์‹

์„œ๋ธŒ์ฟผ๋ฆฌ

์ค‘์ฒฉ ์ฟผ๋ฆฌ ์ž‘์„ฑ Subquery

Raw ํƒ€์ž… ํ•จ์ˆ˜

rawString - ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜

rawNumber - ์ˆซ์ž ๋ฐ˜ํ™˜

rawBoolean - ๋ถˆ๋ฆฐ ๋ฐ˜ํ™˜

rawDate - ๋‚ ์งœ ๋ฐ˜ํ™˜

rawStringArray - ๋ฌธ์ž์—ด ๋ฐฐ์—ด ๋ฐ˜ํ™˜

ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

Raw ํ•จ์ˆ˜๋Š” Knex ์Šคํƒ€์ผ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. SQL ๋ฌธ์ž์—ด ๋‚ด์— ํ”Œ๋ ˆ์ด์Šคํ™€๋”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ”์ธ๋”ฉ ๊ฐ’ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋ ˆ์ด์Šคํ™€๋” ๊ทœ์น™

๊ฐ’ ๋ฐ”์ธ๋”ฉ (?)

์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด๋‚˜ ๋™์  ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ? ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹๋ณ„์ž ๋ฐ”์ธ๋”ฉ (??)

ํ…Œ์ด๋ธ”๋ช…์ด๋‚˜ ์ปฌ๋Ÿผ๋ช…์„ ๋™์ ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ๋Š” ?? ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. table.column ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด์€ ์ž๋™์œผ๋กœ "table"."column"์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ˜ผํ•ฉ ์‚ฌ์šฉ

ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹์—์„œ ?์™€ ??๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
??์™€ ?๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ปฌ๋Ÿผ๋ช…์— ?๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์œผ๋กœ ์ด์Šค์ผ€์ดํ•‘๋˜์–ด SQL ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ??๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹๋ณ„์ž๋กœ ์ด์Šค์ผ€์ดํ•‘๋˜์–ด ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Static SQL ํ•จ์ˆ˜

Puri๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ SQL ํ•จ์ˆ˜๋“ค์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ํ•จ์ˆ˜

์ง‘๊ณ„ ํ•จ์ˆ˜

WHERE Raw

๋ณต์žกํ•œ WHERE ์กฐ๊ฑด์„ ์ง์ ‘ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ WHERE Raw

SQL Injection ์ฃผ์˜: whereRaw์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ฐ”์ธ๋”ฉ(?)์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ง์ ‘ ๋ฌธ์ž์—ด์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์กฐ๊ฑด

๋‚ ์งœ ํ•จ์ˆ˜

CASE WHEN - ์กฐ๊ฑด๋ถ€ ๊ฐ’

CASE WHEN ํ‘œํ˜„์‹์œผ๋กœ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ CASE WHEN

์ˆซ์ž ๊ณ„์‚ฐ

Boolean ๊ฒฐ๊ณผ

์„œ๋ธŒ์ฟผ๋ฆฌ์™€ Raw SQL

Scalar ์„œ๋ธŒ์ฟผ๋ฆฌ

COALESCE - NULL ์ฒ˜๋ฆฌ

์‹ค์ „ ์˜ˆ์ œ

์‚ฌ์šฉ์ž ํ†ต๊ณ„ ๋Œ€์‹œ๋ณด๋“œ

์‹œ๊ฐ„๋Œ€๋ณ„ ์ง‘๊ณ„

์ˆœ์œ„ ๊ณ„์‚ฐ

์œˆ๋„์šฐ ํ•จ์ˆ˜

ROW_NUMBER

RANK / DENSE_RANK

LAG / LEAD - ์ด์ „/๋‹ค์Œ ํ–‰

JSON ํ•จ์ˆ˜ (PostgreSQL)

JSON ํ•„๋“œ ์ถ”์ถœ

JSON ์ง‘๊ณ„

์„ฑ๋Šฅ ์ตœ์ ํ™”

EXPLAIN ์‚ฌ์šฉ

์ธ๋ฑ์Šค ํžŒํŠธ (PostgreSQL์€ ์ง€์› ์•ˆํ•จ)

PostgreSQL์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ:

ํƒ€์ž… ์•ˆ์ „์„ฑ

Raw ํ•จ์ˆ˜๋“ค์€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

Raw ์ฟผ๋ฆฌ์™€ Hydrate

Raw SQL์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” **hydrate()**๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ํ•„๋“œ ๋„ค์ด๋ฐ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ JOIN๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Subset vs Raw Puri์˜ ์ฐจ์ด

Hydrate๊ฐ€ ํ•˜๋Š” ์ผ

hydrate()๋Š” flatํ•œ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Before hydrate (Flat):
After hydrate (Nested):

ํ•„๋“œ ๋„ค์ด๋ฐ ๊ทœ์น™: ์–ธ๋”๋ฐ”(__) ์‚ฌ์šฉ

JOIN๋œ ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ๋Š” ํ…Œ์ด๋ธ”๋ช…__ํ•„๋“œ๋ช… ํ˜•์‹์œผ๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ Hydrate vs ์ˆ˜๋™ Hydrate

Subset ์ฟผ๋ฆฌ (์ž๋™ Hydrate)

Raw Puri ์ฟผ๋ฆฌ (์ˆ˜๋™ Hydrate)

executeSubsetQuery์—์„œ์˜ ์ž๋™ Hydrate

executeSubsetQuery()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ hydrate๋ฅผ ์ž๋™ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Hydrate ํ˜ธ์ถœ ์‹œ์  ์ •๋ฆฌ

์‹ค์ „ ์˜ˆ์ œ: Raw ์ฟผ๋ฆฌ + Hydrate

Hydrate ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ: 1. ํ•„๋“œ ๋„ค์ด๋ฐ: JOIN ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ __(์–ธ๋”๋ฐ” 2๊ฐœ) ์‚ฌ์šฉ 2. ์ˆ˜๋™ ํ˜ธ์ถœ: Raw Puri ์ฟผ๋ฆฌ๋Š” hydrate() ์ˆ˜๋™ ํ˜ธ์ถœ ํ•„์ˆ˜ 3. ํƒ€์ž… ์•ˆ์ „์„ฑ: hydrate ํ›„ ํƒ€์ž…์€ ์ˆ˜๋™์œผ๋กœ ์ •์˜ ํ•„์š” 4. ์„ฑ๋Šฅ: hydrate๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋Š” Subset ์‚ฌ์šฉ ๊ถŒ์žฅ
๊ถŒ์žฅ ์‚ฌํ•ญ: - ๊ฐ€๋Šฅํ•˜๋ฉด Subset ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” (hydrate ์ž๋™) - ๋ณต์žกํ•œ Raw SQL์ด ํ•„์š”ํ•  ๋•Œ๋งŒ ์ˆ˜๋™ hydrate ์‚ฌ์šฉ - ํ•„๋“œ ๋„ค์ด๋ฐ ๊ทœ์น™(__)์„ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ

๋‹ค์Œ ๋‹จ๊ณ„

Type Safety

Puri์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ ์ดํ•ดํ•˜๊ธฐ

Advanced Patterns

์„œ๋ธŒ์ฟผ๋ฆฌ์™€ ํŠธ๋žœ์žญ์…˜

Aggregations

์ง‘๊ณ„ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

Basic Queries

๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋กœ ๋Œ์•„๊ฐ€๊ธฐ