리 액트 디자인 패턴 | Line Entry의 Atomic Design 적용기 모든 답변

당신은 주제를 찾고 있습니까 “리 액트 디자인 패턴 – Line Entry의 Atomic Design 적용기“? 다음 카테고리의 웹사이트 you.halongpearl.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.halongpearl.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 naver d2 이(가) 작성한 기사에는 조회수 4,187회 및 좋아요 113개 개의 좋아요가 있습니다.

Table of Contents

리 액트 디자인 패턴 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 Line Entry의 Atomic Design 적용기 – 리 액트 디자인 패턴 주제에 대한 세부정보를 참조하세요

발표자: 김영호 (N Tech Service)
발표월: 2019.11.
더욱 다양한 영상을 보시려면 NAVER Engineering TV를 참고하세요. https://tv.naver.com/naverd2
○ 발표내용
Line Entry 서비스에 React Styled-Component를 이용하여 Atomic Design 방법론을 적용한 사례를 발표합니다.
○ 발표 슬라이드
– https://www.slideshare.net/NaverEngineering/line-entry-atomic-design

리 액트 디자인 패턴 주제에 대한 자세한 내용은 여기를 참조하세요.

[React] React 디자인 패턴 – 햣 블로그

[React] React 디자인 패턴. React. “디렉토리 어떻게 관리하지…” 이 생각은 프론트엔드든 백엔드든 많이 고민하는 부분 …

+ 여기에 더 보기

Source: woong-jae.com

Date Published: 9/21/2022

View: 8112

리액트 디자인패턴 및 구조 – 코딩애플 온라인 강좌

MVC,MVVM Pattern : 기존 개발에서 많이 쓰이는 디자인 패턴 , 리액트에서는 좀 비효율적이라고 함. 간략하게 찾아본 패턴들의 특징? 요약 입니다.

+ 여기에 더 보기

Source: codingapple.com

Date Published: 1/22/2021

View: 5007

나는 리액트를 어떻게 설계할 것인가? – 도현위키

1. Presentation Component – Container Component. React의 가장 기본적이고 유명한 디자인 패턴이다. Container Component에서 데이터를 처리하고 …

+ 여기에 보기

Source: doiler.tistory.com

Date Published: 2/6/2021

View: 8496

[React] 06. 리액트 디자인 패턴 (fin.) – 개발자 지니의 기록

