๋ณ€์ˆ˜ ์ž‘์—…ํ•˜๊ธฐยถ

Snowflake Scripting์—์„œ๋Š” ์‹, Snowflake Scripting ๋ฌธ, SQL ๋ฌธ์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์„ ์–ธํ•˜๊ธฐยถ

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ๋‹ค์Œ ์ค‘ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์˜ DECLARE ์„น์…˜ ๋‚ด์—์„œ:

    <variable_name> <type> ;
    
    <variable_name> DEFAULT <expression> ;
    
    <variable_name> <type> DEFAULT <expression> ;
    
    Copy
  • ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ LET ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์˜ BEGIN โ€ฆ END ์„น์…˜ ๋‚ด์—์„œ(๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—):

    LET <variable_name> <type> { DEFAULT | := } <expression> ;
    
    LET <variable_name> { DEFAULT | := } <expression> ;
    
    Copy

์—ฌ๊ธฐ์„œ:

variable_name

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์˜ค๋ธŒ์ ํŠธ ์‹๋ณ„์ž ์— ๋Œ€ํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

type

๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DEFAULT expression ๋˜๋Š” . := expression

๋ณ€์ˆ˜์— expression ์˜ ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

type ๋ฐ expression ์ด ๋‘˜ ๋‹ค ์ง€์ •๋œ ๊ฒฝ์šฐ, ์‹์€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๊ฐ’์„ ์ง€์ •๋œ type ์œผ๋กœ ์บ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋ธ”๋ก์˜ DECLARE ์„น์…˜๊ณผ BEGIN โ€ฆ END ์„น์…˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

์ฐธ๊ณ : Python Connector ์ฝ”๋“œ์—์„œ Snowflake CLI, SnowSQL, Classic Console, ๋˜๋Š” execute_stream ๋˜๋Š” execute_string ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์ œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์—์„œ Snowflake Scripting ์‚ฌ์šฉํ•˜๊ธฐ ์ฐธ์กฐ).

EXECUTE IMMEDIATE 
$$
DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
|           10.00 |
+-----------------+

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹นํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Snowflake Scripting์ด ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์œ ์ถ”ํ•˜๋Š” ๋ฐฉ๋ฒ•ยถ

๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด Snowflake Scripting์€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ์‹์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

์„ ์–ธ์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ƒ๋žตํ•˜๋„๋ก ์„ ํƒํ•œ ๊ฒฝ์šฐ, ๋‹ค์Œ ์‚ฌํ•ญ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

  • ์‹์ด ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ Snowflake๋Š” ์œ ์—ฐํ•˜๊ณ (์˜ˆ: NUMBER(3, 1) ์ด ์•„๋‹Œ FLOAT) ์ €์žฅ ์šฉ๋Ÿ‰์ด ํฐ(์˜ˆ: VARCHAR(4)๊ฐ€ ์•„๋‹Œ VARCHAR) ํƒ€์ž…์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ’ 12.3 ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด Snowflake๋Š” ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • NUMBER(3, 1)

    • NUMBER(38, 1)

    • FLOAT

    ์ด ์˜ˆ์—์„œ Snowflake๋Š” FLOAT๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…(ํŠนํžˆ ์ˆซ์ž ๋˜๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ํƒ€์ž…)์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, Snowflake๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ดˆ๊ธฐ ๊ฐ’์„ ์ œ๊ณตํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • Snowflake๊ฐ€ ์˜๋„๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, Snowflake๋Š” SQL ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ปค์„œ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ...
    FOR current_row IN cursor_1 DO:
      LET price := current_row.price_column;
      ...
    
    Copy

    Snowflake Scripting ๋ธ”๋ก์ด ์ปดํŒŒ์ผ๋˜๋ฉด(์˜ˆ: CREATE PROCEDURE ๋ช…๋ น์ด ์‹คํ–‰๋  ๋•Œ) ์ปค์„œ๋Š” ์—ด๋ฆฌ์ง€ ์•Š๊ณ , ์ปค์„œ์— ์žˆ๋Š” ์—ด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ Snowflake๋Š” SQL ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

    092228 (P0000): SQL compilation error:
      error line 7 at position 4 variable 'PRICE' cannot have its type inferred from initializer
    
    Copy

์„ ์–ธ ๋ฒ”์œ„ ์ดํ•ดํ•˜๊ธฐยถ

