๐™น๐šŠ๐šŸ๐šŠ

[JAVA] SQL Query๋ฌธ : Prepared Statement

ํ•ด๋ฒ„๋‹ˆ 2023. 11. 5. 18:29
๋ฐ˜์‘ํ˜•

๊ฒฐ๋ก  

 

query๋ฌธ์„ ๋„ฃ์„ ๋•Œ๋Š” 

String query = "select * from user2 where name like '" + userName + "'";

์ด๋ ‡๊ฒŒ ๋„ฃ์ง€ ๋ง๊ณ  

String query = "select * from user2 where name like ?";

์ด๋ ‡๊ฒŒ ๋„ฃ์ž 

 

โ“์™œโ“ → ๋ณด์•ˆ์ด ์ทจ์•ฝํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 

 

 

 

 

 

 

 

 

Prepared Statement 

   public User getUser(String userName, String userPassword) {

        Connection connection = getConnection();
        String query = "select * from user2 where name like '" + userName + "'";

        User user = new User();
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            pstmt = connection.prepareStatement(query);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String password = rs.getString(4);

                if (userPassword.equals(password)) {
                    System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ " + password);
                    user.setId(rs.getInt(1));
                    user.setName(rs.getString(2));
                    user.setFullName(rs.getString(3));
                    user.setPassword(rs.getString(4));
                    user.setEmail(rs.getString(5));
                    user.setAge(rs.getInt(6));
                    user.setCreateDate(rs.getTimestamp(7));
                }
            } else {
                user = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;
    }

์œ„๊ฐ€ ๋‚˜์˜ ์ „์ฒด์ ์ธ ์ฝ”๋“œ์ด๋‹ค.

 

 

 

 

 

 

 

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ฐ‘ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. 

String query = "select * from user2 where name like '" + userName + "'";

userName์œผ๋กœ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค. 

userName์— "๋‚˜ '์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ๊ณ , ํ•ดํ‚น ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

(์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•ด์ฃผ์…จ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์—์„œ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์ด ์žˆ๋‹ค๋ฉด์„œ ์•Œ๋ ค์ฃผ์…จ๋‹ค.)

 

 

 

 

 

โ“ ์–ด๋–ป๊ฒŒ ํ•ดํ‚น์„ ํ•˜๋Š”๊ฑธ๊นŒโ“

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

์˜ˆ๋ฅผ ๋“ค์–ด, userName ๋ณ€์ˆ˜์— '' OR '1'='1' ์™€ ๊ฐ™์€ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด SQL ์ธ์ ์…˜ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

' OR '1'='1'๋Š” ํ•˜๋‚˜์˜ ์ฐธ ์กฐ๊ฑด์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ณต๊ฒฉ์ž๋Š” ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ SQL ์ธ์ ์…˜ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , SQL ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ๋Š” Prepared Statements ๋˜๋Š” ORM๊ณผ ๊ฐ™์€ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

 

 

 

 

 

 

 

 

๊ทธ๋ž˜์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜๊ณ , ์‹คํ–‰์‹œ์— ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

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

 

 

๊ทธ๋ž˜์„œ ๋ฐ‘์ฒ˜๋Ÿผ ๋ฐ”๊ฟจ๋‹ค. 

 

    public User getUser(String userName, String userPassword) {

        Connection connection = getConnection();
        String query = "select * from user2 where name like ?";

        User user = new User();
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            pstmt = connection.prepareStatement(query);
            pstmt.setString(1, userName);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                String password = rs.getString(4);

                if (userPassword.equals(password)) {
                    System.out.println("๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ " + password);
                    user.setId(rs.getInt(1));
                    user.setName(rs.getString(2));
                    user.setFullName(rs.getString(3));
                    user.setPassword(rs.getString(4));
                    user.setEmail(rs.getString(5));
                    user.setAge(rs.getInt(6));
                    user.setCreateDate(rs.getTimestamp(7));
                }
            } else {
                user = null;
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return user;
    }

 

 

 

String query = "select * from user2 where name like ?";
// ๋ฐ”๊พผ ๋ถ€๋ถ„

pstmt.setString(1, userName);
// ์ถ”๊ฐ€ํ•œ ๋ถ€๋ถ„

์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋ฉด์„œ ๋ณด์•ˆ์„ฑ์„ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

์‘์šฉ 

 

%์ œ๋ชฉ%์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ธฐ. 

%๊ฐ€ ๋“ค์–ด๊ฐ„ ์ œ๋ชฉ์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” %๋ฅผ \\%๋กœ ๋ฐ”๊ฟ”์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์ฟผ๋ฆฌ๋ฌธ : String subject๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. 

      if (subject == null) {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.creatorId = b.id ";
        } else {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.subject like ? and a.creatorId = b.id ";
            escapedSubject = (subject.contains("%")? subject.replace("%", "\\%"): subject);
        }

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์— %๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๋ฉด //%๋กœ ๋Œ€์ฒดํ•ด์ฃผ๊ธฐ

 

 

 

 

 

  pstmt.setString(1, "%" + escapedSubject + "%");

๊ทธ๋ฆฌ๊ณ  ์•ž๋’ค๋กœ %๋ฅผ ๋„ฃ์–ด์ค˜์„œ ํฌํ•จ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ 

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ณด์•ˆ์˜ ์ทจ์•ฝ์„ฑ์ด ์‚ฌ๋ผ์กŒ๋‹ค.

 

 

 

์ „์ฒด ๋ฉ”์†Œ๋“œ

  public List<BoardPost> getAllBoardPosts(String subject) {
        List<BoardPost> boardPosts = new ArrayList<BoardPost>();
        String query = "";
        String escapedSubject = "";

        // subject์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ’ ๋ณด์—ฌ์ฃผ๊ธฐ / ์•„๋‹ˆ๋ผ๋ฉด ์ „์ฒด ๋ชฉ๋ก ๋ณด์—ฌ์ฃผ๊ธฐ
        if (subject == null) {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.creatorId = b.id ";
        } else {
            query = "SELECT a.id, a.subject, a.content, a.createDate, b.id AS creatorId, b.name AS creatorName, b.fullName AS creatorFullName "
                            + " FROM boardpost a, user2 b " + " WHERE a.subject like ? and a.creatorId = b.id ";
            escapedSubject = (subject.contains("%")? subject.replace("%", "\\%"): subject);
        }

        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet resultSet = null;

        try {
            connection = getConnection();
            pstmt = connection.prepareStatement(query);
            if(subject != null) {                
                pstmt.setString(1, "%" + escapedSubject + "%");
            }
            resultSet = pstmt.executeQuery();
            while (resultSet.next()) {
                User creator = new User();
                long id = resultSet.getLong(1);
                String postSubject = resultSet.getString(2);
                String content = resultSet.getString(3);
                Timestamp dateString = resultSet.getTimestamp(4);

                creator.setId(resultSet.getLong(5));
                creator.setName(resultSet.getString(6));
                creator.setFullName(resultSet.getString(7));


                boardPosts.add(new BoardPost(id, postSubject, content, creator, dateString));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null)
                    connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (pstmt != null)
                    pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (resultSet != null)
                    resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return boardPosts;
    }

 

 

 

๋ฐ˜์‘ํ˜•