[DB] SQL 안티패턴

안녕하·2023년 11월 15일
0

데이터베이스

목록 보기
8/21
  • SQL 쿼리와 데이터베이스 설계에서 발생하는 잘못된 패턴

  • 성능 저하, 데이터 무결성 손상, 보안 취약점 야기




무단횡단

  • 1개의 컬럼에 콤마 , 구분의 값을 넣는 것
  • 검색이 어려워짐
  • 문자열 컬럼의 문자 수 제한을 받음
  • validation을 걸기 어려움

해결

  • 교차 테이블 생성



반올림 오류

  • 소수점을 다룰 때 FLOAT 형 사용 금지
  • 부동소수점 반올림으로 오차 발생

해결

  • NUMERIC, DECIMAL 사용



유령 파일

  • 이미지 등 대용량 파일을 저장할 때, 데이터베이스에 링크만 저장하는 패턴
  • 데이터를 삭제한다고 해도 실제 파일까지 삭제된다고 보장 X (외부 스토리지에 쓰레기 데이터로 남음)
  • ROLLBACK 불가
  • 외부 파일은 SQL 접근 권한 영향을 받지 않음

해결

  • BLOB형 검토



NULL 값에 대한 두려움

  • NULL을 일반 값으로 다루거나 일반 값을 NULL로 다루는 패턴
  • NULL을 포함한 연산은 결과가 NULL이 된다
  • NULL은 비교 불가능

해결

  • NULL을 임의의 값으로 다룸
  • 검색 시 IS NULL 사용
  • NOT NULL 제약 조건 -> 애플리케이션 코드에 의존하지 않고 DB에서 강제하기



LIKE와 정규표현식

  • LIKE와 정규표현식을 이용하는 패턴
  • 인덱스의 효과가 사라지고 테이블을 스캔함
  • 단순한 패턴 매치로 의도하지 않은 결과 발생

해결

  • 전문 검색 엔진 이용
  • Sphinx나 Lucene 등 SQL과 독립된 검색 엔진 사용
  • 전치 인덱스를 자체 제작



하나의 복잡한 쿼리

  • 복잡한 문제를 하나의 SQL 쿼리로 해결하는 패턴
  • 결합이나 서브 쿼리 등 복잡한 SQL 쿼리는 보통 간단한 쿼리에 비해 느림

해결

  • 분할 통치
  • 쿼리를 여러 개로 분할
  • 사양 레벨에 따라 태스크를 분할하여 처리



SELECT *

  • SELECT * 사용 지양
  • 테이블 구조가 변경되거나 컬럼이 추가, 삭제, 수정되면 예상치 못한 결과가 나올 수 있음
  • 모든 컬럼을 조회하면 네트워크 부하 및 메모리 사용량 증가

해결

  • 필요한 컬럼만 조회하기



다중 컬럼 속성

  • 하나의 엔티티에 여러 개의 값을 컬럼으로 만드는 것
  • 검색 시 원하는 정보가 어느 컬럼에 있는지 모두 확인해야 함

해결

  • 종속 테이블 생성하여 사용



읽을 수 있는 패스워드

  • 패스워드를 평문으롤 저장하는 것
  • 보안 위험

해결

  • 패스워드 해시를 저장
  • 패스워드는 복구 대신 리셋하기



SQL 인젝션

  • 동적으로 SQL 구축 시 사용자 입력을 코드로 실행하는 것
  • SQL 쿼리 인수, 테이블 삭제 및 조회 등을 이용할 수 있게 되어 보안 취약
  • SQL 인젝션

해결

  • prepared statement를 이용
  • 사용자의 입력을 코드에서 격리



출처: SQL AntiPatterns

profile
세요

0개의 댓글