아키텍처란

 

요구사항에 맞춰 시스템이 어떻게 구성되고 동작하는지에 대한 표현

 

S/W 분야에서 아키텍처에 대해 딱 떨어지는 정의는 없는 것 같다.

각자만의 해석이 일부 들어간 개념과 느낌으로 의사소통 한다고 생각된다.

그렇기에 내가 생각하는 아키텍처에 대해 개념을 잡고 가려한다.

 


 

간단하게 말하면 시스템에 대한 구성도 정도로 표현할 수 있다.

하지만 단순하게 표현된 결과물보다는, 아키텍처가 도출되기 까지의 과정에도 충분한 의미가 있다고 생각한다.

 

과정을 대략적으로 살펴본다면

 

1) 이해 관계자들의 불편으로부터 해소를 위한 니즈가 생겨나고

 

2) 고객들도 자신의 진짜 필요한 것을, 요구사항이 뭔지 몰라 요구공학을 통해

   다양한 방법 (워크샵, 브레인 스토밍, 인터뷰, 설문조사, 시나리오 기법) 으로 시스템에 필요한 요구사항들을 도출한다.

※ Architectural Driver(AD) : 아키텍처를 디자인하기 위한 핵심 요구사항

2024.05.08 - [IT/Architect 공부] - Architect 공부 6일차 - 요구공학 및 품질속성

 

3) 기능적 요구사항과 비 기능적 요구사항이 나오고, 이를 다양한 UML로 표현하여

    이해관계자들이 동일한 시각을 갖는지, 올바르게 선정되었는지 확인한다.

기능적 요구사항 : 시스템이 제공해야하는 서비스와 기능에 대한 정의 ( 입력값과 출력값이 명확 )

비기능적 요구사항 : 시스템의 품질과 제약사항에 대한 정의 ( 입력, 출력에 영향을 줄 수 있는 요소들 )

 

4) 기능적 요구사항은 주로 유스케이스 모델로 표현하고, 비 기능적 요구사항은 품질 속성이 추출되어 이해관계자들에 의해 우선순위가 결정된다. 각 품질속성에 대해 시나리오를 작성해 보고, 이를 충족할 수 있는 잠재적 방법들을 탐색한다.

( Deisng Approach )

 

※ 품질속성과 관련된 ISO (국제 표준 기준)는 기능성,신뢰성,사용성,효율성,유지보수성,이식성 6가지의 특성이 정의된 ISO-9126과 이를 개정해 호환성과 보안성이 추가된 ISO-25010이 있다.

 

5) 품질속성은 결정된 우선순위에 따라 핵심 품질속성을 충족할 수 있는 디자인 후보들에 대한 비교 및 결정을 한다. 
( Architectural Decision )

 

6) 이렇게 아키텍처에 포함될 디자인이 결정되면 이를 설계하고, 주요 이해관계자들이 이해할 수 있는 다양한 시점의 View로 표현한다. ex: 4+1 View, 3 View

 

7) 최종적으로 요구사항이 잘 반영되었는지 평가를 통한 아키텍처를 검토한다.

 

※ 아키텍처 평가 방법

ㅁ SAAM (Software Architecture Analysis Model) 

. 시나리오 중심

. 현재 없는 기능에 대한 간접 시나리오를 개발하고, 이를 충족하기위해 변화해야하는 대안 아키텍처를 찾는다.

  직/간접 시나리오에 가중치를 두고, 투표 및 비교 평가 등으로 현재 아키텍처와 대안 아키텍처에서 시나리오를 얼마나 충    족하는지 판단한다.

. Modifiability와 Functionality에 집중

 

ㅁ ATAM(Architecture Tradeoff Analysis Method)

. SAAM을 발전 시킨것으로 아키텍처 별 Tradoff 를 분석하여 평가하는 방법

. 성능, 사용성, 가용성, 확장성, 보안성 등의 다양한 항목 기준

 

ㅁ CBAM(Cost Benefit Analysis Method) 

. 비용과 이익 등 경제적인 측면에서 아키텍처를 평가하는 기법

디자인에 정답은 없지만 앞서 말한 원칙들이 잘 지켜지는 Best Practice들은 존재한다. 

비슷한 문제에 이러한 BP들을 적용하여 쉽게 해결할 수 있으며,