리액트 디자인 패턴 (React Design Pattern) 앞서 아래와 같은 리액트 패턴 다섯 가지를 알아보았다. ▷ [React] 01. 리액트 디자인 패턴 (Compound …

+ 더 읽기

Source: cocobi.tistory.com

Date Published: 4/7/2022

View: 451

꼭 알아야 할 React 디자인 패턴 ②_ React의 디자인 패턴

안녕하세요 UXPin 파트너 단군소프트입니다. ​. 오늘은 지난 시간에 이어 React에서 사용할 수 있는 수만 개의 디자인 패턴 중 꼭 알아야 할 몇 가지 …

+ 여기에 더 보기

Source: blog.naver.com

Date Published: 1/9/2022

View: 8294

React.js – presentational & container 디자인 패턴

presentational & container 디자인 패턴. 회사에서 리엑트 프로젝트를 부여받고, atomic, presentation 등등 여러가지 파일 구조에 대해 찾아보고, …

+ 자세한 내용은 여기를 클릭하십시오

Source: kyounghwan01.github.io

Date Published: 5/30/2021

View: 8141

[리액트 디자인 패턴] Compound Component Pattern (합성 …

이 글은 Compound Pattern과 관련된 글의 한글 번역입니다. 원문 링크: https://www.patterns.dev/posts/compound-pattern/ Compound Pattern Create …

+ 자세한 내용은 여기를 클릭하십시오

Source: im-developer.tistory.com

Date Published: 8/22/2022

View: 6171

React 아키텍쳐, 디자인 시스템, 파일 구조에 대한 고찰

반년일기 사이드 프로젝트를 진행하면서 리액트에 대한 한계점에 매일 매일 도달 … 리액트 디자인 패턴이라고 검색하면 가장 먼저 뜨는 게시물이다.

+ 자세한 내용은 여기를 클릭하십시오

Source: kyung-a.tistory.com

Date Published: 11/28/2021

View: 7734

주제와 관련된 이미지 리 액트 디자인 패턴

주제와 관련된 더 많은 사진을 참조하십시오 Line Entry의 Atomic Design 적용기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Line Entry의 Atomic Design 적용기
Line Entry의 Atomic Design 적용기

주제에 대한 기사 평가 리 액트 디자인 패턴

  • Author: naver d2
  • Views: 조회수 4,187회
  • Likes: 좋아요 113개
  • Date Published: 2020. 1. 20.
  • Video Url link: https://www.youtube.com/watch?v=33yj-Q5v8mQ

[React] React 디자인 패턴

“디렉토리 어떻게 관리하지…”

이 생각은 프론트엔드든 백엔드든 많이 고민하는 부분일 것이다.

React에서는 어떻게 디렉토리를 나눠야 할까?

React를 사용하는 목표는 React 엘리먼트 트리를 만들어 화면에 렌더링하는 것이다. React 엘리먼트 트리는 컴포넌트를 단위로 구성된다. 그렇다면 컴포넌트들은 필연적으로 계층적인 구조를 가질 수 밖에 없다. 컴포넌트들이 계층적인 구조를 가지기 때문에 디렉토리 구조도 컴포넌트의 계층에 따라 구성하는 것이 자연스럽다.

이번 글에서는 계층을 나누는 ‘기준’을 제시해주는 대표적인 디자인 패턴 몇 가지를 정리해본다.

디자인 패턴

Presentational and Container Component Pattern

2015년 Dan Abramov가 처음 소개한 패턴이다. 가장 기본적이고 유명한 디자인 패턴이다.

첫 소개 이후 Dan Abramov가 2019년에 새로 글을 업데이트 했는데, 더이상 자신이 소개한 패턴으로 컴포넌트를 나누는 것을 추천하지 않는다고 한다. 추천하지 않는다곤 하지만 이전에는 어떤 필요성에 의해 이런 패턴이 고안됐고, 이제는 왜 추천하지 않는지, 그렇다면 무엇을 추천하는지 살펴보자.

이 접근 방식은 컴포넌트를 ‘Conatainer’와 ‘Presentational’의 두 카테고리로 나눈다.

Presentational 컴포넌트는 화면에 보여지는 것만 담당하는 컴포넌트다. 보여지는 것만 담당하기 때문에 어플리케이션의 다른 부분과의 의존성을 갖지 않고, 데이터가 어떻게 가져와지고 변화되는지도 모른다. 그저 받은 것을 보여주는 컴포넌트다. 상태를 가질 수는 있지만 UI와 관련된 상태만 가진다.

Container 컴포넌트는 동작에 관한 것을 담당하는 컴포넌트다. 동작만을 다루기 때문에 DOM 마크업 구조나 스타일을 가지지 않는다. Pesentational 컴포넌트에 보여줄 데이터를 가져오거나 변화시키고 컴포넌트의 행동(behavior)을 정의한다.

장점

관심사를 분리할 수 있다.

기능과 UI가 명확하게 분리되기 때문에 코드의 구조를 이해하기 쉬워지고 유지보수, 재사용성이 뛰어나다.

재사용성을 높일 수 있다.

Presentational 컴포넌트는 다른 부분과 의존성을 갖지 않기 때문에 다른 container애서 마음껏 사용할 수 있다.

마크업이 편하다.

이 패턴을 사용하면 ‘레이아웃 컴포넌트’가 추출될 수 밖에 없다. 이 레이아웃 컴포넌트를 통해 똑같은 마크업을 여러번 작성하는 것을 방지할 수 있다.

이제는 추천하지 않는 이유

Dan Abramov는 두 가지 이유로 이 패턴을 추천하지 않는다고 한다. 필요하지도 않는데 너무 맹목적으로 이 패턴을 강제하는 현상이 있다는 것과 로직을 분리하는 작업을 이제는 Hooks를 통해 할 수 있다는 것이다.

Hooks로 로직을 사용하게 되면 view 뿐만 아니라 로직까지 재사용이 가능하다는 이점을 가져갈 수 있다.

React hooks와 context를 이용한 설계 패턴에 관한 글이 있는데 참고하면 도움이 될 것 같다.

알아둘 것은 추천하지 않는다는 것이지 사용하면 안된다는 의미가 아니다.

Atomic Design Pattern

이 패턴은 2013년 Brad Frost에 의해 처음으로 제시된 디자인 패턴이다. 생각보다 역사가 오래됐는데, 이 패턴은 원래 디자인 시스템을 위한 것이다. 즉, 디자인 시스템에서 컴포넌트들을 효율적으로 구성하는 방식을 의미한다.

Brad Fost는 화학에서 용어를 빌려 UI 구성요소를 설명한다. Label, input, button 같은 작은 단위의 컴포넌트인 ‘atom’부터, atom을 여러개 조합한 ‘molucule’, molucule을 여러개 조합한 ‘organisms’, 만든 컴포넌트를 넣을 레이아웃인 ‘template’, template 위에서 만든 컴포넌트들을 다 주입한 ‘page’로 구성된다.

이 디자인 패턴은 컴포넌트를 뷰가 아닌 기능의 단위로 나눈다는 것을 기억하자.

이렇게 컴포넌트들을 구성할 경우 UI 재사용성이 뛰어나다는 장점을 가지지만, 디자인 시스템을 구축하기 위한 초기 비용이 많이 들고 로직과 상태를 낮은 단위까지 내려줘야 하기 때문에 props drilling issue가 발생할 수 있다.

실무에서 사용되는 방식 엿보기

리디(RIDI)에서는 아토믹 디자인 패턴을 어떻게 적용하는지 참고해보자.

영상을 보면 앞서 소개한 두 가지 패턴을 혼합해서 사용하고 있다.

리디에서는 컴포넌트를 5단계가 아니라 atom, block, pages의 3단계로 나눈다고 한다. 이렇게 되면 pages부터 시작된 prop이 atom까지 4단계가 아닌 2단계로 끝날 수 있어서 props drilling issue를 예방할 수 있을 것 같다.

그리고 컴포넌트는 각각의 디렉토리를 가지고 index.tsx 로 최상위 컴포넌트를 반환한다. index.tsx 는 container 컴포넌트의 역할을 하게해서 오직 로직만 남기고 presentational 컴포넌트와 분리한다.

이 영상을 보고 느낀 점은 뭐든 이분법적으로 나누고 맹목적으로 따르면 안된다는 것이다. 장점과 단점을 정확히 알고 좋다고 생각되는 것을 뽑아 쓸줄 아는 것이 중요한 것 같다.

참조:

https://tecoble.techcourse.co.kr/post/2021-04-26-presentational-and-container/

https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

https://ui.toast.com/weekly-pick/ko_20200213

https://www.youtube.com/watch?v=exf4enLbVm4

리액트 디자인패턴 및 구조

안녕하세요 강의를 다 보고 리액트로 클럽하우스와 비슷한 서비스를 만들고 있습니다. (규모가 큰 서비스는 아닙니다.)

강의와 관련된 질문은 아닙니다만 질문 드려봅니다.

실제로 서비스를 만들다 보니 예제에 있는 스타일대로 별 규칙 없이 되는대로 만들면 후에 유지보수와 다른팀원들과 협업할 때 어려움을 겪을 것 같아 디자인패턴과 폴더 구조를 찾아보았습니다.

Atomic Design Pattern : 컴포넌트를 원자단위로 쪼개 컴포넌트의 재사용성을 높힌 방법

Presentational and Container Component Pattern : Hook의 개념이 존재하지 않았던 이전에, 로직과 view를 분리하기 위한 방법

Flux Pattern : 2014년 페이스북 발표, 기존 MVC 패턴의 단점을 보완하며 Redux와 함께 사용되는 방법

MVC,MVVM Pattern : 기존 개발에서 많이 쓰이는 디자인 패턴 , 리액트에서는 좀 비효율적이라고 함

간략하게 찾아본 패턴들의 특징? 요약 입니다.

위 것들을 찾아보았는데 봐도 어떤걸 적용해야 할지, 어떤 기준으로 선택해서 하는 것이 좋을지 잘 판단이 안서서 질문 드립니다.

정답이 있는문제는 아닙니다만 현업에서 자주 사용되는 방식이 있는지, 아니면 코딩애플님이 추천하시는 어떤 방식이 있는지 궁금합니다.

현재 사용하고 있는 방식은

src

ㄴAssets

ㄴ 이미지들..

ㄴGlobal

ㄴ reset.css

ㄴ Nav

ㄴ mainnavi.js

ㄴ mainnavi.scss

ㄴ subnavi.js

ㄴ subnavi.scss

ㄴ Login

ㄴ login.js

ㄴ login.scss

ㄴ Main

ㄴ main.js

ㄴ main.scss

ㄴ noticePopup.js

ㄴ noticePopup.scss

ㄴ Myprofile

ㄴ myprofile.js

ㄴ myprofile.scss

ㄴ editprofilePopup.js

ㄴ editprofilePopup.scss

이런식으로 기능별로 나누어서 js안에 마크업과 js기능들을 한번에 작성하는 방식이었습니다. (그냥 참고용..)

어떤방식으로 방향을 잡아야 할지 조언 부탁드립니다.

나는 리액트를 어떻게 설계할 것인가?

들어가며

나는 작년부터 지금까지 리액트를 이용해서 여러 프로젝트들을 했다. 리액트를 배운 지 얼마 안 됐을 때는 책에서 배운 대로, 인강에서 배운 대로만 따라 하느라 큰 고민을 하지 않았었다. 그러나 어느 정도 경험이 생기고, 여러 팀 프로젝트를 참여하면서 팀원들과 의견을 나누다 보니, 프로젝트를 시작할 때 어떤 리액트 패턴을 사용할지, 폴더구조는 어떻게 가져갈지에 대한 고민을 하게 되었다.

이런 고민을 하는 과정에서 배운 내용들을 토대로 포스팅을 작성해보려고 한다.

❓ 리액트 컴포넌트 패턴은 뭐가 있고 어떤걸 사용할까

리액트는 정말 자유로운 라이브러리 이기 때문에, 다양한 패턴들이 존재한다. 그중에서 어떤 방식을 사용할지는 개발자가 정하는 것이기 때문에, 우리는 새로운 프로젝트를 시작할 때 이런 고민을 안 할 수가 없다. 정답이 없기 때문에 항상 프로젝트에 맞는 패턴을 고르는 게 좋은데, 대표적으로 리액트의 패턴들은 어떤 게 있는지 알아보자.

1. Presentation Component – Container Component

React의 가장 기본적이고 유명한 디자인 패턴이다. Container Component에서 데이터를 처리하고 Presentation Component에서 데이터를 출력하는 형태이다. 이렇게 나누는 이유는 하나의 컴포넌트에서 api 호출, 이벤트 함수, 비즈니스 로직, 상태관리, 예외처리들이 모두 담겨있으면 파일 하나하나가 엄청 커지게 되고, 특히 회사에서는 유지보수가 굉장히 힘들어진다. 그래서 UI와 로직을 서로 분리해서 관리하기 위한 패턴이다. 아래의 간단한 예시를 보자.

하나의 컴포넌트에서 로직과 UI를 담당하는 형태의 코드는 아래와 같다.

위에 코드를 presentation, container component로 분리하면 아래와 같다.

왼) Container Component 오) Presentation Component

