QueryPie Community Edition is live ๐ŸŽ‰ Get it now for free Download today!

๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ
๋ฐฑ์„œ

๋‹ค์–‘ํ•œ ๋ฒค๋”์˜ SQL ํŒŒ์‹ฑํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ , QSI(Query Structural Interface)

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์–ธ์–ด์™€ ๋ฌธ๋ฒ• ์ฐจ์ด๋กœ ์ผ๊ด€๋œ ์ ‘๊ทผ ์ œ์–ด์™€ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์–ด๋ ค์šด ์ƒํ™ฉ์—์„œ, ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ๋ถ„์„์„ ํ†ตํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ์†”๋ฃจ์…˜์„ ํ™•์ธํ•ด๋ณด์„ธ์š”!

Evan Choi

Evan Choi

Software Engineer

์—๋ฐ˜์€ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ์— ์ „๋ฌธ์„ฑ์„ ๊ฐ–์ถ˜ ์ˆ™๋ จ๋œ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด์ž…๋‹ˆ๋‹ค. QueryPie์—์„œ ๊ทธ๋Š” ๊ธฐ์—… ๊ณ ๊ฐ์„ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜ ๊ตฌ์ถ•์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ „๋ฌธ์ ์ธ ์—ญ๋Ÿ‰๊ณผ .NET ๋ฐ Rust์— ๋Œ€ํ•œ ์—ด์ •์„ ํ†ตํ•ด ํ˜์‹ ๊ณผ ์„ฑ๋Šฅ์„ ์ด๋Œ๋ฉฐ, QueryPie์˜ ์ตœ์ฒจ๋‹จ ๋ฐ์ดํ„ฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํ”Œ๋žซํผ ์ œ๊ณต ๋ฏธ์…˜์— ์ค‘์š”ํ•œ ๊ธฐ์—ฌ๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2024๋…„ 11์›” 22์ผ

๋‹ค์–‘ํ•œ ๋ฒค๋”์˜ SQL ํŒŒ์‹ฑํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ , QSI(Query Structural Interface)

์„œ๋ฌธ

CCPA, GDPR, ISO 27001๊ณผ ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค๋ฅผ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ์—…์ด ์ „์„ธ๊ณ„์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”๋กœ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ๋ณด์•ˆ์ด ๊ธฐ์—…ํ™œ๋™์˜ ํ•„์ˆ˜์š”์†Œ๋กœ ๋ถ€์ƒํ•˜๊ณ  ์žˆ๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ๊ณผ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๋ฌธ๋ฒ•๊ณผ ๋™์ž‘์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€๋œ ์ ‘๊ทผ ์ œ์–ด์™€ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์—ฌ๊ฐ„ ๊นŒ๋‹ค๋กญ์ง€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์—, ์˜ค๋Š˜์€ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๊ตฌ๋ฌธ์œผ๋กœ ํ†ตํ•ฉํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ๋ถ„์„์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋ณด์•ˆ์˜ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์†Œ๊ฐœํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Step.1 ๋ฌธ์ œ์˜ ๋ฐœ๊ฒฌ: ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฌธ๋ฒ• ์ฐจ์ด๋Š” ๊ด€๋ฆฌ ๋ณต์žก์„ฑ์„ ์•ผ๊ธฐํ•œ๋‹ค!

๋Œ€๊ทœ๋ชจ ๊ธฐ์—… ๋ฐ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์กฐ์ง์€ MySQL, SQL Server, PostgreSQL, Oracle๊ณผ ๊ฐ™์€ ์ „ํ†ต์ ์ธ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ MongoDB ์™€ ๊ฐ™์€ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ๋™์‹œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ์ฟผ๋ฆฌ ๋ฌธ๋ฒ•๊ณผ ๋™์ž‘์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ™•์žฅ๋˜๊ณ  ๋ณต์žกํ•ด์ง์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ์˜ ํ†ต์ œ์™€ ๋ณด์•ˆ ๊ด€๋ฆฌ์˜ ๋‚œ์œ„๋„๋Š” ๋†’์•„์ง€๊ฒŒ ๋˜์–ด ๊ฒฐ๊ตญ, ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ˜‘์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณต์žก์„ฑ์€ GDPR์ด๋‚˜ CCPA์™€ ๊ฐ™์€ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๊ทœ์ œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๋ฐ์—๋„ ๊ฑธ๋ฆผ๋Œ์ด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ณ„๋กœ ํ–‰ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

MySQL

  • SELECT * FROM {table} LIMIT 10

SQL Server

  • SELECT TOP 10 * FROM {table}

Oracle

  • SELECT * FROM {table} FETCH FIRST 10 ROWS ONLY

