프로젝트를 뛰다보면 인라인 쿼리를 쓰는 사람도 있고, 저장 프로시저를 쓰는 사람이 있는데, 저는 SQL서버를 많이 사용하며, 저장 프로시저를 선호하는 편입니다. 물론 저장 프로시저는 소스 관리(SVN, GIT) 같은 소스 관리를 하지 못한다는 단점이 있긴하나, 이것을 보안하는 부분은 백업 및 2중 관리(귀찮긴하나 회사에서는 대부분 이렇게 쓰고 있습니다.)로 보완 할 수 있는 부분입니다. 아래는 SQL Sever에서 저장 프로시저를 사용하였을 때 장점을 적어보았습니다.
1. 인라인 쿼리
정의: 인라인 쿼리는 애플리케이션 코드 내에 직접 작성된 SQL 문을 의미합니다. 예를 들어, C#이나 Java 코드에서 데이터베이스와의 상호작용을 위해 SQL 문을 문자열 형태로 포함시키는 방식입니다.
장점:
- 직관성: 애플리케이션 코드 내에서 직접 SQL 문을 작성하므로, 로직을 한 곳에서 관리할 수 있습니다.
- 유연성: 동적 쿼리를 생성하거나 조건에 따라 SQL 문을 변경하기 용이합니다.
단점:
- 보안 취약점: 적절한 파라미터 처리 없이 문자열 연결로 쿼리를 구성하면 SQL 인젝션 공격에 노출될 수 있습니다.
- 성능 저하: 매번 쿼리를 실행할 때마다 데이터베이스 엔진이 구문 분석, 최적화, 컴파일을 수행해야 하므로 오버헤드가 발생합니다.
- 유지보수 어려움: SQL 문이 애플리케이션 코드에 분산되어 있으면, 변경 시 모든 관련 코드를 찾아 수정해야 하므로 관리가 복잡해집니다.
2. 저장 프로시저 (Stored Procedure)
정의: 저장 프로시저는 데이터베이스 내에 미리 컴파일되어 저장된 SQL 문의 집합으로, 함수처럼 호출하여 실행할 수 있습니다. 일련의 작업을 처리하는 절차를 데이터베이스에 저장해 두고 필요 시 호출하여 사용합니다.
장점:
- 성능 향상: 저장 프로시저는 최초 실행 시 컴파일되고, 이후에는 캐시된 실행 계획을 재사용하므로 반복 실행 시 성능이 향상됩니다.
- 보안 강화: 사용자에게 직접 테이블 접근 권한을 부여하지 않고, 저장 프로시저에만 권한을 부여하여 데이터 접근을 제어할 수 있습니다.
- 네트워크 부하 감소: 클라이언트에서 서버로 전송되는 데이터 양이 줄어들어 네트워크 부하를 줄일 수 있습니다.
- 유지보수 용이: 비즈니스 로직이 데이터베이스 내에 캡슐화되어 있어, 애플리케이션 코드를 수정하지 않고도 로직 변경이 가능합니다.
단점:
- 복잡한 로직 처리의 어려움: 문자열이나 숫자 연산 등 복잡한 로직 처리는 프로그래밍 언어(C#, Java 등)보다 효율이 떨어질 수 있습니다.
- 버전 관리 어려움: 저장 프로시저는 데이터베이스 내에 저장되므로, 소스 코드 관리 도구로 버전 관리를 하기 어렵습니다.
- 데이터베이스 종속성: 특정 데이터베이스에 종속되므로, 데이터베이스를 교체하거나 확장할 때 제약이 있을 수 있습니다.
3. 인라인 쿼리와 저장 프로시저의 비교
특징인라인 쿼리저장 프로시저
보안 | SQL 인젝션에 취약할 수 있음 | 파라미터화된 쿼리로 보안 강화 가능 |
성능 | 매번 실행 시 구문 분석 및 컴파일 필요 | 최초 실행 시 컴파일 후 캐시된 실행 계획 재사용으로 성능 향상 |
유지보수 | 코드 내에 SQL 문이 분산되어 있어 관리 어려움 | 데이터베이스 내에 로직이 캡슐화되어 있어 중앙 집중식 관리 가능 |
유연성 | 동적 쿼리 생성 및 조건부 로직 구현에 용이 | 복잡한 동적 로직 구현이 어려울 수 있음 |
네트워크 부하 | 전체 SQL 문이 네트워크를 통해 전송되어 부하 발생 가능 | 프로시저 호출만으로 작업 수행 가능하여 네트워크 부하 감소 |
데이터베이스 종속성 | 데이터베이스 변경 시 SQL 문 수정 필요 | 특정 데이터베이스에 종속되므로 교체 시 제약 발생 가능 |
4. 사용 시 고려사항
- 보안: 인라인 쿼리를 사용할 경우, 반드시 파라미터화된 쿼리를 사용하여 SQL 인젝션 공격을 방지해야 합니다. 저장 프로시저를 사용할 때도 입력 파라미터를 철저히 검증하는 것이 중요합니다.
- 성능: 자주 호출되거나 복잡한 로직의 경우 저장 프로시저를 사용하여 성능을 최적화할 수 있습니다. 그러나 저장 프로시저의 실행 계획이 오래되어 현재 데이터 분포와 맞지 않을 경우 성능 저하가 발생할 수 있으므로, 주기적인 모니터링과 재컴파일이 필요합니다.
- 유지보수: 비즈니스 로직이 자주 변경되는 경우, 저장 프로시저를 통해 중앙에서 관리하면 유지보수가 용이합니다. 그러나 저장 프로시저의 버전 관리를 위해 별도의 도구나 절차를 마련하는 것이 좋습니다.
- 데이터베이스 종속성: 애플리케이션이 여러 데이터베이스 시스템을 지원해야 하는 경우, 인라인 쿼리를 사용하여 데이터베이스 종속성을 최소화할 수 있습니다. 그러나 이 경우에도 SQL 표준을 준수하고, 데이터베이스별로 최적화된 쿼리를 사용하는 것이 중요합니다.
반응형
'개발 > SQL' 카테고리의 다른 글
Update 쿼리 시 주의사항 (0) | 2022.11.03 |
---|---|
SSMS "인덱스가 배열 범위를 벗어났습니다." (0) | 2022.02.09 |
저장 프로시저 인덱싱 분리 및 실행 계획 분리 (0) | 2022.01.25 |
SQL Insert 전 중복 체크 저장 프로시저 (0) | 2022.01.15 |
SQL Convert (0) | 2022.01.12 |
댓글