본문 바로가기

전체 글

(16)
[goggles 프로젝트: 아키텍처] 일단 집을 지어보자 개요프로젝트를 시작하기 전 가장 먼저 해야 할 일은 요구사항을 분석하고, 사용자 흐름도를 작성하는 것이다.이 과정을 통해 서비스의 성격과 배포 주기를 고려하여 도메인의 범위를 나누고, 각 기능이 어떤 단위로 구성되어야 하는지를 정의할 수 있다. 그 다음으로 중요한 단계는, 서비스를 실제로 운영하기 위한 인프라 아키텍처를 설계하는 일이라고 생각한다.기획 단계에서는 기능 중심의 설계가 이루어지지만, 인프라 설계는 단순한 구조 선택을 넘어 실질적인 운영 비용과 직결되는 중요한 의사결정 과정이다. 특히 이번 프로젝트에서는 제한된 운영 비용이라는 현실적인 조건 속에서,어떤 기준으로 인프라 구성을 선택하고, 어떤 방식으로 아키텍처를 발전시켜 나갔는지를 단계적으로 정리해보고자 한다.초기 인프라 아키텍처 1. 고가용성..
[goggles 프로젝트] 프로젝트 개요 그리고 나의 목표 프로젝트 소개" 국내 IT 자격증 강의 및 멘토링 서비스, 고글 에듀 "프로젝트 개요현대 사회에서는 누구나 다양한 기술을 배우고 자격증을 취득할 수 있는 기회를 얻을 수 있다.하지만 자격증은 산업별로 주최 기관이 다르고, 학습 자료와 강의 또한 여러 플랫폼에 분산되어 있어 원하는 정보를 찾고 학습을 체계적으로 관리하기가 쉽지 않다.이러한 문제를 해결하기 위해 고글 에듀(Goggle Edu) 는 다음과 같은 기능을 하나의 플랫폼에서 제공하는 통합 교육 서비스 구축을 목표로 한다.분야별 자격증 강의를 한 곳에서 제공학습 이력 관리 기능 제공시험 일정 및 개인 학습 일정 관리멘토링 예약 기능을 통한 강사와의 직접 소통학습 계획 구체화를 돕는 통합 환경 제공이를 통해 사용자는 여러 플랫폼을 오가며 정보를 찾는 ..
분산 트랜잭션 환경에서 데이터 일관성 어떻게 보장할까(3) Outbox + 멱등성보상 트랜잭션이 실패하면?분산락
분산 트랜잭션 환경에서 데이터 일관성 어떻게 보장할까(2) 개요이전까지는 분산 환경에서 데이터 일관성을 지키기 위해 CAP 이론과 2PC, Saga 패턴에 대해서 정리하였다.특히 Saga 패턴은 MSA 환경에서 데이터 일관성을 유지하기 위한 효과적인 방법이지만, 보상 트랜잭션의 한계, 네트워크 오류, 멱등성 처리와 같은 문제는 여전히 남아있다.따라서 이러한 문제를 완화하고 서비스 간 통신 안정성을 높이기 위한 다양한 기술들을 추가로 학습하고자 한다.서킷브레이커(Circuit Breaker) - Resilience4j 서킷 브레이커가 필요한 이유 현재 영화 티켓 예매 서비스에서 Saga 패턴 중 오케스트레이션을 사용하여 서비스 간 트랜잭션을 관리하고 있다고 가정한다.이때 주문 생성 과정에서 오케스트레이터가 좌석 서비스로 요청을 전송하였지만, 몇 초가 지나도 응답..
분산 트랜잭션 환경에서 데이터 일관성 어떻게 보장할까(1) MSA에서의 분산 트랜잭션 모놀리식 구조로 개발을 진행하는 경우에는 하나의 흐름으로 처리되어야 하는 작업은 메소드 상단에 @Transactional 를 붙여서 관리하였다. 모든 서비스가 하나의 프로젝트 내에서 관리되고 있기 때문에, 일부 서비스만 장애는 곧 전체 시스템 장애로 직결되었다. 따라서 하나의 작업에서 문제가 생겼을 때, 해당 작업을 모두 롤백되어도 같은 프로젝트 내부에 위치하며 데이터베이스를 공유하는 모놀리식 구조에서는 큰 문제점으로 인식되지 않았다. 그러나 프로젝트 규모가 증가함에 따라 독립적으로 개발 및 배포될 수 있는 서비스를 분리하여 운영하게 되었고, 이러한 분산 서비스 간의 통신을 위해서 API 호출과 이벤트 방식을 채택하였다. 하지만 MSA 환경에서 서비스 간의 통신을 수행하며 다음..
MSA 도입 전 고민해야 할 것 ② 시스템 아키텍처
MSA 도입 전 고민해야 할 것 ① 공통 모듈 설계편 공통 모듈 설계 배경 프로젝트를 진행하면서 다음과 같은 공통 규칙이 정의되었다. [ 프로젝트 공통 사항 ]검색 기능은 10건, 30건, 50건 기준으로 페이지에 노출될 수 있으며, 이외의 건수는 기본 10건으로 제한한다.모든 테이블에는 created_at, created_by, updated_at, updated_by, deleted_at, deleted_by 필드를 추가하여 감사 로그(Audit Log) 를 기록한다.ApiResponse, BaseCode, GlobalExceptionHandler를 구성하여 공통된 응답 스펙을 유지한다.해당 요소들은 특정 서비스에 한정되지 않고, 모든 서비스에서 동일하게 유지되어야 하는 규칙에 해당한다. 모놀리식 구조를 MSA 구조로 전환기존 모놀리식 구조에서는 모든 ..
DDD 집을 지어보자 블로그 개요2주간 DDD와 MSA 구조를 적요한 물류 서비스 개발 프로젝트에 참여하게 되었다.사전에 DDD 개념을 학습했음에도 불구하고, 실제 도메인에 이를 적용하는 과정은 생각보다 훨씬 어려웠다.특히 나는 대부분의 프로젝트를 모놀리식 기반의 계층형 구조(Spring MVC)로 개발해 왔기 때문에,DDD에서 요구하는 도메인 중심 설계 방식과 패키지 구조를 실제 코드에 녹여내는 과정에서 많은 혼란을 겪었다. 따라서 이번 글에서는 기존 계층형 구조의 한계점을 되짚어 보고,DDD 4계층 구조를 선택하게 된 이유와 설계 과정에서 고민했던 내용을 정리하고자 한다. 또한 이 과정에서 DIP를 통해 의존성을 제어한 방식과,나아가 헥사고날 아키텍처로 확장하기 위해 어떤 고민을 했는지를 함께 정리함으로써,다음 프로젝트에..