목록분류 전체보기 (63)
쏭의 개발 블로그

[1] Transactional Outbox와 Transaction Log Tailing 개념Transactional Messaging이란?애플리케이션 비즈니스 로직에 의해 데이터베이스를 수정하는 작업과 메시지 큐에 메시지를 발행하는 작업을 원자적으로 수행하여 데이터의 일관성을 보장하는 것Transactional Messaging을 달성하기 위한 분산 트랜잭션 방법Two Phase CommitTransactional OutboxTransaction Log TailingTransactional Outbox메시지 큐에 메시지를 바로 보내지 않고 데이터베이스의 outbox 테이블에 넣는 방식데이터베이스 트랜잭션이 커밋되면 주기적으로 아웃박스 테이블의 내용을 읽어 메시지 큐에 보낸다.적어도 한번 이상(at-le..

[1] Kafka란?실시간으로 스트리밍 데이터를 수집하고 처리하는 데 최적화된 분산 이벤트 스트리밍 플랫폼대규모 데이터를 실시간으로 처리여러 서비스 간에 대규모 이벤트를 생산 및 소비하며 통신특징고성능, 확장성, 내구성, 가용성Producer와 ConsumerProducer : 데이터 생산자Kafka로 데이터를 보내는 클라이언트로, 데이터를 Topic단위로 생산하고 전송한다Consumer : 데이터 소비자Kafka에서 데이터를 읽는 클라이언트로, 데이터를 Topic 단위로 소비하고 처리한다.Producer→Consumer로 데이터를 전송한다 (API, Message Queue)[2] 대규모 데이터 처리를 위한 구조(1) 기본 구조 : API 통신직접 통신하는 방법으로, 요청/응답의 구조동기적인 방식이다...

프로젝트에서 이미지, 비디오, 오디오 등 파일을 저장하기 위해 어떤 클라우드 스토리지를 사용할지 고민했다. 프로젝트의 요구사항과 개발 방식, 비용을 고려하여 효율적이고 저렴한 클라우드 스토리지를 선택하고자 했다. 이번 포스트에서는 프로젝트에서 사용했던 AWS S3와 Wasabi를 비교하고, 실제로 두 환경을 모두 구성하고 파일 저장 코드를 구현한 내용을 공유하고자 한다. AWS S3 환경 구축과 구현에 대한 블로그들은 많지만, Wasabi를 다루고 AWS S3와 Wasabi 전환을 고려한 자료는 찾기가 쉽지 않아 이참에 포스트를 작성해보았다. [1] AWS S3 vs Wasabi 비교내가 프로젝트에서 고민한 클라우드 스토리지는 AWS S3와 Wasabi이다.AWS S3먼저, AWS S3는 클라우드 기반..
프로젝트에서 PostgreSQL에서 JSON 타입을 저장하기로 했다. PostgreSQL에서는 JSON 타입은 JSON과 JSONB가 있으며, 둘다 JSON 포맷 유효성 체크를 한다. JSONJSON은 데이터를 문자열 그대로 저장처리 함수가 각 실행에 대해 파싱이 필요장점원시 텍스트 형태로 저장되어있으므로 저장이 빠르고 간단단점조회나 데이터를 조작하는 경우 성능 저하 발생 가능JSON의 특정 Key나 Value를 조회하려면 전체 문자열을 읽은 다음 해당 부분을 해석하는 과정이 필요인덱싱을 할 수 없다.의미 없는 공백을 저장한다.사용 시 고려사항:저장만 하고 읽거나 필터링하지 않는 경우에 적합 JSONB (binary JSON)JSONB 타입JSON 데이터를 구조화된 binary 형식으로 저장Postgre..

이번 포스트에서는 Redis에 대해 간단히 설명하고 Redis 데이터 백업 전략에 대해 알아본다. [1] Redis란?오픈소스 기반의 In-memory 데이터 저장소로, Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 비관계형 데이터베이스 관리 시스템이다. 데이터베이스, 캐시, 메시지 브로커 등 다양한 용도로 사용할 수 있으며, 정해진 스키마가 없고 유연한 데이터 모델을 사용하는 NoSQL Database이다. 외부에서 사용 가능한 Key-Value 쌍의 해시맵 형태의 서버로 별도의 쿼리문 없이 Key값으로 빠르게 결과를 가져올 수 있다. Redis는 아래과 같은 특징을 가지고 있다.In-memory Database : 디스크가 아닌 메모리에서 데이터를 처리하여 매우 빠른 데이터 엑세스 ..
지난 포스트에서의 Spring Boot와 Redis 연동 과정에서 언급했던 RedisSerializer 선택 기준에 대해 이 포스트에서 다뤄보고자 한다. Spring은 총 3가지 직렬화/역직렬화 클래스를 제공한다.JdkSerializationRedisSerializer, GenericJackson2JsonRedisSerializer, Jackson2JsonRedisSerializer 3가지를 지원한다.각 Serializer에 대해 알아보자. [1] JdkSerializationRedisSerializerJdkSerializationRedisSerializer는 Java의 기본 직렬화 기법인 JDK 직렬화를 사용하여 객체를 처리한다. RedisTemplate의 기본 직렬화 방식으로, 별도로 등록된 Seri..
프로젝트에서 Redis 관련 전역 환경 설정을 위해 Spring Boot와 Redis를 연동했다. 연동 방법과 그 과정에서 어떤 것을 고민했는지 기록하려고 한다. [1] Redis 의존성 추가 및 application.yml 설정먼저 Spring Boot에서 Redis를 사용하기 위한 의존성을 추가해보자. build.gradle에 Spring Data Redis 의존성을 추가해주면 된다. Spring Data Redis는 Spring에서 Redis연동을 쉽게 해주는 라이브러리로, RedisTemplate, StringRedisTemplate, Spring Cache 등의 기능을 제공한다.implementation 'org.springframework.boot:spring-boot-starter-data-..
[1] 동시성 제어여러 사용자가 동시에 데이터에 접근할 때 데이터의 일관성과 무결성을 유지하기 위해 필수적이다.이를 통해 데이터 충돌을 방지하고 데이터 손실이나 오류 없이 시스템 안정성과 신뢰성을 확보할 수 있다.동시성 제어 전략 : 비관적 락, 낙관적 락 [2] 비관적 락 (Pessimistic Lock)데이터 접근 시에 항상 충돌이 발생할 가능성이 있다고 가정하고, 데이터를 보호하가 위해 항상 락을 걸어 다른 트랜잭션 접근을 방지한다.데이터의 변경이 발생할 가능성을 미리 차단하여 데이터의 일관성을 보장다른 트랜잭션들은 락이 해제되기까지 대기한다. 락을 오래 점유하고 있으면 성능 저하나 deadlock 등으로 인한 장애 문제가 발생할 수 있다.비관적 락을 사용할 때는 락의 범위와 지속 시간을 신중하게..