카테고리 없음
mybatis [CDATA] 사용법
Dodledd
2024. 9. 2. 11:27
CDATA
CDATA는 Character Data이다. = 문자형 데이터
마이바티스에서 쿼리를 작성하는 매퍼 파일은 XML로 작성되어 있고 이것이 파싱될 때 XML 표준으로 파싱된다.
마이바티스의 쿼리를 작성하는 xml 에서 <![CDATA[ ]> , [ ] 대괄호 안에 문자열을 넣으면 문자 그대로 전달된다.
보통 조건을 걸어줄 때 많이 발생하게 되는데, 특수문자를 사용할 떄 (ex : <, >, =, & 등등) 이런 것들을 사용할 때 태그로 인식되어 문법파일에러가 나면 프로젝트 자체가 실행이 안될 가능성이 있다.
위 상황을 방지하고자 <![CDATA[ ]>를 사용하는 것이며,
요약하자면 매퍼의 쿼리문에서 태그로 인식하지 않고 문자열 그대로 인식하게 하기 위해 사용하는 것이다.
<query id="selectUser">
<![CDATA[
SELECT * FROM users WHERE name = 'O'Reilly'
]]>
</query>
또한 동적 sql에서는 사용하기 어려운 문제가 있다고 한다.
이유는 동적 SQL은 SQL문의 조건에 따라 생성하는 방식이기 때문에 구조가 유동적이여서 CDATA 섹션을 맞추기 어렵기 때문입니다. (하지만 가능은 하다.)
추가로 Oracle에서 동적 SQL을 사용할 때에는 EXECUTE IMMEDIATE 구문을 사용합니다.
EXECUTE IMMEDIATE 예시
<query id="selectUser">
<![CDATA[
SELECT * FROM users WHERE name = 'O'Reilly'
]]>
</query>
그럼 EXECCUTE IMMEDIATE를 사용했을 때의 장 단점은 뭘까
장점
- SQL 인젝션 방지: 사용자가 입력한 값이 직접 SQL 쿼리에 포함되지 않기 때문에 SQL 인젝션 공격을 예방할 수 있습니다.
- 쿼리 성능 향상: 동일한 쿼리를 여러 번 실행할 경우, 데이터베이스는 쿼리 계획을 재사용할 수 있어 성능이 향상될 수 있습니다.
- 코드 가독성: 쿼리와 데이터 로직을 분리함으로써 코드의 가독성이 높아집니다. SQL 쿼리를 읽는 것이 더 쉬워집니다.
- 데이터 타입 자동 처리: 바인딩된 변수는 데이터베이스가 해당 타입에 맞게 자동으로 변환해 주므로, 타입 관련 오류를 줄일 수 있습니다.
단점
- 유연성 제한: 동적 SQL을 사용할 때, 복잡한 쿼리 조합이 필요할 경우 변수 바인딩만으로는 충분하지 않을 수 있습니다. 특히 복잡한 WHERE 조건에서 유연성을 잃을 수 있습니다.
- 디버깅 어려움: 바인딩된 변수로 인해 실제 실행되는 쿼리를 추적하기 어려울 수 있어, 디버깅이 복잡해질 수 있습니다.