Snowflake Scripting์€ ์–ดํœ˜์  ๋ฒ”์œ„ ์ง€์ • ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’, ๊ฒฐ๊ณผ ์„ธํŠธ, ์ปค์„œ ๋˜๋Š” ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๊ฐ€ ๋ธ”๋ก์˜ DECLARE ์„น์…˜์—์„œ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ์„ ์–ธ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฒ”์œ„(๋˜๋Š” ๊ฐ€์‹œ์„ฑ)๋Š” ํ•ด๋‹น ๋ธ”๋ก๊ณผ ํ•ด๋‹น ๋ธ”๋ก์— ์ค‘์ฒฉ๋œ ๋ชจ๋“  ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก์ด ์™ธ๋ถ€ ๋ธ”๋ก์— ์„ ์–ธ๋œ ์˜ค๋ธŒ์ ํŠธ์™€ ์ด๋ฆ„์ด ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ๋ธ”๋ก(๋ฐ ํ•ด๋‹น ๋ธ”๋ก ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๋ธ”๋ก) ๋‚ด์—์„œ, ๋‚ด๋ถ€ ๋ธ”๋ก์˜ ์˜ค๋ธŒ์ ํŠธ๋งŒ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„์ด ์ฐธ์กฐ๋œ ๊ฒฝ์šฐ, Snowflake๋Š” ํ˜„์žฌ ๋ธ”๋ก์—์„œ ๋จผ์ € ์‹œ์ž‘ํ•˜์—ฌ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•œ ๋ธ”๋ก์”ฉ ์ž‘์—…ํ•˜์—ฌ, ํ•ด๋‹น ์ด๋ฆ„์„ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ์˜ˆ์™ธ์˜ ๋ฒ”์œ„๋Š” ํ•ด๋‹น ์ €์žฅ ํ”„๋กœ์‹œ์ €๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ €์žฅ ํ”„๋กœ์‹œ์ €์— ์˜ํ•ด ํ˜ธ์ถœ๋œ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ(๋˜๋Š” ์ฒ˜๋ฆฌํ• ) ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ• (๋˜๋Š” ๋ฐœ์ƒ์‹œํ‚ฌ) ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹นํ•˜๊ธฐยถ

์ด๋ฏธ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๋ฉด := ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

<variable_name> := <expression> ;
Copy

์—ฌ๊ธฐ์„œ:

variable_name

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์˜ค๋ธŒ์ ํŠธ ์‹๋ณ„์ž ์— ๋Œ€ํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

expression

์‹์ด ํ‰๊ฐ€๋˜๊ณ  ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ณ€์ˆ˜์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์‹์€ ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹์ด ํƒ€์ž…๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์„ ํƒ€์ž… ์œ ํ˜•์œผ๋กœ ์บ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต SQL ํ•จ์ˆ˜ ๋ฐ UDFs (์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜)๋ฅผ ํฌํ•จํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐยถ

Snowflake Scripting ์–ธ์–ด ์š”์†Œ(์˜ˆ: RETURN)์™€ ํ•จ๊ป˜ ์‹์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์‹์— ๋ณ€์ˆ˜ revenue ์™€ cost ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  RETURN ๋ฌธ์— ๋ณ€์ˆ˜ profit ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

DECLARE
  profit NUMBER(38, 2);
  revenue NUMBER(38, 2);
  cost NUMBER(38, 2);
BEGIN
  ...
  profit := revenue - cost;
  ...
RETURN profit;
Copy

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ(๋ธ”๋ก์˜ EXCEPTION ์„น์…˜)์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ DECLARE ์„น์…˜์— ์„ ์–ธํ•˜๊ฑฐ๋‚˜ ์ €์žฅ ํ”„๋กœ์‹œ์ €์— ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. BEGIN โ€ฆ END ์„น์…˜์—์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ธฐ์— ๋ณ€์ˆ˜ ์ „๋‹ฌํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

ํŒ

๋˜ํ•œ Snowflake Scripting ์ต๋ช… ๋ธ”๋ก๊ณผ ํ˜ธ์ถœ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ €์—์„œ SQL (์„ธ์…˜) ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ €์žฅ ํ”„๋กœ์‹œ์ €์—์„œ SQL ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๋ฐ ์„ค์ •ํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

SQL ๋ฌธ์—์„œ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ(๋ฐ”์ธ๋”ฉ)ยถ

