WHERE 조건에 특정 값이 포함된 쿼리를 안전하게 실행하려면 Java에서 PreparedStatement를 사용하면 됩니다. PreparedStatement는 SQL 인젝션 공격을 방지하고 쿼리 실행 성능을 개선하는 데에도 도움이 됩니다. 기본적인 사용 문법은 다음과 같습니다.
String anyVariableName = "select yourColumnName from yourTableName where name = ?"; PreparedStatement ps = (PreparedStatement) con.prepareStatement(yourVariableName); ps.setString(yourColumnIndex, yourValue);
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table demo37 -> ( -> id int not null auto_increment primary key, -> name varchar(200) -> ); Query OK, 0 rows affected (2.46 sec)
2. 데이터 삽입
insert 명령을 사용하여 테이블에 샘플 레코드를 추가합니다.
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo37(name) values('Bob');
Query OK, 1 row affected (0.08 sec)
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo37(name) values('Chris');
Query OK, 1 row affected (0.08 sec)
mysql> insert into demo37(name) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo37(name) values('Mike');
Query OK, 1 row affected (0.09 sec)3. 데이터 조회
select 문을 사용하여 테이블에 저장된 전체 레코드를 확인합니다.
mysql> select *from demo37;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+-------+ | id | name | +----+-------+ | 1 | John | | 2 | Bob | | 3 | John | | 4 | Chris | | 5 | David | | 6 | John | | 7 | Mike | +----+-------+ 7 rows in set (0.00 sec)
4. Java 코드 예제
다음은 PreparedStatement를 사용하여 WHERE 조건에 값을 바인딩하는 Java 코드입니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class PrepareStatementDemo {
public static void main(String[] args) {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledatabase", "root", "123456");
String query = "select name from demo37 where name = ?";
PreparedStatement ps = (PreparedStatement) con.prepareStatement(query);
ps.setString(1, "John");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}5. 실행 결과
위 프로그램을 실행하면 'John'이라는 이름을 가진 모든 레코드가 출력됩니다.
John John John
이처럼 ? 플레이스홀더와 setString() 메서드를 활용하면 WHERE 조건의 값을 동적으로 지정할 수 있습니다. 문자열을 직접 이어 붙이는 방식과 비교했을 때 코드 가독성이 높아질 뿐만 아니라 SQL 인젝션 위험도 크게 줄어들기 때문에 실무에서 반드시 사용해야 하는 방식입니다.