티스토리 뷰

728x90

검색해도 안 나오길래 직접 작성..

어떤 SI의 전사가 또한 이 오류를 맞이할 것 같아서.. 엄청난 해결책은 아니지만 그래도 공유차원에서 적는다.

개발환경

  • spring boot 2.7.10
  • spring boot starter batch
  • tibero6-jdbc.jar
  • 티베로 버전은 6버전

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
    implementation fileTree(dir: 'src/main/resources/libs', includes: ['*.jar'])

    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    annotationProcessor 'org.projectlombok:lombok'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.batch:spring-batch-test'
    testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.2.2'

    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
}

 

첫 번째 맞이한 오류는 이전 글에 적어놨다.

2023.05.22 - [Spring Framework] - 스프링 배치 DatabaseType not found for product name: [Tibero]

 

스프링 배치 DatabaseType not found for product name: [Tibero]

티베로를 사용하면 스프링 배치를 사용하려해도 영 시원치 않다. 스프링 배치가 지원하는 표준 데이터 베이스가 아니기 때문에 아래 오류가 나타나느데.. 비표준 데이터베이스를 등록하는 방법

amagrammer91.tistory.com

그렇게 stackoverflow에서 알려준 방법대로 TiberoBatchConfigure 만들어서 실행을 해보니.. 되는데..

아래와 같은 두 번째 오류를 마주하게 된다. 전체 내용을 다 긁으면 너무 길기 때문에 일정 부분만 잘랐다.

java.lang.AbstractMethodError: Receiver class com.tmax.tibero.jdbc.driver.TbPreparedStatement does not define or inherit an implementation of the resolved method 'abstract void closeOnCompletion()' of interface java.sql.Statement.
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.closeOnCompletion(HikariProxyPreparedStatement.java)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:78)
	at com.sun.proxy.$Proxy70.closeOnCompletion(Unknown Source)
	at org.apache.ibatis.executor.SimpleExecutor.doQueryCursor(SimpleExecutor.java:75)
	at org.apache.ibatis.executor.BaseExecutor.queryCursor(BaseExecutor.java:178)
	at org.apache.ibatis.executor.CachingExecutor.queryCursor(CachingExecutor.java:82)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectCursor(DefaultSqlSession.java:123)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectCursor(DefaultSqlSession.java:116)
	at org.mybatis.spring.batch.MyBatisCursorItemReader.doOpen(MyBatisCursorItemReader.java:69)
	at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:150)
	at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:104)
	at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:311)
	at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:205)
	at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152)
	at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:413)
	at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:136)
	at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:320)
	at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149)
	at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
	at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:140)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:128)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
	at com.sun.proxy.$Proxy54.run(Unknown Source)

 

구글링을 바로 해보니 구현되지 않은 추상메서드를 호출할 때 생길 수 있는 오류라는데.. 아니 티베로 Tibero jdbc가 구현체를 구현을 안 해놓은 건가... 그럼 어떻게 하지 하다가 어쭙잖게 읽어 내려간 에러 스택에서 MybatisCursorItemReader에 관한 에러를 발견하고 Spring Batch의 Cursor와 Paging을 검색하다가 Cursor로 되어있는걸 Paging으로 바꾸고 실행하는 지경에 이르렀다.

 

되려나 싶었는데 이때 세 번째 오류를 맞이하게 된다. 검색해서 타고 들어올 수 있게 어느 정도 오류 스택 트레이스를 넣어놓겠다.

java.lang.AbstractMethodError: Receiver class com.tmax.tibero.jdbc.driver.TbRSFwOnly does not define or inherit an implementation of the resolved method 'abstract java.lang.Object getObject(java.lang.String, java.lang.Class)' of interface java.sql.ResultSet.
	at com.zaxxer.hikari.pool.HikariProxyResultSet.getObject(HikariProxyResultSet.java)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.ibatis.logging.jdbc.ResultSetLogger.invoke(ResultSetLogger.java:69)
	at com.sun.proxy.$Proxy71.getObject(Unknown Source)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:85)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getPropertyMappingValue(DefaultResultSetHandler.java:512)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyPropertyMappings(DefaultResultSetHandler.java:481)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:405)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:355)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:329)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:302)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:195)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at org.apache.ibatis.executor.BatchExecutor.doQuery(BatchExecutor.java:92)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)
	at com.sun.proxy.$Proxy58.selectList(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
	at org.mybatis.spring.batch.MyBatisPagingItemReader.doReadPage(MyBatisPagingItemReader.java:113)
	at org.springframework.batch.item.database.AbstractPagingItemReader.doRead(AbstractPagingItemReader.java:110)
	at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:93)
	at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:99)
	at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:180)
	at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:126)
	at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)
	at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
	at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)
	at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:118)
	at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:71)
	at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:407)
	at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:331)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
	at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:273)
	at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:82)
	at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)
	at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
	at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)
	at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:258)
	at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:208)
	at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152)
	at org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:413)
	at org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:136)
	at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:320)
	at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149)
	at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
	at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:140)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:128)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
	at com.sun.proxy.$Proxy54.run(Unknown Source)