SQL ๋ฌธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— ์ฝœ๋ก ์„ ๋ถ™์ž…๋‹ˆ๋‹ค. ์˜ˆ:

INSERT INTO my_table (x) VALUES (:my_variable)
Copy

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(**)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋ฅผ ๊ฐœ๋ณ„ ๊ฐ’ ๋ชฉ๋ก์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ™•์žฅ ์—ฐ์‚ฐ์ž ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

Snowflake Scripting ์ €์žฅ ํ”„๋กœ์‹œ์ €์˜ ๋ฐ”์ธ๋”ฉ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ SQL ๋ฌธ์—์„œ ์ธ์ž ์‚ฌ์šฉํ•˜๊ธฐ(๋ฐ”์ธ๋”ฉ) ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ณ€์ˆ˜๋ฅผ ์˜ค๋ธŒ์ ํŠธ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: SELECT ๋ฌธ์˜ FROM ์ ˆ์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„) IDENTIFIER ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๊ฐ€ ์˜ค๋ธŒ์ ํŠธ ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋ƒ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

SELECT COUNT(*) FROM IDENTIFIER(:table_name)
Copy

์‹์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Snowflake Scripting ์–ธ์–ด ์š”์†Œ (์˜ˆ: RETURN)๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์•ž์— ์ฝœ๋ก ์„ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ฝœ๋ก  ์ ‘๋‘์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • RETURN๊ณผ ํ•จ๊ป˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ. ์ด ์˜ˆ์—์„œ๋Š” ๋ณ€์ˆ˜ profit ์ด Snowflake Scripting ์–ธ์–ด ์š”์†Œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ ์ฝœ๋ก  ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    RETURN profit;
    
    Copy
  • ์‹คํ–‰ํ•  SQL ๋ฌธ์„ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑ ์ค‘์ธ ๊ฒฝ์šฐ. ์ด ์˜ˆ์—์„œ๋Š” ๋ณ€์ˆ˜ id_variable ์ด ์‹์— ์‚ฌ์šฉ๋˜๋ฉฐ ์ฝœ๋ก  ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    LET select_statement := 'SELECT * FROM invoices WHERE id = ' || id_variable;
    
    Copy

๋˜ํ•œ TO_QUERY ํ•จ์ˆ˜๋Š” SELECT ๋ฌธ์˜ FROM ์ ˆ์—์„œ ์ง์ ‘ SQL ๋ฌธ์ž์—ด์„ ๋ฐ›๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. TO_QUERY ํ•จ์ˆ˜์™€ ๋™์  SQL์˜ ๋น„๊ต๋Š” ๋Ÿฐํƒ€์ž„์— SQL ๊ตฌ์„ฑํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜ ์„ค์ •ํ•˜๊ธฐยถ

Snowflake Scripting ๋ธ”๋ก์—์„œ INTO ์ ˆ์„ ์‚ฌ์šฉํ•ด ๋ณ€์ˆ˜๋ฅผ SELECT ์ ˆ์— ์ง€์ •๋œ ์‹์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT <expression1>, <expression2>, ... INTO :<variable1>, :<variable2>, ... FROM ... WHERE ...;
Copy

์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • variable1 ์€ expression1 ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • variable2 ๋Š” expression2 ์˜ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

SELECT ๋ฌธ์€ ๋‹จ์ผ ํ–‰์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—๋Š” ๋‹จ์ผ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๋Š” SELECT ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ๋‹ค์Œ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE TABLE some_data (id INTEGER, name VARCHAR);
INSERT INTO some_data (id, name) VALUES
  (1, 'a'),
  (2, 'b');
Copy

์ด ์˜ˆ์—์„œ๋Š” Snowflake Scripting ๋ณ€์ˆ˜ id ๋ฐ name ์„ ํ•ด๋‹น ์ด๋ฆ„์ด ์žˆ๋Š” ์—ด์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

DECLARE
  id INTEGER;
  name VARCHAR;
BEGIN
  SELECT id, name INTO :id, :name FROM some_data WHERE id = 1;
  RETURN id || ' ' || name;
END;
Copy

์ฐธ๊ณ : Python Connector ์ฝ”๋“œ์—์„œ Snowflake CLI, SnowSQL, Classic Console, ๋˜๋Š” execute_stream ๋˜๋Š” execute_string ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์ œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์—์„œ Snowflake Scripting ์‚ฌ์šฉํ•˜๊ธฐ ์ฐธ์กฐ).

