brunch

You can make anything
by writing

C.S.Lewis

by 안영회 습작 Jul 19. 2021

기존 테이블 구성을 클래스로 시각화하기

실전 시스템 수준 리팩토링 사례 2회

서로 다른 두 개발자가 만든 비슷한 기능과 전혀 다른 테이블이 있습니다.

아래와 같은 쿼리로 테이블 구조를 살펴봅니다. 참고로 업무 영역(domain)은 비영리 활동인 기부입니다.

use store_donation;
desc donations;
use sharing_platform;
desc donations

둘 모두 기부 서비스의 데이터를 저장하는 테이블들인데, 하나(store_donation)는 오프라인 매장 기부를 위한 테이블이고, 다른 하나(sharing_platform)는 택배를 이용한 기부 데이터 저장을 위한 테이블입니다. 테이블 구성을 보았더니 테이블 이름은 같은데 결과는 굉장히 다른 모습을 보여줍니다.


이들 테이블 이름이 같아 편의상 전자를 매장기부, 후자를 택배기부 (테이블)라고 부르겠습니다.


두 개의 donations 테이블을 클래스도(图)로

테이블은 보통 ERD로 그리는 경우가 많지만, 개인적으로 익숙한 UML 표기를 씁니다. UML 표기법 중에 클래스를 표현하는 그림을 클래스도라고 합니다. plant UML 이라는 도구를 이용하면, 별도 설치없이 UML 그림을 생성할 수 있어 이를 사용했습니다. 


표현방법은 간단합니다. 아래와 같은 식입니다. 작성에 사용한 몇 가지 기준은 다음과 같습니다.

테이블 이름을 클래스 이름으로 표기

필드 이름을 속성 이름으로 표기

데이터 타입은 일단 무시


class donations{
 id
 member_id
 campaign_id
 campaign_name
 status
 is_request_receipt
 is_application_for_receipt
 donor_name
 donor_mobile
 donor_post_no
 donor_address
 donor_address_detail
 reservation_no
 invoice_no
 donation_place_type
 donation_place_id
 donation_place_name
 donation_place_tel_no
 donation_place_post_no
 donation_place_address
 donation_place_address_detail
 take_over_method_type
 logistics_center_type
 logistics_center_place_id
 logistics_center_place_name
 logistics_center_place_tel_no
 logistics_center_place_post_no
 logistics_center_place_address
 logistics_center_place_address_detail
 agree
 marketing_agreed
 is_name_encrypt
 created_by
 created_at
 updated_by
 updated_at
 confirmed_by
 confirmed_at
}


이렇게 하고, plant uml을 실행하면 클래스도를 얻을 수 있습니다. 저는 실행을 위해 별도 도구를 쓰지 않고 두레이 편집기에서 저장하면 자동변환되는 그림을 사용합니다. (두레이를 쓰지 않는 분들은 인터넷 검색을 통해 plant uml 실행 방법을 찾을 수 있습니다.)


먼저 택배기부 테이블을 클래스로 표현했습니다.

다음은 매장기부 테이블을 클래스도로 표현할 차례인데, 매장기부와 택배기부 테이블 이름이 모두 donations로 같으니 하나의 클래스도에 표현할 수가 없습니다. 다행히 Plant UML 설명을 보니 namespace 라는 키워드가 같은 이름을 쓸 수 있게 해줍니다.

In packages, the name of a class is the unique identifier of this class. It means that you cannot have two classes with the very same name in different packages.In that case, you should use namespaces instead of packages.

아래와 같은 식으로 클래스를 namespace 정의로 감싸 주면 됩니다.

namespace sharing_platform{
 class donations{
  ...
 }
}

이제 두 개의 테이블을 하나의 클래스도에 표현할 수 있습니다. 이름은 같으나(donations) 너무나도 달라 보이는 속성이 확연히 드러나네요. 이젠 다른 사람과 대화하기 좋아졌습니다. UML이란 언어의 강점 중의 하나인 시각화(visualization) 효가가 확연히 드러납니다. 원래 목적인 개발자들과 대면 소통하는 것이지만, 여러분과 글로 소통하는 것도 대화의 일종이긴 하네요.

어떤 점이 다른지 명확하게 하면 이점이 있을까요? 일단 시도보기로 합니다.


클래스내 속성을 묶어보기

속성이 많은 택배기부 테이블에 주석을 붙여보고 싶은 충동을 느낍니다. 짧은 시간 노력으로 소통 효과가 확연히 나아질 듯 합니다. 아래 그림을 만든 순서는 이렇습니다.

먼저, 관련 있는 속성별로 순서대로 배열을 해봅니다.

(plant UML 클래스도 설명에 따라) 유사한 것끼리 선으로 구분합니다.

스테레오 타입 표기를 추가해서 같은 속성의 특징을 씁니다.

구분자를 넣고, 하위 영역별로 설명을 추가하니 확실히 특성이 잘 드러나는 클래스도가 되었습니다.


클래스도를 어디에 쓰나?

코드를 훑어 보고 도구를 이용하여 클래스도를 작성했지만, 본 게임은 이제부터 일 수 있습니다. 시각화 도구인 UML의 진짜 용도는 의사소통이니까요. UML의 L은 Language 즉, 언어라는 점을 상기시켜 드립니다. 누구와 어떻게 소통할 수 있을까요?

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari