Stored Procedure๋ž€?

0taetaeยท2025๋…„ 1์›” 2์ผ
post-thumbnail

๐Ÿ’กStored Procedure๋ž€?

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํ”„๋กœ์‹œ์ €
  • RDBMS์— ์ €์žฅ๋˜๊ณ  ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ์‹œ์ €
  • ๊ตฌ์ฒด์ ์ธ ํ•˜๋‚˜์˜ task๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋งํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ค๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋กœ์ง์„ ์ •์˜

๐Ÿ’กStored Procedure ์ž‘์„ฑ

delimiter $$
CREATE PROCEDURE ํ”„๋กœ์‹œ์ €์ด๋ฆ„(IN/OUT ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋ฆ„ ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…)
BEGIN
   body
END
$$
delimiter ;

call ํ”„๋กœ์‹œ์ €์ด๋ฆ„();

โœ”๏ธ IN/OUT์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด, default ๊ฐ’์ธ IN์œผ๋กœ ๋™์ž‘

  • IN : ํ˜ธ์ถœํ•˜๋ฉด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ „๋‹ฌ
  • OUT : ๋ฐ˜ํ™˜๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ €์žฅ

๐Ÿ’ก์˜ˆ์ œ

  • ๋‘ ์ •์ˆ˜์˜ ๊ณฑ์…ˆ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋กœ์‹œ์ €

    delimiter $$
    CREATE PROCEDURE product(IN a int, IN b int, OUT result int)
    BEGIN
       SET result = a * b;
    END
    $$
    delimiter ;
    
    call product(5,7, @result);
    
    select @result;

    โœ”๏ธ@๋ณ€์ˆ˜๋ช… : ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋ณ€์ˆ˜

  • ๋‘ ์ •์ˆ˜๋ฅผ ๋งž๋ฐ”๊พธ๋Š” ํ”„๋กœ์‹œ์ €

    delimiter $$
    CREATE PROCEDURE swap(INOUT a int, INOUT b int)
    BEGIN
       set @temp = a;
       set a = b;
       set b = @temp;
    END
    $$
    delimiter ;
    
    set @a = 5, @b = 7;
    call swap(@a, @b);
    select @a, @b;

    โœ”๏ธ INOUT : IN, OUT ์—ญํ•  ๋ชจ๋‘ ์ˆ˜ํ–‰

  • ๊ฐ ๋ถ€์„œ๋ณ„ ํ‰๊ท  ์—ฐ๋ด‰์„ ๊ฐ€์ ธ์˜ค๋Š” ํ”„๋กœ์‹œ์ €

    delimiter $$
    CREATE PROCEDURE get_dept_avg_salary()
    BEGIN
       select dept_id, avg(salary)
       from employee
       group by dept_id;
    END
    $$
    delimiter;
    
    call get_dept_avg_salary();
  • ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœํ•„ ๋‹‰๋„ค์ž„์„ ๋ฐ”๊พธ๋ฉด ์ด์ „ ๋‹‰๋„ค์ž„์„ ๋กœ๊ทธ์— ์ €์žฅํ•˜๊ณ  ์ƒˆ ๋‹‰๋„ค์ž„์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ”„๋กœ์‹œ์ €

    select * from users;  -- id, nickname
    select * from nickname_logs;  -- ๋‹‰๋„ค์ž„์˜ history ๊ธฐ๋ก
    
    delimiter $$
    CREATE PROCEDURE change_nickname(user_id INT, new_nick varchar(30))
    BEGIN
       insert into nickname_logs(
          select id, nickname, now() from users where id = user_id);
       update users set nickname = new_nick where id = user_id;
    END
    $$
    delimiter;
    
    call change_nickname(1,'taetae');

๐Ÿ’กStored Procedure vs Stored Function

