본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] 스토어드 프로시저

by 김코더 김주역 2022. 8. 14.
반응형

- 스토어드 프로시저는 JPA 2.1부터 지원되며, 아래와 같이 DB에 저장되어 있는 프로시저를 JPA에서 사용할 수 있다.

# inParam 값에 3을 곱해서 반환하는 프로시저
CREATE OR REPLACE RPOCEDURE proc_multiply(IN inParam INT, OUT outParam INT)
BEGIN
    SET outParam = inParam * 3;
END

 

- JPA에서 제공하는 ParameterMode는 다음과 같다.

  • ParameterMode.IN : INPUT 파라미터
  • ParameterMode.OUT : OUTPUT 파라미터
  • ParameterMode.INOUT : INPUT, OUTPUT 파라미터
  • ParameterMode.REF_CURSOR : CURSOR 파라미터

 

 

1. 스토어드 프로시저 사용

- EntityManager의 createStoredProcedureQuery() 메소드를 사용한다.

- 파라미터를 순서 기반이나 이름 기반으로 선택하여 사용할 수 있다.

StoredProcedureQuery spq = em.createStoredProcedureQuery("proc_multiply"); // 프로시저의 이름 입력

spq.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN); // 순서 기반
// spq.registerStoredProcedureParameter("inParam", Integer.class, ParameterMode.IN); // 이름 기반
spq.registerStoredProcedureParameter(2, Integer.class, ParameterMode.OUT); // 순서 기반
// spq.registerStoredProcedureParameter("outParam", Integer.class, ParameterMode.OUT); // 이름 기반

spq.setParameter(1, 100); // 순서 기반
// spq.setParameter("inParam", 100) // 이름 기반

sql.execute();

Integer output = (Integer) spq.getOutputParameterValue(2); // 순서 기반
// Integer output = (Integer) spq.getOutputParameterValue("outParam"); // 이름 기반

 

 

2. Named 스토어드 프로시저 사용

1) 어노테이션에 정의하기

- 스토어드 프로시저 쿼리에 이름을 부여해서 사용할 수 있다.

- 적당한 엔티티 클래스에 @NamedStoredProcedureQuery를 정의해서 사용하면 된다.

- parameters 속성에 파라미터 정보를 모두 정의해주면 된다.

@NamedStoredProcedureQuery (
    name = "multiply"
    procedureName = "proc_multiply",
    parameters = {
        @StoredProcedureParameter(name="inParam", mode=ParameterMode.IN, type=Integer.class),
        @StoredProcedureParameter(name="outParam", mode=ParameterMode.OUT, type=Integer.class)
    }
)
@Entity
public class Member {...}

 

 

2) XML에 정의하기

- 방금 살펴본 어노테이션 방식 예제와 적용 내용은 동일하다.

- 직관적으로 알 수 있으므로 설명은 생략한다.

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="htt://xmlns.jcp.org/xml/ns/persistence/orm" version="2.1">
    <named-stored-procedure-query name="multiply" procedure-name="proc_multiply">
        <parameter name="inParam" mode="IN" class="java.lang.Integer" />
        <parameter name="outParam" mode="OUT" class="java.lang.Integer" />
    </named-stored-procedure-query>
</entity-mappings>

 

 

3) Named 스토어드 프로시저 사용

- Named 스토어드 프로시저를 사용할 때는 createNamedStoredProcedureQuery() 메소드의 파라미터에 Named 스토어드 프로시저의 이름만 명시해주면 StoredProcedureQuery 객체를 생성할 수 있다.

StoredProcedureQuery spq = em.createNamedStoredProcedureQuery("multiply");
// ...

 

 

● 참고자료 : 자바 ORM 표준 JPA 프로그래밍

반응형

'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글

[JPA] Spring Data JPA(1)  (0) 2022.08.19
[JPA] JPQL 최적화  (0) 2022.08.14
[JPA] 네이티브 SQL  (0) 2022.08.11
[JPA] QueryDSL  (0) 2022.08.10
[JPA] JPQL의 작성  (0) 2022.08.04

댓글