본문 바로가기

IT 세상

Application Architecture (AA) 역량

소프트웨어 공학

 소프트웨어 개발의 체계적이고 효율적인 접근 방식을 연구하는 학문.

 소프트웨어 설계, 개발, 유지보수, 관리 등이 포함됩니다.

 

소프트웨어 공학의 주요 개념과 방법론

소프트웨어를 계획, 개발, 테스트, 배포, 유지보수하는 전체 과정을 나타내는 '소프트웨어 개발 생명 주기(SDLC)' 에는 여러 모델이 있는데, 가장 많이 사용되는 몇 가지는 아래와 같습니다.

1. 폭포수 모델

가장 전통적인 모델로, 각 단계를 순차적으로 진행.

요구사항 분석, 설계, 구현, 테스트, 배포, 유지보수 순서로 진행되며,

이전 단계로 돌아가기 어렵다는 단점이 있습니다.

2. 애자일 방법론

유연하고 반복적인 접근 방식을 강조.

소규모 팀이 짧은 개발 주기(스프린트)를 통해 빠르게 개발하고, 지속적으로 고객의 피드백을 반영하여 개선.

스크럼, 칸반 같은 프레임워크가 애자일에 포함됩니다.

3. 스파이럴 모델

반복과 점진적 개발을 결합한 모델.

위험 분석을 통해 프로젝트의 각 단계를 반복하고 점진적으로 개발을 완성.

폭포수 모델과 애자일의 장점을 결합하려는 시도라고 볼 수 있습니다.

 

'프로젝트 관리' 측면

SCRUM 과 Kanban 이 대표적.

- SCRUM :

특정 역할(스크럼 마스터, 제품 소유자, 개발 팀) 과

정해진 이벤트 (스프린트, 데일리 스크럼, 스프린트 리뷰) 를 통해 프로젝트를 관리.

주기적으로 작업을 계획하고 완료하는 데 집중합니다.

- Kanban :

시각적인 보드와 카드 시스템을 사용해 작업 흐름을 관리.

작업의 진행 상태를 시각적으로 표시하여, 병목 현상을 쉽게 파악하고 해결할 수 있습니다.


소프트웨어 설계 패턴

'디자인 패턴' 은 자주 발생하는 문제에 대한 일반적인 해결책을 제공하는데,

예를 들어 싱글톤 패턴, 팩토리 패턴, 옵저버 패턴 등이 있습니다.


소프트웨어 품질 보증의 핵심, 테스트

단위 테스트, 통합 테스트, 시스템 테스트, 수용 테스트 등 여러 단계에서 소프트웨어를 검증.

 

응용 어플리케이션

응용 어플리케이션은 우리 일상 생활과 업무에 큰 영향을 미치며, 다양한 분야와 용도로 발전해오고 있어요.

응용 어플리케이션, 또는 애플리케이션 소프트웨어는 사용자가 특정 작업을 수행할 수 있도록 돕는 프로그램입니다.

이는 기본 시스템 소프트웨어(예: 운영체제) 와 구별됩니다.

응용 어플리케이션의 주요 특징과 예시

1. 사용자 중심:

응용 어플리케이션은 특정 사용자 요구를 충족시키기 위해 설계됐어요.

예를 들어, 워드 프로세서(마이크로소프트 워드)나 스프레드시트(엑셀)는 문서 작성과 데이터 관리를 위해 사용됩니다.

2. 다양한 용도:

다양한 분야에서 사용될 수 있어요.

예를 들어, 그래픽 디자인(포토샵), 데이터베이스 관리(오라클), 웹 브라우징(크롬, 파이어폭스) 등이 있습니다.

3. 실행 환경:

응용 어플리케이션은 특정 운영체제(윈도우, 맥OS, 리눅스 등)에서 실행돼요.

모바일 어플리케이션은 안드로이드나 iOS 같은 모바일 운영체제에서 실행됩니다.

4. 유틸리티 소프트웨어:

시스템 유지보수와 관리를 돕는 응용 어플리케이션도 있어요.

예를 들어, 디스크 정리 프로그램이나 백업 소프트웨어가 이에 해당합니다.

5. 기업용 애플리케이션:

ERP(전사적 자원 관리), CRM(고객 관계 관리) 등의 기업용 소프트웨어는

조직의 운영과 관리에 중요한 역할을 합니다.

 

모듈설계 원칙 : 관심사의 분리

'관심사의 분리(Separation of Concerns, SoC)' 는 소프트웨어 설계에서 중요한 원칙입니다.

이 원칙은 복잡한 소프트웨어 시스템을 더 쉽게 이해하고 유지보수할 수 있도록,

각 모듈이나 컴포넌트를 명확하게 구분하는 것을 목표로 합니다.

주요 개념은 다음과 같습니다.

1. 모듈화:

소프트웨어를 기능적으로 독립적인 모듈로 나누는 것을 말합니다.