Stored ProcedureStored Function
create ๋ฌธ๋ฒ•CREATE PROCEDURECREATE FUNCTION
return ํ‚ค์›Œ๋“œ๋กœ ๊ฐ’ ๋ฐ˜ํ™˜๋ถˆ๊ฐ€๋Šฅ(SQL server๋Š” ์ƒํƒœ์ฝ”๋“œ ๋ฐ˜ํ™˜์šฉ์œผ๋กœ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ)๊ฐ€๋Šฅ(MySQL, SQL server๋Š” ๊ฐ’ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด ํ•„์ˆ˜)
ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ’ ๋ฐ˜ํ™˜๊ฐ€๋Šฅ(๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ, ํ•„์ˆ˜)์ผ๋ถ€ ๊ฐ€๋Šฅ(oracle ๊ฐ€๋Šฅํ•˜๋‚˜ ๊ถŒ์žฅ์•ˆํ•จ, postgreSQL ๊ฐ€๋Šฅ)
๊ฐ’ ๋ฐ˜ํ™˜ํ•„์ˆ˜ ์•„๋‹˜ํ•„์ˆ˜
SQL statement์—์„œ ํ˜ธ์ถœ๋ถˆ๊ฐ€๋Šฅ๊ฐ€๋Šฅ
transaction ์‚ฌ์šฉ๊ฐ€๋Šฅ๋ถˆ๊ฐ€๋Šฅ(oracle์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅ)
์ฃผ๋œ ์‚ฌ์šฉ ๋ชฉ์ business logiccomputation
๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅธ function ํ˜ธ์ถœ๊ฐ€๋Šฅ๊ฐ€๋Šฅ
๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅธ procedure ํ˜ธ์ถœ๊ฐ€๋Šฅ๋ถˆ๊ฐ€๋Šฅ
resultset(table) ๋ฐ˜ํ™˜cursor๋‚˜ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜ํ™˜๋‹จ์ผ๊ฐ’ ๋˜๋Š” ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜
precompiled execution plan์ฒซ ์‹คํ–‰ ์‹œ execution plan์ด ์ƒ์„ฑ๋˜๊ณ  ์บ์‹œ๋จ, ์ดํ›„ ์‹คํ–‰ ์‹œ ์บ์‹œ๋œ execution plan ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ฒซ ์‹คํ–‰ ์‹œ execution plan์ด ์ƒ์„ฑ๋˜๊ณ  ์บ์‹œ๋จ
try-catch ์‚ฌ์šฉ๊ฐ€๋Šฅ๋ถˆ๊ฐ€๋Šฅ

โœ”๏ธ ํŠธ๋žœ์žญ์…˜โ“
์—ฌ๋Ÿฌ๊ฐœ์˜ SQL๋ฌธ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ, ์—ฌ๋Ÿฌ SQL๋ฌธ์ด ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด ๋ฐ˜์˜๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘

๐Ÿ’ก3๊ณ„์ธต ๊ตฌ์กฐ์—์„œ Stored Procedure์˜ ์˜๋ฏธ

  1. Presentation ๊ณ„์ธต
    • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต
  2. Logic tier
    • ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๊ณผ ์ •์ฑ… ๋“ฑ๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต
  3. Data tier
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ณ  ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ณ„์ธต

=> Stored Procedure์˜ ์ฃผ์š” ์‚ฌ์šฉ ๋ชฉ์ ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„

๐Ÿ’กStored Procedure์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    1. application์— transparentํ•˜๋‹ค.
    2. ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์—ฌ์„œ ์‘๋‹ต ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
      • stored procedure๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, select/inser/update ํ• ๋•Œ๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ
      • stored procedure๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ, ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ
    3. ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    4. ๋ฏผ๊ฐํ•œ ์ •๋ณด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ 
    1. ์œ ์ง€ ๊ด€๋ฆฌ ๋ณด์ˆ˜ ๋น„์šฉ ์ฆ๊ฐ€
    2. DB ์„œ๋ฒ„ ์ถ”๊ฐ€ ๋ณต์žก
    3. stored procedure๊ฐ€ ํ•ญ์ƒ transparentํ•˜๋‹ค๊ณ  ๋ณด๊ธฐ ์–ด๋ ต๋‹ค.
    4. ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
      • DBMS๋กœ์˜ ํ˜ธ์ถœ์ด ์ฆ๊ฐ€ํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜์—ฌ ํ†ต์ œํ•˜๊ธฐ ์–ด๋ ค์›€์œผ๋กœ ์ธํ•ด ๋ฌธ์ œ ๋ฐœ์ƒ ์šฐ๋ ค
        => Data Service๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๋กœ์ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.
    5. ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€