복잡하게 디자인 구조를 설명할 필요 없이 패턴 이름만으로 의사소통과 설명이 가능하다.


State 패턴

- 한 객체가 상태에 따라 다르게 동작해야할 때 구현하는 패턴

 

예를들면 버튼 하나로 동작하는 선풍기가 있을 때 

정지상태에서 버튼을 누르면 바람이 나와야하고, 바람이 나오는 상태에서 버튼을 누르면 정지해야한다.

사용자는 버튼 누르기 하나만 선택했는데, 선풍기 객체는 if문으로 현재 상태에 따라 동작이 바뀐다.

 

그럼 미풍,약풍,강풍 기능이 도입된다면?? if문에 3가지 분기가 추가된다.

이는 OCP에 어긋나는 내용으로 기능이 추가된다면, 기존의 코드를 수정하지 않아야한다.

또한 각 바람의 세기를 조절하려면 전부 선풍기 객체에서 찾아 변경해야한다.

 

그렇다면 사용자는 버튼 하나만 누르도록 요청하고, 선풍기가 인터페이스로 각 상태별로 기능을 다르게 구현해야한다.

단 요구하는 기능이 많아질 수록, 클래스도 많아진다는 단점이 있다.

 

 

 

 

Bridge 패턴

 

추상화와 구현을 분리하여 확장성과 유지보수성을 높인 디자인 패턴.

 

 

대표적으로 삼각형, 사각형으로 이루어진 모양과, 모양에 색칠을 할 색깔로 나눌 수 있다.

추상화 부분에 모양을 두고, 구현부에는 색깔을 두어 각자의 책임을 분리하고 기능이 추가될 때 독립적으로 확장이 가능하다.

 

 

추상화 (모양) 을 상속한 삼각형과 사각형은 색깔 인터페이스를 참조하여, 색칠 된 도형을 그린다.

모양이 추가되거나, 색깔이 추가되어도 각자에게는 영향이 가지 않아 유지보수성이 높다.

 

 

Adpater 패턴

 

흔히 해외여행에서 110v 짜리 전압을 사용하는 국가에 갈때 챙기는 돼지코(어댑터)를 생각하면 될 것 같다.

220V 전압을 사용하는 기기에 돼지코를 연결해, 110V에서도 사용할 수 있게 해주는 것이다.

 

이처럼 호환되지 않는 인터페이스를 가진 클래스들이 동작할 수 있게 해준다. ( 인터페이스 변환)

클라이언트 코드가 변경되지 않고, 다른 인터페이스를 사용할 수 있다는 장점이 있다.

 

돼지코 예시를 들면, 클라이언트가 원하는 서비스를 실제로 제공하는 220V 기기 ( Adaptee)와

그를 110V로 변환해주는 Adapter, 클라이언트가 사용하는 인터페이스인 110V로 구성된다.

 

Command 패턴

 

요청하는 Client 객체와 실제 작업을 수행하는 Receiver 객체의 결합성을 낮추기 위한 패턴.

요청을 객체화 하여 전달한다. 요청을 큐에 저장하거나 실행 취소, 재실행 등의 기능을 구현할 수 있다.

 

 

실제 그림은 복잡해보이지만, Client가 요청하고 Receiver가 실제로 요청을 수행한다.

과정을 보면 Client는 요청을 객체화 하여 Invoker에게 전달한다.

Invoker는 사전에 정의된 Command 객체를 지니고 있고 command 인터페이스로 execute 메소드를 호출한다

command 인터페이스를 구현된 ConcreteCommand 객체는 실제로 작업을 수행할 Receiver 객체를 가지고 있고, 이를 호출한다.

Receiver가 실제로 요청을 수행한다.

 

Visitor 패턴

 

객체의 구조와 수행되는 연산을 분리할 수 있는 패턴. 데이터 구조를 변경하지 않고도 새로운 연산을 추가할 수 있다.

 

 

연산 관련하여 Visitor 인터페이스를 통해 접근한다.

Visitor를 구현한 ConcreteVisitor 클래스에서 실제 작업이 수행되고,

객체 구조 관련한 인터페이스는 Element 인터페이스와 그 구현체에서 수행된다.

 

사용자는 Element 구현체를 통해 accept 메소드를 호출하여 Visitor 구현채의 visit 메소드를 수행한다.

 

