최소 수준의 아키텍처 설정

아키텍처 설정

고민해봐야 할것

B2B vs B2C

  • B2B와 B2C의 공통요소?

  • B2B와 B2C의 디자인시스템 리소스 분리?

  • 동일한 시스템은?

  • B2B와 B2C간에 Space, Color 등 동일요소가 있을 수 있다.

  • 두 데이터에서 공통으로 가져는 Foundation 영역

  • 레이어 분리 필요

  • 보통은 Library, Foundation으로 레이어 분리를 하고 디자인 시스템 내에 두 가지 계층으로 이루어진다.

    • 각각의 버전별로 운영

    • Library는 Foundation 기반으로 동작

실무에서 필요한 부분을 먼저 고려하고, 공통의 아키텍처는 점진적으로 뽑아내도록 하자.

Foundation

사전적 정의: 구조물의 견고한 기초

-> 디자인시스템의 라이브러리를 이루는 견고한 기초 데이터들

  • 파운데이션은 여러 개념이 포함됨

  • 다만 모든 디자인시스템에 공통으로 들어가는 개념은 아님

  • Color: 디자인시스템에서 사용되는 색상의 종류

  • Spacing(Layout): 디자인시스템에서 사용되는 컴포넌트간 간격의 종류

  • Typography: 글자를 표현하는 기준

  • Icongraphy: 아이콘을 표현하는 기준

  • etc...

그냥 B2B, B2C 각각 디자인시스템을 두지 않고 왜 파운데이션을 정의해서 중앙화를 하는 것일까?

  • 웹은 게임을 제외하면, 앱을 제작할 때 색상, 간격, 아이콘, 텍스트, 이미지 5가지로 대다수의 화면을 표현할 수 있다.

파운데이션은 디자인시스템에서 제공하는 데이터의 구성모음이다.

  • 파운데이션에 정의된 데이터를 바탕으로 컴포넌트는 개발된다.

  • 컴포넌트를 개발하면서 파운데이션은 공통으로써 기능하므로 파운데이션 등록 프로세스를 견고히 운영해야 한다.

  • 디자이너, 개발자 간 컴포넌트를 함께 정의하며 커버리지를 최대한 파악한 후 파운데이션 버전은 최대한 보수적으로 운영해야 한다.

  • 파운데이션과 컴포넌트의 버전은 따로 움직여야 한다.

    • 디자인시스템의 버전은 "컴포넌트" 버전을 의미, 이 버전은 사용자 관점에서 보이는 것

    • 디자인시스템 실무자는 "컴포넌트"와 "파운데이션" 두 가지 버전을 모두 이해하고 관리해야 한다.

파운데이션을 사용하는 컴포넌트 구조도

  • 컴포넌트별로 버전이 필요한 이유는 컴포넌트별로 파운데이션이 바뀌었을때 사이드이펙트가 있을 수 있기 때문에 컴포넌트의 영향을 최소한으로 가기 위해 이러한 작업 진행

컴포넌트 개발을 위해 챙겨야하는 것

  • 디자인시스템은 코드가 언제든지 사용자에게 보일 것을 염두해야 한다.

    • 코드가 복잡하고 이해가 되지 않으면 안된다.

    • 그렇기 때문에 모든 코드는 일관적이어야 하고 간단해야 한다.

  • 컴포넌트의 개발 방법 통일

    • 코드 컨벤션

    • 코드 리뷰의 방법, 중요한 코드 SoC하기

    • 컴포넌트 로직, 레이아웃 분리

Key Point: 정말 조그마한 것이라도 필수불가결한 공유는 필수!. 히스토리도 조그마한 것도 모두 기록해야 한다.

  • 이유로, 디자인시스템의 모든 논의과정은 사용자가 알 수 있어야 한다.

  • 디자인시스템은 "공통 조직"이기 때문에 중립적이어야 한다.

디자인 언어 (Design Language)

용어의 통일: 가장 중요한 디자인시스템에서의 개념

디자인시스템은 용어 통일을 단계적으로 진행해야 한다.

  • 첫 번째 용어 통일 대상자: 디장니시스템을 개발하는 개발자와 디자이너

    • 서로의 툴(소프트웨어, 피그마, ...)에서 사용되는 용어를 통일

    • 가급적이면 디자인에 통일 시키되, 개발에만 필요한 부분은 따로 용어로 정리한다.

    • 디자인의 경우 디자인에 특화된 언어라기 보다는 비즈니스 특화된 언어를 고를 가능성이 크다.

  • 두 번째 용어 통일 대상자: 디자인시스템을 사용하는 개발자와 디자이너 그리고 PM/PO

    • 사용자 입장에서 디자인 언어를 통해 서로간 동일한 명칭을 사용하므로써 "커뮤니케이션 비용을 절감" 한다.

    • 커뮤니케이션 비용을 절감하는 것은 디자인 언어, 나아가 디자인시스템의 가장 중요한 역할

