소프트웨어아키텍처 9

이벤트 소싱과 CQRS

1. 전통적인 CRUD 아키텍처의 한계1-1. 명령과 조회가 뒤엉킨 서비스 구조 전통적인 애플리케이션은 대부분 하나의 도메인 모델로 명령(Command)과 조회(Query)을 동시에 처리한다. 예를 들어 OrderService는 주문 생성과 동시에 주문 내역 조회도 담당하며, 이는 단일 모델로 모든 역할을 떠안는 구조다. 개발 초기에는 간단해 보일 수 있으나, 시간이 지나면 기능이 복잡해지고 데이터 처리 요구가 다양해지면서 코드의 응집도가 낮아지고 유지보수가 어려워진다. 게다가 명령과 조회는 설계 목표 자체가 다르다. 명령은 데이터 정합성과 비즈니스 규칙을 중심으로 설계되어야 하고, 조회는 성능과 응답 속도에 초점을 맞춰야 한다. 두 책임을 한 클래스가 동시에 지는 것은 단일 책임 원칙(SRP)을 위배..

컴퓨터공학 2025.05.24

Value Object vs Entity

1. 객체지향에서의 본질적인 구분1-1. 왜 두 개념이 필요한가? 소프트웨어 설계에서 모든 객체를 동일하게 취급하면, 코드가 복잡해지고 유지보수성이 떨어진다. 그래서 객체의 ‘역할’에 따라 개념적으로 구분하는 것이 중요하다. Value Object와 Entity의 구분은 바로 이 설계 명확성을 높이기 위한 핵심적인 전략이다. Value Object는 그 값 자체가 중요한 객체이고, Entity는 고유한 정체성을 가진 객체다. 동일한 데이터를 가진 두 객체라도, Value Object라면 하나로 취급되지만, Entity라면 각각 별개의 존재다. 이 구분이 없다면 동일성, 식별, 변경 추적 등의 이슈가 설계 전반에 영향을 미치게 된다. 이러한 구분은 단지 철학적 개념이 아니라, 모델링의 의도와 코딩 구현 ..

컴퓨터공학 2025.05.24

전략, 옵저버, 커맨드 패턴

1. 행동 패턴이 필요한 이유1-1. 생성과 구조만으로는 부족하다 객체지향 설계에는 생성(Creational), 구조(Structural), 행동(Behavioral)이라는 세 가지 패턴 분류가 있다. 대부분의 초보 설계자들은 생성과 구조 패턴에 집중하는 경향이 있다. 하지만 객체가 생성되고 관계가 설정된 후, 실제 동작 방식의 유연성을 확보하는 것이 진짜 설계의 완성이다. 행동 패턴은 객체 간의 협력과 메시지 흐름을 설계하는 데 초점을 맞춘다. 이는 단순한 로직 분리 수준을 넘어, 시간에 따라 변화하거나 전략적으로 대체 가능한 행동을 추상화하는 방식으로 시스템의 복잡성을 줄인다. 특히 사용자 인터페이스, 이벤트 처리, 명령 실행 등에서 매우 유용하게 활용된다. 행동 패턴이 없다면 모든 행동은 if-..

컴퓨터공학 2025.05.23

디자인 패턴 총정리

1. 디자인 패턴이란 무엇인가?1-1. 소프트웨어 설계의 재사용 가능한 해법 디자인 패턴은 단순한 코드 템플릿이 아니다. 그것은 반복되는 문제에 대해 검증된 해결책을 구조화한 설계 전략이다. 건축에서 ‘문을 여닫기 위한 구조’, ‘복층 구조를 위한 계단’ 등의 해법이 있는 것처럼, 소프트웨어에도 문제가 생겼을 때 ‘이럴 땐 이렇게 푼다’는 공통된 해결 틀이 필요하다. 이러한 해결 틀을 공식화한 것이 바로 디자인 패턴이다. 실무에서는 특정한 상황에서 “이걸 어떻게 풀지?”보다, “이 문제는 전략 패턴으로 풀 수 있어”라고 생각하는 것이 설계자 수준의 사고다. 이처럼 디자인 패턴은 단순 구현이 아니라 설계 관점의 레벨을 높이는 도구다.1-2. 패턴은 왜 중요한가? 디자인 패턴의 핵심 가치는 공통 언어와 설..

컴퓨터공학 2025.05.22

SRP vs OCP, 실제 적용 사례

