본문 바로가기

전체 글631

스프링 배치 병렬처리, mock과 static mock, AssertFile을 이용한 배치 로직 테스트 스프링 배치에는 4가지 방법의 병렬처리 방식이 있다. 275개의 데이터가 있는 input.txt 파일을 읽어 output으로 변환하는 작업을 병렬로 처리해보자. 데이터는 다음과 같다. 1 데이터-1 10 2 데이터-2 20 3 데이터-3 30 4 데이터-4 40 5 데이터-5 50 6 데이터-6 60 7 데이터-7 70 8 데이터-8 80 9 데이터-9 90 10 데이터-10 100 11 데이터-11 110 12 데이터-12 120 13 데이터-13 130 14 데이터-14 140 15 데이터-15 150 // ... 먼저 전처리를 위해 dto와 mapper를 작성한다. @Data public class AmountDto { private int index; private String name; priv.. 2023. 7. 12.
스프링 배치 Validator, listener, FlatFileItemReader 및 Writer를 사용하여 간단한 text 변환 작업을 구현해보자 JobParameterValidator @Configuration @AllArgsConstructor @Slf4j public class AdvancedJobConfig { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job advancedJob(Step advancedStep){ return jobBuilderFactory.get("advancedJob") .incrementer(new RunIdIncrementer()) .validator(new LocalDateParameterValidator("targetDate")) .start(ad.. 2023. 7. 12.
Spring Batch 프로젝트 환경 구성, 데이터 읽고 처리하고 쓰기, Batch 테스트 코드 프로젝트 세팅 gradle dependency plugins { id 'java' id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:s.. 2023. 7. 12.
Spring 배치 사용 이유와 기본 아키텍처에 대해 알아보자 1. 배치 프로그램 왜 사용하고 언제 사용할까 배치란 정해진 시간에 일괄적으로 작업을 처리하는 것을 의미한다. 대체로 대용량 데이터를 다룬다. 서비스를 운영하는 관점에서 주기적으로 작업을 처리하려면 배치 프로그램을 사용해야 한다. 데이터 처리 - 필요한 데이터를 모아서 처리해야 할 때 - ETL 작업 (Extract-Transform-Load) - 데이터 모델을 만들 때 (연관 상품을 추천하기) -> 헤비한 데이터 처리 - 마케팅 참고를 위한 데이터 지표 집계 서비스 - 일부러 지연시켜 처리할 때 (주문한 상품을 바로 배송하지 않고 일정 시간 뒤 보낼 때) - 메시지, 이메일, 푸시 등의 발송 - 데이터 마이그레이션 - 실패한 트랜잭션 처리 - 쿠폰, 포인트 소진 처리 - 월말 월초 특정 데이터 생성(월.. 2023. 7. 11.
선착순 이벤트 시스템에서 발생가능한 동시성 문제와 해결 방안 탐구(redis, kafka) 선착순으로 쿠폰을 발급해 주는 시스템에서 발생할 수 있는 문제와 해결 방안을 살펴본다. 요구사항 선착순 100명에게 할인쿠폰을 제공하는 이벤트를 진행하고자 한다. - 선착순 100명에게만 지급되어야 한다. - 101개 이상이 지급되면 안 된다. - 순간적으로 몰리는 트래픽을 버틸 수 있어야 한다. 구현 코드는 다음과 같다. 먼저 쿠폰 도메인이다. @Entity @Getter public class Coupon { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long userId; public Coupon() { } public Coupon(Long id, Long userId) { this.id = id;.. 2023. 7. 11.