1. 개요

저장 프로 시저는 데이터베이스 에 저장된 미리 정의된 SQL 문 그룹입니다. Java에는 저장 프로시저에 액세스하는 여러 가지 방법이 있습니다. 이 사용방법(예제)에서는 Spring Data JPA Repositories에서 저장 프로시저를 호출하는 방법을 배웁니다.

2. 프로젝트 설정

Spring Boot Starter Data JPA 모듈을 데이터 액세스 계층으로 사용 합니다 . 또한 백엔드 데이터베이스로 MySQL을 사용할 것입니다. 따라서 프로젝트 pom.xml  파일 에 Spring Data JPA , Spring Data JDBCMySQL 커넥터 의존성이 필요합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

MySQL 의존성 정의가 있으면 application.properties  파일에서 데이터베이스 연결을 구성할 수 있습니다.

spring.datasource.url=jdbc:mysql://localhost:3306/baeldung
spring.datasource.username=baeldung
spring.datasource.password=baeldung

3. 엔티티 클래스

Spring Data JPA에서 엔터티 는 데이터베이스에 저장된 테이블을 나타냅니다. 따라서 자동차 데이터베이스 테이블을 매핑하는 엔터티 클래스를 구성할 수 있습니다.

@Entity
public class Car {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private long id;

    @Column
    private String model;

    @Column
    private Integer year;

   // standard getters and setters
}

4. 저장 프로시저 생성

저장 프로 시저는 입력에 따라 다른 결과를 얻을 수 있도록 매개변수를 가질 수 있습니다. 예를 들어 정수 유형의 입력 매개변수를 사용하고 자동차 List을 반환하는 저장 프로시저를 만들 수 있습니다.

CREATE PROCEDURE FIND_CARS_AFTER_YEAR(IN year_in INT)
BEGIN 
    SELECT * FROM car WHERE year >= year_in ORDER BY year;
END

저장 프로 시저는 출력 매개변수를 사용하여 데이터 를 호출 응용 프로그램에 반환할 수도 있습니다. 예를 들어 문자열 유형의 입력 매개변수를 사용하고 쿼리 결과를 출력 매개변수에 저장하는 저장 프로시저를 만들 수 있습니다.

CREATE PROCEDURE GET_TOTAL_CARS_BY_MODEL(IN model_in VARCHAR(50), OUT count_out INT)
BEGIN
    SELECT COUNT(*) into count_out from car WHERE model = model_in;
END

5. 리포지토리의 참조 저장 프로시저

Spring Data JPA에서 리포지토리는 데이터베이스 작업을 제공하는 곳입니다. Car 엔티티 에서 데이터베이스 작업을 위한 리포지토리를 구성하고 이 리포지토리의 저장 프로시저를 참조할 수 있습니다.

@Repository
public interface CarRepository extends JpaRepository<Car, Integer> {
    // ...
}

다음으로 저장 프로시저를 호출하는 저장소에 몇 가지 메서드를 추가해 보겠습니다.

5.1. 저장 프로시저 이름을 직접 매핑

@Procedure 어노테이션 을 사용하여 저장 프로시저 메서드를 정의하고 저장 프로 시저 이름을 직접 매핑할 수 있습니다.

이에 상응하는 네 가지 방법이 있습니다. 예를 들어 저장 프로시저 이름을 메서드 이름으로 직접 사용할 수 있습니다.

@Procedure
int GET_TOTAL_CARS_BY_MODEL(String model);

다른 메서드 이름을 정의하려면 저장 프로시저 이름을 @Procedure 어노테이션의 요소로 넣을 수 있습니다.

@Procedure("GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModel(String model);

프로 시저 이름 특성을 사용하여 저장 프로시저 이름을 매핑 할 수도 있습니다 .

@Procedure(procedureName = "GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModelProcedureName(String model);

마지막으로 value 특성을 사용하여 저장 프로시저 이름을 매핑할 수 있습니다.

@Procedure(value = "GET_TOTAL_CARS_BY_MODEL")
int getTotalCarsByModelValue(String model);

5.2. 엔터티에 정의된 저장 프로시저 참조

@NamedStoredProcedureQuery 어노테이션을 사용하여 엔터티 클래스에서 저장 프로시저를 정의 할 수도 있습니다 .

@Entity
@NamedStoredProcedureQuery(name = "Car.getTotalCardsbyModelEntity", 
  procedureName = "GET_TOTAL_CARS_BY_MODEL", parameters = {
    @StoredProcedureParameter(mode = ParameterMode.IN, name = "model_in", type = String.class),
    @StoredProcedureParameter(mode = ParameterMode.OUT, name = "count_out", type = Integer.class)})
public class Car {
    // class definition
}

그런 다음 리포지토리에서 이 정의를 참조할 수 있습니다.

@Procedure(name = "Car.getTotalCardsbyModelEntity")
int getTotalCarsByModelEntiy(@Param("model_in") String model);

이름 특성을 사용 하여 엔터티 클래스에 정의된 저장 프로시저를 참조합니다. 리포지토리 방법의 경우 @Param  을 사용 하여 저장 프로시저의 입력 매개 변수를 일치시킵니다. 또한 저장 프로시저의 출력 매개변수를 리포지토리 메서드의 반환 값과 일치시킵니다.

5.3. @Query 어노테이션 으로 저장 프로시저 참조

또한 @Query 어노테이션 을 사용하여 저장 프로시저를 직접 호출할 수도 있습니다 .

@Query(value = "CALL FIND_CARS_AFTER_YEAR(:year_in);", nativeQuery = true)
List<Car> findCarsAfterYear(@Param("year_in") Integer year_in);

이 방법에서는 네이티브 쿼리를 사용하여 저장 프로시저를 호출합니다. 어노테이션 의 속성에 쿼리를 저장합니다 .

마찬가지로 @Param  을 사용하여 저장 프로시저의 입력 매개변수를 일치시킵니다. 또한 저장 프로시저 출력을 엔터티 Car 개체 List에 매핑합니다 .

6. 요약

이 기사에서는 JPA 리포지토리를 통해 저장 프로시저에 액세스하는 방법을 살펴보았습니다. 또한 JPA 리포지토리에서 저장 프로시저를 참조하는 두 가지 간단한 방법에 대해서도 논의했습니다.

항상 그렇듯이 기사의 소스 코드는 GitHub 에서 사용할 수 있습니다 .

Persistence footer banner