<아키텍처>
- 시스템 구성과 동작원리 그리고 시스템의 구성환경 등을 설명하는 설계도
- 최적화
- 총체적이고 종합적이고 상세하게 개발을 준비하는 것
<시스템 아키텍처>
- 하드웨어와 소프트웨어 아키텍처를 기반으로
시스템이
서비스를 제공
하기 위한 아키텍처
- 스토리지, 서버, 네트워크의 요소들을
어떻게 배치키는지에 따라
시스템 아키텍처 종류가 나뉜다.
- 웹 애플리케이션(서비스)이 돌아가기 위해서는 여러 아키텍처가 통신을 한다.
- 시스템의 구조와 성능 및 신뢰도 등에 영향을 미치는 중요한 요소
- 아키텍처를 이해하면 코드를 더욱 체계적으로 작성할 수 있고, 장기적으로는 시스템 유지 보수와 확장을 용이하게 할 수 있다.
- 시스템의 전체적인 구조를 정의하고 각 요소 간의 관계와 설계 지침을 세우는 데 초점을 둔다.
<소프트웨어 아키텍처 원칙>
- 소프트웨어 설계 및 구현 과정에서 발생하는 복잡성을 관리하고, 유지 보수와 확장을 용이하게 해주는 지침
- 관심사 분리, 모듈화 , 추상화, 캡슐화 등이 있음
-- 관심사 분리(Separation of Concerns) :
소프트웨어 시스템을 독립된 부분으로 나누어 각 부분이 특정 관심사에만 집중하도록 하는 설계 원칙
ex> UI 로직과 비즈니스 로직을 분리, 환경 설정과 애플리케이션 코드를 분리..
-- 모듈화(Modularity) :
시스템을 여러 모듀로 분할하고, 각 모듈이 특정 기능을 담당하도록 하는 방식
느슨한 결합(Coupling)과 높은 응집도(Cohesion) : 모듈 간의 결합도 낮추고 각 모듈 내부의 응집도 높이
ex> 전자상거래 시스템 => 제품 관리, 주문 처리, 결제 등으로 모듈화
-- 추상화와 캡슐
<아키텍처 선택시 중요한 고려 사항>
- 시스템의 규모와 복잡도
- 팀의 기술 역량
- 예산과 리소스
- 변경 가능성
- 배포와 운영의 편의
First.
- 모노리틱 아키텍처와 RESTful API 설계
- 클린 아키텍처 익히기
Second.
- 마이크로서비스, 이벤트 기반 아키텍처, 서버리스 아키텍처
- AWS, Kafka, Docker 익히기
Third.
- CQRS, 분산 아키텍처, 서비스 메시 익히기
- 성능 최적화와 확장성 설계
1. 모노리틱 아키텍(Monolithic Architecture)
- 애플리케이션을 하나의 단일 코드베이스로 개발, 배포하는 소프트웨어 설계 방식
- 애플리케이션의 모든 구성 요소가 하나의 통합된 코드베이스와 실행 환경에서 함께 작동
- 많은 레거시 시스템이 이 구조로 설계
- 계층적 설계( Presesntation, Business, Data Access Layers)
- 특징 :
-- 단일 코드베이스 구성
-- 단일 배포 단위(애플리케이션을 실행하기 위해 하나의 실행 파일만 있으면 됨)
-- 강한 결합(모듈들이 서로 밀접하게 연결)
-- 단순한 개발 초기(상대적으로 접근 쉬움, 초기 프로토타입 개발시 유용함)
- 장점:
-- 쉬운 개발 및 디버깅
-- 일관된 성능
-- 간단한 배포 : 애플리케이션 한 번에 빌드하고 배포
- 단점:
-- 확장성 부족 : 특정 기능만 확장하기 어려움
-- 유지 보수의 어려움 : 변경 사항이 전체 시스템에 영향을 미칠 가능성이 있음
-- 배포의 위험성 : 재배포시 전체 시스템 중단해야 함
-- 기술 스택 제한 : 일부에서 더 적합한 기술만 변경 불가
- 알아야 할 도구 : 서버 애플리케이션 프레임워크(Spring Boot, Django, Express.js)
2. RESTful API 아키텍처 & GraphQL
- REST는 표준화된 설계 방식, GraphQL은 유연한 데이터 쿼리 제공
- REST API 설계 원칙 (HTTP Method, 상태 코드 , HATEOAS)
- GraphQL 스키마 설계 및 Resolver 구현
- API 버전 관리와 보안 (OAuth2, JWT)
- 알아야 할 도구
-- API Gateway (Kong, AWS API Gateway)
-- REST 및 GraphQL 서버 구현 라이브러리 ( Express.js, Apollo Server )
3. 클린 아키텍처 (Clean Architecture)
- 애플리케이션의 비즈니스 로직을 외부 의존성(API, 데이터베이스 등)으로부터 격리하는 구조
- 비즈니스 로직을 외부 의존성으로부터 격리해 유연성과 테스트 가능성을 제공
- 아키텍처가 각각 의존성이 높게 설계되어 있다면 여러 개의 아키텍처를 통합하는 것이 쉽지 않다
- 아키텍처부터 재구축해야 한다면 리소스가 많이 투여되어야 하거나 통합 자체가 되지 않을 수도 있다
- 만약 의존성이 줄어든 클린 아키텍처로 설계되어있었다면 기능이 추가 및 서비스가 통합될 때마다 필요한 아키텍처만 뗐다 붙였다 하기 용이할 수 있다
- 중대형 프로젝트에서 코드 구조를 체계적으로 유지 가능
- 특징
-- 도메인 중심 설계 (Domain-Driven Design, DDD)
-- Ports and Adapters(Hexagonal Architecture)
-- 계층 간의 의존성 규칙 (안쪽 계층은 바깥 계층을 참조하지 않음)
- 알아야 할 도구
-- 클린 아키텍처 템플릿
- 구성
-- 안쪽 : 엔티티(비즈니스 로직)
-- 중간 : 유스케이스
-- 바깥쪽 : 인터페이스 어댑터 및 외부 프레임 워크
- 활용 사례
-- 장기적으로 유지보수가 필요한 프로젝트
-- 다양한 UI나 데이터베이스를 쉽게 교체해야 하는 경우
- 장점
-- 테스트 가능성이 뛰어나고 코드 재사용성을 높임
-- 유지보수 및 확장이 용이
- 단점
-- 초기 설계가 복잡하고 구현에 시간이 걸림
4. 마이크로 서비스 아키텍처( MicroService Architecture )
마이크로 서비스 아키텍처(MSA)
- 기능별로 독립적인 서비스로 나누어 관리 - 시스템을 여러 개의 작은 서비스로 나누어 관리하는 설계 방식 - 애플리케이션을 여러 개의 독립적인 서비스로 나누어 개발, 배포, 운영하는 아
kimyhg.tistory.com
5. 이벤트 기반 아키텍처 ( Event-Driven Architecture )
- 애플리케이션이 이벤트(데이터의 상태 변화) 중심으로 작동하도록 설계
- 이벤트의 상태 변화에 대응하는 소프트웨어 설계 패턴 / 이벤트 : 시스템의 외부 또는 외부에서 시스템에 영향을 주는 상황들(ex> 사용자가 로그인 버튼을 누른다, 문서를 열람한다, 구매한다. 등)
- 고성능 및 비동기 처리가 요구되는 시스템에 적합
- 시스템 간의 느슨한 결합과 실시간 데이터 처리가 가능
- 비동기 작업 처리 방식(Publish/Subscribe, Message Queue)을 알아야 함
- 알아야 할 도구
-- 메시징 플랫폼 ( Apache Kafka, Amazon SNS/SQS )
-- 클라우드 이벤트 서비스(GCP Pub/Sub, AWS EventBridge)
- 활용 사례 :
-- 실시간 알림 시스템 ( Slack, WhatsApp )
-- IoT 애플리케이션 ( 스마트 홈 기기 )
-- 주식 거래 시스템 ( 실시간 거래 데이터 전송 )
- 구조 :

