목록전체 글 (14)
사부작사부작
진행중인 배치 스터디를 학습하며 작성한 글입니다. [SpringBatch 연재 09] 입맛에 맞는 배치 처리를 위한 Custom ItemReader/ItemWriter 구현방법 알아보기 devocean.sk.com 스프링 배치가 ItemReader, ItemWriter를 제공해주지만, 보다 딱 맞는 배치를 수행하기 위해서는 커스터마이징이 필요합니다. ### Custom ItemReader이번 학습에선 QueryDSL을 이용한 QueryDslPagingItemReader를 구현할 예정입니다. QueryDSL은 스프링 배치에서 공식적으로 지원하는 ItemReader가 아닙니다. 그렇기에 AbstractPagingItemReader을 이용하여 커스텀 ItemReader를 만들어 볼 것입니다. Queryd..
https://devocean.sk.com/blog/techBoardDetail.do?ID=166902 [SpringBatch 연재 06] JpaPagingItemReader로 DB내용을 읽고, JpaItemWriter로 DB에 쓰기 devocean.sk.com해당 블로그 글을 기반으로 공부한 글입니다. JpaPagingItemReader 소개 : 해당 클래스는 스프링 배치에서 제공하는 ItemReader 구현체 중 하나입니다. JPA를 이용해서 데이터베이스로부터 페이징 단위로 데이터를 읽어올 때 사용합니다. 주요 구성 요소 :EntityManagerFactory: JPA 엔티티 매니저 팩토리를 설정합니다.JpaQueryProvider: 데이터를 읽을 JPA 쿼리를 제공합니다.PageSize: 한 번에..
JdbcPagingItemReader 클래스먼저 JdbcPagingItemReader와 flatfileItemReader의 상속 관계를 비교해보겠습니다.### JdbcPagingItemReaderAbstractItemStreamItemReader (implements ItemStream, ItemReader)└── AbstractItemCountingItemStreamItemReader└── AbstractPagingItemReader└── JdbcPagingItemReader### flatfileItemReaderAbstractItemStreamItemReader (implements ItemStream, ItemReader)└── AbstractItemCountingItemStreamItemReade..
이번 주차의 스터디 주제는 Chunk Model 과 TaskletModel 입니다 .먼저 들어가기 앞서 단어 뜻을 찾아보겠습니다.chunk 는 ‘덩어리’ 라는 뜻을 나타냅니다. tasklet 에는 한글 뜻이 없어서 번역해보면 ‘운영체제에서의 간단한 작업’ 라고 해석할 수 있습니다.그리고 스터디의 주제인 batch 는 아래의 뜻을 가지고 있습니다.배치는 ‘일괄적으로 묶은 한 회분’ 의 뜻을 가지고 있습니다.Chunk의 뜻을 더 찾아보니 여기서 말하는 ‘덩어리’는 특정 큰 단위에서 나온 덩어리를 의미합니다. 단어 뜻 대로 청크모델은 배치 작업을 한 번에 모두 처리하지 않고 일정한 크기(청크)로 나누어 처리하는 방식입니다. 이에 반해 taskletModel은 단일 작업 단위로 배치를 수행하는 방밥입니다.단어 ..
배치 아키텍처를 살펴보면 위와 같습니다. 이 구성 요소들을 포함하여 레이어 단위로 나눠서 간단히 알아보겠습니다. 1. Application Layer개발자가 직접 작성하는 부분으로, 배치 애플리케이션의 비즈니스 로직과 배치 작업의 흐름을 정의합니다.주요 구성 요소:Job: 배치 작업의 전체 흐름을 정의하는 엔티티로, 하나 이상의 Step으로 구성됩니다.Step: 배치 작업의 단위 실행을 나타내며, Tasklet 또는 Chunk 로 나눠집니다.Tasklet: 단일 작업을 수행하는 경우에 사용합니다.Chunk: 대용량 데이터를 chunk(청크)로 나누어 처리하며, ItemReader, ItemProcessor, ItemWriter를 사용합니다.ItemReader: 데이터 읽기ItemProcessor: 데이터..
틀린 부분이 존재할 수 있습니다. 감사합니다. 객체는 그래프로 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다 - 김영한 JPA는 연관된 객체들을 탐색하는 것을 도와준다. JPA는 직접 쿼리를 날려서 연관된 객체의 데이터를 가져온다. 예를 들어 고객과 주문으로 이루어진 1:N 구조에서 1번 고객이 3건의 주문을 한 데이터가 있다고 하자. 이 상태에서 1번 고객에 연관된 주문 객체들을 가져올 때, 주문 3건에 대해 각각 쿼리를 날려서 가져온다. 그렇기에 흔히 말하는 N+1 쿼리가 발생한다. 그렇다면 JPA는 왜 쿼리를 N번이나 날려서 연관된 객체들을 조회해올까? 왜 JPA는 조인을 통해 고객을 조회할 때 연관된 주문 데이터들을 가져오지 않을까..
OSIV 를 default 값인 true인 상태로 개발을 하다가, false로 바꾸고 이에 따른 더티 체킹이 작동하지 않는 문제를 겪었습니다. OSIV에 대한 설명과 개선해 간 과정을 적은 글입니다. 틀린 부분이 있을 수 있습니다. 먼저 OSIV를 모르는 상태로 기능을 구현하는 중이였다. 그러다가 동욱님의 블로그 글(jojoldu.tistory.com/272)을 읽다가 OSIV라는 단어를 접했고, 이걸 false로 변경하기로 했다. OSIV (Open-Session-In-View) OSIV는 Hibernate 세션(DB작업을 수행하기 위한 논리적 트랜잭션 컨텍스트)을 뷰까지 열어두는 패턴을 의미한다. 스프링에서 이 패턴을 구현한 클래스로는 OpenSessionInViewInterceptor 클래스가 있다..
본 글은 AOP로 기능 구현한 내용을 다루는 글입니다. 개념적인 설명이 미흡할 수 있고, 틀린 부분이 존재할 수 있습니다. 피드백 해주시면 정말 감사하겠습니다 :) 어플리케이션 전반에 퍼져있는 공통된 부가 기능들을 관심사(Aspect)라고 한다. 우리가 널리 쓰고 있는 트랜잭션이 Aspect의 예다. 트랜잭션이 필요한 메서드마다 트랜잭션을 얻고 커밋과 롤백 등의 로직을 구현해야 한다면, 코드가 복잡해질 것이다. 이처럼 비지니스 로직과 달리 부가적으로 들어간 기능을 관심사(Aspect)라고 정의하고 이를 비지니스 로직에서 분리시킬 것이다. Aspect Oriented Programming(AOP) OOP는 비즈니스 로직의 중복을 제거하기 위함이고 AOP는 인프라 로직 중복을 제거하기 위함이다. 여기서 인프..
분산락이 필요한 상황 설명 유저들이 검색한 검색어를 Redis의 Sorted Set에 저장하고, 그걸 바탕으로 인기 검색어를 구현했다. 검색될 때마다 Redis에 저장시켰는데, 통신부하를 줄여보기 위해서 검색어를 서버에 리스트 안에 모아서 100개가 되면 Redis에 보내게 바꿨다. 지금 내 토이프로젝트 상황으로는 검색어 100개를 모으려면, 100일은 더 걸릴 것이다. (사용하는 유저가 없다..ㅠ) 그렇기에 100개가 안 되더라도 Redis에 저장시키기 위해서, 스케줄러로 하루에 2번씩 모아진 검색어를 저장시키게 했다. 하지만 문제가 발생했다! 왜냐하면 난 2대의 서버를 운영중이기 때문이다. 2대의 서버가 동시에 레디스로 데이터를 보내는데 여기서 동시성 이슈가 터졌다. 검색한 검색어 일부가 Redis에..
페이지네이션 구현 페이지네이션은 데이터를 페이지 단위로 나누어 화면에 보여주는 기능이다. 전체 데이터가 아니라 필요한 페이지의 데이터만 불러오기 때문에 성능을 향상시킬 수 있다. 물론 사용자 경험도 훨씬 좋다. 밑의 화면처럼 페이지네이션을 화면에 만들기 위해선 토탈 페이지 카운트를 알아야한다. 그렇기에 페이지네이션이 이루어지려면 페이지당 몇 개의 데이터를 보여줄건지와 토탈 페이지 카운트를 알려줘야 한다. 내 프로젝트의 프론트엔드는 컴포넌트를 이용해서 페이지네이션을 구현했다. 여기서 보다시피 length 속성으로 토탈 페이지 카운트를 입력받고 있다. 프론트엔드에서 전체 데이터 개수로 토탈 카운트를 구할 수 있지만, 백엔드에서 토탈 카운트를 보내주는게 일반적이다. 백엔드에서는 Pageable 인터페이스를 구..