1. 개요 졸업 작품으로 POI (Point Of Interest) 추천 시스템을 개발하기로 했다. 팀원 중 2명이 Python을 사용하여 AI 모델을 개발하는 부분을 맡았고, 데이터를 가공하여 DB에 넣고, 학습된 AI 모델을 서비스로 제공할 수 있도록 서버를 구축하는 역할을 맡았다. AI 모델의 학습 데이터로는 Yelp의 대용량 데이터셋을 사용하기로 했다. 데이터셋에는 약 900만 개의 데이터가 포함되어 있었고, 이 데이터와 새로 추가된 데이터를 사용하여 AI를 재학습해야 했다. 처음에는 Spring 서버를 띄우고, 스프링 스케줄러를 사용하여 Python 파일을 실행하여 재학습을 진행할 계획이었다. 그러나 대용량 데이터이기 때문에 다른 트래픽을 처리하는 데 문제가 될 것으로 예상됐다. 일반적으로 대용..
1. 개요github action, docker와 nginx를 사용해 무중단 배포 CI/CD를 구축해뒀었다. 나는 BLUE/GREEN 방식의 무중단 배포를 적용해뒀는데, 적용 후 새로운 컨테이너가 실행되고 스프링 서버가 다 켜졌다면, 기존 컨테이너를 종료시키는 것 까지 확인했기에 잘 구축됐다 생각했다. 며칠 전 프론트엔드 팀에서 서버 연동 테스트를 해보겠다는 요청이 들어왔고 트리거를 걸어둔 브랜치에 push 해주어 배포를 시도했지만, 변경사항이 제대로 적용되지 않았다. ec2에 들어가 원인을 살펴보았다.Nginx config 파일에 port도 잘 변경되었고, 컨테이너도 잘 실행되고 종료되는걸 확인했는데 변경 코드가 적용되지 않아 이미지가 문제인가 하고 이미지 목록을 조회했더니 이미지가 업데이트 되지..
1. 문제 상황 데이터베이스를 기준으로 ItemReader의 구현체를 나눌 때, Cursor Based ItemReader과 Paging Based ItemReader으로 나눌 수 있다. Cursor 기반의 ItemReader의 경우, 데이터베이스 커넥션을 지속적으로 독점으로 사용하여 처리가 완료되는 시점까지 커넥션을 놓아주지 않기 때문에, 경우에 따라 성능상에 영향을 줄 수 있다. 따라서 Paging 기반의 ItemReader를 선택했고 최근에 스케줄러와, 배치 로직을 개발했다. 하지만 실제 로직 수행 결과는 원하는데로 되지 않았고, 몇 개의 데이터를 건너뛴채로 수행되었다. 나의 배치 로직은 특정 조건을 만족하면 PENDING 중이던 Apply를 CANCELED로 변경해주는 것이다. 사진에서 work_..
1. 개요이전 프로젝트에서 일괄적으로 알림을 보내는 기능을 개발했었는데 기능 구현을 위해 스프링 배치를 학습했었다. 그때도 ItemReader의 종류가 여러가지 있는 건 알았지만 우선 아무거나 선택해 구현했었는데 이번 기회에 제대로 알아보려고 한다. 2. Spring Batch Chunk?Spring Batch에서 일괄 처리를 하는 방법은 크게 두가지가 있다. 바로 Tasklet 기반과 Chunk 기반인데 ItemReader은 Chunk 방식에서 사용되는 것이다. ItemReader에 학습하기 앞서 Chunk에 대해 가볍게 알아보자. Spring Batch에서의 Chunk란 데이터 덩어리로 작업 할 때 각 커밋 사이에 처리되는 row 수를 얘기한다. 즉, Chunk 지향 처리란 ..