프로그래밍공부노트

Day 43 - iBatis (selectKey , Binding, DynamicQuery) 본문

iBatis

Day 43 - iBatis (selectKey , Binding, DynamicQuery)

SANGJIN-YU 2021. 4. 15. 01:58
반응형

XSS란 (Cross Side Script) 

SQL Injection 공격

 

OWASP 

 

SQL Injection Statement 객체

PreparedStatement(준비된 쿼리 : 쿼리 임시 저장 영역, 자동으로 SQL Injection을 막아준다)

: 쿼리를 작성할때 필요한 부분을 Binding을 통해 쿼리를 효율적으로 작업

arr[1,2,3]

SELECT * FROM JOBS_TEMP SHERE JOB_ID =? 한번만 날리면 된다

 

CreateStatement - CallableStatment(하드웨어 부하가 심하다, SQL Injection 공격을 막을 수 없다)

SELECT * FROM JOBS_TEMP SHERE JOB_ID =1

SELECT * FROM JOBS_TEMP SHERE JOB_ID =2

SELECT * FROM JOBS_TEMP SHERE JOB_ID =3

 

 

CallableStatement


selectKey

iBatis를 통해서 insert delete update 실행할때 알아야 할 중요 keyword

 

1) insert - selectKey  (SQL문에서 사용하는 CDATA)

2) CUD에서는 성공한 ROW의 갯수를 반환하기 때문에 각 태그(insert delete update)는 result 타입을 가질 수 없다.

 

<insert id="insert01" parameterClass="com.min.edu.dto.jobsDto">
	INSERT INTO JOBS_TEMP (JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)
		VALUES(#job_id#,#job_title#,#min_salary#,#max_salary#)

<selectKey keyProperty="job_id" resultClass="java.lang.String" type="post">
	SELECT JOB_ID FROM JOBS_TEMP WHERE JOB_ID=#job_id#
</selectKey>
</insert>

keyProperty는 반환되는 column, resultClass는 반환되는 타입을 이야기하고 type은 post와 pre(쿼리끝나기 전 후)

 

CDATA : 문법에 영향을 받지 않고 그냥 글자로 인식시키는 방법을 이야기한다

SQL은 연산자 <> = 가 존재하고 연산자 중 <은 markup tag에서 사용이 되기 때문에 오류가 발생할 가능성이 있음

 

CDATA 작성방법은 : <![CDATA[쿼리문]]> 이렇게 작성하면 된다 (<같은 연산자가 포함된 경우 CDATA)


Binding

Binding 기법 중에서 #변수#를 사용해서 처리하게 됨 JDBC(PreparedStatement) => '값'

$변수$를 사용해서 처리하면 => 값 (''없이)

 

	 <select id="type01" parameterClass="java.util.Map" resultClass="JDto">
	 	SELECT JOB_ID, MAX_SALARY, MIN_SALARY
	 		FROM JOBS_TEMP
	 			WHERE $column$=#id#
	 </select>

 

#컬럼명# = #값#   -> WHERE '컬럼명' = '값'

$컬럼명$ = #값#    -> WHERE 컬럼명 = '값'


Dynamic Query

 

Iterator tag를 사용해서 SQL의 IN절을 사용

입력받는 Argumnet의 갯수를 알수 없다면 in을 통해서 생성할 때 사용

IN('A','B','C,') 이렇게 입력 받는다면 ( IN 다음 ( ,, ) ) 이렇게 오기 때문에 

 

<iterate open="(" conjunction="," close=")"></iterate> 라고 작성해주면 (을 open으로 인식하고 ,을 계속 연결로 인식한 다음에 )이 나오면 닫기 때문에 Arguments의 갯수를 알 수 없을 때 사용이 가능한 것이다.

<select id="selDynamicMap" parameterClass="java.util.Map" resultClass="com.min.edu.dto.jobsDto">
	<include refid="allColumn"/>
			WHERE JOB_ID IN
				<iterate open="(" conjunction="," close=")" property="id">
				#id[]#
				</iterate>
</select>

WHERE 조건절의 IN뒤에 작성해줘서 사용했다. 현재 parameterClass가 Map이기 때문에 map을 통해서 전달받는 key가 #id#라고 생각하면 된다.[]는 list로 받는다는 의미?이다

 

<include/>는 반복적으로 사용되는 쿼리를 refid를 부여하여 반복작업하지 않고 사용할 수 있도록 도와준다.

엄청나게 많은 컬럼명을 계속 작성해야할 때와 같이 반복적이어서 비효율적인 작업을 할 때 사용한다.


어떠한 값이 있다면 WHERE절을 생성하고, 값이 없다면 전체 검색 값을 판단해야함 => 판단이라는 의미는 변수에 묶여있어야 함 => 판단이라는 의미는 변수에 묶여있어야함 parameterClass가 DTO/ MAP

주의할 점은 Primitive (Boxing) 타입의 경우에는 묶여있는 값이 아니기 때문에 판별할 수 없음

 

시나리오

입력받은 값이 5000 이상이라면 WHERE절 실행시키겠다

 <select id="selectDynamic01" parameterClass="java.util.Map" 
 								resultClass="com.min.edu.dto.jobsDto">
 
 <include refid="allColumn"/>
 <dynamic prepend="WHERE">
 	<isGreaterEqual property="min_salary" compareValue="5000"><!-- property >= compareValue-->
 		MIN_SALARY = #min_salary#
 	</isGreaterEqual>
 
 </dynamic>	
 </select>

<prepend> 만약에 하위의 tag의 기능이 true라면 동작시키겠다(여기서는 where절을) 

<isGreaterEqual> : >= (이상 크거나 같다)

property 비교할 기준의 column, compareValue 비교할 기준의 값

 

반응형

'iBatis' 카테고리의 다른 글

Day 44 - iBatis(Dynamic Query)  (0) 2021.04.16
Day 42 - iBatis  (0) 2021.04.14
Day 41 - iBatis(환경설정, 테스트)  (0) 2021.04.12