paint-brush
가장 복잡한 프런트엔드 아키텍처: 기능 분할 디자인에 대해 알아야 할 사항~에 의해@mmmidas
1,942 판독값
1,942 판독값

가장 복잡한 프런트엔드 아키텍처: 기능 분할 디자인에 대해 알아야 할 사항

~에 의해 Yan Levin8m2024/01/18
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

이 기사에서는 Feature-Sliced Design 아키텍처에 대해 설명합니다. 제 생각에는 이것이 사용 가능한 옵션 중에서 가장 좋습니다. 또한 FSD의 개념과 이 아키텍처 방법론이 해결하는 문제를 살펴봅니다.
featured image - 가장 복잡한 프런트엔드 아키텍처: 기능 분할 디자인에 대해 알아야 할 사항
Yan Levin HackerNoon profile picture
0-item
1-item
2-item

소개

프런트엔드 개발자는 종종 애플리케이션 아키텍처와 관련된 문제에 직면합니다. 쉽게 확장할 수 있고 애플리케이션 모듈 간의 느슨한 결합과 높은 응집성을 제공할 수 있는 아키텍처를 사용해야 합니다.


이 기사에서는 Feature-Sliced Design 아키텍처에 대해 설명합니다. 제 생각에는 이것이 사용 가능한 옵션 중에서 가장 좋습니다. 또한 FSD의 개념과 이 아키텍처 방법론이 해결하는 문제를 살펴봅니다.


FSD를 기존 및 모듈식 아키텍처와 비교하고 장단점을 살펴보겠습니다.


먼저 레이어(layer), 슬라이스(slice), 세그먼트(segment)라는 세 가지 개념을 구별해 보겠습니다.

레이어, 슬라이스, 세그먼트

레이어

레이어는 최상위 디렉터리이자 애플리케이션 분해의 첫 번째 수준입니다. 레이어 수는 최대 7개로 제한되어 있으며 표준화되어 있지만 일부는 선택 사항입니다.


현재 다음 레이어가 구별됩니다.

레이어 각 계층에는 고유한 책임 영역이 있으며 비즈니스 지향적입니다. 각 레이어를 개별적으로 고려해 보겠습니다.


  • app: 애플리케이션 로직이 초기화되는 곳입니다. 공급자, 라우터, 전역 스타일, 전역 유형 선언 등이 여기에 정의됩니다. 이는 애플리케이션의 진입점 역할을 합니다.


  • 프로세스: 이 계층은 다단계 등록과 같이 여러 페이지에 걸쳐 있는 프로세스를 처리합니다. 이 레이어는 더 이상 사용되지 않는 것으로 간주되지만 여전히 가끔 나타날 수 있습니다. 선택적 레이어입니다.


  • 페이지: 이 레이어에는 애플리케이션의 페이지가 포함됩니다.


  • 위젯: 페이지에 사용되는 독립형 UI 구성 요소입니다.


  • 기능: 이 계층은 비즈니스 가치를 전달하는 사용자 시나리오 및 기능을 다룹니다. 예를 들어 좋아요, 리뷰 작성, 제품 평가 등은 선택 레이어입니다.


  • 엔터티: 이 레이어는 비즈니스 엔터티를 나타냅니다. 이러한 엔터티에는 사용자, 리뷰, 댓글 등이 포함될 수 있습니다. 이는 선택적 레이어입니다.


  • 공유: 이 계층에는 특정 비즈니스 논리에 연결되지 않은 재사용 가능한 구성 요소와 유틸리티가 포함되어 있습니다. 여기에는 UI 키트, Axios 구성, 애플리케이션 구성, 비즈니스 로직에 바인딩되지 않은 도우미 등이 포함됩니다.


이러한 계층은 코드베이스를 구성하고 모듈식, 유지 관리 및 확장 가능한 아키텍처를 촉진하는 데 도움이 됩니다.

Github 레이어

Feature-Sliced Design의 주요 특징 중 하나는 계층 구조입니다. 이 구조에서는 기능이 계층 구조에서 더 높기 때문에 엔터티는 기능의 기능을 사용할 수 없습니다.


마찬가지로 기능은 위젯이나 프로세스의 구성 요소를 사용할 수 없습니다. 위 레이어는 아래 레이어만 활용할 수 있기 때문입니다. 이는 한 방향으로만 향하는 선형 흐름을 유지하기 위해 수행됩니다. 레이어 구조 계층 구조에서 하위 계층이 위치할수록 코드의 더 많은 위치에서 사용될 가능성이 높기 때문에 계층을 변경하는 것이 더 위험합니다. 예를 들어 공유 레이어의 UI 키트는 기능, 위젯, 심지어 페이지 레이어에서도 사용됩니다.

조각

각 계층에는 응용 프로그램 분해의 두 번째 수준인 하위 디렉터리(슬라이스)가 있습니다. 슬라이스에서 연결은 사물을 추상화하는 것이 아니라 특정 비즈니스 엔터티에 대한 것입니다. 슬라이스의 주요 목표는 값을 기준으로 코드를 그룹화하는 것입니다.


