SpringData JPA Repositories에서 저장 프로 시저 호출

1. 개요

저장 프로시 저는 데이터베이스에 저장된 미리 정의 된 SQL 문 그룹입니다. Java에서는 저장 프로 시저에 액세스하는 여러 가지 방법이 있습니다. 이 튜토리얼에서는 SpringData JPA Repositories에서 저장 프로 시저를 호출하는 방법을 보여줍니다.

2. 프로젝트 설정

이 튜토리얼에서는 Spring Boot Starter Data JPA 모듈을 데이터 액세스 계층으로 사용 합니다. 또한 백엔드 데이터베이스로 MySQL을 사용할 것입니다. 따라서 프로젝트 pom.xml 파일에 SpringData JPA, SpringData JDBC 및 MySQL Connector 종속성이 필요 합니다.

 org.springframework.boot spring-boot-starter-data-jpa   org.springframework.boot spring-boot-starter-data-jdbc   mysql mysql-connector-java  

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

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

3. 엔티티 클래스

SpringData 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. 저장 프로 시저 생성

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

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. 저장소의 참조 저장 프로 시저

SpringData JPA에서 저장소는 데이터베이스 작업을 제공하는 곳입니다. 따라서 Car 엔티티 에 대한 데이터베이스 작업을위한 저장소를 구성 하고이 저장소의 저장 프로 시저를 참조 할 수 있습니다 .

@Repository public interface CarRepository extends JpaRepository { // ... } 

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

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

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

이를 수행하는 4 가지 동등한 방법이 있습니다. 예를 들어 저장 프로 시저 이름을 메서드 이름으로 직접 사용할 수 있습니다.

@Procedure int GET_TOTAL_CARS_BY_MODEL(String model); 

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

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

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

@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 findCarsAfterYear(@Param("year_in") Integer year_in);

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

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

6. 요약

이 튜토리얼에서는 JPA 저장소를 통해 저장 프로 시저에 액세스하는 방법을 보여주었습니다. 또한 JPA 저장소에서 저장 프로 시저를 참조하는 두 가지 간단한 방법에 대해 설명했습니다.

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