Visit 연산에 대한 확장에는 자유롭지만, 객체 구조와 관련된 Element 확장 시에는 Visitor 클래스의 변경이 필요하다.

 

 

Proxy 패턴

 

실제 객체에 대한 접근을 제어하고 관리할 수 있는 패턴이다.

직접 접근을 막고 프록시 객체를 제공함으로써 지연 초기화 및 캐싱 기능을 제공할 수 있으며 보안처리도 가능하다.

※ 지연 초기화 : 객체의 필드 초기화 시점을 그 값이 처음 필요할 때까지 미루는 기법.

                         메소드로 분리하여 진짜 필요할 때만 수행한다.

 

 

 

 

사용자는 인터페이스로 작업을 요청하고, 내부 로직으로 프록시 객체에 도달한다.

프록시 객체는 실제 객체에게 작업을 수행시킬지 판단한다.

 ex: 동일한 요청으로 캐싱값 가지고 있는 경우, 실제로 객체 초기화가 필요한지

프록시 객체는 실제 객체에게 작업을 요청하고 결과값을 반환받아 사용자에게 전달한다.

 

Decorator 패턴

 

객체에 추가적인 기능을 동적으로 추가할 수 있는 디자인 패턴이다.

기본적으로 데코레이터가 적용될 Componenet 객체가 존재하고, 이에 기능을 추가하는 Decorator로 나뉜다.

 

 

예를들어 크리스마스 트리를 꾸밀 때, 기본이 되는 실제 트리를 Component 객체라 할 수 있고

전구, 별 등의 장식품을 Decorator로 표현할 수 있다.

 

조합을 위해 수많은 자식 클래스가 생기지 않고, 동적으로 필요한 기능을 추가할 수 있다.

 

Coposite 패턴

 

객체를 트리 구조로 구성하여 개별/복합 개체를 동일하게 다룰 수 있는 패턴.

단일 객체인 Leaf와 단일,복합 개체를 포함하는 Compoiste 객체로 나뉜다.

단일/복합 객체를 구분할 필요가 없이 동일하게 취급하여 재귀적 구조를 쉽게 만드는 디자인 패턴이다.

 

 

윈도우의 파일 탐색기를 생각해보면 된다.

C드라이브 안에 폴더가 여러개 있고, 단일 수행파일이 있다. 폴더들은 또 트리형태로 폴더와 개별 파일들로 구성 되어있다.

 

Prototype 패턴

 

새로운 객체를 생성할 때 생성자가 아닌, 기존 객체의 복사본을 만들어 사용하는 패턴.

초기화 단계를 생략하고 현재 상태를 복사할 수 있다는 장점이 있지만, 객체마다 복사 시 예외처리들이 다 다르다는 단점.

 

 

 

COR ( Chain of Responsibility ) 패턴

 

요청을 보내는 클라이언트와 처리하는 객체(Handler) 사이의 결합도를 낮추는 패턴.

요청을 처리할 수 있는 여러 개의 Handler 객체를 생성하여 연결하고, Chain에 따라 순차적으로 처리한다.

 

 

 

Factory 패턴

 

객체의 생성과정을 캡슐화 하여, 클라이언트 코드와 분리하는 패턴.

클라이언트에서 New로 객체를 생성하지 않고, 팩토리 클래스에서 다양한 유형의 객체를 생성하여 리턴한다.

 

// Creator(팩토리) 인터페이스
interface Creator {
    Product factoryMethod();
}

// ConcreteCreator(구체적인 팩토리) 클래스
class ConcreteCreatorA implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

// 다른 ConcreteCreator 클래스
class ConcreteCreatorB implements Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

// 클라이언트 코드
public class Main {
    public static void main(String[] args) {
        Creator creatorA = new ConcreteCreatorA();
        Product productA = creatorA.factoryMethod();

        Creator creatorB = new ConcreteCreatorB();
        Product productB = creatorB.factoryMethod();
    }
}

 

Abstract Factory 패턴

 

팩토리 패턴과 유사하나, 관련 객체들의 생성 들의 생성 시, 구상 클래스의 지정 없이 관련 객체들의 모음을 생성하는 패턴

 

유사한 객체들을 집단별로 찍어낼 수 있다는 점이 포인트다.