MongoDB

  • db.getCollection('{table}').limit(10);

๊ทธ๋ž˜์„œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ์ œ์–ด๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

์˜ค๋Š˜๋‚  ๋ฐ์ดํ„ฐ ์œ ์ถœ ์‚ฌ๊ณ ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์€ ๋‚ด๋ถ€์ž๋‚˜ ๋ถ€์ ์ ˆํ•œ ์ ‘๊ทผ ํ†ต์ œ์—์„œ ๊ธฐ์ธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ๋น„์ธ๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋„์˜ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ์กด์˜ ์ ‘๊ทผ ์ œ์–ด ์ฒด๊ณ„๋กœ๋Š” ์ด๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์ ‘๊ทผ์„ ์ œ๋Œ€๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ ์œ ์ถœ์ด๋‚˜ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ์ง์›์ด๋‚˜ ๋ถ„์„๊ฐ€๊ฐ€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ ๋Œ€๊ทœ๋ชจ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ ๊ทธ ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์ด๋Š” ํšŒ์‚ฌ์˜ ์ฃผ์š” ์ž์‚ฐ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋†’์€ ์†์‹ค ์œ„ํ—˜์— ๊ณ ์Šค๋ž€ํžˆ ๋…ธ์ถœํ•˜๋Š” ๊ฒฉ์ด ๋ฉ๋‹ˆ๋‹ค.

Step 2. ๋ชฉํ‘œ์˜ ์„ค์ •: ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ์•„๋ผ!

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ISO 27001์˜ ์ •๋ณด ๋ณด์•ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„๊ณผ GDPR, CCPA์—์„œ ์š”๊ตฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ๊ฐœ์ธ์ •๋ณด ๊ด€๋ฆฌ์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค. QueryPie๋Š” ์ด๋Ÿฌํ•œ ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๊ด€๋œ ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ์„ ์œ„ํ•œ QueryPie ์†”๋ฃจ์…˜์˜ 3๊ฐ€์ง€ ํ•ต์‹ฌ ์ ‘๊ทผ ๋ฐฉ์‹

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๊ด€๋œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์˜ AST ํ†ตํ•ฉ: MySQL, SQL Server, Oracle, MongoDB ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฟผ๋ฆฌ ๋ฌธ๋ฒ•์„ **ํ•˜๋‚˜์˜ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(Abstract Syntax Tree, AST)**๋กœ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฟผ๋ฆฌ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ์ฟผ๋ฆฌ ๋ถ„์„ ๋ฐ ๊ฒฐ๊ณผ ์˜ˆ์ธก: ์‹ค์‹œ๊ฐ„์œผ๋กœ AST๋ฅผ ๋ถ„์„ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ์‚ฌ์ „์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„์˜ ์„ธ๋ฐ€ํ•œ ๋ถ„์„: ์ฟผ๋ฆฌ์— ํฌํ•จ๋œ ํ…Œ์ด๋ธ”, ์ปฌ๋Ÿผ ๋“ฑ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ณ , ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํšจ๊ณผ์ ์œผ๋กœ ํƒ์ง€ํ•˜์—ฌ ๋‚ด๋ถ€์ž ์œ„ํ˜‘์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์  ์„ค๋ช…

Execution Phases

์‹คํ–‰ ๋‹จ๊ณ„

์‹คํ–‰ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ค ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค: INPUT, RAW AST, QSI AST, Analysis Result

  • ๋จผ์ €, INPUT ๋‹จ๊ณ„์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ›์•„ RAW AST๋กœ ํŒŒ์‹ฑํ•˜์—ฌ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์–ด์„œ QSI AST ๋‹จ๊ณ„์—์„œ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธ์  ํŠธ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ, ๊ฐ ์ฟผ๋ฆฌ ์š”์†Œ ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ, Analysis Result ๋‹จ๊ณ„์—์„œ ๋ถ„์„๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋ ์ง€์— ๋Œ€ํ•œ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

INPUT

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๊ฐ€ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.

SELECT * FROM sakila.actor

RAW AST

RAW AST ๋Š” ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ์›์‹œ ํŒŒ์„œ๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์›์‹œ ํŒŒ์„œ๋Š” ANTLR, YACC, JavaCC ๋“ฑ๊ณผ ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•œ AST ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋ฌธ๋ฒ•์ด ๋‹ค๋ฅด๋ฉด MySQL์˜ SELECT 1 ์ฟผ๋ฆฌ์™€ Oracle์˜ SELECT 1 FROM DUAL ์ฟผ๋ฆฌ๊ฐ€ ์˜๋ฏธ์ ์œผ๋กœ ๊ฐ™์Œ์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ณ„ SELECT * FROM actor ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

