저장프로시저와 트리거

저장프로시저(Stored Procedure)? 

 

DB 내부에 저장된 일련의 SQL 명령문들을 하나의 함수처럼 실행하기 위한 쿼리의 집합입니다.

 

DB 작업을 진행함에 있어서 항상 하나의 쿼리문으로 자신이 원하는 데이터 처리를 할 수는 없습니다. 어떤 일은 여러 줄의 쿼리로 해결해야 합니다. 그런데 그 `어떤 일`이 여러 곳에서 필요하다면? 그 때마다 여러 줄의 쿼리 문을 다 작성하는 것이 바람직한 방법일까요?

 

일반 프로시저와 같이 코드의 중복이 많아지면 프로그램 사이즈도 커지고, 수정이 필요한 경우 다 수정해야 하는 번거로움이 있으며 데이터베이스 서버 쪽에서도 각 클라이언트에서 날라오는 SQL문을 각각 분석하고 실행해야 하기 때문에 네트워크 트래픽이 증가합니다. 그래서 업무적으로 자주 사용되는 SQL 들을 서버 쪽에 루틴으로 미리 작성하여 실행될 때 최적화된 상태로 컴파일이 되어 서버 측에 저장되는데 이를 저장프로시저라고 합니다.

 

저장 프로시저를 사용하면 상대적으로 다음과 같은 장점들이 있습니다.

 

 

저장프로시저의 장점

 

·         코드의 중복을 피할 수 있습니다.

 

·         소스의 재 컴파일 없이 확장 및 유지 보수가 간편해 집니다.

 

·         프로그램 에러 확률이 크게 줄어듭니다.

 

·         성능향상

           저장프로시저는 앞에서 언급한 것처럼 최초 실행될 때 최적화된 상태로 컴파일이 되고 이후에 DB에 캐쉬 되어   

           저장됩니다. 캐쉬에 저장되면 최적화와 컴파일 작업을 다시 하지 않는다. 따라서 하나의 저장프로시저가 여러 번   

           사용될 때 성능에 향상이 있습니다.

 

·         네트워크 트래픽이 감소합니다.

      저장프로시저를 사용하면 SQL문이 서버에 저장됩니다. SP를 사용하면 수백 개의 SQL문이 필요한 일도 서버에서   SP로 처리 하기 때문에 쿼리문 자체를 전달하지 않아도 됩니다이 때 각각의 클라이언트는 매개변수만 전달합니다.

 

 

저장프로시저1.png

 

 

 

 

 

 

 

 

 

 

 

 

 

트리거(Trigger)?

 

트리거(Trigger) 영어로 방아쇠라는 뜻인데, 방아쇠를 당기면 그로 인해 총기 내부에서 알아서 일련의 작업을 실행하고 총알이 날아갑니다

 

이처럼 데이터베이스에서도 트리거(Trigger) 특정 테이블에 INSERT, DELETE, UPDATE 같은 DML 문이 수행되었을 데이터베이스에서 자동으로 동작하도록 작성된 프로그램입니다.

 

즉 ! 저장프로시저처럼 사용자가 직접 호출하는 것이 아니라, 데이터베이스에서 자동적으로 호출하는 것이 가장 특징입니다.

 

트리거(Trigger)는 테이블과 뷰 데이터베이스 작업을 대상으로 정의할 수 있으며전체 트랜잭션 작업에 대해 발생되는 트리거(Trigger)와 각행에 대해 발생되는 트리거(Trigger)가 있습니다.

 

 

트리거(Trigger) 적용되는

 

부서별 사원관리 시스템에서 특정 부서를 삭제해야 하는 경우, 그 부서에 해당하는 직원들은 여러 명이 있을 수 있습니다. 그러면 그 부서만 삭제된다면 부서가 없는 사원들이 생겨서 참조 무결성 오류가 발생하게 될 것입니다. 아니면 한 명 한 명의 사원들을 일일이 삭제하는 명령어를 실행해야 합니다. 이러한 작업을 데이터베이스 서버의 트리거로 작성하여 부서를 지우게 전에 해당 부서의 사원들을 지울 수 있도록 트리거 루틴으로 작성합니다.

 

 

또 다른 예로 다음과 같은 상황에서 트리거(Trigger)를 사용할 수 있습니다. 어떤 쇼핑몰에 하루에 수만 건의 주문이 들어옵니다. 주문데이터는 주문일자, 주문상품, 수량, 가격이 있으며, 수천 명의 임직원이 일자 별, 상품별 총 판매수량과 총 판매가격으로 구성된 주문 실적을 실시간으로 온라인상에 조회를 했을 때, 한 사람의 임직원이 조회할 때마다 수만 건의 데이터를 읽고 계산해야 합니다. 만약 임직원이 수만 명 이고, 데이터가 수백만 건이라면, 또 거의 동시다발적으로 실시간 조회가 요청된다면 시스템 퍼포먼스가 떨어질 것입니다.

 

