소프트웨어 디자인, 설계
아키텍쳐 설계 원리
- 클린 아키텍쳐 설계를 준수해서 이론적인 부분과 간단한 예시들을 기술합니다.
1. Domain-Driven Design (DDD)
개요
복잡한 비즈니스 로직을 명확히 분리하여 도메인 모델을 중심으로 설계하는 패턴.
엔티티(Entity), 값 객체(Value Object), 애그리게이트(Aggregate), 리포지토리(Repository), 서비스(Service) 개념을 활용.
기술적 설명
엔티티(Entity): 고유한 식별자를 가지는 객체.
값 객체(Value Object): 불변성을 가지며, 개별적으로 식별되지 않는 객체.
애그리게이트(Aggregate): 여러 개의 엔티티와 값 객체를 하나의 트랜잭션 단위로 묶는 개념.
리포지토리(Repository): 영속성(Persistence) 계층을 관리하는 패턴.
도메인 서비스(Domain Service): 엔티티나 값 객체가 처리하기 어려운 비즈니스 로직을 포함하는 서비스.
적용 사례
중대형 규모의 기업 시스템 (예: 은행, 보험, ERP 시스템)에서 사용.
// 엔티티 예제
class Order {
constructor(id, customer, items) {
this.id = id
this.customer = customer
this.items = items
}
}
2. Model View Controller (MVC)
개요
사용자 인터페이스와 비즈니스 로직을 분리하는 대표적인 아키텍처 패턴.
Model(데이터 및 비즈니스 로직), View(사용자 인터페이스), Controller(요청 처리 및 모델과 뷰 연결)로 구성.
기술적 설명
Model: 애플리케이션의 데이터와 비즈니스 로직을 담당.
View: 사용자에게 데이터를 출력하는 역할.
Controller: 사용자의 입력을 처리하고 Model과 View를 연결.
적용 사례
소규모~중규모 웹 애플리케이션 (예: 블로그, 쇼핑몰, 관리 시스템)에서 사용.
// Express 기반 MVC 예제
const express = require('express')
const app = express()
// Model
const users = [{ id: 1, name: 'Alice' }]
// Controller
app.get('/users', (req, res) => {
res.json(users)
})
// View (API 기반이라 JSON 응답)
app.listen(3000, () => console.log('Server running'))
3. Microservices
개요
단일 애플리케이션을 여러 개의 독립적인 서비스로 나누어 운영하는 아키텍처 패턴.
각 서비스는 독립적인 데이터 저장소를 가지고 있으며 API로 통신.
기술적 설명
서비스 분리: 기능별로 독립적인 서비스로 개발.
데이터베이스 분리: 각 서비스가 개별적으로 데이터를 관리.
API Gateway: 클라이언트 요청을 적절한 서비스로 라우팅.
적용 사례
대규모 서비스 (예: Netflix, Uber, Amazon)에서 사용.
// API Gateway 예제
const express = require('express')
const axios = require('axios')
const app = express()
app.get('/orders', async (req, res) => {
const orders = await axios.get('http://order-service/orders')
res.json(orders.data)
})
app.listen(4000, () => console.log('API Gateway running'))
4. Serverless Architecture
개요
서버 관리 없이 클라우드 서비스 제공자의 기능(Function)으로 애플리케이션을 운영하는 방식.
기술적 설명
FaaS (Function as a Service): AWS Lambda, Azure Functions 등을 활용.
이벤트 기반 실행: HTTP 요청, 메시지 큐, 배치 작업 등 특정 이벤트 발생 시 실행.
적용 사례
스타트업, 빠른 프로토타이핑, 이벤트 기반 서비스 (예: IoT, 실시간 분석)에서 사용.
// AWS Lambda 예제
exports.handler = async (event) => {
return { statusCode: 200, body: 'Hello Serverless!' }
}
5. Message Queue / Streams
개요
비동기 메시지 큐를 활용하여 서비스 간 통신을 수행하는 패턴.
기술적 설명
Producer: 메시지를 생성하여 큐에 넣음.
Consumer: 큐에서 메시지를 가져와 처리.
Broker: 메시지를 관리하는 시스템 (예: Kafka, RabbitMQ).
적용 사례
비동기 이벤트 처리, 대규모 트래픽 분산 (예: 로그 처리, 실시간 스트리밍)에서 사용.
이 패턴들을 활용하면 확장 가능하고 유지보수하기 쉬운 아키텍처를 설계할 수 있습니다. 🚀
이론적으로는 그렇다는 겁니다 하하 .....
참고 자료