ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 도메인과 비즈니스 그리고 비즈니스 로직
    Programming/iOS 2022. 5. 24. 11:18

    비즈니스 로직을 분리해야 한다?

    아키텍처 공부를 하다보면 "비즈니스 로직(도메인 로직)을 UI와 분리해야 한다"는 말을 자주 듣게 된다.

    그렇다면 여기서 말하는 도메인, 도메인로직 그리고 비즈니스, 비즈니스 로직은 무엇일까?

    UI와 무엇을 그리고 왜 분리해야 하는지 이해하려면 먼저 이 용어들이 무엇을 가리키는지 알아야 한다.

    이번 글에서는 도메인과 비즈니스의 뜻을 알아보고 두 로직의 관계와 앱 코드의 책임을 정리한다

    UI와 비즈니스 로직을 나누지 않으면 무엇이 문제인지는 다음 글에서 영화 검색 앱과 웹툰 앱을 예시로 살펴본다.

     

    도메인이란

    도메인은 해당 소프트웨어가 다루고 해결하려는 문제 영역이다.

    영화 검색 앱이 다루는 문제 영역은 사용자가 원하는 조건에 맞는 영화를 찾는 일이다.

    사용자는 장르나 개봉 연도 같은 검색 조건을 지정하고 앱은 조건에 맞는 영화를 찾아 검색 결과로 보여준다.

    이 기능을 앱으로 구현하려면 3가지를 코드로 표현해야 한다.

    • 영화(Movie) - 제목, 장르, 개봉일 등의 정보를 가진다.
    • 검색 조건(SearchCondition) - 검색어, 장르, 개봉 연도 범위, 정렬 기준등을 나타낸다.
    • 검색 결과([Movie]) - 조건에 맞는 영화 목록을 나타낸다.

    무엇을 코드로 표현할지는 서비스가 무엇을 하느냐에 따라 달라진다.

    배우로 검색하기가 있거나 리뷰를 남기는 기능이 있다면 배우와 리뷰도 코드로 표현해야 한다.

     

    도메인 데이터와 도메인 모델

    이처럼 문제 영역의 개념을 코드로 표현한 데이터를 도메인 데이터라고 한다.

    Movie, SerachCondition, [Movie]가 모두 도메인 데이터이다.

    반면 서버 응답으로 온 JSON 필드 구조 그대로 Swift로 옮긴 DTO의 경우는 도메인 데이터가 아니다.

    Swift 타입이지만 영화를 찾는 일이 아니라 서버가 데이터를 어떻게 보내는지를 표현하기 때문이다.

    지금 로딩중인지 같은 화면 상태를 나타내는 것도 마찬가지로 도메인 데이터가 아니다.

     

    도메인 데이터가 그 데이터에 대한 규칙까지 함께 가지면 도메인 모델이라고 부른다.

    다음 포스팅에서 SearchCondition이 연도 범위 규칙을 가지게 되는데 그때 SearchCondition은 도메인 모델이다.

     

    비즈니스란

    비즈니스는 서비스가 사용자에게 무엇을 제공하고 어떤 기준으로 동작하는지를 의미한다.

    영화 검색 앱이라면 사용자가 제목, 장르, 개봉 연도로 영화를 찾게하고 선택한 정렬 기준에 따라 결과를 제공하는 일을 생각할 수 있다.

    그리고 비즈니스는 무조건 수익과 관련이 있는게 아니다. 무료 검색 영화 앱에도 검색 결과를 결정하는 기준이 있다.

     

    도메인과 비즈니스를 정리해보면

    도메인은 소프트웨어가 어떤 문제영역을 다루는가에

    비즈니스는 서비스가 어떤 일을 어떤 기준으로 하는가에 초점을 둔다.

      영화 검색 앱에서의 설명
    도메인 사용자가 원하는 조건에 맞는 영화를 찾는 일, 이 일을 하기위해 영화, 검색 조건, 검색 결과를 다룬다.
    비즈니스 사용자에게 검색 기능을 제공하고 어떤 영화를 어떤 순서로 보여줄지 기준을 정하는 일

     

    도메인 로직과 비즈니스 로직은 무엇이 다른가

    도메인과 비즈니스는 서로 관계가 없는 개념이 아니다.

    많은 경우 서비스가 하는 일들을 소프트웨어로 구현하는 부분에서 두 단어가 같은 대상을 가리킨다.

    예를 들어 '조건에 맞는 영화만 보여준다'는 서비스의 기준이면서 영화 검색이라는 문제 영역의 규칙이기도 하다.

    그래서 모든 문서가 두 단어를 엄격하게 구분하지 않는다.

     

    두 개념이 겹치는만큼 도메인 로직과 비즈니스 로직도 서로 비슷하다.

    • 도메인 로직 - 문제 영역의 규칙에 따라 판단, 계산, 상태 변경을 수행하는 로직
    • 비즈니스 로직 - 서비스의 기준에 따라 판단, 계산, 상태 변경을 수행하는 로직

    영화 검색에서 선택한 장르와 개봉 연도에 맞는 영화인지 판단하는 코드를 예로 들어 보자.

    이 코드는 영화 검색이라는 문제 영역의 규칙을 적용하므로 도메인 로직으로 볼 수 있지만 서비스의 검색 기준을 구현하므로 비즈니스 로직이라고도 볼 수 있다.

    이처럼 두 표현은 대체로 같은 로직을 가리킨다. 그래서 이 글에서는 두 표현을 비즈니스 로직으로 통일한다.

    도메인이라는 표현은 앞에서 살펴 본 도메인 데이터, 도메인 모델처럼 문제 영역의 개념을 가리킬때 사용한다.

     

    앞에서 '조건에 맞는 영화만 보여준다'를 서비스의 기준이라고 했다. 이처럼 비즈니스 로직이 따르는 기준을 비즈니스 룰이라고 한다.

    어떤 처리가 허용되고 어떤 결과가 나와야하는지를 정하는 기준이다.

    선택한 장르에 속한 영화만 포함한다는 비즈니스 룰이고 영화의 장르를 확인해서 포함 여부를 결정하는 코드는 비즈니스 로직이다.

     

    그런데 실제 앱을 개발하다보면 앱의 코드가 UI 로직과 비즈니스 로직 둘로만 나눠지지 않는다. 그밖에 어떤 코드들이 있는지 살펴보자.

     

     

    UI 로직과 비즈니스 로직 외의 코드들

    영화 검색 기능 하나만 봐도 조건을 입력 받는 코드, 서버에 요청을 보내는 코드, 응답을 해석하는 코드, 결과를 저장하는 코드 그리고 이 작업들을 순서대로 호출하는 코드가 있다.

    비즈니스 로직을 UI로직과 분리해야한다 라는 말을 이해하기 위해선 두 로직 외에 어떤 코드들이 있는지 그리고 어떤 책임이 있는지 알아야 한다.

     

      책임 영화 검색에서의 예 이 코드를 수정해야할 때
    UI 로직 입력을 받고 화면 상태, 표시, 전환을 처리한다. 로딩 표시, 결과를 테이블 뷰로 보여주기 디자인이 변경될때, 테이블뷰에서 컬렉션 뷰로 변경될때
    비즈니스 로직 서비스 기준에 따라 판단하고 계산한다. 장르, 연도 조건에 맞는 영화인지 판단하기 검색 기준이 변경될때 (예: 개봉 예정작도 포함)
    애플리케이션 서비스 로직 필요한 작업을 호출하고 순서를 정한다. 조건 확인 -> 목록 요청 -> 결과 전달 처리 순서가 변경될때 (예: 검색 기록 저장 단계 추가)
    네트워크 처리 요청을 만들고 HTTP 통신을 한다. 조건을 파라미터로 만들어 요청 보내기 API  주소나 요청 형식이 변경될 때
    데이터 변환 외부 형식을 코드에서 쓸 데이터로 변환한다. 응답 JSON을 Movie 타입으로 변환 서버 응답 필드가 변경될 때
    데이터 접근, 저장 DB, 파일, 캐시에 접근하고 저장한다. 검색 결과를 로컬 캐시에 저장하기 저장소를 CoreData에서 Realm으로 변경할때

     

    검색 기능이지만 디자인 변경, 기준 변경, API  변경은 서로 다른 이유로 일어난다.

    코드를 수정하는 이유가 다른 코드들을 한곳에 섞어두면 디자인만 변경하려다 검색 기준까지 변경해버릴 수 있다. 책임을 나누는 목적이 여기에 있다.

     

    위 6가지를 크게 묶으면 3가지로 나타낼 수 있다.

    1. 화면: UI 로직
    2. 판단: 비즈니스 로직
    3. 데이터: 네트워크 처리, 데이터 변환, 데이터 접근 및 저장

    애플리케이션 서비스 로직은 이 셋을 이어주는 역할을 담당한다.

    화면에서 요청을 받아 판단과 데이터 작업을 순서대로 호출하고 결과를 다시 화면쪽에 돌려준다.

    '애플리케이션' 단어가 있다고 해서 iOS 앱에만 코드가 있는게 아니라 서버에도 같은 책임을 맡는 코드가 있을 수 있다.

     

    앞에서 판단을 비즈니스 로직으로 묶었지만 코드의 모습만 보고 책임을 정할 수는 없다.

    코드에 if나 filter가 있다고해서 모두 비즈니스 로직이 아니다.

    '시작 연도가 종료 연도보다 늦으면 잘못된 조건이다.'는 서비스 기준을 적용하는 판단이지만

    '잘못된 조건이면 검색 버튼을 비활성화 한다'는 if가 들어가지만 화면에 관련된 로직이다.

    타입의 이름에도 UseCase라는이름이 붙어있어도 판단 없이 전달만 하는 코드일 수 있고 이런 경우는 이후에 자세히 살펴볼 예정이다.

     

    다음 포스팅에서는 UI와 비즈니스 로직을 나누지 않으면 무엇이 문제인지 코드로 살펴보자.

     

    정리

    • 도메인: 소프트웨어가 다루고 해결하려는 문제 영역.
    • 도메인 데이터: 문제 영역의 개념을 코드로 표현한 데이터. 서버 형식을 옮긴 DTO는 포함하지 않는다.
    • 도메인 모델: 도메인 데이터와 그 데이터에 대한 규칙을 함께 가진 것.
    • 비즈니스: 서비스가 사용자에게 무엇을 어떤 기준으로 제공하는지.
    • 비즈니스 룰: 서비스가 지켜야 할 조건과 처리 기준.
    • 비즈니스 로직: 비즈니스 룰에 따라 판단·계산·상태 변경을 수행하는 로직.
    • UI 로직: 입력을 받고 화면 상태,표시, 전환을 처리하는 로직.
    • 애플리케이션 서비스 로직: 판단과 데이터 작업을 호출하고 순서를 정하는 로직.
    • 기능 하나에는 UI, 판단, 조율, 통신, 변환 저장 책임이 함께 들어 있다. 고치게 되는 이유가 다르면 책임도 다르다.
    728x90

    'Programming > iOS' 카테고리의 다른 글

    iOS - Firebase 기본 설정하기  (0) 2022.03.16
    iOS - SwiftUI를 이용해서 Preview 보기  (0) 2022.03.12
    iOS - Project의 Storyboard 삭제하기  (0) 2022.03.12
    iOS - URLSession과 URLSessionTask  (0) 2022.03.09
    iOS - URL과 ATS  (0) 2022.03.06
Designed by Tistory.