자바-백엔드

[JPA] JPA환경에서 프로시저를 호출하려면? (StoredProcedureQuery)

게로망 2026. 3. 24. 15:28

1. StoredProcedureQuery란?

JPA가 제공하는 기본 API인 EntityManager의 하위 인터페이스 중 StoredProcedureQuery 라는게 있다.

 

*EntityManager란? 네이티브쿼리나 프로시저 호출, JPQL을 사용할때 필요한 JPA 기본 제공 API이다.

JPA (표준)
 └─ EntityManager
     └─ StoredProcedureQuery (인터페이스)
         └─ Hibernate가 실제 구현

 

JPA에서 프로시저를 호출하기 위해 사용한다.

특정 상황에서 프로시저 호출해서 결과만 받아서 사용할 필요가 있는 상황에 자주 사용한다.

 

단점은

register → set → execute → get

이런식으로 단계를 걸쳐서 프로시저를 호출하기 때문에 코드 가독성이 좀 떨어질 수 있다.

 

자바가 아니라 DB 로직을 실행하는것이기 때문에 디버깅이 어렵다.(SQL 로그 추적 어려움)

그래서

 

- ERP 인터페이스

- 외부 시스템 연동

- 레거시 시스템 유지

 

이러한 특수한 경우에만 실무적으로 사용한다.

 

 

 

<기본문법>

StoredProcedureQuery query =
    entityManager.createStoredProcedureQuery("프로시저명");

StoredProcedureQuery 객체를 생성한다

query.registerStoredProcedureParameter("P_PARAM", String.class, ParameterMode.IN);
query.registerStoredProcedureParameter("O_RESULT", Integer.class, ParameterMode.OUT);
query.registerStoredProcedureParameter("O_CURSOR", void.class, ParameterMode.REF_CURSOR);

파라미터를 등록한 뒤 

 

query.setParameter("P_PARAM", "값");

IN 파라미터는 따로 값을 넣는다

 

query.execute();

그리고 실행

 

Integer errNum = (Integer) query.getOutputParameterValue("O_ERRNUM");
String errMsg = (String) query.getOutputParameterValue("O_ERRMSG");

List<Object[]> resultList = query.getResultList();

결과조회는 이렇게 한다.