EXECUTE IMMEDIATE $$
DECLARE
  id INTEGER;
  name VARCHAR;
BEGIN
  SELECT id, name INTO :id, :name FROM some_data WHERE id = 1;
  RETURN :id || ' ' || :name;
END;
$$
;
Copy

์ด ์˜ˆ์—์„œ๋Š” SELECT ๋ฌธ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ํ–‰์—์„œ id ๋ฐ name ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

+-----------------+
| anonymous block |
|-----------------|
| 1 a             |
+-----------------+
Copy

๋ณ€์ˆ˜๋ฅผ ์ €์žฅ ํ”„๋กœ์‹œ์ €์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๊ธฐยถ

์ €์žฅ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ณ€์ˆ˜ ์‚ฌ์šฉ์˜ ์˜ˆยถ

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

DECLARE
  w INTEGER;
  x INTEGER DEFAULT 0;
  dt DATE;
  result_string VARCHAR;
BEGIN
  w := 1;                     -- Assign a value.
  w := 24 * 7;                -- Assign the result of an expression.
  dt := '2020-09-30'::DATE;   -- Explicit cast.
  dt := '2020-09-30';         -- Implicit cast.
  result_string := w::VARCHAR || ', ' || dt::VARCHAR;
  RETURN result_string;
END;
Copy

์ฐธ๊ณ : Python Connector ์ฝ”๋“œ์—์„œ Snowflake CLI, SnowSQL, Classic Console, ๋˜๋Š” execute_stream ๋˜๋Š” execute_string ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์ œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์—์„œ Snowflake Scripting ์‚ฌ์šฉํ•˜๊ธฐ ์ฐธ์กฐ).

EXECUTE IMMEDIATE $$
DECLARE
    w INTEGER;
    x INTEGER DEFAULT 0;
    dt DATE;
    result_string VARCHAR;
BEGIN
    w := 1;                     -- Assign a value.
    w := 24 * 7;                -- Assign the result of an expression.
    dt := '2020-09-30'::DATE;   -- Explicit cast.
    dt := '2020-09-30';         -- Implicit cast.
    result_string := w::VARCHAR || ', ' || dt::VARCHAR;
    RETURN result_string;
END;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
| 168, 2020-09-30 |
+-----------------+

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์‹์— ๊ธฐ๋ณธ ์ œ๊ณต SQL ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

my_variable := SQRT(variable_x);
Copy

๋‹ค์Œ ์„ ์–ธ์€ ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์˜๋„๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ดˆ๊ธฐ ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ๋ณ€์ˆ˜ profit, cost, revenue ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์•”์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” LET ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์˜ DECLARE ๋ถ€๋ถ„ ์™ธ๋ถ€์— cost ๋ฐ revenue ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

์ฐธ๊ณ : Python Connector ์ฝ”๋“œ์—์„œ Snowflake CLI, SnowSQL, Classic Console, ๋˜๋Š” execute_stream ๋˜๋Š” execute_string ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์ œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์—์„œ Snowflake Scripting ์‚ฌ์šฉํ•˜๊ธฐ ์ฐธ์กฐ).

EXECUTE IMMEDIATE $$
DECLARE
    profit DEFAULT 0.0;
BEGIN
    LET cost := 100.0;
    LET revenue DEFAULT 110.0;
    profit := revenue - cost;
    RETURN profit;
END;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
|              10 |
+-----------------+

๋‹ค์Œ ์˜ˆ๋Š” ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ์˜ˆ์—๋Š” ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—๋Š” ์„ธ ๊ฐ€์ง€ ๋ธ”๋ก, ์ฆ‰ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ, ์ค‘๊ฐ„, ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก ๋‚ด์—์„œ PV_NAME์€ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก์—์„œ ์„ ์–ธ๋˜๊ณ  ์„ค์ •๋œ ๋ณ€์ˆ˜(innermost block variable ๋กœ ์„ค์ •๋จ)๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

  • ์ค‘๊ฐ„ ๋ธ”๋ก ๋‚ด์—์„œ(๋ฐ ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก์˜ ์™ธ๋ถ€์—์„œ) PV_NAME์€ ์ค‘๊ฐ„ ๋ธ”๋ก์—์„œ ์„ ์–ธ๋˜๊ณ  ์„ค์ •๋œ ๋ณ€์ˆ˜(middle block variable ๋กœ ์„ค์ •๋จ)๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ๋ธ”๋ก ๋‚ด์—์„œ(๋ฐ ์ค‘์ฒฉ ๋ธ”๋ก์˜ ์™ธ๋ถ€์—์„œ) PV_NAME์€ ์ €์žฅ ํ”„๋กœ์‹œ์ €์— ์ „๋‹ฌ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜(CALL ๋ฌธ์— ์˜ํ•ด parameter ๋กœ ์„ค์ •๋จ)๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE TABLE names (v VARCHAR);