로직과 UI를 분리해서 로직을 props로 넘겨주는 식이다. 당장은 엄청 간단한 기능 이기때문에 크게 차이가 없어 보일 수 있지만 로직과 UI가 복잡해지면, 코드가 매우 길어지고 보기도 힘들어진다. 개발자들이 자주 이용하는 velog 서비스도 이런 presentation, container 패턴을 이용하고 있다. (velog Github)

Rudux의 창시자이며, 현재는 Meta(Facebook) React Core팀의 일원인 Dan Abramov가 작성한 presentaion, container 패턴에 대한 포스팅이 있는데, 포스팅 상단을 보면 현재는 이런 패턴을 이용하지 않는다고 한다. 사용하지 않는 이유는 아래에 있는 Component – Hooks 패턴으로 이 모든 작업이 대체가 가능하고, 더불어 hooks 패턴은 UI 뿐만 아니라 로직까지 재활용이 가능해진 다는 점 때문이다.

2. Component – custom hooks

custom hooks 패턴은 기존 presentation, container 패턴에서 로직을 hooks로 관리하는걸 말한다. 기존 container에서는 공통 로직이 발생했을 때 다른 container 컴포넌트로 로직을 넘겨주지 못했는데, hooks로 로직을 관리하게 되면, UI 재사용을 넘어서 로직까지 재사용이 가능해진다. 위에서 작성한 Login 로직을 hooks로 분리하면 아래와 같다.

왼) 컴포넌트 오)custom hooks

해당 로직이 필요한 컴포넌트에서 hooks를 불러오기만 하면 로직을 사용할 수 있다. custom hooks에 관련된 진유림 님의 강의도 참고해보자

3. atomic 구조

atomic 구조는 리액트 컴포넌트를 Atom(원자) 단위로 설계하는 구조를 말한다. 간단하게 말해서 원자가 결합하여 분자가 되고, 분자가 결합하여 유기체가 되는 거처럼 컴포넌트를 가장 작은 단위에서 하나씩 결합하여 만드는 형태이다.