슬라이스 이름은 프로젝트의 사업 영역에 따라 직접 결정되므로 표준화되지 않습니다. 예를 들어 사진 갤러리에는 사진, 앨범, 갤러리와 같은 섹션이 있을 수 있습니다. 소셜 네트워크에는 게시물, 사용자, 뉴스피드와 같은 조각이 필요합니다.


밀접하게 관련된 조각은 디렉터리에 구조적으로 그룹화될 수 있지만 다른 조각과 동일한 격리 규칙을 준수해야 합니다. 이 디렉터리의 코드에 대한 공유 액세스가 있어서는 안 됩니다.

조각

세그먼트

각 조각은 세그먼트로 구성됩니다. 세그먼트는 목적에 따라 슬라이스 내에서 코드를 나누는 데 도움이 됩니다. 팀의 합의에 따라 세그먼트의 구성과 이름이 변경될 수 있습니다. 다음 세그먼트가 더 일반적으로 사용됩니다.


  • api - 필요한 서버 요청입니다.


  • UI - 슬라이스의 UI 구성 요소입니다.


  • 모델 - 비즈니스 로직, 즉 상태와의 상호작용. 예를 들어 작업 및 선택기가 있습니다.
  • lib - 슬라이스 내에서 사용되는 보조 기능입니다.


  • config - 슬라이스의 필수 구성이지만 구성 세그먼트는 거의 발견되지 않습니다.


  • consts - 필요한 상수.

공개 API

각 조각과 세그먼트에는 공개 API가 있습니다. Public API는 index.js나 index.ts 파일로 표현되는데, 이를 통해 슬라이스나 세그먼트에서 필요한 기능만 외부로 추출하고 불필요한 기능은 격리할 수 있습니다. 인덱스 파일은 진입점 역할을 합니다.


공개 API 규칙:


  • 애플리케이션 조각과 세그먼트는 공용 API 인덱스 파일에 정의된 조각의 기능과 구성 요소만 사용합니다.


  • 공용 API에 정의되지 않은 슬라이스 또는 세그먼트의 내부 부분은 격리된 것으로 간주되며 슬라이스 또는 세그먼트 자체 내에서만 액세스할 수 있습니다.


공개 API는 가져오기 및 내보내기 작업을 단순화하므로 애플리케이션을 변경할 때 코드의 모든 위치에서 가져오기를 변경할 필요가 없습니다.

공개 API

건축에 대해 더 깊이 알아보기

추상화 및 비즈니스 로직

계층이 높을수록 특정 비즈니스 노드에 더 많이 연결되고 더 많은 비즈니스 논리가 포함됩니다. 계층이 낮을수록 계층의 추상화, 재사용성 및 자율성이 부족합니다.

레이어의 추상화

FSD는 어떻게 문제를 해결합니까?

Feature-Sliced Design의 작업 중 하나는 느슨한 결합과 높은 응집력을 달성하는 것입니다. FSD가 어떻게 이러한 결과를 달성했는지 이해하는 것이 중요합니다.


OOP에서는 이러한 문제가 오랫동안 다형성 , 캡슐화 , 상속 , 추상화 등의 개념을 통해 해결되었습니다. 이러한 개념은 구성 요소나 기능이 사용되는 방식에 따라 다른 결과를 얻을 수 있는 코드의 격리, 재사용성 및 다양성을 보장합니다.


Feature-Sliced Design은 이러한 원칙을 프런트엔드에 적용하는 데 도움이 됩니다.


추상화다형성은 레이어를 통해 달성됩니다. 하위 레이어는 추상적이기 때문에 상위 레이어에서 재사용이 가능하며, 조건에 따라 컴포넌트나 기능이 지정된 매개변수나 props에 따라 다르게 작동할 수 있습니다.


캡슐화는 슬라이스와 세그먼트의 외부에서 필요하지 않은 것을 격리하는 공용 API를 통해 달성됩니다. 슬라이스의 내부 세그먼트에 대한 액세스는 제한되어 있으며 공개 API는 슬라이스 또는 세그먼트의 기능 및 구성 요소에 액세스할 수 있는 유일한 방법입니다.


상위 계층이 하위 계층을 재사용할 수 있으므로 상속은 계층을 통해서도 달성됩니다.

클래식 아키텍처와의 비교

나는 당신이 고전 건축을 여러 번 접했다고 믿습니다. 대부분의 저자는 단순성으로 인해 교육 기사 및 YouTube 비디오에서 이를 사용합니다. 고전 건축에는 특정한 표준이 없습니다. 그러나 종종 다음과 같은 형식을 볼 수 있습니다.

고전 건축 고전적인 아키텍처에는 눈에 띄는 단점이 있습니다. 가장 큰 문제는 구성 요소와 모듈 혼란 사이의 암묵적인 연결로 인해 프로젝트를 유지 관리하기가 어려워진다는 것입니다. 고전적인 아키텍처의 단점은 시간이 지남에 따라 더욱 분명해집니다. 프로젝트가 길어질수록 애플리케이션 아키텍처는 해결하기 어려운 뒤엉킨 혼란이 더욱 커집니다.


