1. 개요
저장 프로 시저는 데이터베이스 에 저장된 미리 정의된 SQL 문 그룹입니다. Java에는 저장 프로시저에 액세스하는 여러 가지 방법이 있습니다. 이 사용방법(예제)에서는 Spring Data JPA Repositories에서 저장 프로시저를 호출하는 방법을 배웁니다.
2. 프로젝트 설정
Spring Boot Starter Data JPA 모듈을 데이터 액세스 계층으로 사용 합니다 . 또한 백엔드 데이터베이스로 MySQL을 사용할 것입니다. 따라서 프로젝트 pom.xml 파일 에 Spring Data JPA , Spring Data JDBC 및 MySQL 커넥터 의존성이 필요합니다.
<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 에서 사용할 수 있습니다 .