Spring Data & Batch
Spring Batch 통합 테스트 환경 구축하기
Spring Batch 통합 테스트 환경 구축하기
2022.08.03서론 앞으로 팀내 스프링 배치를 적극 사용하기 위해, 미리 테스트 환경 구축하는 작업을 진행했던 내용에 대해서 공유해보려고 합니다. 작업 하기 전 스프링 배치 테스트는 어떤식으로 하는게 좋을지 검색을 해봤습니다. 이쉽게도 스프링 배치는 아티클이 별로 없기 때문에 테스트에 대해 집중적으로 다루고 있는 글도 드물었습니다. AS-IS 우선 기존에 제가 테스틀 작성했던 방법입니다.(과거 배치 테스트 블로그 글에서 소개했던 방법을 그대로 사용했었습니다) @SpringBatchTest @SpringBootTest(classes = {GetProductDtoJobConfig.class, TestBatchConfig.class}) class GetProductResponseJobConfigTest { @Autowire..
스프링 배치에서 JobParameters을 더 편하게 사용하는 방법
스프링 배치에서 JobParameters을 더 편하게 사용하는 방법
2022.06.23스프링 배치에서 JobPameter를 사용할때 외부에서 주입받아서 사용하는 경우가 많다. 대표적으로 "날짜"가 있다. 하지만 SpringBatch에서는 LocalDateTime을 지원하지 않아서 다음과 같이 타입 변환 작업이 이루어져야한다. @Bean @StepScope public ItemReader simpleReader( @Value("#{jobParameters[requestDate]}") String requestDate ) { LocalDate date = LocalDate.parse(requestDate, DateTimeFormatter.ISO_DATE); // yyyy-MM-dd log.info(">>> date = {}", date); return new ListItemReader(Lis..
스프링과 EntityManager의 동시성 비밀
스프링과 EntityManager의 동시성 비밀
2021.11.20서론 최근 바빠서 항상 조금씩 끄적이면서 임시저장을 했는데 오랜만에 글을 마무리 해봅니다. 이번 글에서는 EntityManger에 대한 얘기를 해보려고합니다. 목차 EntityManager란? EntityManager가 생성되는 과정 EntityManager는 어떻게 thread-safe를 보장할까? EntityManager란 무엇일까? 공식 문서에서 EntityManager는 다음과 같이 기술되어 있다. An EntityManager instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there ..
Optimistic Lock으로 선착순 한 명 쿠폰을 만들어보자
Optimistic Lock으로 선착순 한 명 쿠폰을 만들어보자
2021.08.28개요 사내에서 쿠폰 등록 이벤트를 만들어야하는 상황이 있었다. 쿠폰은 고유의 쿠폰번호가 있으며, 해당 쿠폰은 유저당 하나만 등록할 수 있었다. (대표적으로 스타크래프트 cd키라고 생각하자). 고민했던 점 - 확장성: 쿠폰은 한 번만 등록할 수 있지만, 언제 선착순 최대 x명으로 변경될지 모른다 - 동시성: 동시에 x명의 유저들이 쿠폰을 등록한 경우 결론 - 확장성: 쿠폰의 최대 사용 개수랑, 현재 남은 쿠폰 물량으로 나눴다. - 동시성: 현재 선착순 한 명에서 Redis를 사용하면 오버 엔지니어링이라고 판단됐다. 우선 optimistic lock을 이용하고, 기획이 확장되면 필드를 제거하고 Redis를 이용한 추가 설계를 고려할 수 있다. 간단한 설계 예시 실제로는 유저가 쿠폰을 등록하는 것이지만 동시성..
[Spring Batch] 하나의 Step에서 여러개의 ItemWriter를 사용하는 방법
[Spring Batch] 하나의 Step에서 여러개의 ItemWriter를 사용하는 방법
2021.08.04신규 도메인에서 배치 작업을 하는 도중 해결했던 문제 경험에 대해서 공유하고자 합니다. 예시) 배치로 일련의 작업을 수행한 뒤 엔티티를 JpaItemWriter를 통해 저장 / 변경하고, JdbcBatchItemWriter를 이용해서 연관 관계가 없는 단순 데이터용 테이블을 저장 / 변경한다는 가정을 해보겠습니다. 처음에 생각한건 하나의 Job에다가, 두 개의 Step을 만드는 것이었는데, 하나의 Step에서 두 개의 ItemWriter를 사용할 방법이 없을까? 찾다보니 CompositeItemWriter를 발견했습니다. 예제를 참고할 만한 자료가 없었지만, 다행이게도 내부 구현이 복잡하지 않아서 직접 코드를 짜면서 실험해도 금방 만들 수 있었습니다. CompositeItemWriter는 여러개의 Ite..
One-to-One 관계에서 Lazy 로딩은 언제 동작되는 것일까?
One-to-One 관계에서 Lazy 로딩은 언제 동작되는 것일까?
2021.06.17서론 JPA를 사용하면서 일대일 연관관계를 맺었는데 예상치 못한 쿼리를 만나게 되었고 원인을 분석하면서 알게된 내용을 공유해보려고 한다. One-to-One 관계에서는 Lazy로딩은 특정 조건에서만 동작한다. 그렇다면 언제 Lazy 로딩이 잘 동작하고, 언제는 동작하지 않으며 그 이유가 무엇인지 알아보자. 특정 조건이라는 게 그럼 무엇일까? 결론부터 말하자면 연관관계 주인쪽 엔티티 측에서는 Lazy 로딩이 정상적으로 동작한다. 다음과 같은 일대일 양방향 연관관계가 있다고 해보자 @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @OneT..