DB의 저장 프로시저 (SP - Stored Procedure)란

- 저장 프로시저는 각 DBMS에서 제공하는 기능으로, 
SQL문을 저장해놓고, 필요할 때마다 호출해서 사용하는 프로그래밍 기능이다.

사용하는 이유

  1. SQL의성능을 향상시킬수 있다.

    • SP를 실행하게 되면 최적화, 컴파일 단계를 거쳐, 결과가 캐시에 저장되게 되는데, 이 후 해당 SP를 실행하게 되면 캐시에 있는것을 가져와 사용하므로 실행속도가 빠르다.
  2. 유지보수 및 재활용 측면에서 유리하다.

    • 응용프로그램 내에서 직접 SQL문을 호출하지않고 SP이름을 호출하도록 설정하면 SP파일만 수정하면 되기때문에 유지보수와 재활용 측면에서 유리하다
  3. 보안이 강화될 수 있다.

    • 사용자별로 테이블 권한을 부여하는것이 아닌, SP에만 접근 권한을 주는 방식으로 보안을 강화할 수 있다. 실제 테이블에 접근하여 조작하는것이 위험하기 때문에 개발자에게는 SP권한만 주는 방식을 많이 사용한다.

또한, 일반적인 쿼리들은 Where의 조건이 조금만 달라져도, 최적화 컴파일을 다시 수행하여야 하지만, 함수 형태의 SP로 생성하게 되면 매개변수만 변경하여 성능적인 측면을 크게 높일 수 있다.


Spring에서의 저장 프로시저 동작원리

1. DB에서 SP를 생성한다( 미리 작성되어있는 쿼리 모음 )
2. SP의 리턴값을 저장하는 Entity클래스(@NamedStoredProcedureQuery어노테이션)으로 연결함.
3. Repository에서 프로시저 객체를 생성한다. 이때, 2.에서 생성한 프로시저JPA의 파라미터를 설정한 후 execute한다.

궁금한점 : 저장 프로시저를 사용할경우 Entity는 테이블명으로 class와 연결하지 않아도 괜찮은것인가?

  • @NamedStoredProcedureQuery어노테이션을 Entity에 적용하면 DBMS에 정의 되어있는 SP(저장 프로시저) 와 연동하여 사용할 수 있다.

프로시저란?

  • 간단히 설명하면 "여러 쿼리를 한번에 실행하는 것" 이다.
  • SQL의 Function과 비슷해 보이지만 차이가 있다. function : 클라이언트에서 처리, 리턴값 필수, 리턴값은 한개만 반환 가능 프로시저 : 서버로 보내서 처리, 리턴값 선택, 리컨값 여러개 가능

속도면에서는 함수에 비해 프로시저가 더 빠르다. 그렇기 때문에 프로시저같은 경우는 실행,처리를 할때 주로 사용하고, 함수는 간단한 계산이나 수치 결과를 나타낼 때 사용한다.

프로시저를 사용하는 이유

  1. 하나의 요청으로 여러 SQL문을 실행 할 수 있음
  2. 네트워크 소요 시간을 줄일 수 있음(여러개의 쿼리를 처리하는 시점에서 네트워크 부하를 줄임)
  3. 보수성이 뛰어나다
  4. 개발 업무를 구분하여 개발할 수 있다.(DB관련 처리를 API처럼 만들어 사용가능)

프로시저의 단점

  1. 재사용성이 낮다(DB버전 별 구문/규칙과 호환성이 다르기 때문)
  2. 처리 성능이 좋지 않다(MySQL스토어드 프로그램 처리 성능이 낮다)

Pasted image 20240610171904.png

  • 파라미터 선언은 프로시저명() 안에서 선언하고, SQL문과 변수는 BEGIN - END 안에서 작성한다.
  • SELECT사용시 반드시, 조회한 컬럼의 값을 INTO로 변수 안에 넣어주어야 한다.
  • 프로시저안에서 사용하는 SQL문은 세미콜론(;)으로 문장 끝을 맺어주어야 한다.
  • if, case, loop 문을 사용할 수 있다.
  • 프로시저내에서 다른 프로시저를 호출 할 수 있다.