본문 바로가기
DB (DataBase) (국비)/DB 메모

PreparedStatement (향상된 Statement)

by Hwanii_ 2023. 6. 13.
728x90

JDBC 인터페이스를 구현할 때, Statement 객체를 사용했었다.

 

이 Statement 클래스의 하위 클래스로 PreparedStatement 라는 클래스가 존재 한다.

 

결론부터 말하면, 다음과 같은 특징을 가진다.

 

1.

문법상 자바의 개입이 사라진다.

VO 객체 인자의 정보를 가져오는식으로 코드를 구현하지 않는 문법 & 로직이 되어서,

자바의 개입이 사라진다는 의미 이다.

 

2.

그래서, 모든 SQL 구문이 자바의 개입이 사라지기에,

Model의 DAO 클래스 내부에 최상단으로 배치를 하여 높은 응집도를 실현 시킬 수 있다.

 

3.

최상단 배치를 하고, 각 비즈니스메서드들이 해당하는 SQL 구문을 사용할 수 있어야 하므로,

클래스 변수로 만들어주기 위해 키워드로 static을 붙혀준다.

 

이클립스를 통해 예시를 확인 해보자.

 

 

1.

위의 코드는 비즈니스메서드 중에 insert() 메서드 이다.

 

2.

JDBCUtil.connect() 함수를 통해,

드라이버 로딩 및, connection 객체 연결통로를 열어 준다.

( connection  객체 생성 >> conn = JDBCUtil.connect(); )

 

3.

DB와 연결

( pstmt 객체 생성 >> )

( pstmt = conn.prepareStatement(SQL 구문) )

 

>> SQL 구문을 준비 시킨 상태로 DB와 연결 한다.

(statement와 차이점인 부분 중에 하나)

 

prepareStatement(); 메서드는 createStatement() 메서드와 다르게

인자로 String 값을 받을 수 있다.

 

기존의 createStatement() 메서드

 

prepareStatement() 메서드

 

위처럼, prepareStatement() 메서드는 매개변수로 String 타입의 sql을

받는 모습을 확인 할 수 있다.

 

그래서 바로 sql 구문을 prepareStatement() 메서드에 넣으면 되는 상황이다.

 

4.

또한, 짚고 넘어가야 하는 부분은

기존에는 createStatement() 이 메서드에 인자로 아무것도 넣을 수 없었고

 

그다음 구문인, executeUpdate() 메서드 또는, executeQuery() 메서드에

sql 구문을 넣는 방식 이였다.

 

아래를 확인 해보자.

 

 

executeUpdate() 메서드에 sql 구문을 직접 대입할 수 밖에 없는 모습이다.

 

 

Statement 를 사용했을 때, 

문법상 sql 구문에서 필요한 값을 VO 객체의 인자를 받아서,

이렇게 sql 구문에 VO 객체의 멤버변수의 값들을 get 해서 넣어줘야 하는 상황 이였다.

 

5. 

하지만,

prepareStatement는 setString() 또는 setInt() 와 같은 메서드를 가지고 있다.

 

기존의 statement는 setString() 또는 setInt() 와 같은 메서드가 없다.

 

암튼 없다.

 

이 setString() 메서드와 setInt() 메서드는 아래와 같은 기능을 가지고 있다.

 

 

이클립스를 통해 아래에 정리.

 

 

 

최상단에 위치해 있는 sql 구문을 보면 ? 가 있는것을 확인할 수 있다.

 

prepareStatement가 인자로 가지고 있는 sql 구문 기준으로,

 

첫번째 물음표에 어떤 값을 넣어.

두번째 물음표에 어떤 값을 넣어.

세번째 물음표에 어떤 값을 넣어.

..

 

의 기능을 가진 prepareStatement의 setString() 또는 setInt() 메서드 이다.

그밖에 setDate나 setDouble 등이 있다.

 

이렇게,

executeUpdate()나 executeQuery() 전에

 

prepareStatement = connection.prepareStatement(sql_구문 이름);

 

을 하고,

setString() 또는 setInt() 등의 메서드가 존재하기 때문에,

 

그 밑에서

prepareStatement.setString( 1,VO.get멤버변수명() ); 과

prepareStatement.setInt( 2, VO.get멤버변수명() ); 으로,

 

sql 구문의 ? 값을 set 할 수 있는 문법의 구조를 가질 수 있음을 확인 할 수 있다.

 

[ 참고 ]

 

MySQL의 경우, JAVA 에서

 

sql 구문의 ?에 별도의 ' ' 을 붙히지 않아도 된다.

 

하지만, LIKE 구문과 같이, %에는 ' '을 반드시 붙혀 줘야 한다.

 

 

[ 정리 ]

 

1.

PreparedStatement 클래스의 prepareStatement() 메서드는

인자로 String 타입의 매개변수를 받을 수 있다.

즉, sql 구문을 바로 넣을 수 있다.

 

(기존의 Statement 클래스의 createStatement() 메서드는 인자로 아무것도 받을 수 없다)

 

2.

PreparedStatement 클래스는 메서드로 setString(), setInt() 와 같은 메서드를 가지고 있다.

 

이 메서드들 덕분에 sql 구문의 값들에 VO 객체의 인자를 get해서 넣을 수 있기 때문에

코드를 간결하게 작성 할 수 있게 된다.

 

3.

2의 메서드 덕분에

sql 구문의 필요한 값들에 대해서 VO 객체의 인자를 get을 하지 않아도 됬기 때문에,

비즈니스 메서드 밖으로 전부 sql 구문을 뺄 수 있게 된다.

 

즉,

 

1.

문법상 자바의 개입이 사라진다.

VO 객체 인자의 정보를 가져오는식으로 코드를 구현하지 않는 문법 & 로직이 되어서,

자바의 개입이 사라진다는 의미 이다.

 

2.

그래서, 모든 SQL 구문이 자바의 개입이 사라지기에,

Model의 DAO 클래스 내부에 최상단으로 배치를 하여 높은 응집도를 실현 시킬 수 있다.

 

3.

최상단 배치를 하고, 각 비즈니스메서드들이 해당하는 SQL 구문을 사용할 수 있어야 하므로,

클래스 변수로 만들어주기 위해 키워드로 static을 붙혀준다.

 

 

 

반응형