[기술면접] Spring Batch
배치 애플리케이션
배치는 일괄처리를 한다는 뜻입니다. 만약 매일 전 날의 데이터를 집계해야하는 상황을 가정해보겠습니다. 웹앱만 알고 있다면 Tomcat + Spring MVC 구조를 사용할 수밖에 없습니다. 하지만 서비스가 커질수록 큰 데이터를 읽고, 가공하고, 저장하는 과정은 서버의 CPU와 I/O등의 자원을 다 써버립니다. 결국 그 시간동안 다른 reuest를 처리하지 못하게 됩니다. 게다가 기능의 특성상 매일 한 번만 수행됩니다. 매일 한 번만 호출될 기능을 위해서 API를 별도로 만들어야하는 낭비가 발생됩니다. 게다가 10만개의 row를 읽던 중 5만번째에서 에러가 발생했을 때, 다시 실행할 때는 5만번째부터 다시 실행되면 좋겠습니다. 또, 여러 관리자가 실수로 각각의 배치 요청을 시도할 수도 있습니다. 전날의 데이터에 대한 가공이 여러번 수행되면 붎필요한 연산이 수행될뿐만 아니라 가공된 데이터에 문제가 생깁니다.
정리하자면, 배치 처리를 수행하는 서버는 아래와 같은 비지니스 로직 외적인 기능이 많이 필요합니다.
- 일정 시간마다 수행되어야 하는 기능
- 기능 수행 중 문제가 발생했을 때, 해당 지점부터 다시 시작할 수 있는 기능
- 같은 파라미터로 여러 번 수행 요청이 발생했을 때, 단 한 번만 수향되어야 하는 경우
이러한 기능을 제공하는 것이 Spring Batch이고, 개발자는 비지니스 로직에 집중할 수 있게 됩니다.
사례 1.
앞서 말했던 전날 데이터를 집계해야하는 상황입니다. 마케팅팀의 요청으로 매일 아침에 전날 데이터 집계 상황을 제공해야합니다. 이 경우 매일 새벽에 1번만 배치가 수행되도록 설정합니다. 퇴근했다가 출근하면 데이터 집계가 모두 완료되어 있는 것입니다. 서비스가 중단되거나 요청이 적은 새벽 시간에 동작하기 떄문에 퍼포먼스에도 영향을 주지 않습니다.
사례 2.
사진, 문서 등에서 섬네일을 추출해야하는 상황입니다. 섬네일을 추출하는 과정은 입력되는 데이터에 따라서 크게 네 가지 형태로 다르게 동장합니다.
- 용량이 적은(100MB미만) 이미지
- 사용자가 입력한 이미지는 MQ에 추가됩니다.
- MQ를 보고 있는 AWS Lambda는 데이터를 가져와서 섬네일을 추출합니다.
- 용량이 큰(100MB이상) 이미지
- 사용자가 입력한 이미지는 MQ에 추가됩니다.
- MQ를 보고 있는 AWS Lambda는 데이터를 가져와서 섬네일을 추출합니다.
- AWS Lambda가 처리할 수 있는 메모리의 크기를 넘기 때문에 Lambda에서 OOM(Out Of Memory)가 떨어집니다.
- OOM을 배치 서버가 캐치해서 MQ에서 데이터를 가져와서 섬네일을 추출합니다.
- hwp가 아닌 문서
- LibreOffice와 JODconverter를 사용해서 문서를 PDF로 변환합니다.
- 배치 서버는 PDF에서 섬네일울 추출합니다.
- hwp 문서
- pyhwp를 사용해서 문서를 PDF로 변환합니다.
- 배치 서버는 PDF에서 섬네일울 추출합니다.
이렇게 생성된 섬네일은 S3에 저장 요청을 하고 다운로드 링크를 받습니다.