Copy

์ด ์˜ˆ์ œ์—์„œ, ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก์˜ PV_NAME์— ๋ฌธ์ž์—ด innermost block variable ์„ ํ• ๋‹นํ•ด๋„ ์ค‘๊ฐ„ ๋ธ”๋ก์˜ ๋ณ€์ˆ˜ ๊ฐ’์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ˆ์ชฝ ๋ธ”๋ก์˜ ๋ณ€์ˆ˜๋Š” ์ค‘๊ฐ„ ๋ธ”๋ก์˜ ๋ณ€์ˆ˜์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฐ™๋”๋ผ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

CREATE OR REPLACE PROCEDURE duplicate_name(pv_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
BEGIN
  DECLARE
    PV_NAME VARCHAR;
  BEGIN
    PV_NAME := 'middle block variable';
    DECLARE
      PV_NAME VARCHAR;
    BEGIN
      PV_NAME := 'innermost block variable';
      INSERT INTO names (v) VALUES (:PV_NAME);
    END;
    -- Because the innermost and middle blocks have separate variables
    -- named "pv_name", the INSERT below inserts the value
    -- 'middle block variable'.
    INSERT INTO names (v) VALUES (:PV_NAME);
  END;
  -- This inserts the value of the input parameter.
  INSERT INTO names (v) VALUES (:PV_NAME);
  RETURN 'Completed.';
END;
Copy

์ฐธ๊ณ : Python Connector ์ฝ”๋“œ์—์„œ Snowflake CLI, SnowSQL, Classic Console, ๋˜๋Š” execute_stream ๋˜๋Š” execute_string ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์˜ˆ์ œ๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(Snowflake CLI, SnowSQL, Classic Console ๋ฐ Python Connector์—์„œ Snowflake Scripting ์‚ฌ์šฉํ•˜๊ธฐ ์ฐธ์กฐ).

CREATE OR REPLACE PROCEDURE duplicate_name(pv_name VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
$$
BEGIN
  DECLARE
    PV_NAME VARCHAR;
  BEGIN
    PV_NAME := 'middle block variable';
    DECLARE
    PV_NAME VARCHAR;
    BEGIN
      PV_NAME := 'innermost block variable';
      INSERT INTO names (v) VALUES (:PV_NAME);
    END;
    -- Because the innermost and middle blocks have separate variables
    -- named "pv_name", the INSERT below inserts the value
    -- 'middle block variable'.
    INSERT INTO names (v) VALUES (:PV_NAME);
  END;
  -- This inserts the value of the input parameter.
  INSERT INTO names (v) VALUES (:PV_NAME);
  RETURN 'Completed.';
END;
$$
;
Copy

์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

CALL duplicate_name('parameter');
Copy

ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

SELECT *
    FROM names
    ORDER BY v;
Copy
+--------------------------+
| V                        |
|--------------------------|
| innermost block variable |
| middle block variable    |
| parameter                |
+--------------------------+

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ์•ˆ์ชฝ์— ์ค‘์ฒฉ๋œ ๋ธ”๋ก(๋‘ ๊ฐœ์˜ ๋ ˆ์ด์–ด๊ฐ€ ์ค‘์ฒฉ๋จ)์—๋Š” ๋‚ด๋ถ€ ๋ธ”๋ก์˜ ๋ณ€์ˆ˜ PV_NAME ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ค‘๊ฐ„ ๋ธ”๋ก(ํ•œ ๋ ˆ์ด์–ด๊ฐ€ ์ค‘์ฒฉ๋จ)์—์„œ๋Š” ์ค‘๊ฐ„ ๋ธ”๋ก์˜ ๋ณ€์ˆ˜ PV_NAME ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ๋ธ”๋ก์—๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค์„œ๋ฅผ ์—ด ๋•Œ ๋ณ€์ˆ˜๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์˜ˆ๋Š” ์ปค์„œ ์—ด๊ธฐ์˜ ์˜ˆ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.