-- 프로듀서(이벤트를 생성)와 컨슈머(이벤트를 처리)로 구성
-- 메시지 브로커 (Kafka, RabbitMQ )를 사용해 비동기적으로 통신 (이벤트 대기열을 관리하는 이벤트 중재자(Broker) )
-- ex> 결제 서비스가 결제 이벤트를 처리하고 결제 완료 이벤트를 발생시키면, 다시 재고 관리 서비스로 이벤트가 전달되어 재고를 업데이트하는
- 장점 :
-- 비동기 작업으로 높은 확장성과 반응성 제공
-- 느슨한 결합으로 변경에 유연
-- 실시간성 시스템 (빠르게 반응해야 하는 시스템)
- 단점 :
-- 디버깅과 문제 추적이 어려움
-- 메시지 처리 실패 시 복구 로직이 필요
-- 비동기 처리하므로 이벤트 순서 보장 어려움 --> 이벤트를 새로 받을지, 무시할지, 에러 처리를 할지 고려해야 함
6. 서버리스 아키텍처 ( Serverless Architecture )
- 서버 관리 없이 클라우드 플랫폼의 이벤트 기반 함수(FaaS, Functions as a Service)를 통해 애플리케이션 실행
- 코드가 이벤트에 의해 실행
- AWS Lambda, Google Cloud Functions 등이 대표적
- 변동적인 트래픽: 사용량이 예측하기 어려운 경우
- 비용 효율성: 실제 실행 시간만큼만 비용을 지불하고 싶은 경우
- 비용 효율적이며 특정 이벤트 기반 작업에 유용
- FaaS(Function as a Service) 개념과 AWS Lambda, Google Cloud Functions 사용법
- 서버리스와 데이터베이스의 결합(DynamoDB, Firebase)
- 서버리스 배포와 모니터링 방법
- 알아야 할 도구 :
-- AWS Lambda, Azure Functions
-- 서버리스 프레임워크(Serverless Framework, AWS SAM)
- 활용 사례:
-- 데이터 변환 작업(ETL 파이프라인)
-- 간단한 API 서버
-- 비정기적 트리거 작업(예: 보고서 생성)
- 장점 :
-- 인프라 관리 불필요
-- 필요할 때만 실행되므로 비용 효율적
- 단점 :
-- 클라우드 제공 업체에 의존적
-- 긴 실행 시간이 필요한 작업에는 부적합
7. CQRS ( Command and Query Responsibility Segregation )
- 쓰기 작업(Command)와 읽기 작업(Query)을 분리하여 각각 다른 모델로 처리
- 읽기와 쓰기가 명확히 분리되는 경우, 읽기 작업 최적화가 중요한 시스템
- 대규모 시스템에서 성능 최적화와 유연성을 제공
- 쓰기 모델과 읽기 모델의 분리 방법, 이벤트 소싱과의 조합 설계, 데이터 동기화 전략
- 알아야 할 도구 :
-- 이벤트 스토어(Event Store DB)
-- 데이터베이스(Elasticsearch, MongoDB)
- 활용 사례 :
-- 대규모 데이터 조회가 많은 시스템
-- 고성능 요구가 있는 금융 거래 시스템
-- 이벤트 소싱과 함께 사용되는 애플리케이션
- 특징 :
-- 쓰기와 읽기에 최적화된 데이터 모델 사용 가능
- 장점 :
-- 읽기 성능과 쓰기 성능을 개별적으로 최적화 가능
- 단점 :
-- 설계가 복잡하며, 데이터 동기화가 필요함
-- 데이터 모델이 두 개 필요(쓰기 모델, 읽기 모델)
8. 분산 아키텍처 ( Distributed Architecture )
- 애플리케이션의 여러 구성 요소를 물리적으로 분산된 시스템에서 실행
- 대규모 시스템의 핵심 아키텍처로 높은 가용성과 확장성을 보장
- 데이터 분산과 일관성 정리 (CAP 이론)
- 분산 트랜잭션과 Saga 패턴
- 서비스 간의 로드 밸런싱과 장애 복구
- 알아야 할 도구
-- 데이터베이스(Spanner, Cassandra)
-- 분산 트레이싱 (Jaeger, Zipkin)
- 활용 사례 :
-- 클라우드 기반 애플리케이션 ( ex> AWS, Google Cloud )
-- 글로벌 사용자 기반의 애플리케이션
- 장점 :
-- 높은 가용성과 확장성 : 장애 시에도 시스템을 지속적으로 운영 가능
-- 다양한 지역의 사용자에게 낮은 지연을 제공
- 단점 :
-- 분산 시스템의 복잡성 (데이터 일관성 문제, 네트워크 지연 등)
-- 네트워크 지연, 데이터 일관성 문제 ( 캡 정리 - Consistency, Availability, Partition tolerance)를 해결해야 함
-- 복잡한 모니터링과 디버깅 도구 필요
9. 서비스 메시 아키텍처 ( Service Mesh Architecture)
- 마이크로서비스 간 통신, 보안, 트래픽 관리가 점점 중요해짐
- 서비스 메시 도구 (Istio, Linkerd)
- 트래픽 라우팅, 로드 밸런싱 설정
- 보안 인증 ( MTLS, TLS )
- 알아야 할 도구 :
-- Istio, Consul
-- 오브저버빌리티 도구 ( Prometheus, Grafana )
10. 헥사고날 아키텍처 (Hexagonal Architecture , Ports and Adapters Architecture)
- 애플리케이션 코어를 외부 의존성으로부터 격리 / 외부 의존성 : ex) 데이터베이스, UI )
- 외부 의존성을 제거하고 비즈니스 로직을 테스트하기 용이한 구조
- 장기적으로 안정적이고 유지보수가 쉬움
- 어댑터 설계(ex> 데이터베이스 어댑터, API 어댑터)
- 비즈니스 로직 중심의 설계
- 언어별 클린 아키텍처 라이브러리 활
- 활용 사례 :
-- 테스트 가능성을 높이고 싶은 프로젝트
-- 비즈니스 로직을 외부 의존성으로부터 격리하고 싶은 경우
- 테스트 주도 개발(TDD) : 비즈니스 로직을 독립적으로 테스트하고 싶은 경우
- 특징 :
-- 코어 애플리케이션은 독립적으로 테스트 가능
- 장점 :
-- 유지보수가 쉽고 테스트 친화적
-- 유연한 구조 : 새로운 외부 시스템(API, DB 등) 을 쉽게 연결할 수 있음
- 단점 :
-- 초기에 설계 복잡도가 높음
-- 경험이 부족한 팀에는 낯설 수 있음
11. 그 밖의 아키텍처
- 계층형 아키텍처(Layered Architecture)
- 플러그인 아키텍처(Plugin Architecture)
- 서비스 지향 아키텍처(Service-Oriented Architecture, SOA)
- Peer to Peer(P2P) 아키텍처
- Pipe and Filter 아키텍처
- Pipeline 아키텍처
- 마이크로커널 아키텍처(microkernel architecture)
- 공간 기반 아키텍처(space-based architecture)
- 공유 데이터 아키텍처(Shared Data Architecture)
- 리액티브 아키텍처 (Reactive Architecture)
- 객체 기반 아키텍처 (Object-Oriented Architecture)
- 블록체인 아키텍처
- 플랫폼 아키텍처(Platform Architecture) : 여러 애플리케이션이나 서비스를 통합해 작동하도록 설계된 플랫폼 중심의 구조
'소프트웨어 아키텍처' 카테고리의 다른 글
DDD(Domain Driven Design) (0) | 2024.12.22 |
---|---|
RESTful API (1) | 2024.11.29 |
마이크로 서비스 아키텍처(MSA) (1) | 2024.11.26 |