각 모듈은 특정한 기능이나 책임을 가지고 있습니다.

예를 들어, 웹 애플리케이션에서는 사용자 인증, 데이터베이스 접근, UI 렌더링 등을 각각 별도의 모듈로 나눌 수 있습니다.

2. 독립성:

모듈은 가능한 한 서로 독립적이어야 합니다.

한 모듈의 변경이 다른 모듈에 영향을 주지 않도록 설계하는 것이 중요합니다.

이를 통해 시스템 유지보수와 확장이 쉬워집니다.

3. 응집력과 결합도:

좋은 모듈은 높은 응집력과 낮은 결합도를 가져야 합니다.

응집력은 모듈 내의 구성 요소들이 얼마나 긴밀하게 연관되어 있는지를 나타내고,

결합도는 모듈 간의 상호 의존성을 의미합니다.

높은 응집력과 낮은 결합도를 통해 모듈의 독립성과 재사용성을 높일 수 있습니다.

4. 관심사의 분리:

특정 관심사(기능)를 담당하는 모듈이 그 기능에만 집중할 수 있도록 설계합니다.

예를 들어, 데이터베이스 접근 모듈은 데이터 저장과 조회에만 집중하고,

비즈니스 로직 모듈은 비즈니스 규칙과 처리에만 집중하도록 합니다.

5. SoC의 주요 장점:

SoC의 주요 장점은 유지보수성과 확장성입니다.

각 모듈이 독립적으로 설계되어 있으므로,

특정 기능을 개선하거나 버그를 수정할 때 다른 부분에 영향을 주지 않고 작업할 수 있습니다.

또한 새로운 기능을 추가할 때도 기존 시스템에 큰 영향을 주지 않도록 설계할 수 있습니다.

예를 들어, MVC(Model-View-Controller) 패턴은 SoC의 대표적인 사례 입니다. 

 모델은 데이터와 비즈니스 로직을, 

 뷰는 사용자 인터페이스를, 

 컨트롤러는 사용자 입력을 처리

하는 역할을 각각 분리하여 유지보수를 용이하게 합니다.

관심사의 분리는 소프트웨어의 복잡성을 줄이고, 

개발 효율성을 높이며, 코드의 가독성과 재사용성을 향상시키는 데 큰 도움을 줍니다.

 

아키텍처 스타일 개념

각 아키텍처 스타일은 소프트웨어 시스템의 설계와 개발에서 특정한 방식으로 구조를 정의하고 구성 요소 간의 상호작용을 규정해요. 현대 소프트웨어 개발에서 많이 사용되고 있는 주요 아키텍처 스타일은 아래와 같습니다.

1. SA & SD (Service-Oriented Architecture & Network Services Development): 

SOA(서비스 지향 아키텍처)는 애플리케이션을 독립된 서비스로 구성하는 방식입니다.

각 서비스는 특정 기능을 수행하고, 표준화된 인터페이스를 통해 통신합니다.

SA & SD는 이러한 SOA의 개념을 네트워크 서비스 개발에 적용한 방식이에요.

이는 서비스 간의 느슨한 결합을 촉진하고, 재사용성과 확장성을 높이는 데 중점을 둡니다.

2. OOAD (Object-Oriented Analysis and Design):

객체 지향 분석 및 설계는 소프트웨어 시스템을 객체라는 개념을 중심으로 분석하고 설계하는 방법론입니다.

객체는 데이터(속성)와 메서드(동작)를 포함하고, 클래스라는 틀을 통해 정의됩니다.

OOAD는 상속, 다형성, 캡슐화 등의 원칙을 활용하여 시스템의 구조와 동작을 모델링합니다.

이는 코드의 재사용성과 유연성을 높이는 데 도움을 줍니다.

3. CBSE (Component-Based Software Engineering):

컴포넌트 기반 소프트웨어 공학은 소프트웨어 시스템을 독립된 컴포넌트로 구성하고,

이러한 컴포넌트를 조립하여 시스템을 구축하는 접근 방식입니다.

각 컴포넌트는 특정 기능을 수행하고, 명확한 인터페이스를 통해 다른 컴포넌트와 상호작용해요.

CBSE는 개발 속도를 높이고, 유지보수와 확장을 쉽게 하는 데 유리합니다.

4. MSA (Micro Services Architecture):

마이크로서비스 아키텍처는 애플리케이션을 작고 독립적인 서비스로 나누는 접근 방식입니다.

각 마이크로서비스는 특정 비즈니스 기능을 담당하고, 독립적으로 배포 및 스케일링이 가능합니다.

서비스 간의 통신은 일반적으로 HTTP/REST API나 메시지 큐를 통해 이루어집니다.

MSA는 애자일 개발과 클라우드 환경에서 특히 유용하며, 시스템의 유연성과 확장성을 크게 향상시킵니다.