Reader 성능 개선JpaPagingItemReader를 사용하면 쿼리 조회 시에 LIMIT OFFSET 방식을 사용하기 때문에 OFFSET 수가 커질수록 읽어야할 데이터 수가 많아져 성능에 문제가 생길 수 있다. Spring Batch의 ItemReader는 대량의 데이터를 읽을 때 LIMIT OFFSET 방식의 속도 개선 방법으로는 No-Offset 기반과 Cursor 기반 두 가지 접근 방식을 사용할 수 있다.No-Offset 방식은 '페이징 성능 개선: offset vs no offset vs covering index' 글에 작성한 적이 있듯이 Offset을 사용하지 않고 인덱스를 활용해 효율적으로 페이지 단위 조회를 수행한다.Cursor 방식은 DB 커넥션을 유지한 채, 결과 집합(Resul..
Spring BatchSpring Batch는 대용량 데이터 처리를 위한 경량 프레임워크로, Job과 Step으로 구성된 배치 작업을 정의하고 실행한다. 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 스킵, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공한다. Spring Batch의 주요 사용 사례는 다음과 같다.대용량 데이터 ETL(Extract, Transform, Load)정기적인 대량 데이터 처리(매출 집계, 통계 생성)외부 시스템과의 데이터 동기화파일 import/export wkrdjq대량 메일 발송 및 알림 처리 Spring Batch 특징 및 장점풍부한 필수 기능 제공트랜잭션 관리, 로깅/추적, 체크포인트/재시작, 통계 집계, 예외 처리(Skip), 재시도(Ret..
인덱싱인덱스를 사용하면 효율적으로 쿼리할 수 있다. 인덱스를 사용하지 않는 쿼리를 컬렉션 스캔(collection scan)이라 하며, 서버가 쿼리 결과를 찾으려면 '전체 내용을 살펴봐야 함'을 의미한다. > db.col3.find({ a: 3 }).explain("executionStats"){ explainVersion: '1', queryPlanner: { namespace: 'test.col3', parsedQuery: { a: { '$eq': 3 } }, // ... executionStats: { executionSuccess: true, nReturned: 59, // 반환받은 결과의 개수 executionTi..
MongoDB프로젝트 초기 설계 당시에는 어떤 DB를 사용하는지 결정하게 된다. 이때 시스템의 특성과 요구사항에 따라 관계형 데이터베이스 대신 NoSQL 데이터베이스를 채택하는 주된 이유는 다음과 같다.대규모 데이터셋이나 매우 높은 쓰기 처리량 달성을 관계형 데이터베이스보다 쉽게 할 수 있는 뛰어난 확장성의 필요관계형 모델에서 지원하지 않는 특수 질의 동작관계형 스키마의 제한에 대한 불만과 더욱 동적이고 표현력이 풍부한 데이터 모델에 대한 바람NoSQL 데이터베이스는 이러한 요구사항에 따라 아래와 같이 크게 4가지 유형으로 구분된다. 이 중에서 MongoDB는 문서 지향(Document-oriented) 데이터베이스의 대표적인 예로 다양한 형태의 데이터를 유연하게 저장하고 확장할 수 있는 기능을 제공한..
트랜잭션트랜잭션은 읽기나 쓰기 작업이 가능한 데이터베이스 작업을 하나 이상 포함하는 데이터베이스의 논리적 작업 단위를 의미한다. 데이터베이스 운영 시 여러 도큐먼트에 관한 읽기과 쓰기 작업이 필요한 경우가 많고, 이러한 도큐먼트들은 하나의 컬렉션에 있을 수도 있고, 여러 컬렉션에 분산되어 있을 수 있다.몽고DB는 비관계형 데이터베이스이므로 전통적인 관계형 데이터베이스의 트랜잭션 방식을 그대로 적용할 수 없다. 몽고DB CRUD 블로그에서 설명했듯이 updateOne, findOneAndDelete, findOneAndReplace, findOneAndUpdate 등 Single Document에 대해서는 원자성을 보장한다. 몽고DB의 경우 insertMany처럼 전체 쿼리에 대해 일부 실패하면 그 시점까..
몽고DB CRUD몽고DB는 위 명령행처럼 몽고DB 인스턴스와 상호작용하는 자바스크립트 셸을 제공한다. 셸은 관리 기능이나, 실행 중인 인스턴스를 점검하거나 간단한 기능을 시험하는데 매우 유용하다. 셸은 시작할 때 몽고DB 서버의 test 데이터베이스에 연결하고, 데이터베이스 연결을 전역 변수 db에 할당한다. 따라서 데이터베이스 선택하기 위해서는 use 명령어를 통해 선택할 수 있다. 그리고 셸에서 데이터를 조작하거나 보려면 생성(create), 읽기(read), 갱신(update), 삭제(delete)의 네 가지 기본적인 작업(CRUD)을 할 수 있다. 삽입삽입은 몽고DB에 데이터를 추가하는 기본 방법이다. insertOneinsertOne 함수는 컬렉션에 도큐먼트를 추가한다. 예를 들어, 영화를 저장..
Terraform테라폼(Terraform)은 하시코프(HashiCorp)에서 공개한 IaC 도구다. 테라폼을 통해 리소스를 코드로 손쉽게 배포 및 삭제하며, 다수의 리소스를 일괄적으로 관리하는 구조로 특정 클라우드나 인프라에 종속적이지 않고 AWS, Azure, Google Cloud와 같은 클라우드 서비스나 온프레미스 시스템과 연동될 수 있도록 지원하는 프로바이더 기반 아키텍처이다.테라폼은 HCL를 사용하여 간결하고 읽기 쉬운 문법을 통해 인프라를 정의할 수 있다. 각 인프라와 서비스는 고유의 API를 가지고 있고 프로바이더는 각 API 명세를 테라폼 코드로 호출해 동작한다. 즉, terraform apply와 같은 명령으로 만들어진 코드를 실행하고 배포할 수 있다. 테라폼 장점테라폼을 사용하면 다음과..
분산락과 낙관적 락을 사용한 데이터 정합성 지키기보상 트랜잭션을 사용한 데이터 정합성 유지하기 블로그 글에서 주문 비즈니스 로직에서 분산 트랜잭션을 처리 시스템을 구축했다.특히 상품 서비스에서 재고를 관리하고 있으며, 다수의 사용자가 동시에 한정 수량의 상품을 구매할 경우 UPDATE inventory SET quantity = quantity - 1와 같은 단순 쿼리만으로는 경쟁 조건(Race Condition)이 발생해 데이터 정합성이 쉽게 깨질 수 있다. 따라서 이커머스에서 재고의 정확성은 곧 서비스 신뢰도와 직결되므로, 정합성을 보장하기 위한 아키텍처 설계와 동시에 제어 전략이 필수적이다.이를 해결하기 위해 상품 서비스에서 일반적으로 비관적 락(Pessimistic Lock)과 낙관적 락(Opti..
서비스 API 카테고리서비스 API 카테고리로 분류된 리소스는 클러스터상의 컨테이너에 대한 엔드포인트를 제공하거나 레이블과 일치하는 컨테이너의 디스커버리에 사용되는 리소스이다. 내부적으로 사용되는 리소스를 제외하고 사용자가 직접 사용하는 것은 L4 로드 밸런싱을 제공하는 서비스 리소스와 L7 로드 밸런싱을 제공하는 인그레스 리소스, 두 종류가 있다. 또한, 서비스 리소스에는 제공 목적에 따라 클러스터 내부나 클러스터 외부에서 접속할 수 있는 가상 IP 등의 엔드포인트를 제공하고 있다. 쿠버네티스 클러스터 네트워크와 서비스EKS 기본 아키텍처 게시글에서 확인할 수 있는데 EKS 클러스터를 생성하면 노드별로 Amazon VPC CNI가 설치되어 내부 네트워크가 자동으로 구성되기 때문에 파드는 서비스를 사용하..
- Total
- Today
- Yesterday
- transaction
- Kafka
- spring session
- 분산 락
- spring webflux
- 구름톤챌린지
- Java
- Redisson
- 카프카
- annotation
- NeXTSTEP
- socket
- mysql
- pessimistic lock
- Synchronized
- mdcfilter
- EKS
- jvm 메모리 구조
- TDD
- redis session
- 구름톤 챌린지
- sql
- nginx
- 낙관적 락
- 람다
- 넥스트스탭
- 비관적 락
- 트랜잭션
- nginx configuration
- postgresql
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
