전체 글

TIL(Today I Learned)

[Today I Learned - 13] JpaPagingItemReader Limit, Offset not working - (1)

1. 무슨 문제가 있었는지? 스프링 배치를 이용하여 Chunk 기반으로 개발하고 있었는데 ItemReader를 구현하는 부분에서 Limit, Offset이 적용되지 않아 전체 테이블을 조회하는 문제가 발생했는데 ItemReader는 JpaPagingItemReader를 이용했고 아래와 같이 PageSize를 설정하여 사용하고 있다. 실제 서비스에서 사용하는 코드를 올릴 수 없어서 임의의 엔티티 클래스(TestEntity)와 파라미터(param1, param2)를 설정했다. 스프링 배치를 주로 사용하신 분이라면 JPQL 만 보고 문제의 원인을 바로 알아보는 분들이 계실수도 있지만 나는 배치를 처음 사용하는 것이기 때문에 2~3일 정도를 오류 분석에 시간을 투자했다.. ㅠㅠ 우선 삽질한 내용이 길기 때문에 ..

TIL(Today I Learned)

[Today I Learned - 12] Spring Batch의 Tasklet Transaction

1. 어떤 문제가 있었나? 스프링 배치를 이용하여 배치성 프로그램을 개발하고 있는데 tasklet에서 작업 시간이 오래되면서 connection timeout이 발생했다. timeout은 60초 정도 잡아두었는데 개발 환경에서 적은 데이터로도 timeout이 발생해서 트랜잭션 단위를 더 짧게 가져가기 위해 Spring Batch 에서 트랜잭션 관리를 어떻게 하는지 공부가 필요했다. 2. 문제의 원인 먼저 Spring Batch는 Tasklet 기반과 Chunk 기반으로 구분된다. Chunk 기반의 경우 대용량의 데이터를 Chunk 단위로 구분하고 Chunk 단위로 트랜잭션을 관리한다. 하지만 Tasklet은 Step 단위(?)로 트랜잭션을 관리하는데 Tasklet 을 수행하는데 오랜 시간이 걸리면서 ti..

TIL(Today I Learned)

[Today I Learned - 11] JpaTransactionManager의 Timeout

1. 어떤 문제가 있었나? 스프링 배치를 통해 작업을 수행하는데 이 때 Exclusive Lock을 사용하고 있다. 근데 이 배치와 DBA 님이 만드신 배치와 Deadlock 이 발생하는 문제가 발생했다. DBA님의 배치 시간이 10초 안쪽이여서 내가 만든 배치를 20초 동안 waiting 후 진행하면 문제가 해결될 것이라 생각하여 @Transactional 어노테이션에 timeout을 20초로 설정하였으나 Deadlock이 또 발생해서 문제의 원인을 찾아보려고 한다. @Transactional(timeout = 20) 2. 어떤 시도를 했나? 우선 디버깅 모드로 데드락이 발생하는 메소드에서 어떤 트랜잭션 정보를 사용하는지 확인해보았다. 그런데 분명 어노테이션에 timeout을 20초로 설정했는데 -1로..

TIL(Today I Learned)

[Today I Learned - 10] 400 Bad Request With Spring

1. 어떤 문제가 있었나 현재 근무중인 회사에서 API 를 운영하고 있는데 고객과 연동 테스트를 진행하던 도중 발생한 문제에 대해 알아보려고 한다. 문제 상황은 운영중인 API 에서 GET 메소드를 지원하고 필요한 데이터를 BODY에 담아서 요청하도록 설계되어 있는데 업체에서 GET 요청을 보내도 오류가 발생한다고 문의가 왔다. (GET 메소드에 BODY를 담는다는 것에 대해서는 오해의 소지(?)가 있을 수 있다고 생각하는데 이 부분에 대한 나의 생각은 기회가 된다면 다른 포스팅으로 정리할 생각이다) 우선 고객이 정확한 에러 로그를 첨부하지 않은 상태였기 때문에 시스템 로그부터 확인하려고 했는데 특이한 로그가 있어서 이 부분에 대해 확인해보려고 한다. (로그는 Filter 와 Interceptor 에서 ..

lazy man
Lazy Man's Blog