분류 전체보기(408)
-
Skip lock을 아시나요? (feat: PostgreSQL)
Context테이블에 저장된 데이터를 주기적으로 트랜잭셔널하게 읽어서 처리할 때,어떻게 하면 여러 인스턴스에서 데이터를 race condition을 방지하면서 데이터를 읽어서 처리할 수 있을까요? 예를 들어서 다음과 같은 상황이 있을 수 있습니다.type A struct { publisher EventPublisher}func (a *A) DoSomething(ctx context.Context) { // 어떤 비즈니스 로직 수행 a.publisher.publishEvent(ctx, &Event{}) // event 발행}비즈니스 로직에서 DoSomething메서드를 호출했을 때, 이 이벤트를 구독해서 Outbox 테이블에 기록하는 로직이 있다고 가정해봅시다. type EventListener..
2025.05.30 -
(kafka) debezium을 사용한 exactly once producing
Abstract마이크로서비스 아키텍처(MSA) 환경에서 서비스 간 메시지 전송의 정합성을 확보하는 일은 매우 중요한 과제입니다. 일반적인 Kafka acks 설정만으로는 메시지 중복 전송 방지나 전송과 오프셋 커밋의 원자성을 동시에 만족시키기 어렵습니다. 이 글에서는 enable.idempotence와 transactional.id 기능을 활용해 브로커 단계에서 exactly‑once producing을 완전하게 확보하는 방법을 설명합니다. 아울러 Debezium을 통한 DB CDC(Change Data Capture)와 Kafka Connect/Connector 구조를 결합하여, 외부 데이터베이스 트랜잭션과 Kafka 메시지 전송 간의 일관성을 유지하면서도 높은 확장성과 운영 편의성을 제공하는 방안을..
2025.04.21 -
Go 애플리케이션에서 테스트 커버리지 시각화하기
Context테스트 커버리지는 안정성의 척도인가?어떤 애플리케이션이든 기능이 고도화됨에 따라서 코드가 많아지고, 이 코드가 정상적으로 동작하는지를 테스트하기 위해서 우리는 많은 테스트 코드를 작성합니다. 그리고 우리는 테스트의 커버리지를 척도로 삼아 이 애플리케이션이 얼마나 안정적인가를 따지곤 합니다. 하지만 실제로 테스트 커버리지가 높다고 해서 애플리케이션이 안정적인 것은 아닙니다. 커버리지는 단순히 "작성된 코드 중 테스트가 실제로 실행한 부분"으로, 예외 상황이나 경계 조건까지 테스트를 하지 않으면 수치가 높아도 의미가 없습니다. 그럼에도 불구하고 커버리지가 중요한 이유커버리지는 BMI에 비유한다면 BMI가 건강의 전부는 아니지만, 기초 지표로는 유용한 것처럼, 커버리지도 그런 신호등 역할을 해줍..
2025.04.15 -
멱등성 있는 이벤트 발행하기
EDA에 많은 관심을 가지고 있어서 이벤트에 대해 많은 공부를 하게 되었고,그중 멱등성 있는 이벤트 발행하기라는 주제로 글을 작성하려고 합니다. # 이벤트EDA에서 이벤트는 단순한 기록으로 처리되는 것이 아니라 시스템 구성요소 간의 동기/비동기 통신 및 비즈니스 로직 실행의 핵심 메시지로 취급합니다. 일반적인 layered architecture를 생각해 보면,A 엔티티의 변경사항이 발생하고, 이 이벤트를 A와 관련된 엔티티에 전파해야 한다면, A service 이런 패턴은, 응집도를 떨어뜨리고, 결합을 강하게 만들어 좋은 패턴이라고 볼 수는 없죠. @RequiredArgsConstructorpublic class Aservice { private final ARepository aReposit..
2025.03.12 -
[도메인 주도 설계 철저 입문] 2장. 시스템 특유의 값을 나타내기 위한 '값 객체'
이 장에서는 '값 객체'에 대해서 다루고 있습니다.'값 객체'란 무엇일까요.도메인 주도 설계에서 말하는 값 객체는 이렇듯 시스템 특유의 값을 나타내는 객체다. 그리고 바로 다음 값의 성질을 설명하고 있습니다.변하지 않는다.주고 받을 수 있다.등가성을 비교할 수 있다. 이를 코드로 생각해보면 각각 다음과 대응된다고 생각했습니다.변하지 않는다. -> final주고 받을 수 있다. -> 대입으로 밖에 변경이 안 된다.등가성을 비교할 수 있다.(equals @override) 변하지 않는다.불변하는 값의 장점을 책에서는 다음과 같이 서술하고 있습니다.객체를 생성하고 메서드에 인자로 넘기니 자기도 모르는 사이에 상태가 수정되어 의도하지 않은 동작을 보이거나 버그를 일으켰다는 이야기는 ... 모르는 사이에 상태가 ..
2024.08.26 -
flyway로 DB 관리하기(with spring boot & gradle)
이 글에서는 flyway를 어떻게 spring boot에 적용하는지에 대해 작성하겠습니다. Flyway는 DB 버전 관리 툴로, 다양한 DB를 지원하고 마이그레이션을 지원합니다. 의존성 추가 및 기본 설정plugins { ... id("org.flywaydb.flyway") version "9.0.0"}dependencies { implementation("org.flywaydb:flyway-core")} build.gradle에 이렇게 두 개의 문장을 추가해 의존성을 추가해줍니다. flyway { url = db_url user = db_user password = db_password locations = arrayOf(db_migration_file_loc) # 기본 위치는 filesyst..
2024.08.16