1. 이론과 현실 사이의 간극1-1. SRP와 OCP는 언제 충돌하는가 SOLID 원칙은 객체지향 설계에서 이상적인 구조를 안내해주는 나침반 같은 존재다. 그러나 이상은 이상일 뿐, 실무에서는 그 원칙들이 충돌하거나 현실과 괴리되는 순간들이 적지 않다. 특히 SRP(단일 책임 원칙)과 OCP(개방-폐쇄 원칙)은 애초에 지향하는 방향 자체가 다르기 때문에 실제 개발 현장에서는 둘 사이의 갈등이 빈번히 발생한다. SRP는 책임을 명확하게 나누라고 하고, OCP는 기존 코드를 수정하지 말고 확장하라고 요구한다. 그런데 책임을 나누다 보면 단일 클래스가 너무 작아지고, 그 조합을 위한 코드가 중첩되며, 새로운 기능이 들어올 때마다 확장을 고려해야 하는 OCP와 상충하게 된다. 반대로, 확장을 위해 공통된 인터..

컴퓨터공학 2025.05.22

의존성 역전 원칙의 진짜 의미

1. 의존성 역전 원칙(DIP)이란 무엇인가?1-1. 정의와 원칙의 배경 의존성 역전 원칙(Dependency Inversion Principle, DIP)은 로버트 C. 마틴(Robert C. Martin)이 제시한 SOLID 원칙의 마지막 다섯 번째 규칙이다. DIP는 단순한 코드 스타일 가이드가 아니라, 소프트웨어 구조 전체의 설계 방향을 근본적으로 바꾸는 패러다임이다. DIP는 다음 두 가지 핵심 문장으로 요약된다고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다.추상화는 세부 구현에 의존하지 않아야 하며, 세부 구현이 추상화에 의존해야 한다. 여기서 고수준 모듈은 시스템의 비즈니스 규칙을 담은 핵심 로직이고, 저수준 모듈은 DB, 메시지 브로커, 외부 API, 프레..

컴퓨터공학 2025.05.21

Clean Architecture 원칙

1. Clean Architecture란 무엇인가?1-1. 정의와 철학 Clean Architecture는 2012년 Robert C. Martin(‘Uncle Bob’)이 공식적으로 소개한 소프트웨어 설계 아키텍처다. 핵심 개념은 시스템의 핵심 비즈니스 규칙을 외부로부터 완전히 독립시켜, 변화에 유연하면서도 테스트 가능한 구조를 만드는 데 있다. 그는 레이어드 아키텍처나 헥사고날 아키텍처 등 기존 구조의 장점들을 통합해 더 정제된 구조를 제시했으며, Clean Architecture는 클린 코드의 연장선으로서 “변화에 강한 소프트웨어”를 위한 철학으로 자리 잡았다. 이 아키텍처는 단순히 코드를 정리하는 기술이 아니라, 소프트웨어 시스템의 생존력, 확장성, 그리고 협업 구조를 어떻게 설계할 것인가에 대..

컴퓨터공학 2025.05.21

레이어드 아키텍처 구조

1. 레이어드 아키텍처란 무엇인가?1-1. 개념 정의 레이어드 아키텍처(Layered Architecture)는 소프트웨어 시스템을 **기능적 역할에 따라 층(Layer)**으로 나누어 설계하는 가장 전통적이면서도 널리 사용되는 구조다. 일반적으로는 3계층 또는 4계층 구조로 나누며, 각 계층은 고유한 책임을 갖고 상위 계층에 서비스를 제공한다. 각 계층은 아래 계층에만 의존하도록 구성되어 구조적 안정성을 확보할 수 있다.1-2. 구성 계층의 종류 가장 대표적인 구성은 다음과 같다:Presentation Layer (UI)Application Layer (Service)Domain Layer (Business Logic)Infrastructure/Data Layer (Persistence) 필요에 따라 ..

컴퓨터공학 2025.05.20

아키텍처란 무엇인가?

1. 소프트웨어 아키텍처의 정의와 본질1-1. 소프트웨어 아키텍처란 무엇인가? 소프트웨어 아키텍처는 단순한 코드 구조를 넘어서, 시스템을 구성하는 주요 요소와 이들 간의 관계, 그리고 시스템의 설계와 진화를 이끄는 원칙들을 의미한다. 아키텍처는 시스템을 만들기 전 가장 먼저 고려되는 기술적 설계의 골격이다. 이는 기능 구현 이전에 전체 시스템의 형태를 결정짓는 핵심 단계이며, 개발뿐 아니라 운영, 유지보수, 확장성에도 큰 영향을 준다.1-2. 아키텍처의 구성 요소 아키텍처는 컴포넌트, 커넥터, 인터페이스, 제약 조건, 그리고 비기능 요구사항으로 구성된다. 컴포넌트는 기능 단위의 독립 모듈을 말하며, 커넥터는 이들 간의 통신 방식이다. 인터페이스는 컴포넌트와 외부가 상호작용하는 지점을 정의하고, 제약 조건..

컴퓨터공학 2025.05.17