Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Clean Architecture] 13. Component (컴포넌트) 본문

Clean Architecture/Clean Architecture 기초

[Clean Architecture] 13. Component (컴포넌트)

jake-kim 2021. 7. 5. 22:35

Component (컴포넌트)

  • 컴포넌트의 개념: 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위
    • iOS에서는 .ipa 파일
  • 컴파일형 언어에서 컴포넌트는 '바이너리 파일'의 결합체
  • 인터프리터형 언어에서 컴포넌트는 '소스 파일'의 결합체
    • cf) 인터프리터형 언어: 컴파일러를 거쳐서 기계어로 변환되지 않고 바로 실행되는 프로그래밍 언어
    • 스위프트는 '컴파일형'언어

Component Cohesion (컴포넌트 응집도)

  • REP(Reuse/Release Equivalence Principle): 재사용/릴리즈 등가 원칙
  • CCP(Common Closure Printciple): 공통 폐쇄 원칙
  • CRP(Common Reuse Principle): 공통 재사용 원칙

REP

  • 재사용을 위하여 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 가능
  • 릴리즈 문서 작성과 릴리즈 번호를 주는 이유
    • 릴리즈 번호가 없다면 재사용 컴포넌트들이 서로 호환되는지 보증할 방법이 없는 것
    • 새로운 버전이 언제 출시되고 무엇이 변했는지 소프트퉤어 개발자들이 알아야 하기때문

CCP

  • 유지보수를 위해 동일한 이유로 동일한 시점에 변경되는 클래스를 같은 클래스로 묶고, 서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 묶는 것
  • CCP는 컴포넌트 수준의 SRP(Single Responsibility Principle)
    • SRP(Single Responsibility)을 컴포넌트 관점에서 다시 사용된 개념: 단일 클래스는 변경의 이유가 여러개가 있어서는 안되듯, CCP에서도 단일 컴포넌트는 변경의 이유가 여러 개 있어서는 안된다는 의미
  • 대부분의 애플리케이션에서 유지보수성은 재사용성보다 훨씬 중요
    • 애플리케이션에서 코드가 반드시 변경되어야 한다면, 여러 컴포넌트 도처에 분산되어 발생하기보다는 변경 모두가 단일 컴포넌트에서 발생하는 편이 낫다는 의미
    • 변경된 컴포넌트에 의존하지 않는 컴포넌트는 다시 검증하거나 배포 불필요
    • 소프트웨어를 릴리즈, 재검증, 배포하는 일과 관련된 작업량을 최소화
  • OCP(Open Close Principle)원칙과 유사: Closure(폐쇄)의 의미가 Close의 의미와 동일

CRP

  • 불필요한 릴리즈를 피하기 위해 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 않는 것
  • 재사용되는 경향이 있는 클래스와 모듈들은 같은 컴포넌트에 포함해야 하는 의미
  • 컴포넌트 내부에서는 클래스들 사이에 수많은 의존성이 존재
    • Container 클래스와 해당 클래스의 Iterator클래스가 있을 때, 이들 클래스는 서로 강하게 결합되어 있기 때문에 함께 재사용 > 동일한 컴포넌트에 위치
  • ISP(Interface Segregation Principle)와의 관계
    • CRP는 ISP의 포괄적인 버전: ISP는 사용하지 않는 메서드가 있는 클래스에 의존하지 않는 것이고 CRP는 사용하지 않는 클래스를 가진 컴포넌트에 의존하지 않는 것

컴포넌트 응집도에 대한 균형 다이어그램

  • 포함 원칙: REP, CCP
    • 두 원칙은 컴포넌트를 더욱 크게 만드는 원칙
  • 배제 원칙: CRP
    • 컴포넌트를 작게 만드는 원칙
  • 세 가지 원칙은 상충되므로 균형을 이루게끔 하는게 이상적

  • REP와 CRP에만 중점을 두면, 사소한 변경이 생겼을 때 너무 많은 컴포넌트에 영향을 미치는 상황이 발생
  • CCP와 REP에만 중점을 두면, 불필요한 릴리스가 빈번해지는 상황
  • 프로젝트의 컴포넌트 구조는 시간과 성숙도에 따라 변하는 것
    • 일반적으로 프로젝트는 삼각형의 오른쪽에서 시작: 재사용성만 희생
    • 프로젝트 성숙하고 그 프로젝트로부터 파생된 또 다른 프로젝트가 시작되면, 프로젝트는 삼각형에서 점차 왼쪽으로 이동

* 참고

Clean Architecture

Comments