| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- sqs fifo queue
- Intellij
- blank import
- MSA
- go-sql-driver
- 관측 가능성
- typescript
- javascript
- replication lag
- 캡슐화
- database/sql
- GIT
- RDS
- elasticsearch
- logging
- GoF
- esbuild
- context7
- 디자인패턴
- AI
- goland
- go
- 통합 로깅 시스템
- 오블완
- Infra
- 구조체
- Kubernetes
- AWS
- 티스토리챌린지
- golang
- Today
- Total
Fall in IT.
DDD(Domain Driven Design)를 적용하여 Go 프로젝트를 개발할 때, 데이터베이스에서 조회한 데이터를 도메인 엔티티로 복원하는 과정은 항상 수반되는 아주 귀찮은 작업이다.이 글에서는 엔티티의 캡슐화를 유지하면서 효율적으로 복원하는 방법에 대해 정리해보았다.Go에서 DB → DTO → Domain Entity로 복원하는 세 가지 방법과 각각의 장단점 그리고 마지막으로 Java(Spring boot + JPA)에서의 처리 방법을 비교해보겠다.먼저, 일반적인 Account Entity 구조를 살펴보자.// 계좌 엔티티type Account struct { id ID name string balance money.Money version int createdAt time.Time updatedA..
Go 언어로 Database에 접근하려고 할때, 보통 이런 코드가 들어간다.import ( "database/sql" _ "github.com/go-sql-driver/mysql")여기서 github.com/go-sql-driver/mysql은 MySQL 드라이버인데, 흥미로운 점은 _로 import 한다는 점이다.“어? 명시적으로 사용하지 않는걸 반드시 임포트해야 동작하게 만들어놨다고..?” 란 의문이 생긴다.이 부분에 대해서 그 이유와 동작 방식을 쉽게 풀어보겠다.1. Blank Import (_)의 의미Go에서 import _ “패키지”는 해당 패키지를 코드에서 직접 사용하지는 않지만, 패키지의 init() 함수는 실행되게 만든다.즉, _를 붙이면 명시적으로 패키지를 호출하여 사용하진 않지만, si..
DB 업데이트와 SQS 메시지 발송을 하나의 트랜잭션 즉, 원자적 단위로 묶을 수 없다.그 이유는관계형 데이터베이스 트랜잭션은 DB 내부에서만 원자성이 보장되고SQS(혹은 대부분의 메시지 큐)는 데이터베이스와의 2PC(분산 트랜잭션, XA 트랜잭션)을 지원하지 않기 때문이다.즉, 둘은 완전히 별도의 시스템이기 때문에 원자적 보장이 없으므로, 하나만 성공하거나 실패할 수 있는 상황이 생길 수 있다.나는 주로 어떤 방식으로 구현했는가? (어떤 선택을 했었더라..?)DB 업데이트 트랜잭션을 실행한다.트랜잭션 커밋에 성공하면 SQS 메시지를 전송한다.트랜잭션 커밋에 실패하면 SQS 메시지를 전송하지 않는다.SQS 메시지를 전송에 실패할 경우 DB에 기록하고 후처리가 가능하도록 한다.내가 선택한 방식에 대한 이유..
1. 배경: 자동 회로 설계 툴과 부품 매칭우리는 자동 회로 설계 도구를 개발하면서, 회로에 배치할 다양한 부품들을 적절히 배치하기 위해 부품의 타입과 카테고리를 자동으로 매칭하는 작업이 필요했다. 사전에 정의된 매칭 데이터가 없는 경우에는 부품 분석 서버에 분석을 요청하고, 그 결과로부터 카테고리와 타입 정보를 전달받는 구조로 설계했다.2. 처리 방식: 비동기 분석과 메시지 응답 구조부품 분석 작업은 종류가 방대하고, 처리 시간도 예측하기 어려웠다. 따라서 동기 요청이 아닌 비동기 방식으로 분석 요청을 보내고, 분석 결과는 메시지 큐를 통해 응답받는 구조를 설계했다. 이렇게 함으로써 시스템은 다양한 부품 분석 요청을 병렬로 처리할 수 있고, 결과는 분산된 여러 인스턴스에서 수신 및 반영할 수 있게 되었..
MSA 아키텍처로 여러 서비스를 운영하면서, 저는 도메인 단위로 유스케이스를 묶는 구조를 사용해 왔습니다.예를 들어, User 서비스에서는인증 관련 로직은 AuthUsecase회원 정보 관련 로직은 UserUsecase이렇게 기능별로 Usecase를 구분해 구성했습니다.AuthUsecase에는 이메일 인증, 휴대폰 인증, 본인 인증 등을, UserUsecase에는 회원가입, 로그인, 유저 정보 조회, 비밀번호 재설정 등 다양한 메서드를 구현해 관리했습니다.처음에는 이 구조가 충분히 단순하고 효과적이었습니다. 하지만 서비스가 점차 확장되고 비즈니스 요구사항이 복잡해지면서 한계가 드러났습니다.문제의 시작: 사용자 유형에 따른 분기 증가시간이 지나면서 User 서비스는 B2B와 B2C 사용자를 동시에 지원하게..