-
[Spring Batch] ItemReader(3) - 저장프로시저(SP, Stored Procedure)Java/Spring Batch 2021. 5. 31. 08:44
저장 프로시저란 무엇일까? 특정 유형의 클라이언트가 향후 수행할 수 있도록 데이터베이스에 저장한 해당 데이터베이스 전용 코드의 집합을 말한다. 모든 데이터베이스가 저장프로시저를 지원하진 않지만 대부분의 상용 등급 관계형 데이터베이스에서 사용이 가능하다.
대다수의 엔터프라이즈 환경에서 관계형 데이터베이스는 데이터가 저장된 테이블이 있는 단순한 공간만이 아니다. 관계형 데이터베이스는 온갖 비즈니스 목적에 맞춰 사용되는 복잡한 저장 프로시저가 포함된 코드의 생태계다. 저장 프로시저는 일반적인 자바 개발자에게는 데이터베이스로 작업을 할때 접하기에 가장 먼 메커니즘이지만, 전 세계의 다양한 데이터베이스에서 찾을 수 있는 잘 정립된 도구다.
스프링 배치가 저장 프로시저에서 데이터를 조회하는 용도로 제공하는 StoredPRocedureItemReader 컴포넌트를 사용하는 구성을 살펴보기 전에 예제에서 사용할 저장 프로시저를 살펴보자. 예제에서는 MySQL 데이터베이스를 사용하므로 저장 프로시저를 생성하는 데에 MySQL 문법을 사용한다. 작성할 프로시저에서는 지금까지 실행한 쿼리와 동일한 역할을 하는 도십별 모든 고객을 조회하는 작업을 할 것이다.
DELIMITER // CREATE PROCEDURE customer_list(IN cityOption CHAR(16))) BEGIN SELECT * FROM CUSTOMER WHERE city = cityOption; END // DELIMITER ;
프로시저를 생성했으니 새 ItemReader의 구성 방법을 살펴보자. StoredProcedureItemReader는 JdbcCursorItemReader를 바탕으로 설계됐으므로 구성 코드도 JdbcCursorItemReader 구성 코드와 비슷하다. 그러나 StoredProcedureItemReader를 구성할 때는 쿼리에 필요한 SQL을 지정하지 않고 호출할 프로시저의 이름을 지정한다. 저장 프로시저가 좀 더 복잡한 파라미터를 처리할 수 있으므로 파라미터 정의를 매핑하는 대에도 좀 더 많은 작업이 필요하다. StoredProcedureItemReader는 프로시저가 받아야 할 파라미터를 정의하는 매커니즘으로, SqlParameter 객체의 배열을 설정하는 기능을 제공한다. 아래의 예제에서는 VARCHAR 타입인 cityOption이라는 파라미터 한 개를 정의한다. StoredProcedureItemReader의 구성이다.
... @Bean @StepScope public StoredProcedureItemReader<Customer> customerItemReader(DataSource dataSource, @Value("#{jobParameters['city']}") String city){ return new StoredProcedureItemReaderBuilder<Customer>() .name("customerItemReader") .dataSource(DataSource) .procedureName("customer_list") .parameters(new SqlParameters[]{ new SqlParameter("cityOption", Types.VARCHAR)}) .preparedStatementSetter( new ArgumentPreparedStatementSetter(new Object[] {city})) .rowMapper(new CusstomerRowMapper()) .build(); }
전체 소스
AcornPublishing/definitive-spring-batch
스프링 배치 완벽 가이드 2/e. Contribute to AcornPublishing/definitive-spring-batch development by creating an account on GitHub.
github.com
스프링 배치 완벽 가이드, 마이클 미넬라
'Java > Spring Batch' 카테고리의 다른 글
[Spring Batch] 에러처리(레코드 건너뛰기, 잘못된 레코드 로그 남기기, 입력이 없을 때의 처리) (0) 2021.08.10 [Spring Batch] ItemReader(4) - 기존서비스 (0) 2021.06.13 [Spring Batch] ItemReader(2) - JPA (0) 2021.05.30 [Spring Batch] ItemReader(1) - JDBC (0) 2021.05.30 [Spring Batch] Step (0) 2021.05.15