Steady Mind For My Life

https://github.com/jongseok3910/Spring-Study

Oracle

바인드변수

함탕 2023. 12. 12. 15:13
728x90
728x90

바인드변수를 사용해야 하는 이유

오라클에서는 SQL을 실행하기 전에 하드파싱 or 소프트파싱이라는

과정을 거친다.

2023.07.18 - [Oracle] - 쿼리 처리 원리

 

쿼리 처리 원리

SQL의분석 SQL은 자바 같은 프로그래밍 언어와 달리 실행하기 전에 문법적인 에러를 검출할 방법이 없다. (자바는 컴파일 할 때 문법적에러를 검출 할 수 있다) 그래서 SQL을 실행하기 전에 분석을

hamutang.tistory.com

 

동일한 SQL문이 라이브러리캐시(공유 풀)에 존재하면 소프트파싱과정을 거쳐

실행되기 때문에 SQL이 빨리 실행될 수 있도록 도와준다.

즉, SQL문이 완전히 동일해야 효율이 좋다

 

아래 예시를 살펴보자.

 

바인드변수 사용 전

1
2
3
4
5
6
7
public void login(String loginId) throws Exception{
    String stmt = "SELECT * FROM USER WHERE LOGIN_ID = '" + loginId +"' ";
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery(stmt);
 
    /*이하 생략*/
}
cs

 

위와 같이 사용하면 아래와 같은 SQL이 실행된다.

SELECT * FROM USER WHERE LOGIN_ID  = 'A'

SELECT * FROM USER WHERE LOGIN_ID  = 'B'

SELECT * FROM USER WHERE LOGIN_ID  = 'C'

SELECT * FROM USER WHERE LOGIN_ID  = 'D'

 

LOGIN_ID 부분이 A, B, C, D ~ 사용자 아이디에 따라 SQL문이 바뀐다.

(SQL문이 완전히 동일하지 않다)

 

바인드변수 사용 후

1
2
3
4
5
6
7
8
public void login(String loginId) throws Exception{
    String stmt = " SELECT * FROM USER WHERE LOGIN_ID = ? ";
    PreparedStatement st = con.prepareStatement(stmt);
    st.setString(1, loginId);
    ResultSet rs = st.executeQuery();
 
    /*이하 생략*/
}
cs

 

위와 같이 사용하면 아래와 같은 SQL이 실행된다.

SELECT * FROM USER WHERE LOGIN_ID = :1

 

다양한 LOGIN_ID가 들어와도

LOGIN_ID 부분이 :1로 SQL문이 바뀌지 않는다.

(SQL문이 완전히 동일하다)

 

정리

바인드변수 '?'가 있기에 동일한 SQL문이 수행되고

라이브러리캐시에 등록되어 있는 SQL정보가 재사용되어

실행 효율이 좋아지기 때문에(소프트파싱)

바인드변수를 사용하는 것이 좋다.

(소프트파싱=SQL검증과 실행계획수립 생략하고 SQL 실행)

 

 

728x90
300x250