MySQL (ANTLR4)

MySQL (ANTLR4)

Oracle (ANTLR4)

Oracle (ANTLR4)

PostgreSQL (YACC)

PostgreSQL (YACC)

QSI AST

QSI AST๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์˜ ์˜๋ฏธ์  ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ, ์ฃผ๋กœ ํŒŒ์ƒ(Derivation), ์กฐ์ธ(JOIN), ์›๋ณธ(Source)์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๊ฐ€๊ณต ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ฐธ์กฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ํ…Œ์ด๋ธ”์ด๋‚˜ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, actor ๋ผ๋Š” ์‹๋ณ„์ž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํŠน์ • ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Data Reference

ํŒŒ์ƒ ํ…Œ์ด๋ธ” ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ ํŒŒ์ƒ๋œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SELECT name AS n FROM actor, ์ฟผ๋ฆฌ์—์„œ๋Š” actor ํ…Œ์ด๋ธ”์˜ name ์ปฌ๋Ÿผ์— n์ด๋ผ๋Š” ๋ณ„์นญ์„ ๋ถ€์—ฌํ•˜์—ฌ, ์ด๋ฅผ ์ƒˆ๋กœ์šด ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Derived Table

์กฐ์ธ ํ…Œ์ด๋ธ” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SELECT * FROM address JOIN city USING (city_id)๋Š” address์™€ city ํ…Œ์ด๋ธ”์„ city_id๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Joined Table

๋ณตํ•ฉ ํ…Œ์ด๋ธ” ๊ฒฐํ•ฉ ์ด ๋…ธ๋“œ๋Š” ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SELECT 1 UNION ALL SELECT 2์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ SELECT ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Compound Table Combination

์ธ๋ผ์ธ ํŒŒ์ƒ ํ…Œ์ด๋ธ” ํŠน์ • ๊ฐ’์„ ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ ์ง์ ‘ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, VALUES (1,2), (3,4)๋Š” ๋‘ ๊ฐœ์˜ ํ–‰๊ณผ ๋‘ ๊ฐœ์˜ ์—ด์„ ๊ฐ€์ง„ ์ž‘์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์—ฌ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Inline Derived Table

ํ…Œ์ด๋ธ” ํ•จ์ˆ˜ ํ˜ธ์ถœ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ…Œ์ด๋ธ” ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SELECT * FROM table_function()๋Š” table_function()์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ…Œ์ด๋ธ” ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

Table Function Call

Analysis Result

์ตœ์ข… ๋ถ„์„ ๊ฒฐ๊ณผ๋กœ, ์ž…๋ ฅ ์ฟผ๋ฆฌ์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜๋  ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

SELECT ์ฟผ๋ฆฌ์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ” ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ๋ถ„์„ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ตœ์ข… ์ปฌ๋Ÿผ ๋ชฉ๋ก
  • SELECT ์ ˆ์— ์ž‘์„ฑ๋˜์–ด ํ…Œ์ด๋ธ”์˜ ์ตœ์ข… ์ปฌ๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ ์ปฌ๋Ÿผ ๋ชฉ๋ก
  • ์„œ๋ธŒ์ฟผ๋ฆฌ ์ปฌ๋Ÿผ ๋ชฉ๋ก, ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ ๋“ฑ ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ ํ…Œ์ด๋ธ” ๋ชฉ๋ก
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ์›๋ณธ ํ…Œ์ด๋ธ”, ๋ณ„์นญ์œผ๋กœ ์ง€์ •๋œ ํ…Œ์ด๋ธ”, CTE ๋“ฑ ๊ฒฐ๊ณผ๊ฐ€ ํ…Œ์ด๋ธ” ํ˜•ํƒœ์ธ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ„์ ‘ ์ปฌ๋Ÿผ ๋ชฉ๋ก
  • ์ปฌ๋Ÿผ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” WHERE, HAVING ๋“ฑ์— ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
Analysis Result

์˜ˆ์‹œ ์ž…๋ ฅ ์ฟผ๋ฆฌ

SELECT a.address || ', ' || c.city AS addr,
a.phone                     AS phone
FROM address AS a, city AS c
WHERE a.city_id = c.city_id

๋ถ„์„ ๊ฒฐ๊ณผ

Analysis Result

View

์ฟผ๋ฆฌ์— ์ž‘์„ฑ๋œ ํ…Œ์ด๋ธ”์ด View์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ View ์ •์˜๋ฅผ ์กฐํšŒํ•˜๊ณ  ๋ถ„์„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ์›๋ณธ ํ…Œ์ด๋ธ”์„ ๋๊นŒ์ง€ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