클래식 아키텍처는 지속적인 유지 관리나 애완동물 프로젝트가 없는 소규모 프로젝트에 적합합니다.

Feature-Sliced Design은 개념과 표준 덕분에 기존 아키텍처의 문제를 방지합니다.


그러나 FSD로 작업하는 개발자의 이해도와 기술 수준은 클래식 아키텍처로 작업할 때보다 높아야 합니다. 일반적으로 경력이 2년 미만인 개발자들은 FSD에 대해 들어본 적이 없습니다.


그러나 Feature-Sliced Design으로 작업할 때는 문제를 "나중에" 해결하기보다는 "지금" 해결해야 합니다. 코드의 문제와 개념의 차이가 즉시 명백해집니다.

단순한 모듈형 아키텍처와의 비교

단순한 모듈식 아키텍처에는 몇 가지 단점이 있습니다.

  • 때로는 모듈이나 구성요소에 기능을 어디에 넣어야 할지 불분명할 때가 있습니다.


  • 다른 모듈 내에서 모듈을 사용하는 데 어려움이 있습니다.


  • 비즈니스 항목을 저장하는 데 문제가 있습니다.


  • 전역 함수의 암시적 종속성으로 인해 얽힌 구조가 발생합니다.


복잡하거나 적당히 복잡한 프로젝트에서는 단순한 모듈식 아키텍처보다 기능 분할 디자인이 선호되어야 하는 것 같습니다. FSD는 많은 근본적인 아키텍처 문제를 해결하고 단점도 거의 없습니다.


단순성과 개발 속도 측면에서 단순한 모듈형 아키텍처가 FSD보다 유리할 수 있습니다. MVP가 필요하거나 단기 프로젝트를 개발하는 경우 FSD보다 간단한 모듈식 아키텍처가 더 적합할 수 있습니다. 그러나 다른 경우에는 기능이 분할된 디자인이 더 좋아 보입니다.

기능 분할 디자인의 잠재력

FSD는 젊은 아키텍처 방법론입니다. 그러나 이미 많은 은행, 핀테크, B2B, 전자상거래 회사 등에서 사용되고 있습니다. 다음은 회사 목록이 포함된 GitHub 문제에 대한 링크입니다: GitHub Issue .


공식 FSD 문서가 포함된 GitHub 저장소에는 이 기사를 게시할 당시 11,000개 이상의 별표가 있었습니다. 문서는 적극적으로 확장되고 있으며 FSD 개발 팀과 Telegram 및 Discord의 커뮤니티는 연중무휴로 아키텍처 관련 질문이 있는 사람들에게 도움을 드릴 수 있습니다.


이 아키텍처의 잠재력은 높이 평가되며 전 세계 대기업에서 널리 사용되고 있습니다. 적절한 채택을 통해 FSD는 프런트엔드 개발 분야에서 지배적인 아키텍처 솔루션이 될 가능성이 있습니다.

건축의 장점과 단점

장점

  • 아키텍처 구성 요소를 쉽게 교체, 추가 또는 제거할 수 있습니다.


  • 아키텍처 표준화


  • 확장성


  • 방법론은 개발 스택과 독립적입니다.


  • 예상치 못한 부작용 없이 모듈 간의 제어되고 명시적인 연결.


  • 비즈니스 중심의 아키텍처 방법론.

단점

  • 다른 많은 아키텍처 솔루션에 비해 진입 장벽이 높습니다.


  • 인식, 팀 문화 및 개념 준수가 필요합니다.


  • 과제와 문제는 나중에 해결하기보다는 즉시 해결해야 합니다. 코드 문제와 개념의 편차가 즉시 표시됩니다. 하지만 이는 장점으로도 볼 수 있습니다.

결론

Feature-Sliced Design은 프론트엔드 개발자가 알아야 하고 사용할 수 있어야 하는 흥미롭고 가치 있는 발견입니다. FSD는 팀에 유연하고 표준화되었으며 확장 가능한 아키텍처와 개발 문화를 제공할 수 있습니다. 그러나 방법론의 긍정적인 측면을 활용하려면 팀 내 지식, 인식 및 규율이 필요합니다.


FSD는 명확한 비즈니스 방향, 엔터티 정의, 기능적 구성 및 응용 프로그램의 구성 요소 구성으로 인해 다른 아키텍처 중에서 돋보입니다.


프로젝트 및 공식 Feature-Sliced Design 문서에서 FSD 사용 사례를 독립적으로 탐색할 수도 있습니다.


공식 문서

예. GitHub 클라이언트

예. 나이키 운동화 및 신발 매장

예. 스도쿠


이 게시물은 길 수도 있지만, 새로운 것을 배우셨기를 바랍니다. 이 게시물을 읽어주셔서 감사합니다.


생각이나 질문이 있으시면 언제든지 댓글을 남겨주세요!


여기에도 게시됨