이를 위해 하나의 Factory에서 연관된 다양한 종류들의 객체를 찍어내야한다.

 

예를들어 의자, 소파, 커피테이블을 세트로 판매중이라면 생산시에 같은 디자인으로 만들어야 한다.

이를 위한 디자인 별로 추상 팩토리를 선언하고, 실제 의자, 테이블, 소파를 생산하는 팩토리를 구현한다.

 

 

※ 팩토리 패턴과의 비교

 

하나의 팩토리에서 단일/여러 종류의 객체를 생산하는 차이.

팩토리 패턴은 객체 생성과정만 추상화하지만, 추상 팩토리는 생성되는 객체의 관계들까지 추상화한다.

 

Builder Pattern

 

복잡한 객체를 생성하는 과정을 단계별로 캡슐화한 생성 패턴

Builder 객체를 통해 실제 객체 생성과정을 단계별로 구분하고,

Director 클래스에서는 순서를 정의하고, Builder 객체를 사용해 객체를 생성한다.

 

복잡한 생성과 파라미터가 존재하는 경우 유용하다.

예를들어 햄버거를 생성할 때 빵, 패티, 치즈, 양상추, 토마토, 베이컨, 피클 등의 다양한 재료들이 들어간다.

요청하는 사람마다, 제품의 종류마다 각 재료들은 다양하게 변경되며 빵은 맨 위와 아래에 한개씩 포함되어야한다.

이러한 복잡한 생성과정과 순서를 정의할 때 편리하고, 필요한 재료만 포함시킬 수 있다.

유연성과 가독성이 높아진다.

 

설계에 정답은 없으나 품질을 올리려는 시도들은 존재함.

아래 나열되는 몇가지 원칙들과 이를 잘 적용한 BP 사례들은 존재한다. 

- 최대한의 독립성으로 재사용성을 늘리고 유지보수를 쉽게 한다

. 높은 응집성 : 클래스에 연관성 있는 기능들만 모여있는지

. 낮은 연결성 : 객체간 의존성을 낮춤


 

DRY ( Don't Repeat Yourself ) : 같은 코드를 반복하지 말아라. 계속 사용된다면 모듈화를 고민해 볼 것

 

KISS ( Keep It Simple and Stupid ) : 코드를 단순하고 읽기 쉽게 만들어라

 

SOLID 원칙

 

ㅁ SRP ( Single Reponsibility Principle )

- 하나의 클래스에는 하나의 책임만 지도록 단일 기능으로 구현

 

여러개의 기능으로 이루어진 클래스는 책임의 수 만큼, 기능의 수 만큼 변경될 여지가 생겨버린다.

이를 해결하기 위해 Facade 패턴을 사용할 수 있다. 

Facade는 건물의 정면을 뜻하는 단어로, 클라이언트는 Facade 인터페이스 하나만 보고 접근한다.

내부의 기능은 어떻게 구현되어있는지 모르며, 각 기능별로 담당하는 클래스들이 내부에 따로 존재하는 패턴

뒷단의 복잡한 구조를 감추고, 깔끔한 Facade를 바라보게 하는 용도로 사용한다.

 

ㅁ OCP ( Open Close Principle )

- 확장에는 열려있고, 변경에는 닫혀있는 원칙

변경하는 대상과 불변 대상을 구분하여, 요구사항이 변경되어도

코드를 변경하지 않고 다른 클래스를 확장하여 해결 가능한 설계

 

간단하게 말하면 변경이 일어나는 부분에 대해서 인터페이스로 추상화 하고,

클라이언트는 불변하는 인터페이스를 참조 하면 된다.

 

전략 패턴을 예로 들어, 결제를 하려할 때

고객은 어떤 결제방식을 선택할지 전략을 지정하기만 하면 된다.

 

 

 

여기에 결제 방식이 추가된다면, 기존 코드는 건들지 않고 클래스를 하나 더 만들면 된다.

 

ㅁ LSP ( The Liskov Substitution Principle ) 

자식 타입의 클래스는 부모 클래스의 역할을 수행할 수 있어야한다.

 

상속과 관련된 내용으로, 상속관계 클래스간의 일관성과 유연성을 보장한다.

가장 대표적인 예로 직사각형의 하위 클래스인 정사각형을 생각하면 된다.

상속관계가 아니거나, 자식 클래스에서 잘못된 오버라이딩을 했거나...

  • 정사각형은 직사각형의 모든 속성과 동작을 가지고 있어야 하므로, 직사각형 객체를 정사각형 객체로 대체할 수 있다.
  • 하지만 정사각형 클래스에서 setWidth()와 setHeight() 메서드를 오버라이딩하여 가로와 세로의 길이가 항상 같도록 구현한다면, LSP를 위반하게 된다.

 

ㅁ ISP ( Interface Segregation Principle )

SRP와 유사하게 , 다양한 기능을 가진 인터페이스를 선언하기 보다는 기능별로 인터페이스를 분리하자

 

인터페이스를 기능별로 잘게 나누어, 클래스는 사용하고자 하는 인터페이스만 구현하면 된다.

복합기의 예시를 들 수 있다. 복합기는 인쇄, 복사, 팩스 등 다양한 기능이 사용 가능하지만

이를 복합기라는 하나의 인터페이스로 제공하면 ISP를 위반한다.

모든 사용자가 기능을 다 쓰지는 않기때문에, 각 기능별로 인터페이스를 분리하여 사용자가 원하는 기능만 구현하게 하자.

 

ㅁ DIP ( Dependency Inversion Principle )

하위 모듈을 참조할 때 직접 참고하지 않고, 추상화된 상위 인터페이스를 참조하는 것.

하위 모듈의 변경에 영향을 받지 않는다.

요구 공학 ( Requirements Engineering )

- 시스템의 목적을 식별하기위해 요구사항을 파악하고 이를 검증 및 관리하는 일련의 활동들

- S/W 개발 프로세스와 생명주기가 맞춰가며 진행된다.

 

요구사항

- 요구 공학 프로세스로부터 생성된 시스템 서비스(기능)와 제약사항(비기능)에 대한 설명

 

요구공학 프로세스는 아래 순서대로 진행된다.

 

1) 타당성 분석

