[Architecture] 클린 아키텍처의 핵심: Use Case

Borahm·2021년 5월 17일
2
post-thumbnail

1. Use case

  • 내가 만들고자 하는 시스템(혹은 서비스)을 사용하는 클라이언트가 그 시스템을 통해 하고자 하는 것 (반대로 시스템이 사용자에게 제공하는 서비스)을 말한다.

  • 영화관 서비스를 예를 들어보자.

  • 손님(클라이언트)가 하고자 하는 것을 아래와 같이 나눌 수 있다.

    • 영화 예매
    • 예매 취소
    • 환불
    • 팝콘 사기
  • 위와 같은 것들이 '영화관'이라는 시스템에서 사용자가 요청할 수 있는, '영화관'의 Use case이다.

  • 클린 아키텍처에서 말하는 좋은 아키텍처란, 아키텍처(설계도)가 그 시스템이 하고자 하는 것을 설명해야 한다는 것이다. 그리고 그것은, Apache, Django, MySQL과 같은 도구가 아니고, 그것이 웹사이트 임을 유추할 수 있는 특정 웹 프레임워크의 폴더 구조도 아니다. 그것이 웹 서비스이든, 로컬에서 동작하는 서비스이든 관계 없이, 해당 서비스가 클라이언트에게 어떤 기능을 제공해주는지 말해줄 수 있어야 좋은 아키텍처인 것이다.

  • 아키텍처 예시

    이미지 출처

  • 좋은 아키텍처를 만들기 위해서는 Use case가 안정적으로 잘 만들어져 있어야 하고, 그 외의 도구들은 언제든지 바뀔 수 있으므로, 결합도를 최대한 낮추는 것(loose couplling)이 중요하다. 하나의 기능?만을 Use case라고 표현하면, 혹시 너무 심플한 거 아닌가? 라고 생각할지 모르겠다. 실제로 본인이 만들고자 하는 서비스가 있어서, 그것을 Use case화하고 구현해보면 결코 그것이 심플하지 않음을 완전히 깨닫게 되겠지만.. 위의 이미지를 통해 간접 경험해보자.

  • Use case를 툴 같은 외부 요인과 어떻게 분리(loose coupling)시킬 수 있나? 아래 이미지는 방법을 대략적으로 나타낸 것이다.

    이미지 출처

  • 위의 이미지에서 Interactor가 Use case라고 생각하면 된다. 그리고 그림에는 하나의 Interactor만 그려져 있지만, Interactor와 Use case는 일대일 매칭되는 것이며, 때문에 하나의 서비스에는 여러 Interactor가 있을 수 있다.

  • Interactor가 사용하는 Entity들은, Use case를 처리하기 위해 필요한 요소들이라고 생각하면 된다. '영화 예매'를 예로 들면, 우리가 서비스 시스템을 객체지향적으로 설계한다고 했을 때, '영화 예매'라는 로직을 처리하기 위해 '영화', '상영', '손님', '비용' 등의 객체들을 구성하고, 그 객체들의 협력으로 구조를 만들 수 있을 것이다. 이때 '영화', '상영', '손님', '비용'과 같은 것들이 Entity가 될 수 있다.

  • 그리고 Use case와 툴을 포함한 그 외 외부를 나누기 위해서, 이미지에서 표현한 것과 같이 Boundary라는 인터페이스를 둔다. 해당 인터페이스를 통해 Use case로 들어오는 요청을 모두 같은 형태로 들어오도록 만들고, Use case로부터 응답이 나갈 때도 항상 정해진 형태로 나갈 수 있도록 한다. 때문에 Delivery mech. 의 위치에 어떤 종류의 프레임워크가 붙어도 관계가 없어진다.

  • 가령, 파이썬 개발라서, WAS 프레임워크로 Flask를 쓰든, Django를 쓰든 관계 없이, 해당 프레임워크로 들어온 요청을 Use case가 받아들일 수 있는 형태에 맞춰서 전달하고, 정해진 응답 형식에 맞게 처리해주면 되는 것이다.

2. Use Case Diagarm

소개

  • 유스 케이스 다이어그램: 시스템이 제공하는 기능과 이용자의 관계를 표현

    이미지 출처

다이어그램 작성

다이어그램 해석

  • 유스케이스 다이어그램을 봤을 때 아래와 같이 해석하거나 작성하면 유용하다.

    1. 시스템 S에서 액터 A가 유스케이스 U와 관련이 있는 경우

      "A는 U라는 목적을 달성하기 위해 S와 상호작용한다"

    2. 유스케이스 U가 유스케이스 U1과 포함 관계에 있는 경우

      "U를 하기 위해서는 U1을 반드시 수행한다"

    3. 유스케이스 U가 유스케이스 U2와 확장 관계에 있는 경우

      "U를 수행하는 도중에 경우에 따라 U2가 수행된다"

3. 유스 케이스 시나리오

  • 유스케이스 다이어그램이 완성되면, 각각의 유스케이스에 대해
    유스케이스 시나리오를 작성한다.
  • 유스케이스 시나리오에 일반적으로 포함되는 내용은 다음과 같
    다.
    • 유스케이스 이름
    • 유스케이스를 수행하는 행위자
    • 유스케이스 내용
    • 선행 및 후행조건
    • 이벤트 흐름(기본흐름, 예외흐름, 대안흐름)
  • 유스케이스와 UML(인터넷 쇼핑몰 예)를 참고하면 좋다.

References

0개의 댓글