24.11.29 TIL Software Architecture

신성훈·2024년 11월 29일

TIL

목록 보기
89/162

1. Software Architecture란?

소프트웨어 아키텍처는 시스템의 기본 구조와 설계를 정의하는 청사진입니다.
이 아키텍처는 시스템의 구성 요소, 이들 간의 관계, 데이터 흐름 및 상호작용 방식을 명확히 나타냅니다.

2. 왜 Software Architecture가 중요한가?

  1. 확장성: 새로운 요구사항을 쉽게 추가하거나 시스템을 확장할 수 있습니다.
  2. 유지보수성: 코드 변경이 필요한 경우 영향을 최소화할 수 있습니다.
  3. 성능 최적화: 시스템의 병목 현상을 줄이고 효율적으로 동작하게 합니다.
  4. 팀 협업: 팀 내에서 명확한 역할 분담과 커뮤니케이션을 가능하게 합니다.
  5. 재사용성: 잘 설계된 모듈은 다른 프로젝트에서도 쉽게 사용할 수 있습니다.

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 원칙의 중요성: 코드를 유지보수하기 훨씬 쉬워졌습니다.
  • 아키텍처 선택 고민: 프로젝트 요구사항에 맞는 설계 스타일을 선택하는 것이 어려웠지만, 적절한 문서화와 협업으로 문제를 해결했습니다.
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글