해당 시스템이 개발할 가치가 있는지, 가능한지에 대한 사전 논의

- 기술적, 경제적 관점, 일정, 운영 측면에서 검토한다.

 

2-1) 요구사항 도출

- 시스템을 통해 해결하고자 하는 문제를 찾아내는 것.

고객들도 자신의 진짜 요구사항이 뭔지 모르기 때문에 이를 찾아내는 여러 방법들이 존재한다. 

( 브레인 스토밍, 롤플레잉, 인터뷰, 워크샵 등등 )

 

ex)

. 브레인 스토밍을 통해 각 이해관계자들의 다양한 요구사항들이 1차적으로 생성되고

. 이 중에 일부를 채택하여 요구사항을 명세화한다.

. 해당 요구사항에 대해 다양한 이해관계자들이 어떻게 생각하는지

  논의하고 합의점을 찾아, 모두가 납득할만한 요구사항으로 수정

 

2-2) 요구사항 분석

- 요구사항 모델을 통해 이해 관계자들의 이해를 돕는다. 

 

모델링 방법

. 구조 분석

ㅁ DFD ( Data Flow Diagram )

ㅁ STD ( State Transition Diagram )

ㅁ ERD ( Entity-Relation Diagram )

 

. 유즈 케이스 분석

ㅁ UC ( Use Case Modeling )

 

. 비용 기준 접근 : ROI

. 계층화 분석법(AHP) : 여러 대안들을 계층으로 나누어 다방면에서 판단하기 위한 분석법

 

3) 요구사항 명세

요구사항들을 문서화 하는 작업.

요구사항은 크게 기능 , 비기능 요구사항으로 나뉜다.

 

. 기능적 요구사항 : 시스템이 어떻게 동작해야하는지에 대한 설명. 제공하는 기능

. 비기능적 요구사항 : 시스템에 부과되는 제약 조건(품질 속성). 시스템의 품질에 대한 판단

※ 도메인 요구사항 : 시스템의 도메인으로부터 오는 요구사항. 기능 비기능 둘 다 가능

 

QAS : Quality Attribute Senario

- 품질 속성을 만족하는지 확인하기위한 시나리오.

구체적인 상황과 수치로 표현되어 요구사항 충족 여부를 확인할 수 있어야한다.

 