비슷한 구현되지 않은 추상메서드 호출 오류였다.

아 이건 구글링을 해도 안 나오는 문제여서 너무나도 당황했다. 삽질을 계속하던 도중에 티맥스 사이트에 들어가서 고객문의까지 해봐야겠다는 생각이 들었을 즈음 나와 같은 오류를 맞이한 사람이 없나 검색을 하게 되는데.. 있었다.

 

질문. Mybatis Cursor 사용 시 closeOnCompletion 오류(tibero6) 확인 부탁드립니다.

아마 로그인하고 봐야 하는 것 같다.

https://technet.tmaxsoft.com/ko/front/support/qna/viewQna.do?cmProductCode=&find_key=content&find_value=mybatis&paging.page=1&board_seq=CUST-20230208-000007 

 

Message

 

technet.tmaxsoft.com

티베로 엔지니어의 답변이 아래와 같다.

안녕하세요.

확인해보니 해당 메서드를 사용하기 위해서는 티베로 패치가 필요해보입니다.

사용하고자 하시는 매서드가 적용되어 있는 JDBC Driver를 먼저 전달해드립니다.

해당 Driver로 테스트 부탁드립니다.

다만 서버쪽 패치도 필요할 수도 있으니 향후 관리를 위해 

담당 영업매니져나 콜센터에 연락해 티베로 엔진 패치를 진행하시길 권고드립니다.

콜센터 : 1544-8629

그러고 나서 답변 밑에 tibero6-jdbc-18.jar 파일을 첨부해서 줬는데 그걸 넣어서 실행해 보니까... 된다!!  Paging을 Cursor로 바꿔도 확실히 실행이 된다..

해당 jar 파일을 여기에도 첨부해 놓겠다.. 다만 아쉬운 건 이런 해결 방법을 엔지니어가 첨부해 준 jar 파일로 해결을 하긴 했으나 어디에서도 매뉴얼을 찾을 수 없었다는 것이다. 그리고 뭔가 기술적으로 해결을 하고 싶었는데 못했다는 정도? 

 

혹시나 해서 티베로 엔지니어가 첨부해 준 jar 파일이 티베로 다운로드 센터에서 받은 티베로 6 에도 혹시 있으려나 싶어서 다운로드하여서 살펴봤는데 찾지는 못했다.. 

 

경로는 tibero6 > client > lib > jar에서 봤는데 tibero6-jdbc-18.jar는 없었다.

 

이 글이 도움이 될진 모르겠지만 SI 전사들 중에서는 분명히 batch + tibero 조합이나 tibero 관련 오류를 맞이할 수 있기 때문에 시간 낭비 안 하고 잘 해결했으면 좋겠다.

첨부파일

tibero6-jdbc-18.jar
1.70MB

참고

https://oingdaddy.tistory.com/371

 

AbstractMethodError: Receiver class oracle.jdbc.driver.OraclePreparedStatementWrapper does not define or inherit an implementati

배치 기능 개발 중 다음과 같은 오류가 발생하였다. [18:18:17.212][ERROR][org.springframework.batch.core.step.AbstractStep.execute:line237] - Encountered an error executing step workerStep in job samplePartitionerJob java.lang.AbstractMeth

oingdaddy.tistory.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kaman123&logNo=221294593161 

 

java.lang.AbstractMethodError 원인 파악

모 금융사 쪽 일하는 중이다. mybatis로 오라클 프로시저를 호출하는 부분이 있었는데, 테스트 서버에서는 ...

blog.naver.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함