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 시대에 아키텍처 역량은 더욱 중요해지고 있다