소프트웨어 아키텍처팀 혹은 소프트웨어 아키텍처라는 단어를 주변에서 많이 들어볼 수 있습니다.
특히 아키텍처라는 단어는 더 많이 들어 볼 수 있는데요.
소프트웨어 아키텍처라는 것이 뭘까요?
Q. 소프트웨어 아키텍처라는 게 뭔가요?
소프트웨어 아키텍처란 소프트웨어의 구조를 말합니다.
소프트웨어의 구조는 소프트웨어의 기본 골격이 되고 소프트웨어를 구성하는 요소의 관계를 표현하는 시스템 구조입니다.
이 아키텍처를 가지고 이해관계자들의 의사소통 도구가 되기도 하고 소프트웨어 아키텍처의 구조에 따라 프로젝트의 성공 실패 여부가 결정되기도 합니다.
설계 기본 원리로 알아야 할 내용으로는 모듈화, 추상화, 단계적 분해, 정보은닉이 있습니다.
Q. 모듈화, 추상화, 단계적 분해, 정보은닉은 뭔가요?
모듈화(Modularity)란 소프트웨어의 성능을 향상하거나 시스템의 유지보수가 더 편하도록 시스템을 모듈별로 나누는 작업을 모듈화라고 합니다.
이 모듈화를 할 때는 모듈을 적정한 크기를 나누는 것이 좋습니다. 적정한 크기라고 하는 것이 추상적인 수치이긴 하지만 이는 내부 이해관계자들의 협의를 통해서 정하는 것이 바람직하기에 적정한 크기라고 표현합니다.
모듈의 크기를 너무 작게 나누게 되면 추후 패키징과 같이 흩어져있던 모듈을 한 덩어리로 다시 합치게 될 때 비용이 많이 발생하고 모듈의 크기를 너무 크게 나누게 되면 덩어리가 너무 커서 해독하거나 서비스를 가져오거나 할 때 다른 비용이 많이 발생합니다.
추상화(Abstraction)란 문제의 포괄적이고 전체적인 개념을 구체화한 후 차례로 세분화하여 구체화시켜나가는 것을 말합니다. 사용자의 요구사항이 있을 경우 사용자가 무엇을 원하는지 구체화된 기능을 생각하고 이 기능을 구현하기 위해 다시 세부적으로 나누어서 구현 방법을 고민하는 것이라고 이해하면 쉬울 것입니다.
불필요한 것을 걸러내고 꼭 필요한 것만 골라내어 모델화 시키는 것을 말하며, 이 추상화 작업은 과정 -> 데이터 -> 제어 순으로 흘러가게 됩니다.
과정 추상화란 자세한 수행과정을 정의하지 않고, 전반적인 흐름만 파악할 수 있게 설계하는 것을 말하며
데이터 추상화란 데이터의 세부적인 속성이나 용도를 정의하지 않고, 데이터 구조를 대표할 수 있는 표현으로 대처하는 방법을 말합니다.
제어 추상화란 이벤트 발생의 정확한 절차나 방법을 정의하지 않고, 대표할 수 있는 표현으로 대처하는 방법을 말합니다.
추상화라는 작업은 생각보다 그렇게 디테일한 작업은 아닙니다.
단계적 분해(Stepwise Refinement)란 하향식 설계 방법을 이야기합니다.
모듈화와 같이 생각해주며 좋으며 큰 것에서부터 점점 작은 것으로 상위 중요 개념으로부터 하위 개념으로 점점 구체화시키는 분할 기법입니다.
정보 은닉(Information Hiding)이란 한 모듈 내에 포함된 절차와 자료들의 정보가 감추어져 있어 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법을 이야기합니다.
정보 보안과 관련이 있습니다.
Q. 소프트웨어 아키텍처 패턴(Software Architectural Patterns)이란 뭔가요?
앞서 말씀드렸다시피 소프트웨어 아키텍처란 소프트웨어의 구조를 이야기합니다. 이 구조를 그리려는 데 이 구조를 그리는 패턴이 있다고 보시면 됩니다. 파워포인트의 템플릿이라고 생각하면 좋을까요?
아키텍처를 설계할 때 활용할 수 있는 전형적인 해결 방식을 말하고 예시라고도 볼 수 있습니다.
이 아키텍처 패턴을 사용하면 기본적인 윤곽을 볼 수 있으며 시행착오를 줄이며 고품질의 소프트웨어를 만들 수 있습니다.
Q. 소프트웨어 아키텍처 패턴에는 어떤 것들이 있을까요?
소프트웨어 아키텍처 패턴에는 크게 10가지 패턴이 있습니다.
1. Layer Pattern (n-tier Pattern)
상위 계층은 하위 계층에 대한 서비스 제공자가 되고 하위 계층은 상위 계층의 클라이언트가 됩니다.
서로 마주 보고 있는 두 개의 계층에 대해서만 상호작용이 일어나게 됩니다. 하여, 변경 내용이 있을 경우 두 개의 계층에만 영향을 미칩니다. 즉, 시스템을 개선할 때 두 개의 계층만 고치면 됩니다.
일반적인 데스크톱 애플리케이션 그리고 E-commerce 웹 애플리케이션에서 많이 사용됩니다.
2. Client-Server Pattern
하나의 서버와 다수의 클라이언트로 구성되어 있습니다.
클라이언트가 서버에게 서비스를 요청을 할 경우 서버는 클라이언트에게 적절한 서비스를 제공합니다.
항상 적절한 서비스를 제공하려다 보니 서버는 항상 대기상태를 유지하고 있습니다.
요청을 제공하기 위한 동기화 작업을 제외하고는 서로 독립적인 관계를 가집니다.
이메일, 문서 공유 및 은행 등 온라인 애플리케이션에서 많이 사용됩니다.
3. Master-Slave Pattern
이 패턴에서는 마스터와 슬레이브로 나뉩니다. 마스터가 슬레이브로 작업을 분산해주고 그 후 분산받은 작업을 처리한 슬레이브들이 다시 마스터로 값을 반환합니다.
이 패턴에서는 특정 슬레이브가 문제가 생기더라도 작업을 여러 슬레이브에 분산하여 진행하기 때문에 큰 문제가 되지 않습니다.
컴퓨터 시스템에서 버스와 연결된 주변장치라고 생각하시면 됩니다.
4. Pipe-Filter Pattern
이 패턴에서는 데이터 스트림을 생성하고 처리하는 각 필터 컴포넌트에서 캡슐화하여 처리되고 처리된 데이터는 파이프를 통해서 전송됩니다.
각 필터는 재사용이 되고 필터를 재배치하여 다양한 파이프라인을 만들 수도 있습니다.
그렇다 보니 확장성과 용이성 그리고 재사용성 측면에서 높은 강점을 나타냅니다.
데이터의 변환작업 혹은 동영상 버퍼링에 많이 사용됩니다.
5. MVC Pattern(Model-View-Controller Pattern)
3개의 모델로 구성된 컴포넌트를 말합니다.
모델은 핵심 기능과 데이터를 포함하고 있습니다.
뷰는 사용자에게 정보를 표시하여 줍니다. (뷰는 한 개가 아닐 수 있습니다.)
컨트롤러는 사용자가 입력한 내용을 처리합니다.
여러 개의 뷰를 만들 수 있고 사용자의 입력을 처리할 수 있으므로 대화형 애플리케이션에 많이 사용됩니다.
6. Event-Bus Pattern
4가지 컴포넌트로 구성되어 있습니다.
이벤트 소스: 이벤트 버스를 통해서 특정한 채널로 클라이언트가 요청하는 서비스를 전송(이벤트 생성)
이벤트 리스너: 채널로부터 메시지를 받음 그리고 메시지를 실행함
채널: 이벤트의 통로
버스: 채널과 채널 사이의 의사소통이 되도록 하는 영역
안드로이드 개발이나 알림 서비스에 적합한 패턴입니다.
7. Broker Pattern
브로커(Broker)가 클라이언트와 서버 사이에 중개 역할을 합니다.
서비스 호출에 응답하는 컴포넌트가 여러 개 있을 때 중간에서 알선해주고 연결해주는 방식입니다.
보통 분산 시스템에 사용되며 서버가 여러 개 있을 경우 이 패턴이 빛을 발합니다.
8. Blackboard Pattern
결정 가능한 해결 전략이 알려지지 않은 문제에 용이합니다.
3가지 컴포넌트로 구성되어 있습니다.
블랙보드: 설루션 객체를 포함하는 구조화된 전역 메모리
지식 소스: 자체 표현을 가진 특수 모듈
제어 컴포넌트: 모듈 선택, 설정 및 실행을 담당
모든 컴포넌트는 1차적으로 블랙보드에 접근하게 됩니다. 컴포넌트는 블랙보드에 추가되는 새로운 데이터 객체를 생성할 수 있습니다. 컴포넌트는 블랙보드에서 특정 종류의 데이터를 찾으며, 기존 지식 소스와 패턴 매칭으로 데이터를 찾습니다.
음성인식, 차량 식별, 단백질 구조 식별과 같은 문제에 사용됩니다.
9. Interpreter Pattern
특정 언어를 다른 언어로 번역하거나 해석할 때 사용되는 패턴입니다.
10. Peer-to-peer Pattern
피어 한 개를 컴포넌트로 간주한다. 피어는 클라이언트가 될 수도 있고 서버가 될 수도 있습니다.
이 패턴은 추가가 쉬운 패턴이라 추가 확장에 용이합니다.
대신 보안에는 취약한 편이며 피어가 계속 확장되면 서버에도 영향을 미치게 됩니다.
P2P 사이트에서 많이 사용되는 패턴입니다.
참고: https://ithotplace.tistory.com/24
https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013
https://mingrammer.com/translation-10-common-software-architectural-patterns-in-a-nutshell/
'소년의 IT 쉽게 이해하기 > 개발 쉽게 이해하기' 카테고리의 다른 글
모듈(Module) 쉽게 이야기하기 (0) | 2022.02.10 |
---|---|
객체지향 쉽게 이야기하기 (0) | 2022.02.09 |
좋은 프로그램이란 뭔가요? (0) | 2021.12.30 |
인터프리터(Interpreter)와 컴파일(Compile) 쉽게 이야기하기 (0) | 2021.12.24 |
라이브러리(Library) 쉽게 이야기하기 (0) | 2021.12.09 |
댓글