Atom – Molecule – Organism – Template – Page

Atoms

HTML 태그 같은 label, input, button, link, 태그들처럼 가장 작은 단위의 컴포넌트를 말한다.

input Atom

Molecule

Atom을 여러개 조합한 컴포넌트이다.

input Atom + input Atom

Oraganisms

Molecule과 Atom들을 조합하여 만든 컴포넌트이다.

Templates

위에서 만든 컴포넌트들을 넣을 레이아웃 컴포넌트이다

Pages

Templates에 위에서 만든 컴포넌트들을 다 주입한 컴포넌트이다.

Atomic 구조는 UI 재사용성이 매우 뛰어나서 협업 프로젝트에서 빠른 개발을 할 수 있는 패턴이다. 하지만 디자인 시스템을 구축하기 위한 초기 비용이 많이 들고, 로직과 State 들을 낮은 단위의 컴포넌트에서 다루지 못하고 page 단위에서 props로 내려줘야 하는 단점이 있다. props를 깊게 깊게 넣어줘야 하기 때문에 의도지 않은 props를 내려주는 실수가 있을 수도 있다.

초기 프로젝트 폴더 구조를 설계할 때 이 패턴들 중에 어떤 게 나의 프로젝트와 어울릴지를 잘 판단해서 골라야 한다. 디자인이 잘 나와있어서 디자인 시스템을 구축하기 편한 환경이라면 atomic 구조를 잘 활용할 수 있겠지만, 기획과 디자인이 자주 변경되는 환경에서는 atomic 디자인을 추천하지 않는다.

❓ 폴더 구조는 어떻게 가져가는 게 좋을까

폴더구조도 검색하면 정말 다양한 폴더구조들이 나온다. 여러 프로젝트들과, 검색 결과를 통해 많이 나왔던 폴더들을 나열하면 다음과 같다.

pages -> 각 페이지들

-> 각 페이지들 components -> 컴포넌트 들

-> 컴포넌트 들 hooks -> hooks들

-> hooks들 styles -> style 코드

-> style 코드 types (ts + react 조합일 경우) -> type들

(ts + react 조합일 경우) -> type들 assets (or static) + images, icons -> 이미지 or 아이콘 같은 정적 파일들

(or static) + images, icons -> 이미지 or 아이콘 같은 정적 파일들 utils -> 프로젝트에 이용되는 유틸 함수들

-> 프로젝트에 이용되는 유틸 함수들 api -> api 목록들

-> api 목록들 lib -> 잡다 한 거? (너무 범위가 넓어서 애매하다)

-> 잡다 한 거? (너무 범위가 넓어서 애매하다) stores (or redux or recoil…. ) -> 전역 상태 폴더

내가 그동안 진행했던 프로젝트에서는 components 폴더 내부에 각 도메인 별로 (auth, post, tutorial, mypage) 폴더를 만든 뒤에 해당 도메인에서 사용되는 component들을 넣어놓고, 공통으로 사용되는 component들은 components/common 폴더에 넣어놓고 사용했었다.

components

이렇게 설계했을 때의 장점은 도메인 별로 컴포넌트를 나눠놔서 코드를 수정해야 하거나, 추가해야 할 때 쉽게 컴포넌트를 찾을 수 있어서 좋았다.

이렇게 컴포넌트들을 도메인별로 나누고 각 폴더 내부에는 해당 도메인에서 사용되는 hooks들과 컴포넌트를 테스트하는 test 폴더를 만들어서 해당 도메인의 로직 관리, 테스트 관리 코드를 넣어놨다.

hooks를 처음에는 src/hooks폴더에 다 넣고 관리했었는데, 생각해보면 어차피 각 도메인 내부에서만 사용되는 로직이라 재활용도 안되기 때문에 굳이 공용 hooks 쪽에 놔둘 필요가 없다고 판단해서 해당 컴포넌트 내부로 옮겼다.

만약 2번 이상 사용되는 hooks라면 공용 hooks 쪽에 넣어놓는 식으로 해서 재사용 hooks들은 한 공간에 넣는 식으로 규칙을 정했다.

마치며

새로운 프로젝트를 할 때 팀원과 같이 개발환경을 세팅하고, 폴더 구조, 라이브러리를 정하는 과정이 매우 어려운 거 같다. 각자 개발해온 과정도 많이 다르고, 추구하는 스타일도 많이 다른데 그걸 하나로 맞춰서 개발한다는 거 자체가 쉽지 않은 일이다. 그래도 이렇게 팀원과 같이 얘기하다보면 배우는 점도 많고 내가 몰랐던 사실들도 많이 알아가기 때문에 소통을 계속 하면서 서로 맞춰나가면 좋을 거 같다. 다들 화이팅!

[React] 06. 리액트 디자인 패턴 (fin.)

반응형

😄 리액트 디자인 패턴 (React Design Pattern)

앞서 아래와 같은 리액트 패턴 다섯 가지를 알아보았다.

▶ [React] 01. 리액트 디자인 패턴 (Compound Components Pattern)

▶ [React] 02. 리액트 디자인 패턴 (Control Props Pattern)

▶ [React] 03. 리액트 디자인 패턴 (Custom Hook Pattern)

▶ [React] 04. 리액트 디자인 패턴 (Props Getters Pattern)

▶ [React] 05. 리액트 디자인 패턴 (State reducer pattern)

이 다섯 가지 패턴을 통해 IoC(Inversion of Control, 제어의 역전) 이라는 개념과 IoC를 조절하는 방법을 알게 되었고, 각각의 패턴을 사용하여 더 유연하고 쉽게 적용할 수 있는 컴포넌트를 만들 수 있는 방법에 대해 배웠다.

그러나 사용자에게 더 많은 제어권을 준다는것은 컴포넌트가 플러그 앤 플레이(plug and play)라는 접근방식에서 멀어짐을 의미한다. 따라서 상황에 맞는 패턴을 선택하는 것은 개발자로서의 역할이다.

