문제 Spring Batch에서 Partitoner를 통해 Step들을 병렬 처리하려고 했었다. 그런데 처음에는 정상적으로 수행이 되다가 어느 시점에 아래와 같은 에러가 발생했다. 병렬 처리를 위한 TaskExecutorPool의 Size는 50으로 설정했었고, DB Connection Pool의 Size는 10으로 설정했었다. 일반적인 상황이라면, 충분히 수행되어야 하는 상황인데도 위와 같은 에러가 발생하게 되었다. 원인 하나의 스레드에서 2개의 DB Connection을 획득하려고 하다 보니 Connection이 부족하게 되었고, 이로 인해 Timout이 발생한 상황이었다. Spring Batch에서 Chunk 지향 처리는 Reader, Processor, Writer라는 3가지 구성 요소를 기반으로..
기존에 운영되고 있던 Api 서버에서 동시성 이슈가 발생이 되었다. 포인트에서 마일리지로 전환하는 과정에서 적립과 차감내역이 정상적으로 반영되지 않던 문제였는데, 해결한 과정을 정리하려고 한다. 문제 포인트에서 마일리지로 전환할 때, 포인트는 차감되고 마일리지는 적립이 된다. 이때, 포인트가 1,000원이 있고 마일리지가 0원인 상태에서 포인트 -> 마일리지 전환에 대한 3번의 요청이 동시에 들어오면, 아래와 같은 결과가 발생하게 되었다. 포인트 차감 포인트 차감의 경우, 950원 -> 900원 -> 850원으로 반영되어야 하는데 3개의 내역이 모두 950원의 내역으로 반영되어 있다. 마일리지 적립 마일리지 적립의 경우, 50원 -> 100원 -> 150원으로 반영되어야 하는데 3개의 내역이 모두 50원..
부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에서 정의하는 것이다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있다. 상속과 오버 라이딩을 통한 다형성으로 문제를 해결하는 것 Spring Batch의 AbstractJob 추상 클래스 Spring Batch에 Job 인터페이스를 구현한 AbstractJob 추상 클래스와 그 하위 구현체들은 템플릿 메서드 패턴을 기반으로 구현되어 있다. 위의 구조를 설명하자면, AbstractJob 추상 클래스에는 doExecute() 추상 메서드가 있고, execute() 메서드에서 doExecute() 메서드를 실행한다. 그리고 doExecute() 추상 메서드는 하위 구현체인 Si..