1. 목표

개요의 목표는 다음 4가지를 이해하는 것

  1. 소프트웨어 아키텍처란 무엇인가
  2. 왜 중요한가
  3. 소프트웨어 아키텍처의 일반적인 정의
  4. 소프트웨어 개발 전체 과정에서 어디에 위치하는가

2. 소프트웨어 아키텍처를 이해하는 직관적 비유

모든 것은 구조(Structure)를 가진다

우리가 만드는 모든 것에는 구조가 존재한다.

  • 미리 설계된 구조일 수도 있음
  • 즉흥적으로 만들어진 구조일 수도 있음
  • 하지만 구조는 항상 존재함

구조는 시간이 지나면 바꾸기 어려워진다

어떤 시스템이든:

  • 만들기 위해 많은 노력을 들일수록
  • 나중에 구조를 변경하는 비용이 커짐

즉:

  • 초기 구조 설계가 매우 중요함

3. 구조가 중요한 이유

구조는 제작 의도(Intent)를 반영한다

구조는 단순한 형태가 아니라:

  • "무엇을 위해 만들어졌는가"
  • "어떤 품질을 갖는가"

를 결정한다.


건축물 비유

극장(Theater)

목적:

  • 공연 관람

특징:

  • 공연 관람에는 최적
  • 거주나 업무에는 부적합

집(House)

목적:

  • 생활 공간

특징:

  • 거주에는 적합
  • 공연 개최에는 부적합

소프트웨어에도 동일한 원리 적용

같은 기능이라도:

  • 코드를 작성하는 방식은 무한함
  • 설계 구조에 따라 결과가 달라짐

4. 소프트웨어 아키텍처가 결정하는 것

소프트웨어 아키텍처는 시스템의 핵심 특성을 결정한다.

영향을 주는 요소:

  • 성능
  • 확장성(Scalability)
  • 규모 처리 능력
  • 유지보수성
  • 기능 추가 용이성
  • 오류 대응 능력
  • 보안 대응 능력

잘못 설계된 구조의 문제

초기 구조가 잘못되면:

  • 재설계 비용 증가
  • 시간 낭비
  • 큰 시스템일수록 비용 폭증

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

정의

소프트웨어 아키텍처란
높은 수준의 시스템 구조 개념이며
구성 요소 간 관계를 표현하고
시스템 요구사항과 제약사항을 만족시키는 것


6. 정의를 구성 요소별로 해석


1) 높은 수준의 시스템 구조 (High-Level Structure)

의미:

  • 추상화(Abstraction)
  • 중요한 구조만 표현
  • 세부 구현은 제외

포함되는 것

  • 시스템의 큰 구조
  • 주요 컴포넌트
  • 관계 흐름

포함되지 않는 것 (오해를 많이 하니 주의)

  • 프로그래밍 언어
  • 프레임워크
  • 특정 기술 스택
  • 코드 구현 방식

매우 중요한 오해

많은 엔지니어가:

"기술 선택 = 아키텍처"

라고 생각함

하지만 이는 잘못된 생각.


아키텍처 ≠ 기술 선택

기술은:

  • 구현 단계에서 선택 가능
  • 아키텍처 이후 결정될 수 있음

아키텍처는:

  • 설계 마무리 단계에서 선

2) 구성 요소(Component)와 관계(Relationship)

구성 요소란:

  • 블랙박스(Black Box)
  • 특정 행동(API)을 가진 단위

구성 요소 예시

  • 사용자 인증 서비스
  • 결제 서비스
  • 데이터 저장 서비스
  • 메시징 시스템

핵심

중요한 것은:

  • 구성 요소 자체보다
  • 서로 어떻게 연결되는가

재귀적 구조 가능

구성 요소 하나가:

  • 내부적으로 또 다른 아키텍처를 가질 수 있음

즉:

  • 시스템 안에 작은 시스템 존재 가능

3) 요구사항(Requirements)과 제약조건(Constraints)

아키텍처는 반드시 다음을 만족해야 함.


요구사항

시스템이 해야 하는 것

예:

  • 로그인 기능
  • 결제 기능
  • 대용량 처리

제약조건

시스템이 하면 안 되는 것

예:

  • 개인정보 외부 노출 금지
  • 특정 응답시간 제한
  • 특정 보안 정책 준수

7. 소프트웨어 아키텍처의 추상화 레벨

아키텍처는 여러 단계로 존재함.


낮은 수준 추상화

  • 클래스(Class)
  • 구조체(Struct)
  • 객체(Object)

중간 수준 추상화

  • 모듈(Module)
  • 패키지(Package)
  • 라이브러리(Library)

높은 수준 추상화 (강의 중심)

특징

  • 서비스 단위 (개별의 구성요소들은 별도의 서비스로 존재)
  • 분산 시스템
  • 여러 컴퓨터에서 개별 혹은 그룹으로 분산 실행

8. 대규모 시스템 아키텍처

강의에서 다루는 대상:

  • 대규모 시스템
  • 분산 구조
  • 멀티 서비스 시스템

장점

처리량 증가

  • 더 많은 요청 처리

데이터 확장

  • 대량 데이터 처리 가능

사용자 확장

  • 수천~수만 사용자 대응

대표 사례

  • 차량 공유 서비스
  • VOD 플랫폼
  • SNS
  • 온라인 게임
  • 금융 서비스

9. 설계 실패의 위험성

좋은 설계:

  • 스타트업 → 대기업 성장 가능
  • 글로벌 서비스 가능

나쁜 설계:

  • 몇 달 개발 후 실패
  • 사용자 요구 미충족
  • 재개발 필요