디자인 언어의 역할

  1. 디자인시스템 개발자(디자이너/개발자)간의 커뮤니케이션에 필요한 언어

  2. 디자인시스템 개발자와 사용하는 사람 간의 커뮤니케이션에 필요한 언어

e.g)네이버의 버튼 컴포넌트 예시

  • 구성요소: Border, Typography, Icongraphy

  • 컴포넌트는 확장가능 해야 한다.

    • 현재) 로그아웃 우측에 Exit Icon이 있음

    • 미래) 로그아웃 좌측에 Exit Icon을 배치할 수도 있다.

    • 그마저도 모바일과 PC는 다를 수 있다.

  • 디자인시스템 개발자들이 항상 하는 생각: 비즈니스가 우리의 상상보다 더 많은걸 필요로하면 어떻게 해야하는가?

    • Button 컴포넌트는 Left, Right, Middle 등의 레이아웃 구조와 관련된 영역이 존재

    • 사용처에서는 "Left", "Right", "Middle" 등의 개념을 이해하지 않아도 되게끔

    • 컴파운트 컴포넌트 패턴 등을 이용해 제공하거나, 인터페이스 주석을 달아 제공

    • 버튼 컴포넌트 내부적으로 여러 레이아웃에 대한 자동화, 코드등은 사용처에서 모르도록 각자의 언어를 만드는 것이 필요

  • 버튼의 예시처럼 디자인시스템은 컴포넌트가 점점 많아지고, 잘게 쪼개진다.

  • 그러면서 같은 컴포넌트 하나에 레이어가 수십개 존재하게 될 수도 있다.

    • e.g) 네이버의 버튼에 좌,우만 있는게 아닌 상,하가 생길수도 있고, 애니메이션 등이 외부에 생길 수도 있다.

  • 그렇기 때문에 디자인시스템 개발하는 곳에서 쓰이는 언어와 사용하는 측에서의 언어를 분리해서 제공해야 한다.

    • 이러한 역할을 하는 것이 디자인 언어이며, 디자인 언어는 각 사용되는 영역에서 저마다 구축해야 한다.

자동화된 디자인시스템 개발 및 운영 프로세스

디자인시스템을 성공시키기 위해 가장 중요한 개념

  • 디자인시스템은 만들지 않는 것이 제일 성공확률이 높다.

    • 제작을 위해 들어가는 팀, 개발 리소스, R&R 분리 등 정말 많은 고려필요

  • 디자인시스템을 구축하게되면 두 가지를 항상 고민해야 한다.

    • 첫 번쨰: 디자인시스템을 어떻게 전파하고 실제로 사용 시킬 것인가?

    • 두 번쨰: 사용자에게 신뢰성이 있는 컴포넌트를 어떻게 개발하고 운영할 것인가?

첫 번쨰: 디자인시스템을 어떻게 전파하고 실제로 사용할것인가

  • 디자인시스템은 사용을 위해 적극적인 어프로치와 완성도 높은 퀄리티의 결과물이 필요

    • 상위 조직 및 유관 부서 설득을 통해 적용 일정을 잡는 것이 첫 목표

    • 무엇이든 적극적인 어프로치 그리고 사용처를 확보하지 못하면 아무리 좋아도 의미가 없다.

    • 적용을 통해 완성도가 높다는 걸 입증하고 결과 단계에서 어떠한 성과 (기간 단축)이 있는지 체크를 통해 발표 등 노력

  • 조직 관점에서 고민

    • 디자인시스템을 사용하는 부서를 어느정도 인원이 얼만큼 서포트하는데 리소스를 쓰는가?

    • 운영 리소스와 신규 피처 개발, 버그 픽스 등 리소스는 잘 배분되어 사용되어 있는가

    • 신규 디자인시스템을 적용하는 과정을 기본적인 리소스에 3~4배는 사용된다고 생각해야함

      • 개발자가 알지못하는 버그와 수많은 질의응답의 시간이 기다리기 때문

두 번째: 사용자에게 신뢰성 있는 컴포넌트를 어떻게 개발하고 운영할 것인가

  • 디자인시스템 전파에 어느정도 성공해서 여러 부서가 사용할 때

    • 컴포넌트 변경사항이 적도록 고민 필요

    • 장애를 내지 않도록 다양한 OS 단위의 테스트 필요

    • 수많은 CS 등을 처리할 수 있는 자동화된 운영 프로세스 구축 필요

업무 프로세스 구축하기

  • (개발 방법 구축) 배포 / 브랜치 (소스코드) 운영 방식

  • (개발 환경 구축) 피쳐 / 수정단위의 변경사항 확인을 위한 테스팅 환경 구축

  • (커뮤니케이션 자동화) 사용자와 커뮤니케이션을 위한 채널 정리 및 업무 상황 확인