따라서 트리거(Trigger)를 사용하여 주문한 건이 입력될 때마다, 일자 별 상품별로 판매수량과 판매금액을 집계하여 집계자료를 보관하도록 만들어줍니다.

 

 

패키지

 

어떠한 특정 목적을 가진 함수의 집합 등을 모아서 패키지로 묶는 다는 개념입니다.패키지는 다른 개발 언어와 유사하게 정의 또는 선언부(Package)와 구현부(Package Body)를 분리하여 관리합니다.

 

 

참고: 저장프로시저나 트리커 및 패키지를 만드는 SQL 문법은 데이터베이스 별로 다를 수 있습니다. 저희는 교육에서 인터베이스를 사용하면 저장프로시저가 작성되어 있는 데이터베이스를 사용할 것입니다. 하지만 개인 프로젝트 진행 시에는 본인 프로젝트에 맞춰서 저장프로시저와 트리거등을 작성하여 사용한다면 배우신 부분을 복습할 뿐만 아니라 훨씬 더 실제 프로젝트에 맞춰 진행하시는 것입니다.

 

다운 로드 : 9장 저장프로시저와트리거.pdf

 


프로그래밍을 제대로 공부해보고 싶다면, 다음 순서로 진행하시는 것을 권장합니다.

 

  1. 프로그래밍 애피타이저 시리즈
  2. [동영상] 데브기어 델파이 기초 시리즈
  3. [오프라인 강의] 델파이/C++빌더 기초 강화
  4. [오프라인 강의] 델파이/C++빌더 윈도우 프로그래밍

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 7530
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 7280
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 9688
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 14764
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 16477
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 12247
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 31608
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 167202
1220 [10.4 시드니 신기능] 겟잇 패키지 매니저(GetIt Package Manager) 개선 험프리 2020.05.21 468
1219 [10.4 시드니 신기능] 컨트롤 개별 VCL 스타일 적용(Per-Control Style) 적용 험프리 2020.05.19 768
1218 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 2097
1217 [10.4] 커스텀 매니지드 레코드(Custom Managed Records) 험프리 2020.05.14 905
1216 [고객 사례- 솔루션, 델파이] Beyond Compare - 데이터, 시스템 비교/병합/관리 프로그램 관리자 2020.05.14 599
1215 델파이, 25년의 혁신 - 버전 1부터 10.3까지 버전별 핵심 기능 [2] 관리자 2020.05.12 1530
1214 [고객 사례- 솔루션, 델파이] AlignMix - 시각화된 세일즈 관리 도구 관리자 2020.05.12 264
1213 [10.4 시드니 신기능] 다시 태어난 '코드 인사이트' [2] file 험프리 2020.05.08 1341
1212 [발표자료] 20200429 델파이 Push 메시지 전송 시스템 구현 방법 with 구글 Firebase [3] file 관리자 2020.05.04 733
1211 헬스케어 분야에서의 델파이 - 코로나에 맞서며 file 김원경 2020.04.29 497
1210 [고객 사례- 의료, 델파이] COVID-19 격리 대상자 상태 관리 앱 관리자 2020.04.28 543
1209 이 달의 기술자료 - 2020년 05월 file 험프리 2020.04.24 288
1208 [사례 소개] 데브기어 마이그레이션 유상 컨설팅 사례 험프리 2020.04.22 382
1207 인터베이스와 FireDac에서 배열필드 사용하기 file 김원경 2020.04.16 320
1206 인터베이스, FireDAC 및 TEMSDataSetResource를 사용하여 RAD 서버에서 자동 증가 필드를 생성하는 방법 file 김원경 2020.04.16 323
1205 델파이용 벡터 컨테이너 file 김원경 2020.04.14 573
1204 [프로그래밍 애피타이저] 개발이 처음이거나 비 전공자 분들을 위한 가장 첫 번째 STEP! 관리자 2020.04.13 1949
1203 인터베이스(InterBase) 2020 버전을 사용해야 하는 5 가지 이유 file 김원경 2020.04.09 5876
1202 [프로그래밍 애피타이저] 10장 트랜잭션의 정의 file 김원경 2020.04.09 357
» [프로그래밍 애피타이저] 9장 저장프로시저와 트리거 file 김원경 2020.04.09 413