* 아래 제시된 도표는 구현의 복잡성(Integration Complexity)과 제어의 역전(IoC)이라는 항목을 기준으로한 각각의 패턴의 위치를 보여준다.

반응형

꼭 알아야 할 React 디자인 패턴 ②_ React의 디자인 패턴

안녕하세요 UXPin 파트너 단군소프트입니다.

오늘은 지난 시간에 이어 React에서 사용할 수 있는 수만 개의 디자인 패턴 중 꼭 알아야 할 몇 가지 패턴에 대해 소개하겠습니다.

혹시 아직 이전 포스팅을 보지 못하신 분은 아래의 링크에서 확인해 주세요.

[지난 이야기 中]

React.js – presentational & container 디자인 패턴

import React from “react” ; import CommentList from “./CommentList” ; class CommentListContainer extends React . Component { constructor ( ) { super ( ) ; this . state = { comments : [ ] } ; } componentDidMount ( ) { fetch ( “/my-comments.json” ) . then ( res => res . json ( ) ) . then ( comments => this . setState ( { comments } ) ) ; } render ( ) { return < CommentList comments = { this . state . comments } /> ; } }

[리액트 디자인 패턴] Compound Component Pattern (합성 컴포넌트 패턴) 알아보기

https://unsplash.com/photos/QiWOG1MA9rE

이 글은 Compound Pattern과 관련된 글의 한글 번역입니다.

원문 링크: https://www.patterns.dev/posts/compound-pattern/

Compound Pattern

어플리케이션에서 우리는 종종 서로에게 속한 컴포넌트를 가지게 된다. 이 컴포넌트들은 공통의 상태를 통해 서로에게 의존되어 있고, 로직을 함께 공유한다. 여러분은 종종 select, dropdown 컴포넌트 또는 메뉴 아이템들에서 이러한 형태를 볼 수 있다. Compound component pattern은 task를 수행하기 위해 다 같이 함께 작동하는 컴포넌트를 생성할 수 있도록 해준다.

Context API

다음 예제를 살펴보자: 다람쥐 이미지 목록이 있다! 단순히 다람쥐 이미지들을 보여주는 것 외에, 유저가 이미지를 수정하거나 삭제할 수 있도록 버튼을 추가하려고 한다. 우리는 유저가 컴포넌트를 토글했을 때, 목록을 보여주는 FlyOut 컴포넌트를 사용할 수 있다.

FlyOut 컴포넌트는 내부에 기본적으로 다음 3가지를 가지고 있다:

토글 버튼과 List를 가지고 있는 FlyOut wrapper

wrapper List를 토글하는 Toggle 버튼

버튼 메뉴 아이템을 가지고 있는 List

Compound component pattern을 리액트의 Context API와 사용하는 것은 이 예제에 완벽하게 들어맞는다!

먼저, FlyOut 컴포넌트를 생성해보자. 이 컴포넌트는 상태를 가지고 있고, 모든 children에게 전달 할 toggle value를 가지고 있는 FlyOutProvider를 리턴한다.

const FlyOutContext = createContext(); function FlyOut(props) { const [open, toggle] = useState(false); const providerValue = { open, toggle }; return ( {props.children} ); }

우리는 이제 자식에게 open과 toggle이라는 value를 전달할 수 있는 stateful한 FlyOut 컴포넌트를 가지게 된다.

이제 Toggle 컴포넌트를 만들어보자. 이 컴포넌트는 단순히 유저가 메뉴를 토글하기 위해 클릭할 수 있는 컴포넌트를 렌더한다.

function Toggle() { const { open, toggle } = useContext(FlyOutContext); return (

toggle(!open)}>

); }

Toggle이 FlyOutContext provider에 실제로 접근할 수 있도록 만들려면, 이 컴포넌트를 FlyOut의 자식 컴포넌트로 렌더해야 한다!

물론 단순히 자식 컴포넌트로 렌더할 수도 있다.

그러나 Toggle 컴포넌트를 FlyOut 컴포넌트의 속성으로 만들 수도 있다!

const FlyOutContext = createContext(); function FlyOut(props) { const [open, toggle] = useState(false); return ( {props.children} ); } function Toggle() { const { open, toggle } = useContext(FlyOutContext); return (

toggle(!open)}>

); } FlyOut.Toggle = Toggle;

이 말인즉슨 만약 우리가 FlyOut을 어떤 파일이든 사용하려고 할 때, 우리는 오직 FlyOut만을 import하면 된다는 뜻이다!

import React from “react”; import { FlyOut } from “./FlyOut”; export default function FlyoutMenu() { return ( ); }

토글만 있는 것은 충분하지 않다.

open이라는 value를 바탕으로 열리고 닫히며, list 아이템을 가진 List 또한 필요하다.

