Skip to content

2. 객체 모델링 과정

이건창 edited this page May 11, 2024 · 3 revisions

객체 모델링

객체 모델링에서 집중한 일

상품 수입, 가공, 진열, 판매하는 과정을 거치면서 종이로된 쿠폰을 사용한다면 각 과정마다 어떤 영향을 미칠지 그리고 코드로 작성된 도메인 서비스와의 괴리감은 어떻게 낮출 수 있을지 고민했다.

쿠폰북의 개념

다들 어릴적에 전단지에 작성된 쿠폰북 봤을테다. 나만 나이 먹은게 아닐 것이다. 내가 가게를 연다면 이런 전단지 사이에 쿠폰을 실어 사용자에게 전달하면 좋겠다는 생각이 들었다.

image

그럼 회원은 쿠폰북을 가지며 사용할 때마다 쿠폰을 꺼내 하나씩 사용할 수 있게 되고 쿠폰북에서 쿠폰을 사용하여 소진하게 된다.

image

그럼 이미 사용했던 쿠폰을 찾으려면 어떻게 해야할까? 사용했던 쿠폰은 가게 사장님이 가져가지 않았을까 생각했고, 쿠폰을 보면서 사용자가 단골인지 아닌지도 확인 할 수 있을테다. 이런 관점으로 객체를 만들기 시작했다.

객체 모델링

객체를 만드려면 역시 어떤 책임을 가져 행위를 하는지 고민해보고 다음과 같이 정리했다.

---
title: 이달의 민족
---
classDiagram
    Shop *-- UnusedCouponBook
    Shop *-- PublishedCouponBook
    Shop *-- HandOutCouponBook
    Shop *-- RoyalCustomers
    Shop *-- PublishedEventCouponBook
    RoyalCustomers *-- Member
    Member *-- UnusedCouponBook
    CouponBook *-- Coupon
    FixDiscountCoupon --|> Coupon
    RateDiscountCoupon --|> Coupon
    ShopOwner *-- Shop
    UnusedCouponBook *-- CouponBook
    PublishedCouponBook *-- CouponBook
    HandOutCouponBook *-- CouponBook
    UsedCouponBook *-- CouponBook
    PublishedEventCouponBook *-- CouponBook

    class CouponBook{
	-List~Coupon~ coupons
	+existCoupon(Coupon coupon) void
	+deleteCoupon(Coupon coupon) void
	+addCoupon(Coupon coupon) void
    }
    
    class UsedCouponBook{
        -CouponBook usedCoupons
        +addUsedCoupon(Coupon coupon) void
        +showUsedCoupons() List~Coupon~
    }

    class UnusedCouponBook{
        -CouponBook unUsedCoupons
        +addUnusedCoupon(Coupon coupon) void
        +removeUsedCoupon(Coupon coupon) void
        +showUnusedCoupons() List~Coupon~
    }
    
    class PublishedCouponBook{
        -CouponBook publishedCoupons
        +addPublishedCoupon(Coupon coupon) void
        +removePublishedCoupon(Coupon coupon) void
        +showPublishedCoupons() List~Coupon~
    }
    
    class HandOutCouponBook{
        -CouponBook handOutCoupons
        +addHandOutCoupon(Coupon coupon) void
        +showHandOutCoupons() List~Coupon~
    }

    class PublishedEventCouponBook{
        -CouponBook publishedEventCoupons
        +issueEventCoupon(Coupon coupon) void
        +showEventCoupons() List~Coupon~
    }

    class Coupon{
	-String name
	-String description
	-Enum couponType
	+isPublished() boolean
	+isHandOut() boolean
    }

    class FixDiscountCoupon{
	-Int discountAmount
    }

    class RateDiscountCoupon{
	-Int discountRate
    }

    class Member{
	-String name
	-CouponBook unUsedCouponBook
	+useCoupon(Coupon Coupon) void
	+showMyCouponBook() List~Coupon~
	+receiveCoupon(Coupon coupon) void
    }

    class ShopOwner{
        -Shop shop
        +handOutCouponToRoyalCustomersInShop(Coupon coupon) void
        +publishCouponInShop(Coupon coupon) void
        +issueEventCouponInShop(Coupon coupon) void
        +addRoyalCustomerInShop(Member member...) void
        +showPublishedCouponsInShop() List~Coupon~
        +showHandOutCouponBookInShop() List~Coupon~
        +showEventCouponBookInShop() List~Coupon~
        +showRoyalCustomersInShop() List~Member~
    }

    class Shop{
        -String shopName
        -CouponBook publishedCoupons
        -CouponBook handOutCouponBook
        -CouponBook usedCouponBook
        -CouponBook eventCouponBook
        -RoyalCustomers royalCustomers

        +publishCoupon(Coupon coupon) void
        +handOutCouponToRoyalCustomers(Coupon coupon) void
        +issueEventCoupon(Coupon coupon) void
        +alreadyUsedCoupon(Coupon coupon) boolean
        +useCoupon(Coupon coupon) Coupon
        +addRoyalCustomer(Member member...) void
        +showPublishedCoupons() List~Coupon~
        +showHandOutCoupons() List~Coupon~
        +showEventCoupons() List~Coupon~
        +showRoyalCustomers() List~Member~
    }

    class RoyalCustomers{
        -List~Member~ members
        +handOutCoupon(Coupon coupon) void
        +addMember(Member member) void
        +showRoyalCustomers() List~Member~
    }

Loading

마치면서

객체 지향 모델링은 인지 부조화를 줄여 가독성을 높여줬다. 거기에 헥사고날 아키텍처로 인프라를 격리해 복잡성을 한 층 더 줄일 수 있어보인다.

도메인 주도 설계는 진행하는 과정에 재미를 느껴 집중도를 높일 수 있었고 모든 참여자가 같이 즐길 수 있는 방법처럼 보였다. 일을 즐기면서 할 수 있다니... 천국이 아닌가..?