티스토리 뷰

SMALL

spring batch 에서 JdbcPagingItemReader 를 이용해서 데이터를 조회하는 코드를 작성했다. 이후 배치 잡을 실행했는데 아래와 같은 에러 메세지와 함께 잡이 실패했다.

Column 'column4' not found.; nested exception is java.sql.SQLException: Column 'column4' not found.

column4 는 임의로 이름을 바꾼거고, 실제로 존재하는 컬럼명을 넣었었다. 혹시 컬럼명에 오타가 있는건가 해서 오타도 확인해보고, 실제로 쿼리를 직접 SQL 에서 실행할때는 잘 돌아가는 것까지 확인했다.

 

JdbcPagingItemReader 를 만드는 코드도 일반적인 관례를 따랐으며, QueryProvider 를 이용했다.

SqlPagingQueryProviderFactoryBean queryProvider = SqlPagingQueryProviderFactoryBean()
queryProvider.setDataSource(dataSource)
queryProvider.setSelectClause("SELECT column1, column2, column3")
queryProvider.setFromClause("FROM claim_progress")
queryProvider.setWhereClause("WHERE column4 = :condition")
queryProvider.setSortKey("column4")

몇 시간을 살펴보다가 해결법을 찾을 수 있었는데, column4 를 SELECT 절에 넣지 않았기 때문이다. 아래와 같이 column4 까지 넣어주면 문제가 해결된다.

queryProvider.setSelectClause("SELECT column1, column2, column3, column4")

위처럼 하면 문제는 해결되지만 원인이 궁금하다. 일단 에러가 나는 원인은 JdbcPagingItemReader 내 아래 코드 때문이다.

for 문 안을 보면 sortKey 를 이용해서 rs(ResultSet) 에서 값을 꺼내는걸 볼 수 있다. 하지만 sortKey 를 SELECT 컬럼에 넣어놓지 않았다면 가져올 값이 없을 것이고, 그 때문에 에러가 발생하는 것이다. 그럼 저 startAfterValues 는 뭐하는 것인가를 따라가보려 했는데 이미 너무 오랜 시간 삽집을 해서 나중에...

 

batch meta table 에 뭔가 데이터를 넣는 용도로 쓰고있는 것까지만 확인했다.

LIST
댓글
댓글쓰기 폼