암묵적 칼럼
19.1 목표: 타이핑 줄이기
프로그래머들이 타이핑을 너무 많이 해야 한다고 불평하는 예 중 하나가 사용할 모든 컬럼을 SQL에 써야 하는 경우다.
와일드 카드는 쿼리를 간결하게 하는데, 컬럼 목록은 명시적이 아니라 암묵적이다.
SELECT * FROM Bugs;
INSERT INTO Accounts VALUES (DEFAULT,
'bkarwin', 'Bill', 'Karwin', 'bill@example.com', SHA2('xyzzy'), NULL, 49.95);
칼럼목록을 나열하지 않고 작성 하는게 더 짧다.
19.2 안티패턴: 지름길만 좋아하면 길을 잃는다.
리팩터링 방해
컬럼목록을 나열하지 않고 사용할 경우 컬럼변경에 대해 취약해진다.
- 컬럼을 추가하게 되면 INSERT문에서 에러가 발생하거나 엉뚱한 컬럼에 값을 할당될 수 있다.
- 컬럼을 삭제하게 되면 Application에서 SELECT의 레코드 결과셋을 참조 시 칸이 밀려 에러가 발생하거나 엉뚱한 값을 할당될 수 있다.
숨겨진 비용
쿼리에서 와일드카드를 사용하는 편리함은 성능과 확장적응성에 해를 끼칠 수 있다.
불필요한 데이터가 서버와 네트워크에서 처리되어야 한다.
요청한 것을 얻은 것이다.
SQL은 '원하지 않는 컬럼을 제외한 모든 컬럼'을 지정하는 문법은 없다.
테이블의 모든 컬럼을 요청하는 와일드카드를 사용하거나, 아니면 원하는 컬럼의 목록을 명시적으로 나열해야 한다.
19.3 안티패턴 인식 방법
- 애플리케이션이 여전히 데이터베이스의 컬럼을 예전 이름으로 참조해 동작하지 않아. 모든 코드를 수정했지만, 어딘가 빠뜨린 곳이 있나봐
: 테이블이 변경되었을 때 참조하는 곳을 모두 찾아 수정하는 것은 힘든 일이다. - 네트워크 병목을 추적하는데 며칠이 걸렸고, 마침내 데이터베이스 서버의 과도한 트래픽 문제로 범위를 좁혔어. 통계에 따르면 쿼리가 평균 2MB의 데이터를 가져가지만 표시하는 것은 그 10분의 1에 불과해
: 불필요한 데이터를 많이 가져오고 있다는 반증일 수 있다.
19.4 안티패턴 사용이 합당한 경우
테스트를 위한,쿼리와 같이 임시로 사용할 SQL이라면 와일드카드 사용을 정당화할 수 있다.
19.5 해법: 명시적으로 칼럼 이름 지정하기
와일드카드나 암묵적 칼럼 목록에 의지하기보다는, 항상 필요한 칼럼을 나열해야 한다.
오류 검증
SELECT 목록에 컬럼을 지정하면 앞서 설명한 혼동에 대해 더 큰 저항력이 생긴다.
- 테이블에서 컬럼의 위치가 바뀌어도, 쿼리 결과에서는 바뀌지 않는다.
- 테이블에 컬럼이 추가되어도, 쿼리 결과에는 나타나지 않는다.
- 테이블에서 컬럼이 삭제되면, 쿼리가 에러를 발생시킨다. (수정해야 할 포인트를 알려주는 유익한 점이다. '빨리 실패하라;는 원칙의 예)
그거 필요하지 않을 꺼야
SQL와일드카드를 포기하면, 자연히 불필요한 컬럼을 쓰지 않게 된다. 그 결과, 대역폭을 보다 효율적으로 사용하게 된다.
어쨌든 와일드카드를 포기해야 돼
SQL쿼리에도, 특정 칼럼에 수식을 적용하거나, 컬럼에 별명을 지정하거나, 특정 컬럼을 개별적으로 다룰 일이 꼭 생길 것이다.
처음부터 와일드카드를 사용하지 않으면, 나중에 쿼리를 변경하기 쉬울 것이다.
- 최초작성일 : 2011년 12월 15일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 인사이트(insight) 에서 출간한 'SQL AntiPatterns : 개발자가 알아야 할 25가지 SQL 함정과 해법'를 참고하였습니다.*