프로젝트에서 쓰는 틀이 iBatis 라 쿼리를 XML 에 두는 방식이었다. 처음에는 왜 이렇게 하는지 몰랐다. 코드 안에 쓰면 한 파일에서 다 보이는데 굳이 나누면 오가야 하기 때문이다.
Table of contents
Open Table of contents
코드 안에서는 모양이 안 보였다
전에는 SQL 을 자바 코드 안에서 문자열로 이어 붙였다. 조건이 붙을 때마다 문자열을 더하는 코드가 늘어났다. 완성된 쿼리가 어떤 모양인지는 실행해 봐야 알 수 있었다.
느릴 때 EXPLAIN 을 보려면 그 문자열을 손으로 조립해야 했다. 조립하다 틀리면 다른 쿼리를 재게 된다. 코드 안에 있다는 것이 편해 보였는데 실제로는 그렇지 않았다.
옮기고 나서 오가는 횟수가 줄었다
XML 로 옮기니 SQL 전체 모양이 한눈에 보였다. 그대로 복사해 EXPLAIN 을 볼 수 있었다. 조건이 붙는 부분도 <if> 로 표현되니 어떤 경우에 무엇이 붙는지 읽혔다.
쿼리를 고치는 사람과 자바를 고치는 사람이 다른 파일을 열게 된 것도 있었다. 같은 파일을 동시에 고치는 일이 줄었다. 번거로워 보이던 분리가 실제로는 오가는 횟수를 줄였다.
치환 방식 둘이 서로 달랐다
값을 넣는 방법이 두 가지였는데 만들어지는 SQL 이 서로 달랐다. 하나는 PreparedStatement 로 값을 따로 전달하고 다른 하나는 문장 안에 그대로 박는다. 겉보기에는 둘 다 값이 들어간 쿼리가 나온다.
값이 문장에 박히면 값 안에 따옴표가 들어갈 때 쿼리 구조 자체가 바뀐다. 자바에서 문자열을 이어 붙이던 것도 같은 상태였다. 그래서 값은 전달하는 쪽을 쓰고 구조를 바꿔야 할 때만 다른 쪽을 쓰되 미리 정한 목록과 대조한 값만 넣었다.
아직 불편한 것
파일을 오가야 하는 것은 그대로 남았다. 이름을 잘못 적으면 컴파일에서 안 잡히고 실행할 때 드러난다. 자바 쪽에서 이름을 바꾸면 파일 쪽도 같이 고쳐야 한다.
조건이 아주 많은 쿼리는 태그가 겹겹이 쌓여 읽기 어려웠다. 그런 경우에는 어느 쪽이 나은지 아직 모르겠다. 지금 쓰는 범위에서는 옮긴 쪽이 나았다.
정리
- 코드 안에 문자열로 쓰면 완성된 쿼리를 실행해야 안다
- 도구에서 재려면 문자열을 손으로 조립하게 된다
XML로 꺼내면 전체 모양이 한눈에 보인다- 그대로 복사해
EXPLAIN을 볼 수 있다 - 두 치환 방식은 만들어지는
SQL이 다르다. 하나는PreparedStatement다 - 값이 문장에 박히면 구조가 바뀔 수 있다
- 구조를 바꿔야 하면 미리 정한 목록과 대조한다
- 이름 오타가 실행할 때 드러나는 것은 남는다