/ PROGRAMMING

[React] react-router 에서 트리구조의 부모자식 URL 페이지를 구성하는 방법

react-router를 이용해서 아래와 같은 부모자식 트리구조 URL 구조가 있을 때 구현 하는 방법을 알아 봅니다

React-router 에서 트리구조의 부모자식 URL 페이지를 구성하는 방법

react-router를 이용해서 아래와 같은 부모자식 URL 구조가 있을 때 구현 하는 방법을 알아 봅니다

URL 항목

URL 이렇게 존재한다고 했을 때

user/list
user/detail
order/list
order/detail

URL의 구조

일반적으로는 이렇게 부모 자식으로 구성됩니다.

user - list
     - create

order - list
      - create

react-router 에서 일반적인 routing 방식

<React.Fragment>
    <Route exact path="/user/list" component={UserList} />
    <Route exact path="/user/create" component={UserCreate} />
    <Route exact path="/order/list" component={UserList} />
    <Route exact path="/order/create" component={UserCreate} />
</React.Fragment>

user 와 order가 중복이 됩니다 URL이 많아 지면 복잡해 보이기도 합니다.

react-router 에서 URL 매핑을 부모자식(트리구조)구조로 구현 하는 방법

<React.Fragment>
    <Route
        path="/user"
        render={props => (
            <React.Fragment>
                <Route exact path={`${props.match.url}/list`} component={UserList} />
                <Route exact path={`${props.match.url}/create`} component={UserCreate} />
            </React.Fragment>
        )}
    />
    <Route
        path="/order"
        render={props => (
            <React.Fragment>
                <Route exact path={`${props.match.url}/list`} component={OrderList} />
                <Route exact path={`${props.match.url}/create`} component={OrderCreate} />
            </React.Fragment>
        )}
    />
</React.Fragment>

react-router 에서 URL 매핑을 트리구조 구조의 컴포넌트로 분리하는 방법

부모 자식의 트리 구조로 컴포넌트를 분리하여 URL 매핑을 구성할 수 있습니다.

Root Router (부모라우터)

<React.Fragment>
    <Route path="/user" component={UserRouters} />
    <Route path="/order" component={OrderRouters} />
</React.Fragment>

상위 URL을 정의 해놓고 하위 URL을 매핑을 정의 해놓은 router 컴포넌트를 호출합니다.

User Routers (자식라우터)

export default function UserRouters({ match }) {
  return (
    <React.Fragment>
        <Route
            path={match.url}
            render={props => (
                <React.Fragment>
                    <Route exact path={`${props.match.url}/list`} component={UserList} />
                    <Route exact path={`${props.match.url}/create`} component={UserCreate} />
                </React.Fragment>
            )}
        />
    </React.Fragment>
  )
}

/user/~~~~ 시작하는 url은 모두 위 컴포넌트를 호출하게 됩니다.

OrderRouters (자식라우터)

export default function OrderRouters({ match }) {
  return (
    <React.Fragment>
        <Route
            path={match.url}
            render={props => (
                <React.Fragment>
                    <Route exact path={`${props.match.url}/list`} component={UserList} />
                    <Route exact path={`${props.match.url}/create`} componet={UserCreate} />
                </React.Fragment>
            )}
        />
    </React.Fragment>
  )
}

/order/~~~~ 시작하는 url은 모두 위 컴포넌트를 호출하게 됩니다.

마무리

URL이 많을 경우 모튼 URL 매핑을 나열하면 부모자식 구조가 잘 한눈에 보이지 않고 파악이 어렵지만 위 같은 방식으로 부모자식으로 패턴을 구분하여 구현 할 수 있습니다.

개인적으로는 react-router의 부모자식 구조로 router를 구성하는 방식이 그리 깔끔한 것 같지는 않다는 생각이 듭니다.
조금더 깔끔한 방법을 아시는 분은 댓글 부탁드립니다.

kimchanjung

김찬정

좀 더 넓은 TEST 커버리지! 좀 더 나은 Architecture! 좀 더 나은 Code Pattern! 보다 더 간결하고 깔끔한 코드!를 항상 갈망 합니다.

Read More