eajni IT ์ดˆ๋ณด์‚ฌ์ „ ๐Ÿ’ฆ๐Ÿ’ฆ

[Spring] statement vs. preparedstatement

2022-11-29

์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ฟผ๋ฆฌ๋ฌธ์„ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 2๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค โ‡’ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ SQL ์งˆ์˜๋ฌธ์„ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. โ‡’ ์‚ฌ์šฉ์‹œ ๋ฐ˜๋“œ์‹œ try~catch๋ฌธ ๋˜๋Š” throws ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

์ฟผ๋ฆฌ๋ฌธ ๋ฉ”์†Œ๋“œ ๋ฐ˜ํ™˜๊ฐ’ ์‚ฌ์šฉ๋ก€
SELECT executeQuery() ResultSet ResultSet ๊ฐ์ฒด๋ช… = Statement๊ฐ์ฒด.executeQuery(โ€SELECT๋ฌธโ€)
INSERT
UPDATE
DELETE
executeUpdate() ์ฒ˜๋ฆฌ๋œ ๋ ˆ์ฝ”๋“œ(row) ๊ฐœ์ˆ˜ int A=Statement๊ฐ์ฒด.executeUpdate(๋ณ€์ˆ˜๋ช…)
CREATE
ALTER
execute() 0 (resultset๊ณผ ๊ฐฑ์‹ ๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜ ๋‘˜ ๋‹ค ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ) ย 

Statement ์ธํ„ฐํŽ˜์ด์Šค

  • Statement ๊ฐ์ฒด๋Š” Statement ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ Connection ํด๋ž˜์Šค์˜ createStatement( ) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์–ป์–ด์ง„๋‹ค.
  • Statement ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด executeQuery( ) ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ SQL๋ฌธ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ์ธ์ˆ˜๋กœ SQL๋ฌธ์„ ๋‹ด์€ String๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • Statement๋Š” ์ •์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ์ฟผ๋ฆฌ๋ฌธ์— ๊ฐ’์ด ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
import java.sql.Statement;
import java.sql.Connection;
import java.sql.SQLException;
 
public class StatementTest 
{
    public static void main(String args[])
    {
        Connection conn = null; // DB์—ฐ๊ฒฐ๋œ ์ƒํƒœ(์„ธ์…˜)์„ ๋‹ด์€ ๊ฐ์ฒด
        Statement stm = null;  // SQL ๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
        
        try {
            conn = DBConnection.getConnection();
            stm = conn.createStatement();
            
            String quary = "INSERT INTO TEST VALUES('id1', 'pw1', 'name1')";
            int success = stm.executeUpdate(quary);
            
            if(success > 0)
                System.out.println("๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์„ฑ๊ณต");
            else
                System.out.println("๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์‹คํŒจ");
 
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        }
    }
}

PreparedStatement ์ธํ„ฐํŽ˜์ด์Šค

  • PreparedStatementย ๊ฐ์ฒด๋Š”ย Connectionย ํด๋ž˜์Šค์˜ preparedStatement( )๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ธ์ˆ˜๋กœ SQL๋ฌธ์„ ๋‹ด์€ String๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • SQL๋ฌธ์žฅ์ด ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋˜๊ณ , ์‹คํ–‰ ์‹œ๊ฐ„๋™์•ˆ ์ธ์ˆ˜๊ฐ’์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Statement ๊ฐ์ฒด์™€ ๋‹ค๋ฅด๋‹ค.
  • Statement ๊ฐ์ฒด์˜ SQL์€ ์‹คํ–‰๋  ๋•Œ ๋งค๋ฒˆ ์„œ๋ฒ„์—์„œ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด,ย PreparedStatementย ๊ฐ์ฒด๋Š” ํ•œ ๋ฒˆ ๋ถ„์„๋˜๋ฉด ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๋‹ค.
  • ๊ฐ๊ฐ์˜ ์ธ์ˆ˜์— ๋Œ€ํ•ด ์œ„์น˜ํ™€๋”(placeholder)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL๋ฌธ์žฅ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์œ„์น˜ํ™€๋”๋Š” ? ๋กœ ํ‘œํ˜„๋œ๋‹ค.
  • ๋™์ผํ•œ SQL๋ฌธ์„ ํŠน์ • ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋•Œ, ์ธ์ˆ˜๊ฐ€ ๋งŽ์•„์„œ SQL๋ฌธ์„ ์ •๋ฆฌํ•ด์•ผ ๋  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค.
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
 
public class PreparedStatementTest 
{
    public static void main(String args[])
    {
        Connection conn = null; // DB์—ฐ๊ฒฐ๋œ ์ƒํƒœ(์„ธ์…˜)์„ ๋‹ด์€ ๊ฐ์ฒด
        PreparedStatement pstm = null;  // SQL ๋ฌธ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
        
        try {
            
            String quary = "INSERT INTO TEST VALUES(?, ?, ?)";
            
            conn = DBConnection.getConnection();
            pstm = conn.prepareStatement(quary);
            
            // ์ฟผ๋ฆฌ์— ๊ฐ’์„ ์„ธํŒ…ํ•œ๋‹ค.
            // ์—ฌ๊ธฐ์„œ 1, 2, 3์€ ์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ์œ„์น˜ํ™€๋” ๋ผ๋Š” ๋œป
            pstm.setString(1, "id2");
            pstm.setString(2, "pw2");
            pstm.setString(3, "name2");
            
            int success = pstm.executeUpdate();
            
            if(success > 0)
                System.out.println("๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์„ฑ๊ณต");
            else
                System.out.println("๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์‹คํŒจ");
 
            
        } catch (SQLException sqle) {
            sqle.printStackTrace();
        }
    }
}

PreparedStatement ์žฅ์ 

๋™์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ™์€ SQL๋ฌธ์—์„œ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋˜๊ฐ€ ์ธ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ_์— ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค. ๋˜ํ•œ _๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰ ์†๋„๊ฐ€ Statement๋ณด๋‹ค ๋น ๋ฅธ ์žฅ์ ์ด ์žˆ๋‹ค.

๋˜ Statement ๊ฐ์ฒด๋Š” ์ฟผ๋ฆฌ ์‹คํ–‰์‹œ ๊ฐ’์— ์ž‘์€๋”ฐ์˜ดํ‘œ( โ€˜ )๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ๋‘ ๊ฐœ( โ€˜ โ€˜ ) ํ‘œ์‹œํ•ด์•ผ ํ•œ๋‹ค(ex_I โ€˜ โ€˜ am). ๊ทธ๋Ÿฌ๋‚˜ PreparedStatement ๊ฐ์ฒด๋Š” ์ž‘์€๋”ฐ์˜ดํ‘œ ๋ฌธ์ œ๋ฅผ ์ฟผ๋ฆฌ ์‹คํ–‰์‹œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.


Comments

Content