개발 방법 구축) 배포 / 브랜치 (소스코드) 운영 방식

  • 추천) Trunk-Based Development

  • 단일 브랜치에서 모든 작업을 진행, 소규모 단위의 배포를 잦게 일어나도록 한다.

  • 대다수의 디자인시스템 컴포넌트는 컴포넌트 별 버전이 존재하고, 코드 전역적으로 브레이킹 체인지가 일어나지 않기 때문에 베타/릴리즈 등 수많은 브랜치의 존재가 필요없음

  • 그 과정에서 수많은 테스트와 엄격한 규칙이 동작해야 Trunk-Based Development는 지켜질 수 있다.

    • 디자인시스템의 경우 컴포넌트 별 테스트를 중요하게 지켜야 하므로, 엄격한 규칙을 지키기에 최적화된 프로덕트

개발 환경 구축) 피처 / 수정 단위의 변경사항 확인을 위한 테스팅 환경 구축

커뮤니케이션 자동화) 사용자와의 커뮤니케이션을 위한 채널 정리 및 업무 상황확인

테스트: 디자인시스템의 필수적이고 핵심적인 수단

  • 디자인시스템은 테스트가 되지 않으면 사용되는 영향 범위가 넓을수록 문제가 커지게 된다.

    • 사용하는 팀이 100개라하면 하나의 문제가 100개의 팀에 영향을 주기 때문

  • 세 가지 주요로 봐야할 디자인시스템의 핵심 테스트

    • 첫 번째: 정상적으로 동작하는가?

    • 두 번째: 레이아웃이 문제 없이 동작하는가?

    • 세 번쨰: 모든 환경에서 동작하는가?

세 가지 측면에서 어떤 테스트 방법을 사용하면 좋을지 체크해보자.

첫 번쨰: 정상적으로 동작하는가

  • 기본: 컴포넌트 단위로 버전을 제공, 컴포넌트 버전 레벨로 버그를 격리

    • 예를들어 문제 로직을 버튼과 리스트에서 사용한다 할 때, 버튼만 버전을 올리면 버튼에만 영향이 있을 것

    • 이는 정상적으로 동작할 수 있도록 영향 범위를 제어하는 역할을 함

  • 코드리뷰: 정상적으로 동작하는지 개발자 레벨에서의 코드리뷰 활동에서 체크할수 있도록 한다.

    • 피처 단위의 테스트 환경 구축을 통해 이를 가능케 한다.

  • 테스트 코드: 컴포넌트 테스트, 통합 테스트, 단위 테스트를 핵심적으로 이용

    • 기본적으로 디자인시스템은 브라우저 이벤트를 제외한 비동기 동작은 잘 활용하지 않을 것

    • 기능들에 대해 단위/통합 테스트를 Jest나 Vitest 등을 통해 로직 작성

    • 컴포넌트 테스트는 E2E 툴을 이용해 진행 (더불어 접근성 테스트도 진행)

    • 중요) 레이아웃 테스트는 이 단계에서 진행하지 않는다. 로직에 대한 검증만

두 번째: 레이아웃이 문제없이 동작하는가?

  • 레이아웃과 로직 테스트를 분리한 이유는 로직 (HTML/CSS)로 하여금 100% 브라우저의 레이아웃이 동일할것으로 체크하지 못하기 때문

    • 이 세상엔 다양한 브라우저, OS가 존재하고 그들마다 처리하는 방법이 다르기 때문

  • 여러 레이아웃에서 다른 문제를 검증하기 위해 pixel 단위로 체크하는 "시각적 회귀 테스트"를 이용한다.

    • 스토리북과 퍼펫티어를 이용해서 공통 서버를 올린다음, 공통 서버 내에서 여러 브라우저를 테스트할 수 있는 환경을 구축한다.

    • 각 개발자 별 브라우저에서 테스트보다, 공통의 테스트 슈트를 검증할 수 있는 공통 서버를 구축하는것이 중요하다.

      • 초기에는 큰 성능을 요하지 않으므로 서버 한 대에 도커 여러개를 물려서 브라우저 환경 테스트를 진행해도 좋다.

  • 시각적 회귀 테스트는 배포 전 무조건 이루어져야 하며, 문제 있을 시 배포가 이뤄지지 않도록 제공한다.

    • browserlist 등으로 제공 버전등을 명확하게 하자

세 번쨰: 모든 환경에서 동작하는가?

  • 레이아웃과 이어지는 내용

  • OS/Browser 별로 달라지는 환경에 대해 테스트 구비 필요

  • 필요하다면 사내 QA 팀과 함께 테스트할 수 있는 방안 마련 필요

    • 디자인시스템을 구축할 수준의 회사라면 QA 팀이 존재할 것으로 기대

    • 그렇지 않다면 디자인시스템을 구축하는 의미가 퇴색된다.

      • 비즈니스를 치기도 바쁜 환경에서 디자인시스템은 비즈니스를 더 오래 배포가 못나가도록 한다..

Last updated