View ์ •์˜

CREATE VIEW sakila.actor_view (
id,
full_name,
update_at
) AS
SELECT actor_id,
first_name || last_name,
last_update
FROM actor

์ž…๋ ฅ ์ฟผ๋ฆฌ

SELECT * FROM actor_view

๋ถ„์„ ๊ฒฐ๊ณผ

Analysis Result

Use Case๋กœ ๊น๊นํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ: ๋ชจ๋ฒ” ์‚ฌ๋ก€

QueryPie ๋Š” ์ด ์†”๋ฃจ์…˜์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค๋ฅผ ์ค€์ˆ˜ํ–ˆ์„๊นŒ์š”?

๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ œ์–ด

  • ์„ธ๋ถ„ํ™”๋œ ๊ถŒํ•œ ์„ค์ •: ํ…Œ์ด๋ธ” ๋ฐ ์ปฌ๋Ÿผ ์ˆ˜์ค€์—์„œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น

  • ๋™์  ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น: ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋งˆ์Šคํ‚น๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํ‚น ์ •์ฑ… ๊ด€๋ฆฌ: ๋งˆ์Šคํ‚น ๊ทœ์น™์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์ ‘๊ทผ ์•Œ๋ฆผ ๋ฐ ๊ฒฝ๋ณด ์‹œ์Šคํ…œ: ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ ๋ฐ ๊ฐ์‚ฌ ์ถ”์ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ™œ๋™์„ ์ƒ์„ธํžˆ ๊ธฐ๋กํ•˜์—ฌ ์ถ”ํ›„ ๊ฐ์‚ฌ๋‚˜ ๋ถ„์„์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ƒ ํ–‰๋™ ํƒ์ง€: ๋จธ์‹  ๋Ÿฌ๋‹ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๊ณ  ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

์›์žฅ ํ…Œ์ด๋ธ” ๋ณดํ˜ธ

  • ์ ‘๊ทผ ์ œํ•œ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง: ์žฌ๋ฌด๋‚˜ ํšŒ๊ณ„ ๊ด€๋ จ ์›์žฅ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์—„๊ฒฉํžˆ ์ œํ•œํ•˜๊ณ , ์ ‘๊ทผ ์‹œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€: ์›์žฅ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜๋„๋ก ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

QSI: ๋ฐ์ดํ„ฐ ๋ณด์•ˆ์˜ ํ˜์‹ , ์‹ ๋ขฐ์™€ ๊ฒฝ์Ÿ๋ ฅ์„ ๋†’์ด๋Š” ๋น„๊ฒฐ!

ํ˜„๋Œ€ ๊ธฐ์—…์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ๊ณผ ๋ณต์žกํ•œ ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์š”๊ตฌ ์‚ฌํ•ญ ์†์—์„œ ๋ฐ์ดํ„ฐ ๋ณด์•ˆ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋„์ „์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ์†Œ๊ฐœํ•œ QSI ๋Š” ์ด๋Ÿฌํ•œ ๋„์ „์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฒค๋”์˜ ์ฟผ๋ฆฌ ํŒŒ์‹ฑ์„ ํ†ตํ•ฉํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ถ„์„ํ•จ์œผ๋กœ์จ, ๊ธฐ์—…์€ ์ผ๊ด€๋œ ๋ณด์•ˆ ์ •์ฑ…์„ ์ ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์œ ์ถœ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ œ์–ด, ๋ฐ์ดํ„ฐ ๋งˆ์Šคํ‚น, ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง, ์›์žฅ ํ…Œ์ด๋ธ” ๋ณดํ˜ธ ๋“ฑ์„ ๊ฐ•ํ™”ํ•จ์œผ๋กœ์จ ISO 27001, GDPR, CCPA์™€ ๊ฐ™์€ ๊ธ€๋กœ๋ฒŒ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณด์•ˆ์€ ๋‹จ์ˆœํžˆ ์œ„ํ—˜์„ ํšŒํ”ผํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด ๊ธฐ์—…์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ๊ฒฝ์Ÿ๋ ฅ์„ ๋†’์ด๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๊ธฐ์—…์€ QSI๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ, ๊ทœ์ œ ์ค€์ˆ˜์— ๋”ฐ๋ฅธ ๋ฒ•์  ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ ๋‹ฌ์„ฑ์— ๋”์šฑ ๋งค์ง„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฒค๋”์˜ SQL ํŒŒ์‹ฑํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ , QSI(Query Structural Interface) | QueryPie