처음에는 API 만드는 스타일만 확인하려 했는데 범용적인 아키텍처 패턴도 알아야 하겠더라.
https://youtu.be/f6zXyq4VPP8?feature=shared
1. Layered Architecture (계층형 아키텍처)
특징:
- 계층별 역할: 애플리케이션을 계층으로 분리하여 각 계층이 특정 역할을 담당합니다.
- 프레젠테이션 계층: 사용자 인터페이스
- 애플리케이션 계층: 비즈니스 로직
- 도메인 계층: 비즈니스 규칙
- 인프라 계층: 데이터베이스 및 외부 시스템과의 통합
장점:
- 코드 구조가 명확하여 유지보수가 쉽습니다.
- 각 계층을 독립적으로 개발 및 테스트할 수 있습니다.
단점:
- 계층 간의 의존성이 복잡해질 수 있습니다.
- 성능 저하의 원인이 될 수 있습니다.
사용 사례:
- 전통적인 엔터프라이즈 애플리케이션
- CRUD 기반 애플리케이션
2. Event-Driven Architecture (이벤트 기반 아키텍처)
특징:
- 이벤트 생성 및 소비: 시스템은 이벤트를 생성하고, 이 이벤트에 반응하는 방식으로 동작합니다.
- 느슨한 결합: 이벤트 발행자와 소비자가 느슨하게 결합되어 있습니다.
- 비동기 처리: 이벤트 기반으로 비동기 처리를 할 수 있습니다.
장점:
- 확장성과 유연성이 높습니다.
- 독립적인 서비스가 이벤트를 통해 상호작용할 수 있습니다.
단점:
- 이벤트 흐름을 추적하기 어려울 수 있습니다.
- 디버깅이 복잡해질 수 있습니다.
사용 사례:
- 실시간 데이터 처리 시스템
- 분산 시스템 및 마이크로서비스
3. Monolithic Architecture (모놀리식 아키텍처)
특징:
- 단일 코드베이스: 애플리케이션이 하나의 코드베이스로 관리됩니다.
- 모든 기능이 하나로 통합: 모든 기능이 하나의 단위로 배포되고 실행됩니다.
장점:
- 개발 및 배포가 단순합니다.
- 초기에 개발이 빠릅니다.
단점:
- 애플리케이션 규모가 커질수록 유지보수가 어렵습니다.
- 한 부분의 변경이 전체 시스템에 영향을 미칠 수 있습니다.
사용 사례:
- 소규모 애플리케이션
- 초기 스타트업 제품
4. Microkernel Architecture (마이크로커널 아키텍처)
특징:
- 핵심 시스템과 플러그인 모듈: 핵심 시스템 기능과 독립적인 플러그인 모듈로 구성됩니다.
- 확장성: 플러그인 모듈을 통해 기능을 쉽게 확장할 수 있습니다.
장점:
- 시스템을 쉽게 확장하고 유지보수할 수 있습니다.
- 핵심 기능과 확장 기능을 분리하여 관리할 수 있습니다.
단점:
- 플러그인 모듈 간의 통신 및 관리가 복잡할 수 있습니다.
- 초기 설계와 구현이 어렵습니다.
사용 사례:
- 확장 가능한 애플리케이션
- IDE(통합 개발 환경) 및 플러그인 시스템
5. Microservices Architecture (마이크로서비스 아키텍처)
특징:
- 독립적인 서비스: 각 기능이 독립적인 서비스로 분리되어 관리됩니다.
- 서비스 간 통신: REST, gRPC 등의 프로토콜을 사용하여 서비스 간 통신을 수행합니다.
장점:
- 독립적인 배포 및 확장이 가능합니다.
- 각 서비스가 독립적으로 개발 및 운영될 수 있습니다.
단점:
- 서비스 간의 통합과 관리가 복잡해질 수 있습니다.
- 분산 시스템으로 인해 추가적인 인프라 관리가 필요합니다.
사용 사례:
- 대규모 엔터프라이즈 애플리케이션
- 클라우드 네이티브 애플리케이션
기타 주요 아키텍처 패턴
6. Service-Oriented Architecture (SOA)
특징:
- 서비스 재사용: 서비스는 독립적이며 재사용 가능하도록 설계됩니다.
- 표준 프로토콜: SOAP, REST 등을 사용하여 서비스 간 통신을 수행합니다.
장점:
- 서비스 재사용을 통해 개발 효율성을 높일 수 있습니다.
- 플랫폼 독립적인 통합이 가능합니다.
단점:
- 서비스 간의 통합이 복잡할 수 있습니다.
- 성능 저하가 발생할 수 있습니다.
사용 사례:
- 엔터프라이즈 시스템 통합
- 이기종 시스템 통합
7. Serverless Architecture
특징:
- 서버 관리 불필요: 서버 인프라 관리가 필요 없습니다.
- 이벤트 기반 실행: 함수가 이벤트에 반응하여 실행됩니다.
장점:
- 비용 효율적입니다(사용한 만큼만 지불).
- 스케일링이 자동으로 이루어집니다.
단점:
- 장기 실행 작업에 적합하지 않습니다.
- 벤더 종속성이 발생할 수 있습니다.
사용 사례:
- 짧고 빈번한 작업 처리
- 이벤트 기반 애플리케이션
API는 여러 종류로 만들어도 이런 아키텍처는 여러 개를 가지고 가면 안 될 것 같았다.
너무 복잡하지 않나?
그런데 불가능하지 않더라.
아키텍처 패턴을 선택할 때, 하나의 주요 아키텍처 패턴을 중심으로 설계하는 것이 일반적이지만, 여러 패턴을 혼합하여 사용할 수도 있습니다. 다양한 패턴을 조합하면 각 패턴의 장점을 취하면서 단점을 보완할 수 있기 때문입니다. 특히, 복잡하고 대규모 애플리케이션에서는 이러한 혼합이 더욱 유용할 수 있습니다. 아래에 각각의 혼합 가능성을 설명하겠습니다.
1. Layered Architecture와 다른 패턴의 혼합
- Layered + Event-Driven: 기본적으로 계층형 아키텍처를 사용하되, 각 계층 간의 통신을 이벤트 기반으로 처리하여 느슨한 결합을 유지할 수 있습니다.
- Layered + Microservices: 계층형 아키텍처를 사용하여 각 서비스(마이크로서비스)가 자체적인 계층 구조를 가질 수 있습니다.
2. Event-Driven Architecture와 다른 패턴의 혼합
- Event-Driven + Microservices: 마이크로서비스 간의 통신을 이벤트 기반으로 처리하여 확장성과 유연성을 높일 수 있습니다.
- Event-Driven + Microkernel: 플러그인 모듈 간의 통신을 이벤트 기반으로 처리하여 모듈 간의 독립성을 유지할 수 있습니다.
3. Monolithic Architecture와 다른 패턴의 혼합
- Monolithic + Layered: 단일 코드베이스 내에서 계층형 아키텍처를 사용하여 코드 구조를 명확히 할 수 있습니다.
- Monolithic + Event-Driven: 단일 애플리케이션 내에서 이벤트 기반 처리를 도입하여 모듈 간의 느슨한 결합을 유지할 수 있습니다.
4. Microkernel Architecture와 다른 패턴의 혼합
- Microkernel + Event-Driven: 플러그인 모듈 간의 통신을 이벤트 기반으로 처리하여 확장성을 높일 수 있습니다.
- Microkernel + Microservices: 핵심 시스템은 마이크로커널 아키텍처로 설계하고, 확장 기능은 마이크로서비스로 구현할 수 있습니다.
5. Microservices Architecture와 다른 패턴의 혼합
- Microservices + Event-Driven: 마이크로서비스 간의 통신을 이벤트 기반으로 처리하여 확장성과 유연성을 높일 수 있습니다.
- Microservices + Layered: 각 마이크로서비스가 자체적인 계층 구조를 가질 수 있습니다.
실용적인 예시
- e-commerce 플랫폼:
- Microservices + Event-Driven: 개별 마이크로서비스(사용자 관리, 제품 관리, 주문 관리 등) 간의 통신을 이벤트 기반으로 처리하여 확장성과 유연성을 높임.
- Layered Architecture: 각 마이크로서비스 내에서 계층형 구조를 사용하여 코드의 명확성과 유지보수성을 높임.
- 실시간 데이터 처리 시스템:
- Event-Driven + Microservices: 데이터 처리와 분석을 여러 마이크로서비스로 분리하고, 이벤트 스트림을 통해 데이터를 전달하여 확장성과 실시간 처리를 지원.
- Microkernel: 데이터 처리 핵심 기능은 마이크로커널 아키텍처로 구현하고, 다양한 데이터 분석 플러그인을 추가하여 기능 확장.
오, 여기까지 보니까 더욱 섞어 쓰는 것도 나쁘지 않아 보인다.
'개발 상식 시리즈 > 백엔드 상식' 카테고리의 다른 글
백엔드 30일 완성을 읽고 배운 것(60페이지까지) (0) | 2024.05.18 |
---|---|
백엔드 30일 완성을 읽고 배운 것(30페이지까지) (0) | 2024.05.17 |
주요 API 아키텍처 스타일 (0) | 2024.05.16 |