QAW : Quality Attribute Workshop

- 초기부터 이해관계자가 참석하여 품질 속성에 대해 의논하는 것.

- QAS로 문서화 되고 우선순위가 부여된 QA를 얻을 수 있다. 

 

. 순서

ㅁ 각 요구사항 들에 대해 이해 관계자 별로 우선순위 부여

ㅁ 요구사항의 품질 속성 정의 ex : 보안성, 가용성, 신뢰성, 안정성, 유지보수성 등등

ㅁ 그에 맞는 시나리오 부여

ex:

Requirement-ID QA_###
Category 관련된 Quality Attribute가 무엇인지 기술함 (예, Performance, Reliability, Security 등)
Source Stimulus를 발생시키는 주체가 무엇인지 기술함
Stimulus 시스템에 입력되는 내외부 자극이 무엇인지 기술함
Artifacts Stimulus의 영향을 받는 시스템의 내부 모듈, 컴포넌트, 혹은 시스템 전체
Environment 해당 Stimulus 발생시 시스템의 환경
Response 기술된 Environment에서 Artifact이 Stimulus를 받아들인 후 취하는 Action이 무엇인지 설명함
Response Measure 위의 Response의 정도를 측정하는 단위가 무엇인지 기술함 (예, 초당 데이터 처리량, 반응시간, 시간일 경우 hour, minute, second 여부 등)
Description 위에 기술된 Source로부터 Response Measure까지의 내용을 하나의 문장으로 요약해서 기술함

 

 

4) 요구사항 확인 및 검증

 

 

5) 요구사항 변경 관리

앞전에 OOAD를 통해 분석/설계 방법을 배웠다면, 이제는 설계의 품질을 올리는 과정이다.

좋은 설계의 정답은 없으나, Best Practive는 존재한다.

 

ㅁ 좋은 객체지향 설계를 위한 원칙들

 

1) DRY 원칙

Don't Repeat Yourself

- 같은 코드를 가리키는 이름은 오직 하나여야 한다.

 

2) KISS 원칙

Keep It Simple and Stupid

- 코드를 단순하고 인간이 읽기 쉽게

-- 보통의 메소드를 보면 10줄이 넘어가지 않는다.

 

3) Solid 원칙

 

SOLID

SRP : 단일 클래스가 하나의 책임과 역할만. 여러개의 responsibilite가 있으면 쪼개라

 


OCP : 변경이 최소화되어야한다.

 


LSP : 상속된클래스는 부모클래스를 대체할 수 있어야한다.

 


DIP : 높은 수준의 모듈은 낮은 수준의 모듈에 디펜던시를 가져서는 안된다. 
       디펜던시 뿐만아니라 onwership도 포함.사용하는 패키지로 오너십

 


ISP : 인터페이스가 커지면, 사용자들은 사용하지 않더라도 인터페이스에 종속됨. -> 여러개로 나눌 필요성

※postPayment() operation이 변경될때, Roaster Application은 사용하지 않음에도, 종속관계라 Recompile 필요. 

 

4) GRASP

 

GRASP: General Principles in Assigning Responsibilities

OOAD 과정에서 클래스에 responsibility를 부여하는 설계원칙.

 

Modularity : 좋은 설계란, 시스템을 모듈로 나누고 그에 맞는 Reponsibility가 부여되어있는것

측정 방법으로는 1) Coupling(결합성) 과 2) Cohesion(응집성) 측정

1) Coupling : 디펜던시가 낮으수록 좋다 → 변경의 자유로움과 영향도가 적음 ( loosely coupled )

 

2) Cohesion : 모듈 하나에 대해 평가, 얼마나 연관성 있게 모여있는지 (이해가 쉽고, 재사용이 용이함 )

 

GRASP 9가지 원칙

 

1) Information Expert : responsiblity 부여에 대한 근거 중 Information을 갖고 있는 오브젝트가 타당할 확률이 높다.

 

2) Creator : 특정 인스턴스 생성의 responsiblity를 누가 가질 것인가?

                   아래 조건을 충족할수록 타당함

 

3) Controller : UI Layer에서 넘어온 request를 누가 먼저 받을지에 대한 것

3-1) 시스템 전체를 대표하는 Entity를 두어서 전부 처리하던가

