1. Software Architecture란?
소프트웨어 아키텍처는 시스템의 기본 구조와 설계를 정의하는 청사진입니다.
이 아키텍처는 시스템의 구성 요소, 이들 간의 관계, 데이터 흐름 및 상호작용 방식을 명확히 나타냅니다.
2. 왜 Software Architecture가 중요한가?
- 확장성: 새로운 요구사항을 쉽게 추가하거나 시스템을 확장할 수 있습니다.
- 유지보수성: 코드 변경이 필요한 경우 영향을 최소화할 수 있습니다.
- 성능 최적화: 시스템의 병목 현상을 줄이고 효율적으로 동작하게 합니다.
- 팀 협업: 팀 내에서 명확한 역할 분담과 커뮤니케이션을 가능하게 합니다.
- 재사용성: 잘 설계된 모듈은 다른 프로젝트에서도 쉽게 사용할 수 있습니다.
3. Software Architecture 스타일
3.1 계층형 아키텍처 (Layered Architecture)
- 가장 일반적인 구조로, Presentation, Business Logic, Data Access 계층으로 나뉩니다.
- 각 계층은 명확한 책임을 가집니다.
3.2 클라이언트-서버 (Client-Server)
- 클라이언트가 요청을 보내고, 서버가 응답을 처리하는 구조입니다.
- 예: 웹 애플리케이션
3.3 이벤트 기반 아키텍처 (Event-Driven)
- 이벤트를 기반으로 구성 요소 간 비동기 통신을 수행합니다.
- 예: 메시지 큐, Kafka
3.4 마이크로서비스 아키텍처 (Microservices)
- 하나의 애플리케이션을 독립적으로 배포 가능한 작은 서비스들의 모음으로 나눕니다.
- 각 서비스는 독립적으로 개발 및 배포 가능
3.5 서버리스 아키텍처 (Serverless)
- 서버를 직접 관리하지 않고, 클라우드 제공자가 서버 관리와 스케일링을 처리합니다.
- 예: AWS Lambda, Azure Functions
3.6 파이프 & 필터 아키텍처 (Pipes and Filters)
- 데이터를 단계별로 처리하는 시스템 설계.
- 예: 데이터 처리 파이프라인
4. Software Architecture 설계 원칙
4.1 SOLID 원칙
- Single Responsibility: 하나의 클래스는 하나의 책임만 가져야 합니다.
- Open/Closed Principle: 확장에는 열려 있고, 수정에는 닫혀 있어야 합니다.
- Liskov Substitution: 상위 클래스 객체를 하위 클래스 객체로 대체 가능해야 합니다.
- Interface Segregation: 사용하지 않는 메서드를 강요하지 않아야 합니다.
- Dependency Inversion: 고수준 모듈은 저수준 모듈에 의존하지 않아야 합니다.
4.2 DRY 원칙 (Don't Repeat Yourself)
4.3 KISS 원칙 (Keep It Simple, Stupid)
4.4 YAGNI 원칙 (You Aren't Gonna Need It)
5. Software Architecture 설계 도구
- UML (Unified Modeling Language): 시스템 구성 요소 간 관계를 시각적으로 표현
- C4 Model: Context, Container, Component, Code를 통해 시스템 설계
- ERD (Entity-Relationship Diagram): 데이터베이스 설계 시 사용
6. Software Architecture 설계 시 주의점
- 요구사항 분석: 사용자 및 비즈니스 요구사항을 명확히 이해해야 합니다.
- 기술 스택 선택: 시스템 요구사항과 팀의 기술 역량에 적합한 도구 및 프레임워크 선택
- 성능 고려: 예상되는 트래픽과 데이터 처리량을 고려하여 설계
- 보안 강화: 인증, 권한 관리, 데이터 암호화 등 보안 요소 통합
- 확장성: 미래의 요구사항에 대비한 설계
7. 마무리
- 계층형 아키텍처 학습: Spring Framework를 통해 자연스럽게 익힐 수 있었습니다.
- 마이크로서비스와의 비교: 모놀리식 구조를 나누는 데 필요한 경험을 배웠습니다.
- SOLID 원칙의 중요성: 코드를 유지보수하기 훨씬 쉬워졌습니다.
- 아키텍처 선택 고민: 프로젝트 요구사항에 맞는 설계 스타일을 선택하는 것이 어려웠지만, 적절한 문서화와 협업으로 문제를 해결했습니다.