function List({ children }) { const { open } = React.useContext(FlyOutContext); return open &&

    {children}

; } function Item({ children }) { return

  • {children}
  • ; }

    List 컴포넌트는 open이라는 값이 true인지 false인지에 따라 자식 컴포넌트를 렌더한다.

    Toggle 컴포넌트에 했듯이 List와 Item 또한 FlyOut 컴포넌트의 속성으로 만들자.

    const FlyOutContext = createContext(); function FlyOut(props) { const [open, toggle] = useState(false); return ( {props.children} ); } function Toggle() { const { open, toggle } = useContext(FlyOutContext); return (

    toggle(!open)}>

    ); } function List({ children }) { const { open } = useContext(FlyOutContext); return open &&

      {children}

    ; } function Item({ children }) { return

  • {children}
  • ; } FlyOut.Toggle = Toggle; FlyOut.List = List; FlyOut.Item = Item;

    이제 이것들을 FlyOut 컴포넌트의 속성으로 사용할 수 있다!

    이 예제에서 우리는 유저에게 두 가지 옵션을 주려고 한다: Edit과 Delete이다.

    FlyOut.List를 생성하여 두 개의 FlyOut.Item 컴포넌트를 렌더해보자.

    하나는 Edit 옵션을, 그리고 나머지 하나는 Delete 옵션을 말이다.

    import React from “react”; import { FlyOut } from “./FlyOut”; export default function FlyoutMenu() { return ( Edit Delete ); }

    완벽하다! 우리는 방금 어떠한 상태도 FlyOutMenu에 추가하지 않고, 전체 FlyOut 컴포넌트를 만들었다!

    Compound pattern은 여러분이 컴포넌트 라이브러리를 구축하는데 도움이 된다.

    종종 이 패턴을 Semantic UI와 같은 UI 라이브러리를 사용할 때 볼 수 있을 것이다.

    우리는 또한 Compound Component pattern을 해당 컴포넌트의 자식을 mapping하는 방식으로 적용할 수도 있다. 해당 컴포넌트를 추가적인 props와 함께 복제함으로써 open과 toggle 속성을 추가할 수 있다.

    export function FlyOut(props) { const [open, toggle] = React.useState(false); return (

    {React.Children.map(props.children, child => React.cloneElement(child, { open, toggle }) )}

    ); }

    모든 자식 컴포넌트는 복제되고, open과 toggle value를 전달받는다.

    이 전 예제에서와 같이 Context API를 사용하는 대신, 이 두 value를 이제 props를 통해 접근할 수 있게 된다.

    장점

    Compound 컴포넌트들은 내부적으로 상태를 다루며 몇몇 자식 컴포넌트들 사이에서만 공유한다.

    Compound 컴포넌트를 사용하면 우리 자신의 별도 상태를 다루는 것에 대해서 걱정할 필요가 없다.

    Compound 컴포넌트를 import할 때, 해당 컴포넌트에 필요한 자식 컴포넌트를 명시적으로 import할 필요도 없다.

    import { FlyOut } from “./FlyOut”; export default function FlyoutMenu() { return ( Edit Delete ); }

    단점

    value를 제공하기 위해 React.Children.map 을 사용하면 컴포넌트 nesting에 제한이 생긴다 .

    오직 부모 컴포넌트의 직접적인 자식들만 open과 toggle props에 대한 접근성이 생기므로, 이 컴포넌트를 다른 어떠한 컴포넌트로도 감쌀 수 없게 된다.

    export default function FlyoutMenu() { return ( {/* This breaks */}

    Edit Delete

    ); }

    React.cloneElement를 사용하여 엘리먼트를 복제하는 것은 얕은 병합(shallow merge)을 수행 한다. 이미 존재하는 props가 우리가 전달하는 새로운 props와 병합될 것이다. 만약 이미 존재하는 prop과 같은 이름의 prop을 React.cloneElement에 전달한다면 이 방식이 네이밍 충돌을 일으킬 수 있다. props가 얕에 병합됨에 따라, prop의 value는 우리가 전달한 최신 값으로 덮어씌워질 것이다.

    References

    반응형

    React 아키텍쳐, 디자인 시스템, 파일 구조에 대한 고찰

    반응형

    반년일기 사이드 프로젝트를 진행하면서 리액트에 대한 한계점에 매일 매일 도달했다.

    무엇보다 퍼블리싱과 기능 구현을 동시에 진행하려는 욕심에,

    대충 짜놓았던 디렉토리 구조가 무너지는 느낌, 가뜩이나 어수선한 프로젝트가 더 어수선해지는 기분이었다.

    그때 현 회사 사수가 디자인 시스템에 대해 꼭 공부 할 필요가 있다고해서

    무작정 코드부터 작성하려는 급한 마음을 잠시 내려놓고,

    아키텍쳐, 디자인 시스템을 기반으로 리액트 디렉토리 구조를 어떻게 하면 좋을지에 대해 공부를 해보려고한다

    1. 현재 상태

    아래 이미지는 현재 플젝 리액트 디렉토리 구조다

    반년일기 프로젝트 디렉토리 구조

    가장 크게 client, db, doc, server로 나눈 상태고 나는 client를 담당하고 있다

    client의 핵심 상위 폴더는 assets, components, router이다

    반년일기 프로젝트의 assets 폴더, router 폴더, components 폴더 구조

    생각없이 짠 구조는 아니고 나름 취준시절 니꼬의 리액트 네이티브 무비앱 유료강의를 들었던 그때 그 디렉토리 구조를 반영한거다….

    그러나 이 구조는 음………. 현재 프로젝트와 안 맞는 느낌이고 무엇보다 저 구조로 작성했던 시절이 벌써 1년전이다

    그리고 기능 구현에 급급하다보니 구조가 무분별하게 꼬여있다 서로 뒤엉킨 느낌……..?

    그래서 그런지 가뜩이나 코딩하는데 어수선한 마음이 더 어수선해지는 기분이더라…..

    사수가 리액트의 디자인 시스템은 뜨거운 논쟁중의 하나이기도 해서 정답은 없지만 더 좋은 형태는 있다고 해서…

    이 참에 좋다는 영상과 글들 읽어보면서 분석도 하고 후기도 써보면서 우리 프로젝트에 어떻게 반영할지 고민해보려고 한다

    2. 다양한 디자인 시스템 정보에 대한 고찰

    사실 개발 첫 입문시!

    구글에 디자인 시스템을 쳐봤을때 가장 먼저 뜨는 내용들은 하나같이 디자이너 입장에서의 디자인 시스템이었다

    그래서 사실 나는 개발자와는 연관이 없는 분야군 (…) 하면서 넘겼었다…..

    일단 ‘개발자 디자인 시스템’ 이라고 치면 가장 먼저 뜨는 글을 읽어보았다

    https://simsimjae.medium.com/%EB%94%94%EC%9E%90%EC%9D%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EC%A0%95%EC%9D%98%EC%99%80-%ED%95%84%EC%9A%94%EC%84%B1-2d76d424ac03

    일단 이 글에서 디자인 시스템은 매우 많은 것들을 포함한 영역이고,

    그 안에 작은 단위의 스타일 가이드, 그리고 그 작은 단위를 합친 컴포넌트 단위를 말하는 느낌이다

    (여기까지는 내가 회사에서 자사 스타일 가이드를 만들면서 들었던 내용과 일치한다)

    한마디로 디자인 시스템을 잘~ 도입해서 하나만 제대로 따악! 만들어 놓으면

    여기저기 재사용이 가능해서 디자이너, 개발자들에게 매우 편리하다인데…..

    마치 리액트의 컴포넌트가 추구하는 방향(?)과 일치하는 것 같다

    그래서 유독 리액트에서 디자인 시스템이 뜨거운 논쟁인건가? 싶기도….

    https://blog.gangnamunni.com/post/welchis/

    강남언니 기술 블로그에서 작성한 글도 읽어봤다

    확실히 모두 재사용성에 큰 의미를 두고 있고 하나같이 스토리북이란걸 사용하고있다

    https://story.pxd.co.kr/1434

    위 글에서 전반적인 디자인 가이드와 시스템에 대해 폭넓게 알려주고 있다

    https://team.modusign.co.kr/%EC%9E%98-%EC%82%AC%EC%9A%A9%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%94%94%EC%9E%90%EC%9D%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-7387b40f547a

    요즘 엄청 떡상중이라는 모두의 싸인…

    여기에서는 리액트에 디자인 시스템을 어떻게 사용했는지 예시를 들어준다

    https://beige22.medium.com/%EC%BD%94%EB%93%9C%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-design-system-b04bb916a02b

    위 글을 읽어보니 리액트에서는 버튼 하나를 만들때도 모듈화 하나보다….

    그리고는 스타일을 변수로 받는 것 같은데 내가 기존에 알고있던 styled-components에서 props로 받는 것 보다 더 복잡해서 굉장히 놀랬다…. 이런거 처음 본다….

    아이콘이 어느 위치에 있든, 아이콘만 있든, 텍스트만 있든 간에 여백 크기도 적절하게 배분되는게 굉장히 신기했다

    보니까 스타일 props를 className에 동적으로 넣어서 미리 작성해논 scss를 오버라이딩? 상속? 하는 개념같다

    이런 구조는 최소 기획자 1, 디자이너 1, 퍼블리싱에 빠삭한 프론트엔드 개발자 1 정도는 있어야지 구축 가능한 시스템 같다…

    기준과 컨셉을 애매하게 잡고 시도했다가는 시간에비해 아까운 구조만 남길거같은 느낌….

    3. 리액트 디자인 패턴

    https://velog.io/@holim0/React-Design-Pattern

    리액트 디자인 패턴이라고 검색하면 가장 먼저 뜨는 게시물이다

    그 외에도 대부분의 블로그 글에서는

    데이터 처리 → Container (리덕스나 State, API 호출 등 로직 처리를 담당 그리고 그 값을 Props를 통해 Presenter에 전달)

    데이터 출력 → Presenter (오직 Props를 통해 전달받은 데이터를 화면에 출력)

    UI를 담당하는 → Components

    이렇게 3가지를 분리해서 작성하라고 가이드한다

    https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0

    리액트 창시자가 작성한 글

    위 포스팅이 뭔가 Container VS Presenter의 뜨거운 논쟁이 있었던 느낌인데…………

    영어를 못하니까… 번역체도 좀 이상해서 뭐라는지 모르겠다😭😭

    그 후 좀 더 찾아보니 단순 Container, Presenter 파일을 분리하는 패턴은 Hook이 생기기 이전에 흥행한 방식같다

    그럼 Hook이 생기고서는 뭐가 대세일까? 대세는 모르겠지만 VAC 패턴이란걸 발견하게 되었다

    3-1. VAC 패턴

    React에서 View의 렌더링 관심사 분리를 위한 VAC 패턴 소개

    위 글에서 VAC 패턴은 FE 개발자와 UI 개발자(웹퍼블리셔) 사이의 협업 문제를 줄일 수 있는 패턴이라고 소개해준다

    VAC 패턴의 특징

    반복이나 조건부 노출, 스타일 제어와 같은 렌더링과 관련된 처리만을 수행한다 오직 Props를 통해서만 제어되며 스스로의 상태를 관리하거나 변경하지 않는 stateless(무상태) 컴포넌트이다 이벤트에 함수를 바인딩(하나를 다른 것으로 매핑시키는 것을 의미)할 때 어떠한 추가 처리도 하지 않는다 VAC는 state를 가질 수 없지만 state를 가진 컴포넌트를 자식으로 자기는 것은 가능하다. 이 경우 VAC는 부모 컴포넌트와 자식 컴포넌트 중간에서 개입하지 않고 단순히 props를 전달하는 역할만 한다

    // Props Object 정의 const SpinBox = () => { const [value, setValue] = useState(0); // JSX를 추상화 const props = { value, onDencrease: () => setValue(value – 1), onIncrease: () => setValue(value + 1), }; // JSX return ; } // JSX를 VAC로 분리 const SpinBoxView = ({value, onIncrease, onDecrease}) => (

    {value}

    );

    위 예시도 말만 다를뿐이지 Container, Presenter 개념을 나눠서 분리 작성한거 아닌가…? 싶다

    왜냐면 니꼬 강의 들었을때 딱 저 패턴으로 작성했어서… 흐으으으으음….

    딱히 색다로운 방식이라는 느낌이 안드는데 내가 잘 모르는건가 싶다

    근데 다른 예시를 들어주니 딱 이해가 갔다

    예를 들어 SpinBox의 최소 값을 0 이하로 설정할 수 없는 조건과 증가, 감소 버튼을 둥글게 처리하는 디자인 수정이 발생한다면?

    FE개발자는 Props Object의 onDecrease를 수정하면 되고 웹퍼블리셔는 VAC에서 className을 추가하든 style 속성을 추가하면 된다.

    그럼 서로 수정한 파일이 다르니 충돌이 안 일어난다는 것!!

    그리고 Container, Presenter 와 차이를 막판에 설명해주는데 이해가 간다

    개인적으로 개념이 완벽히 분리된듯한 VAC 패턴이 마음에 든다

    💥 VAC 잘못된 예시

    View 컴포넌트의 기능이나 상태 에저에 VAC가 관여해서는 안된다 (아마 이벤트에 파라미터도 설정하면 안된다는 말 같다)

    그리고 위 블로그 글에서 잠깐 언급된 BLoC 패턴이 있길래 알아봤다

    3-2. BLoC 패턴

    https://pks2974.medium.com/bloc-%EC%9D%B4%ED%95%B4-%ED%95%98%EA%B8%B0-%EB%B0%8F-%EA%B0%84%EB%8B%A8-%EC%A0%95%EB%A6%AC-%ED%95%98%EA%B8%B0-7dc705e4c640

    https://github.com/sbyeol3/articles/issues/15

    와 이건 생각보다 더 어려운 구조같다 React에 적용한 예시가 있는데… 정말 간단한 코드같은데 내 기준 코드의 가독성이 안좋은 느낌이다ㅠㅠㅠ 뭐라는지 모르겠다….

    개인적으로 자바 코드 보는듯한 느낌이 든다

    리액트를 다양하게 고오급 스킬을 사용해본 사람이나 좀 이해가 갈듯한……

    이게 Redux 흐름과 비슷한편이라서 적용해보면 좋을거 같은데 Redux를 모르는 내가 당장 쓰기에는… 여러모로 시간이 많이 필요한 패턴인거같다

    3-3. 아토믹 디자인

    https://ui.toast.com/weekly-pick/ko_20200213

    아토믹 디자인은 회사에서 처음 접하게되어서 익숙하게 알고있다

    현재 이 방식으로 자사 common style을 구축하려고 밑바탕 작업을 해논 상태이다(?)

    근데 현재 자사 서비스가 리액트로 갈것인가 자바로 갈것인가에따라….

    내가 만든 common style의 규모가 달리할거같다……….

    쨌든 이런식으로 작업을 해봐서 익숙하고! 이게 얼마나 좋은 디자인 시스템인지 몸소 느꼈었다

    체계적으로 작은단위부터 관리할 수 있어서 참 좋은데 문제는 초기에 생각하는 시간을 엄청나게 잡아먹는다는 것이다…ㅋㅎ

    4. 디렉토리 구조

    https://www.stevy.dev/react-design-guide

    위 글에서 매우 다양한 프로젝트 구조 설계 패턴을 제시해주고 있다

    제시한 구조 중에서 실제 회사에서 쓰고 있는 구조랑 비슷한 구조가 있었다

    그리고 여기서도 아토믹 디자인 이야기가 빠지지 않는다

    https://isa-dev.tistory.com/9

    여기에 플젝 폴더명이 무엇을 의미하고 어떻게 짜면 좋은지 간결하게 설명해놨다

    5. 바꾼 결과

    일단 크게 assets, components, pages, utils로 나눴다

    src/assets/

    assets폴더에는 정적 파일들이 위치해있다

    src/components/

    components에는 아토믹 디자인 구조를 적용해봤다

    다른점은 templates 부분이 없고 layout 폴더가 있다

    규모가 큰 프로젝트가 아니다보니 templates 컴포넌트까지 나오지도 않고, layout 관련 컴포넌트들을 templates에 포함시킬까? 하다가 의미가 너무 안맞는 느낌이라서 그냥 layout 폴더를 만들었다s

    src/pages

    그리고 routes 폴더를 싹 갈아엎었다

    일단 pages로 변경하고 페이지마다 폴더를 각각 생성해줬다

    그리고 각각 페이지별로 적용되는 hook과 api 로직을 분리해서 작성해주려고한다

    그래서 페이지 안 폴더도 쪼개야하나..? 싶은데 의미가 맞는게 딱히 없는 느낌이라…. util도 아닌거같고… hook이라기엔 custom hook을 쓰게될지 말지 잘 모르겠고…. 그래서 일단은 냅뒀다

    src/utils

    전역적으로 쓰이는 회원 인증 로직, 인증 라우터는 어떻게 둬야하지? 싶었다

    다들 전역적으로 쓰는 컴포넌트는 utils로 퉁 치는 것 같길래 일단은 나도 그 구조로 해놨다

    근데 찰떡같이 맞는다는 느낌은 안들어서… 또 수정될수도 ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

    6. 마무리

    현재는 이렇게 구조를 가져갈 생각이고

    이 부분은 경험에 따라, 취향에 따라 많이 바뀔 수도 있는 부분이라

    이 디렉토리 구조가 언제까지 갈지는….ㅋㅋㅋㅋ 잘 모르겠다ㅋㅋㅋㅋㅋㅋㅋㅋ

    디자인 패턴에 대해 꾸준히 습득하는게 좋을거 같다

    반응형

    키워드에 대한 정보 리 액트 디자인 패턴

    다음은 Bing에서 리 액트 디자인 패턴 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

    이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

    사람들이 주제에 대해 자주 검색하는 키워드 Line Entry의 Atomic Design 적용기

    • 네이버테크톡
    • UIT개발
    • Atomic Design
    • React Styled-Component

    Line #Entry의 #Atomic #Design #적용기


    YouTube에서 리 액트 디자인 패턴 주제의 다른 동영상 보기

    주제에 대한 기사를 시청해 주셔서 감사합니다 Line Entry의 Atomic Design 적용기 | 리 액트 디자인 패턴, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

    See also  잠실 교보 문고 주차 | 교보문고에서 책 1권도 안사고 무료 주차하기 상위 252개 베스트 답변

    Leave a Comment