핵심 메시지

잘못된 시스템을 다시 만드는 것은:

  • 매우 어렵고
  • 매우 비싸다

이렇게 위험 부담이 크다는 것은 이 강의 과정에서 배울 내용이 매우 중요하다는 


10. 소프트웨어 개발 생명주기(SDLC)

소프트웨어 개발은 크게 4단계


1) 설계 (Design)

  • 구조 정의
  • 아키텍처 설계

2) 구현 (Implementation)

  • 코드 작성

3) 시험 (Testing)

  • 검증
  • 오류 발견

4) 배포 (Deployment)

  • 실제 운영

반복 구조

소프트웨어는 지속적으로 개선됨.

따라서:

  • 위 과정이 반복됨
  • 이 반복의 첫 번째 주기가 차후 반복에 크게 영향을 미침
  • 기존의 시스템에서 점진적으로 변화를 만듬

11. 소프트웨어 아키텍처의 위치

아키텍처는:

설계 단계의 결과물

그리고 동시에

구현 단계의 입력값


즉:

설계 → 아키텍처 생성 → 구현 시작


12. 설계 단계가 중요한 이유

설계 단계는:

  • 가장 중요함
  • 구현보다 먼저 결정됨
  • 팀 전체 방향을 결정함

특징

  • 수주 ~ 수개월 소요 가능
  • 여러 엔지니어 협업 필요

13. 소프트웨어 아키텍처가 어려운 이유

알고리즘은:

  • 정답 판단 가능

아키텍처는:

  • 정답이 없음
  • 좋고 나쁨 판단이 어려움

14. 좋은 아키텍처를 만드는 방법

좋은 설계를 위해서는:

  1. 체계적 설계 프로세스를 따름 (Methodical Design Process)
  2. 산업 검증 패턴 사용 (Architectural Patterns)
  3. 좋은 사례 학습하여 적용 (Best Practices)
  4. 경험 축적

15. 강의 핵심 요약


핵심 1

모든 시스템은 구조를 가진다.


핵심 2

구조는 시스템 성공을 결정한다.


핵심 3

소프트웨어 아키텍처는:

  • 높은 수준의 시스템 구조를 표현하는 것 
  • 요구사항 + 제약조건 만족하도록
  • 각기 다른 구성 요소의 관계를 표현한 것

핵심 4

아키텍처는:

  • 설계 결과물
  • 구현 입력값

핵심 5

좋은 구조는 미래 비용을 줄인다.


한 줄 핵심 정리

소프트웨어 아키텍처는
"어떤 기술을 쓰는가"가 아니라
"시스템을 어떤 구조로 만들 것인가"를 정의하는 설계 철학이다.

RHEL8의 WSL 환경을 구성 중에 RHEL8 이 내장되어있지 않아 docker 를 이용하여 tar.gz 를 추출하는 방법을 생각했다.

docker는 OS-level 가상화 애플리케이션이다. 이러한 의미로 Windows OS 에 docker 를 구동하면 Windows 기반의 GUI를 사용하는 것처럼 이해되는데, 내가 윈도우에서 docker desktop을 설치하여 사용하였을 땐 분명 linux 환경이었다.

그리하여 윈도우 기반 docker stack 에 대해 조사하게된 내용을 정리하였다.

 

Windows 기반 docker 아키텍처

 

Docker 엔진은 Linux 특정 커널 기능을 사용하는 데몬으로 실행된다. 따라서 Windows 에서 Docker 엔진을 직접 실행하는 것은 불가능하다. 따라서 docker를 실행하려면 Windows에서 Linux 기반 환경을 만들어야 한다. Windows에서 Linux 환경을 활성화하려면 두 가지 옵션이 있다.

1. Windows Subsystem for Linux(WSL) : 리눅스 애플리케이션을 실행하기 위한 호환성 레이어(compatibility layer)*
*호환성 레이어(compatibility layer) : 한 OS에서 구동되는 프로그램을 다른 OS에서 구동되도록 코드를 변환해주는 소프트웨어

2. Hyper-V: 가상화(virtualization)*를 위한 마이크로소프트 솔루션

* 가상화(virtualization): 크게 '격리'와 '공유' 개념이 적용된 기술. 가상 환경을 생성하여 컴퓨팅 환경 전체에 리소스를 분산함으로써 리소스를 보다 효율적으로 사용할 수 있게 해주는 기술

 

개념

Docker는 Hyper-V/WSL 아래의 Windows OS를 가상화하는 것이 아니라
Hyper-V/WSL 위에서 실행되는 Linux OS(kernel)를 기반으로 컨테이너를 가상화한다. 따라서 컨테이너들은 공통의 Linux kernel  을 공유한다.

 

리눅스 커널이 필요한 이유

Docker는 진짜 의미의 "OS 가상화"가 아니라:

Linux kernel의 기능을 사용하는 프로세스 격리 기술

 

Docker가 사용하는 핵심 Linux kernel 기능:

  • namespaces → 프로세스 격리
  • cgroups → CPU / memory 제한
  • union filesystem → layered filesystem
  • iptables / network namespace → 네트워크 격리

이 기능들은 Windows kernel에는 없고,  Linux kernel에만 있다. 그래서 반드시 Linux kernel이 필요하다.

 

참고

Create Docker Windows Containers from Docker Desktop - Digital Varys

- 가상화란 무엇인가요? | IBM

 

후속 아티클

- VM 과 Container 차이

- 가상화와 컨테이너 차이

- podman과 docker 차이

+ Recent posts