3-2) 유즈케이스, 세션 담당 객체를 만들어서 받던가

 

4) Low Coupling : 굳이 불필요한 Coupling 을 낮추는 방향으로. ( 변경 영향도 ↓ )
                             Global Object는 커플링 상관이 적음

 

5) High Cohension : 높은 응집률을 가지도록 부여

 

6) Pure Fabrication : 기존 오브젝트(도메인 단계에서 나온 오브젝트)에 responsiblity를 부여하기보다는, 디자인단계에서 새로 만들어서 부여

 

7) Polymorphsim : 특정 타입마다 다른 Behavior. 클래스가 많아지고 직관적 이해가 어려워질수는 있음

 

8) Indirection : 중재할 수 있는 객체를 두어, 커플링을 회피

 

9) Protected Variations(PV) : stable한 interface를 만들어서 resoponsibility를 부여

 

 

아키텍트의 역할 : 핵심 고객/관계자의 의도를 파악해 다른 관계자들에게 잘 전파하는 것.

소프트웨어는 생각이고, 언어는 생각을 정의한다. ( 자주 쓰는 단어들이 그 사람의 의도를 보여준다 )

어떤 품사냐에 따라 다양한 방법론들이 등장

 

1) 동사 : 절차적(구조적) 개발 방법론

2) 명사 : 객체지향 개발론

3) 부사 : 비기능(?)

 

고객이 Concern이 생기고, 이를 분석단계에서 나눠준다.

나눠줄때는 MECE에 따라 나눠주어 서로 영향을 끼치지 않도록 한다.

ME (Mutually Exclusive) : 1개의 집합을 2개로 나눴을 때, 나눠진 2개의 집합의 교집합이 공집합인 경우 

CE (Collectively Exhaustive) : 1개의 집합을 2개로 나눴을 때, 나눠진 2개의 집합 합집합이 전체 집합인 경우 

이 둘을 충족하면 Orthogonal 하여, 서로 의존도가 없다.
( 1개의 집합을 2개로 나눴을 때, 나눠진 1개의 집합의 변화가 다른 집합에 영향을 미치지 않는 경우 )

 

모호성이 제거되어 고객의 Requirement가 결정되고 이는 기능/비기능적 요구사항으로 나뉠 수 있다.

기능  : 동사로 설명 가능. 입력값 대비 출력값의 변화이며 한번에 테스트로 된다/안된다가 정해진다.

비기능 : 부사로 설명가능. 입력 대비 출력의 변화를 제약하는 요소들 (Quality)

              신경쓰기 어려우나, 비기능이 떨어지면 시장이 외면

 

Quality Attribute Senraio 작성

고객의 비기능적 요소를 얼마나 잘 충족할 수 있는지에 대한 내용으로

성능/사용성/신뢰성 등의 항목들로 표현 가능. 난이도/중요도를 작성하여 우선순위를 정하고 어디에 집중할지 결정 가능

 

작성 요령

1. 특정한 상황을 가정하라.
2. 수치로 작성하라.
3. 순서를 정하라.

 

 

MECE에 따라 나누기를 성공했다면 이것들을 적절히 붙여야한다.

1) Call & Return(Client Server)

2) Event Bus ( Send Receive )

3) Data-shared

4) Pipe&filters

개발의 독립적인 단위. Port를 지니고 내부구조를 볼 수 있다. ( OOAD 보다는 구현단계인 OOI 쯤에 등장한다.)

Kruchten의 4+1 view model에서 Development view에 해당한다.

 

Interface를 통해 접근한다.
Required - Input / Provided - Output 으로 보면 된다.

 

Interface 표현 방법
1) Ball(롤리팝) and socket symbols
롤리팝은 Provider , socket은 Required 로 표현

 

2) Stereotype notation
Depedency : 컴포넌트가 일을 하려면 특정 컴포넌트의 데이터가 필요하다. 이를 디펜던시가 있다고 표현
Realization : 필요한 데이터를 컴포넌트가 interface realization 하여 제공한다.

 

3) Text listing

 

Component realizaion
컴포넌트 내부의 클래스를 realzation . 오브젝트 인스턴스 및 Association 까지 표현 가능 ( 오브젝트 다이어그램 까지 )

 

