본문 바로가기

Computer

What is a Use Case?

Use Case 의 정의

일반적으로 프로그래밍에서 말하는 Use Case 는 다음과 같이 정의될 수 있다.

  • 사용자가 특정 시스템을 사용하는 방식을 정의한 것.
  • 사용자가 특정 시스템을 사용하여 목적을 달성하기 위해 시스템이 제공해야 하는 기능의 단위.

Use Case 의 특징

Use Case 를 작성할 때 일반적으로 지켜지는 여러 특징이 있다.

  • Use Case 는 사용자의 관점에서 정의되어야 한다.
    (e.g. "로그인한 사용자는 게시판에 글을 등록할 수 있다." or "로그인한 사용자는 게시판에 글을 등록할 수 있어야 한다.")
  • Use Case 는 "Actor" 와 "Action" 이 필요하다.
    (위의 예제에선 Actor: "로그인한 사용자", Action: "게시판에 글을 등록하다" or "글을 등록하다"로 볼 수 있다.)
  • Use Case 는 특정 Context 또는 System 에 포함될 수 있다.
    (위의 예제에서 Action 을 "글을 등록하다."로 봤을 때는 "게시판"이 Context 가 될 수 있다. 만약 Action 을 "게시판에 글을 등록하다"로 봤을 때는 "전체 시스템"을 Context 로 볼 수 있는 등, 범위를 넓게 볼 수도 있다.)

Use Case 예시

위의 정의와 특징을 기반으로 Use Case 의 예를 몇 개 들어보자면,

  1. "사용자는 알람을 설정할 수 있다." 또는 "알람 설정 기능" -> `SetAlarmUseCase`
  2. "사용자는 설정한 알람을 삭제할 수 있다." 또는 "알람 삭제 기능" -> `RemoveAlarmUseCase`
    (위의 1,2번 예와 같이 Use Case 를 작성할 경우, 시스템 전역에서 이 Use Case 를 통해 알람 설정/삭제 기능을 이용하는 것에 어색함이 없다.)
  3. "사용자는 알람 설정에서 알람을 설정(삭제)할 수 있다." -> `AlarmSettings.Set(Remove)AlarmUseCase`
    (위의 경우에는 Context 를 "알람 설정"으로 제한했다고 볼 수 있고, 시스템이 "알람 설정" Context 자체는 관심이 없음에도 알람 설정(삭제) 기능을 이용하고자 한다면 어색할 수 있다.)

그럼 Use Case 를 실제로 구현해보자. Use Case 에 대해서 테스트가 가능하도록 protocol 을 정의하는 경우가 많으므로 일단 protocol 을 구현해보자. (그리고 사실 아키텍처 관점에서 구현은 크게 중요하지 않다.)

/// 사용자는 알람을 설정할 수 있습니다.
public protocol SetAlarmUseCase {
    func execute()
}

 

위의 Use Case 구현은 "사용자가 알람을 설정할 수 있다"는 것만 표현이 되었다. 여기에 사용자가 원하는 시간에 알람을 설정할 수 있어야 한다는 요구사항이 추가된다면 어떻게 표현되어야 할까?

/// 사용자는 원하는 시간에 알람을 설정할 수 있습니다.
public protocol SetAlarmUseCase {
    func execute(time: Time)
}

 

사용자가 알람을 설정하고 싶은 시간은 사용자만이 알기 때문에, 위의 구현과 같이 UseCase 를 실행할 때 파라미터를 통해 "원하는 시간"이라는 정보를 받는 방법으로 요구사항을 표현할 수 있다.

 

하지만 "사용자가 알람을 설정할 때 AI 분석을 통하여 선호하는 알람 소리로 설정해야 한다." 와 같은 요구사항은 어떨까?

이러한 요구사항은 Use Case 의 형태를 변경하지 않는다. 단지 구현의 변경이 생길 뿐이다. "~~ 할 수 있다." 로 표현되는 이전의 요구사항과 표현 방식도 다르다. 이런 요구사항은 사용자가 시스템을 사용하는 방식에 영향을 끼치지 않는다.

 

Use Case 이점

위의 예시 처럼 Use Case 를 작성하고 나면, 이제 시스템 내에서 동일한 알람 설정 기능이 필요한 경우 이 Use Case 를 실행하는 것으로 목표를 달성할 수 있다.

다른 Use Case 를 실행할 때 동일한 알람 설정 기능의 실행이 동반되어야 하는 경우 이 Use Case 를 참조하여 실행하는 것으로 구현할 수도 있다.

 

 

 

이 글에서 말하는 어떤 개념에 대한 설명, 정의는 제가 다양한 여러 문서, 포스트, 아티클 등을 접하며 정립된 개인적인 견해입니다. 일반적으로 설명되는 것과 다를 수 있으며 정답이 아닙니다.