소프트웨어 아키텍처

아키텍처란 무엇인가

meellon 2026. 6. 19. 06:00

학습 목표

소프트웨어 아키텍처의 정의를 설명할 수 있다.

구조를 컴포넌트·커넥터·제약 으로 표현할 수 있다.

아키텍처 결정디자인 결정의 범위를 구분할 수 있다.

트레이드오프가 아키텍처의 핵심임을 설명할 수 있다.

문제 상황

  • 기능은 잘 돌아가는데 변경이 점점 느려진다
    • 결제 방식 하나 바꾸려면 여러 모듈·DB·배치를 동시에 수정
    • 테스트 범위를 예측하기 어렵고, 배포 리스크가 커진다
  • "코드는 있는데 구조가 없다"
    • 패키지·폴더는 있지만 경계가 없음
    • 레이어를 어기는 호출, 순환 의존이 쌓인다
  • 회의마다 다른 답이 나온다
    • 개발은 속도, 운영은 안정성, 비즈니스는 출시 일정
    • 공통 기준 없이 논쟁만 반복된다

이런 문제는 클래스 하나 고치는 수준이 아니다. 시스템 구조와 설계 결정 수준에서 풀어야 한다. 그게 아키텍처다.

1. 소프트웨어 아키텍처의 정의

여러 정의가 있지만 공통 분모는 같다.

  • 구조(Structure)
    • 시스템을 이루는 요소와 그 관계
  • 설계 결정(Design Decision)
    • 왜 이 구조를 선택했는지, 무엇을 포기했는지
  • 품질 속성(Quality Attribute)
    • 성능·가용성·보안 등 목표

Bass et al. (Software Architecture in Practice) 는 다음과 같이 정의한다.

소프트웨어 시스템의 구조를 구성하는 요소들, 이들 간의 관계, 그리고 이 구조와 관계를 안내하는 설계·진화 원칙

 

Richards & Ford (Fundamentals of Software Architecture) 는 아키텍처를 다음 다섯 가지로 본다.

요소 내용
Structure 컴포넌트·관계
Architecture characteristics 품질 속성 (가용성, 확장성 등)
Architecture decisions 바꾸기 어려운 결정
Design principles 팀이 따를 가이드라인
Environment 배포·조직·규제 등 맥락
  • 동작하는 코드 ≠ 좋은 아키텍처
    • 프로토타입은 돌아가도, 운영·변경·확장을 견디지 못할 수 있다
    • 아키텍처는 시간이 지나도 유지되는 구조를 다룬다

2. 구조: 컴포넌트·커넥터·제약

구조는 "박스와 화살표"가 아니라 세 가지로 나눠 생각하면 명확하다.

컴포넌트 (Component)

  • 계산·상태를 담당하는 단위
  • 예: API 서버, 주문 서비스, PostgreSQL, Redis, Kafka

커넥터 (Connector)

  • 컴포넌트 간 통신·호출·데이터 전달 메커니즘
  • 예: HTTP REST, gRPC, 메시지 큐, JDBC

제약 (Constraint)

  • 구조를 제한하는 규칙
  • 예: "주문 DB는 Order 서비스만 접근", "동기 호출은 3 hop 이내"

  • 같은 컴포넌트라도 커넥터가 다르면 아키텍처가 달라진다
    • REST 동기 호출 vs 이벤트 비동기 — 장애 전파·일관성·지연이 다름
  • 제약을 문서화하지 않으면 시간이 지나며 침묵의 규칙만 남는다

3. 아키텍처 결정 vs 디자인 결정

오리엔테이션에서 개요를 봤다. 여기서 범위를 구체화한다.

  아키텍처 결정 디자인 결정
범위 시스템·서비스 전체 모듈·클래스·함수
변경 비용 높음 (재배포·마이그레이션) 상대적으로 낮음
모놀리스 vs MSA, RDB vs NoSQL, 동기 vs 이벤트 클래스 분리, 패턴 선택, 네이밍
시점 초기에 신중히, ADR로 기록 구현 중 반복 개선

 

  • 아키텍처 결정이 디자인을 제한한다
    • MSA를 선택하면 서비스 간 API 계약·분산 트랜잭션이 디자인 이슈가 된다
    • 레이어드 아키텍처를 선택하면 Presentation이 Persistence를 직접 호출하면 안 된다
  • 디자인이 아키텍처를 깨뜨릴 수 있다
    • "잠깐만 이 서비스에서 다른 DB 직접 읽자" → 경계 붕괴
    • 작은 위반이 쌓이면 아키텍처가 명목상만 남는다
  • 실무에서의 구분 기준 (Richards & Ford)
    • 아키텍처적 중요도: 이 결정이 품질 속성·구조에 얼마나 영향을 주는가
    • 변경 난이도: 되돌리는 비용이 큰가
    • 둘 다 높으면 아키텍처 결정으로 취급하고 ADR을 남긴다

4. 트레이드오프

아키텍처에 최선(best) 은 없고 적합(fit) 만 있다.

  • 모든 품질 속성을 동시에 극대화할 수 없다
    • 강한 일관성 vs 가용성 (CAP)
    • 개발 속도 vs 운영 안정성
    • 단순한 모놀리스 vs 독립 배포 가능한 MSA
  • 트레이드오프를 명시하지 않으면
    • 나중에 "왜 이렇게 됐지?"만 남는다
    • 기술 부채가 의도 없는 부채가 된다
선택 얻는 것 잃는 것
모놀리스 단순 배포·트랜잭션 팀·배포 독립성
MSA 독립 확장·배포 분산 복잡도·운영 비용
동기 REST 단순한 호출 흐름 연쇄 장애·지연 누적
이벤트 기반 느슨한 결합 eventual consistency

  • 초기에 구조를 잡지 않으면 변경 비용이 기하급수적으로 오른다
    • 기능 추가는 선형인데, 결합도는 누적된다
    • 아키텍처 작업은 "나중에"가 아니라 비용이 가장 쌀 때 하는 것

5. 아키텍처가 다루는 범위

코드 구조만이 아니다. 오리엔테이션의 범위 다이어그램을 전제로 정리한다.

  • 배포 단위: JAR 하나인지, K8s Pod 여러 개인지
  • 데이터 소유권: 서비스마다 DB를 갖는지, 공유 스키마인지
  • 통신 방식: 동기 API인지, 이벤트 스트리밍인지
  • 운영·관측: 로그·메트릭·트레이스를 어디서 수집하는지
  • 개발자가 매일 쓰는 디자인 패턴(Singleton, Factory 등)은 아키텍처 스타일(레이어드, MSA)과 다른 층위다
    • 패턴은 디자인 결정에 가깝다
    • 스타일 선택은 아키텍처 결정에 가깝다

해당 내용은 Fundamentals of Software Architecture (Mark Richards, Neal Ford) 및 Software Architecture in Practice, 4/E (Bass, Clements, Kazman) 의 내용을 기반으로 합니다.

'소프트웨어 아키텍처' 카테고리의 다른 글

헥사고날과 클린 아키텍처  (3) 2026.06.23
레이어드 아키텍처  (0) 2026.06.22
아키텍처 품질 속성  (0) 2026.06.21
이해관계자와 Concern  (0) 2026.06.20
소프트웨어 아키텍처 오리엔테이션  (0) 2026.06.17