컴포넌트 밖에서 외부 오브젝트와의 연결은 Requred/Provided Interface를 통해 표현할 수 있지만
컴포넌트 내부의 연결은 Assembly connector , 내부/외부를 연결하는 Delegation connector로 표현 가능

 

 

 

ㅁ BP 참고하여 고려할 점

1) 유스케이스처럼 그린점. 시스템의 바운더리를 명확하게 하지 않은점 수정 필요

2) MVC 패턴처럼 레이어를 나눈것은 동일하였으나, 인터페이스 연결관계만 표시했어야함.

3) 컴포넌트 다이어그램 이해가 부족하여 복습 필요

 

 

<BP>

ㅁ System의 Dynamic함을 표현. System/Method의 action flow를 보여준다

Activity Transition으로 이루어져있다.
. State가 아닌 action. ( 어떤일을 한다 )

Transition은 trigger,event가 없다. Activity가 끝나면 넘어간다.

Branching(Decision Point) : 마름모로 표시되며 조건에 따른 분기점


 

점선과 네모칸으로 오브젝트 수준에서 State도 표현할 수 있다.

 

 

Swimlanes : 선을 그어, Actitvity 수행 주체를 표현할 수 있다.

 

Statechart Diagram과 유사한데, State의 변화과정속에 action이 들어온 것인지 / action이 메인인지에 따라 다르다..

 

실습

 

ㅁ BP 참고해서 고려할점

1) 재고조회에서 재고가 소진되었을 시, 입고요청 후 종료하는 방법도 있으나

    입고가 완료되면 다시 분기점으로 돌아가 진행 가능

2) 카드와 재고 관련해서 분기되었던 것들이, 주문진행에서 합쳐지고 바로 다시 갈라졌다.

    쭉 병렬로 진행 하여 카드유효 -> 카드결제로, 재고있음 -> 상품배송으로 바로 이어져야 할듯.

3) 주문 취소나, 완료 후 고객에게 통보해주는걸 상담원에게 롤을 주었다.

    -> 실시간으로 상담원이 시스템에 접속하고, 고객과 소통하는 상황을 그림

    하지만, 상담원은 전화상담 정도만 진행하고 시스템에서 고객에게 직접 통보주는 그림도 고려

4) 각 분기별로 종료를 만들었는데, BP처럼 종료케이스가 한 점으로 모이는게 깔끔할듯

 

<BP>

FSM(Finitie State Machine)에 몇 가지 특성이 더해진 Diagram.

1) Composite State

2) Orthogonal State

3) History State

가 추가된 FSM을 state chart formularism 혹은 StateChart Diagram이라고 한다.

 


 

상태를 나타내는 State와 State 변화들이 수행되는 Transition으로 이루어져있다.

노드의 상태를 나타내는 State는

들어올 때의 Enrty, 현재상태에서 작업을 수행하는 Do, 다른 State로 전환될 때의 Exit 으로 구성되어있고

State 조건에 따라 Initial, Final, Terminate 등으로 표현될 수 있다.

Transition는 번호가 새겨진 event, 조건인 condition(guard), 수행문인 action으로 구성되어있다.

※ 예시

1) initial state를 따라 S1 state가 Active 되고

2) entry에 따라 x=4 값으로 결정된다

3) event가 발생하고 x==4 조건이 맞아 true 로 변경된다.

4) S1에서 나가면서 exit에 의해 x=5가 되고

5) transition 이 true이므로 action에 의해 x=10이 된다.

6) S2가 Active되고 entry에 의해 x=11이 된다.

 


 

1) Composite state ( → OR State )

다른 state를 내부적으로 포함할 수 있다. ( substate )

순간마다 substate를 포함하여, 하나의 State만 Active 될 수 있다.

 

2) Orthogonal state ( → AND State )

region 별로 state가 Active 될 수 있다.

 

※ Submachine State (SMS) : 다른 state machine diagram을 축약해서 참조형으로 표시

3) History State

마지막으로 active된 state를 기억해서 수헹.

. shallow state : 마지막 state와 동일 레벨에서 다시 수행. 보통 해당 레벨의 initial에서 수행된다.

. Deep history state : 마지막 state에서 다시 수행. ( 좀더 강력 )

※ H,H*에 선이 있는것은 last state가 없을 때의 진행방향을 위함

 

+ Recent posts