React Design Pattern

Junbro·2022년 8월 8일
0
post-thumbnail

이번 개인 프로젝트(landSoundScape) 에서 VAC(View Asset Component) 패턴을 도입하였다.

1. VAC(View Asset Component)

VAC (View Asset Component)는 렌더링에 필요한 JSX와 스타일을 관리하는 컴포넌트를 의미한다.

VAC 패턴은 View 컴포넌트에서 JSX 영역을 Props Object로 추상화하고, JSX를 VAC로 분리해서 개발하는 설계 방법이다,.

이런 설계는 비즈니스 로직 뿐만 아니라 UI 기능 같은 View 로직에서도 렌더링 관심사를 분리하는데 목적이 있다.

VAC Container을 JSX, Style을 제외한 비지니스 로직, 상태관리 등을 맡고 VAC에서는 JSX, Style을 관리하여 렌더링을 담당한다.

결국, VAC 패턴은 기존의 컴포넌트에서 JSX 영역을 별도로 분리하여 협업시 충돌을 최소화하고, 컴포넌트의 역할을 확실하게 분리하는 것을 목적으로 한다.

2. 적용

이번 개인 프로젝트에서 VAC 패턴이 필요로 하는 부분에 적재적소에 적용시켰다.

VAC Container

function Search() {
  const { hideModal } = useModal();
  const [filter, setFilter] = useState("");
  const [debouncedFilter] = useDebounce(filter, 500);
  const { data } = useQuery(
    ["getPhotos", debouncedFilter],
    () => getPhotos(debouncedFilter),
    {
      enabled: Boolean(debouncedFilter),
      refetchOnWindowFocus: false,
    },
  );

  const SearchProps = {
    photos: data,
    onInputChange: e => setFilter(e.target.value),
    onPhotoClick: () => hideModal(),
  };

  return <SearchView {...SearchProps} />;
}
  • Fetching, CustomHook, state 등 비지니스 로직 상태 관련 코드 담당
  • ‘Props Object’ 를 통해 VAC 컴포넌트에 전달
  • JSX 로직이 분리되어 있어 비즈니스 로직에 집중할 수 있었고 ‘VAC Debugger’을 통해 테스트를 진행

VAC

function SearchView({ photos, onInputChange, onPhotoClick }) {
  return (
    <SearchBarWrapper>
      <SearchBar
        type="text"
        placeholder="Search using tags related to photos."
        onChange={onInputChange}
      />
      <SearchIcon />
    </SearchBarWrapper>
    <PhotosWrapper>
      {photos?.map(photo => (
        <Link key={photo._id} to={`/${photo._id}`} onClick={onPhotoClick}>
          <PhotoEntry {...photo} />
        </Link>
      ))}
    </PhotosWrapper>
  );
}

SearchView.propTypes = {
  photos: PropTypes.array.isRequired,
  onInputChange: PropTypes.func.isRequired,
  onPhotoClick: PropTypes.func.isRequired,
};

const SearchBarWrapper = styled.div`
  display: flex;
  margin-top: 2rem;
  border: 0.3rem solid #265d6e;
  border-radius: 40px;
  justify-content: space-around;
  align-items: center;
  padding: 0.3rem 2rem;
`;

...
  • JSX 로직과 , Style 관련 코드를 담당
  • ‘Container’에서 넘겨준 ‘Props Object’를 통해 이벤트 바인딩
  • ‘propTypes’을 통해 타입 검사

3. 소감

결과적으로 이 패턴은 이번 프로젝트 나아가 저에게 잘 맞는 패턴이였다.

JSX 코드를 담당하는 컴포넌트, 비지니스 로직, State를 관리하는 컴포넌트가 구분이 되어 관심사 분리가 확실하게 되는 것을 느꼈다.

또한, 이번 프로젝트는 저 혼자 진행하였지만 협업시에는 아직 View (JSX) Component가 없어도 VAC 개발툴을 이용하여 비지니스 로직을 작성할 수 있는 점이 더 큰 장점으로 다가올 거라 생각한다.

리액트는 웹 개발 특성상 ‘Agile’하게 개발을 진행하여야 된다고 생각한다. 그러한 생각으로 먼저 코드를 작성한 후 분리, 모듈화가 필요하다고 생각되면 그 상황에 최선의 구조를 적용하는 리팩토링 과정을 선호한다.

VAC 패턴은 다른 패턴(Presentational, 아토믹 디자인)과는 다르게 제약이 많지 않고, 설계에 과도하게 오랜시간을 가지지 않도록하여 내게 좋은 개발 경험을 안겨주었다.

4. 참고자료

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

React VAC Pattern - View 로직과 JSX의 의존성을 최소화 하자!

[리액트] VAC 패턴 적용 후기 및 장단점

profile
정보를 공유하겠습니다 😀

0개의 댓글