PART 1 · 강의 1/3

소프트웨어
아키텍처란 무엇인가

좋은 소프트웨어의 근간이 되는 아키텍처의 정의, 역할, 중요성을 이해합니다.

01

소프트웨어 아키텍처란?

다양한 전문가들의 정의를 통해 이해하기

"아키텍처는 나중에 바꾸기 어려운 결정들의 집합"

— Martin Fowler

"소프트웨어 아키텍처는 시스템의 기본 조직으로, 구성 요소들, 그들 간의 관계, 환경과의 관계, 그리고 설계와 진화를 이끄는 원칙들을 포함한다."
— IEEE 1471 표준
"아키텍처는 비용을 최소화하면서 요구사항을 충족시키는 구조를 만드는 것이다. 좋은 아키텍처는 변화에 열려있고, 핵심 비즈니스 로직을 보호한다."
— Robert C. Martin (Clean Architecture 저자)
📌 핵심 정의 요약
  • 구조적 결정 — 시스템의 전체적인 형태를 결정하는 높은 수준의 선택
  • 변경 비용 — 나중에 바꾸기 어렵거나 비용이 많이 드는 결정들
  • 품질 속성 — 성능, 확장성, 유지보수성 등 비기능적 요구사항
  • 트레이드오프 — 다양한 요구사항 간의 균형과 절충
02

건축과의 비유

건물 건축과 소프트웨어 아키텍처의 유사점

🏗️

건물 건축

청사진, 구조 설계

↔️
💻

소프트웨어 아키텍처

시스템 설계, 구조 결정

🏠 건물 건축

  • • 기초 공사 후 변경 어려움
  • • 배관, 전기 배선 미리 설계
  • • 내진 설계 (품질 속성)
  • • 증축 고려한 설계

💾 소프트웨어

  • • 데이터베이스 스키마 변경 어려움
  • • 모듈 간 통신 방식 미리 설계
  • • 확장성, 보안 (품질 속성)
  • • 기능 추가 고려한 설계
⚠️ 비유의 한계

건축과 달리 소프트웨어는 더 유연하게 변경 가능합니다. 하지만 그 유연성도 초기 아키텍처가 얼마나 잘 설계되었느냐에 따라 크게 달라집니다. 나쁜 아키텍처는 "기술 부채"가 되어 모든 변경을 어렵게 만듭니다.

03

아키텍처의 역할

왜 아키텍처가 중요한가?

🎯

비즈니스 목표 달성

기술적 결정이 비즈니스 요구사항을 지원하도록 보장

품질 속성 충족

성능, 확장성, 보안, 유지보수성 등 비기능 요구사항

🔄

변화 대응력

새로운 요구사항에 최소 비용으로 대응 가능

아키텍처 없이 개발

  • • "일단 동작하게 만들자"
  • • 스파게티 코드 양산
  • • 변경할 때마다 버그 발생
  • • 개발 속도 점점 느려짐
  • • 결국 전체 재작성 필요

아키텍처 기반 개발

  • • "확장 가능하게 설계하자"
  • • 명확한 모듈 분리
  • • 변경 영향 범위 제한
  • • 개발 속도 유지/향상
  • • 점진적 개선 가능
04

아키텍처 결정 사항들

아키텍트가 결정하는 것들

📦

시스템 분할

모놀리식 vs 마이크로서비스, 모듈 경계 설정

🔗

통신 방식

동기/비동기, REST/gRPC/메시지 큐

💾

데이터 저장

RDB/NoSQL, 캐싱 전략, 데이터 동기화

🛡️

보안 구조

인증/인가, 암호화, 네트워크 보안

📈

확장 전략

수평/수직 확장, 로드 밸런싱, 샤딩

🚀

배포 구조

컨테이너, 오케스트레이션, CI/CD 파이프라인

💡 핵심 포인트

아키텍처 결정은 "나중에 바꾸기 어려운 것"에 집중합니다. 사용하는 라이브러리나 프레임워크의 세부 버전은 아키텍처가 아닙니다. 시스템의 전체적인 형태와 주요 구성 요소 간의 관계가 아키텍처입니다.

SUMMARY

핵심 요약

  • 아키텍처는 시스템의 기본 구조와 나중에 바꾸기 어려운 결정들의 집합이다
  • 품질 속성(성능, 확장성, 유지보수성 등)을 달성하기 위한 구조적 기반이다
  • 좋은 아키텍처는 변화에 열려있고 비즈니스 로직을 보호한다
  • 아키텍처 없는 개발은 기술 부채를 쌓아 결국 전체 재작성이 필요해진다
  • AI 시대에 아키텍처 역량은 더욱 중요해지고 있다