Post

React 컴포넌트를 구조화하는 방법

안녕하세요! 오늘은 React 애플리케이션에서 컴포넌트를 구조화하는 방법에 대해 알아보겠습니다. 컴포넌트를 효율적으로 구조화하면 코드의 가독성과 유지보수성을 높일 수 있습니다.

React 컴포넌트를 구조화하는 방법

1. 파일 및 폴더 구조

1.1 기본 구조

애플리케이션의 규모가 작을 때는 간단한 파일 및 폴더 구조를 사용할 수 있습니다.

1
2
3
4
5
6
7
src/
  ├── components/
  │   ├── Header.js
  │   ├── Footer.js
  │   └── App.js
  ├── App.js
  └── index.js

1.2 모듈화 구조

애플리케이션이 커질수록 모듈화된 구조를 사용하는 것이 좋습니다. 기능별로 폴더를 나누어 컴포넌트를 관리합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
src/
  ├── components/
  │   ├── Header/
  │   │   ├── Header.js
  │   │   └── Header.css
  │   ├── Footer/
  │   │   ├── Footer.js
  │   │   └── Footer.css
  │   └── App/
  │       ├── App.js
  │       └── App.css
  ├── services/
  │   └── api.js
  ├── utils/
  │   └── helpers.js
  ├── App.js
  └── index.js

2. 컴포넌트 분리

2.1 재사용 가능한 컴포넌트

공통으로 사용되는 UI 요소를 별도의 컴포넌트로 분리하여 재사용성을 높입니다.

1
2
3
4
5
6
7
8
// Button.js
import React from 'react';

function Button({ label, onClick }) {
    return <button onClick={onClick}>{label}</button>;
}

export default Button;

2.2 컨테이너 컴포넌트와 프레젠테이셔널 컴포넌트

컨테이너 컴포넌트는 상태 관리를 담당하고, 프레젠테이셔널 컴포넌트는 UI를 담당합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// UserListContainer.js
import React, { useState, useEffect } from 'react';
import UserList from './UserList';
import { fetchUsers } from '../services/api';

function UserListContainer() {
    const [users, setUsers] = useState([]);

    useEffect(() => {
        fetchUsers().then(data => setUsers(data));
    }, []);

    return <UserList users={users} />;
}

export default UserListContainer;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// UserList.js
import React from 'react';

function UserList({ users }) {
    return (
        <ul>
            {users.map(user => (
                <li key={user.id}>{user.name}</li>
            ))}
        </ul>
    );
}

export default UserList;

3. 스타일링

3.1 CSS 파일

각 컴포넌트별로 CSS 파일을 분리하여 스타일을 관리합니다.

1
2
3
4
5
6
/* Header.css */
.header {
    background-color: #f8f9fa;
    padding: 20px;
    text-align: center;
}
1
2
3
4
5
6
7
8
9
// Header.js
import React from 'react';
import './Header.css';

function Header() {
    return <header className="header">My App</header>;
}

export default Header;

3.2 CSS 모듈

CSS 모듈을 사용하여 CSS 클래스의 범위를 컴포넌트 단위로 제한할 수 있습니다.

1
2
3
4
5
6
/* Header.module.css */
.header {
    background-color: #f8f9fa;
    padding: 20px;
    text-align: center;
}
1
2
3
4
5
6
7
8
9
// Header.js
import React from 'react';
import styles from './Header.module.css';

function Header() {
    return <header className={styles.header}>My App</header>;
}

export default Header;

3.3 스타일드 컴포넌트

스타일드 컴포넌트를 사용하여 CSS-in-JS 방식으로 스타일을 작성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Header.js
import React from 'react';
import styled from 'styled-components';

const HeaderWrapper = styled.header`
    background-color: #f8f9fa;
    padding: 20px;
    text-align: center;
`;

function Header() {
    return <HeaderWrapper>My App</HeaderWrapper>;
}

export default Header;

4. 코드 스플리팅

4.1 동적 임포트

React.lazy와 Suspense를 사용하여 동적으로 컴포넌트를 임포트하고, 초기 로딩 시간을 줄일 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// App.js
import React, { Suspense, lazy } from 'react';

const Header = lazy(() => import('./components/Header/Header'));

function App() {
    return (
        <Suspense fallback={<div>Loading...</div>}>
            <Header />
        </Suspense>
    );
}

export default App;

결론

React 컴포넌트를 효율적으로 구조화하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다. 폴더 구조를 모듈화하고, 컴포넌트를 분리하며, 적절한 스타일링 방법을 사용하여 애플리케이션을 체계적으로 관리할 수 있습니다. 코드 스플리팅을 통해 초기 로딩 시간을 줄이고, 사용자 경험을 개선할 수도 있습니다. 이러한 방법들을 잘 활용하여 더 나은 React 애플리케이션을 개발해 보세요.

오늘도 제 글을 읽어주셔서 감사합니다. 다음 시간에 더 유익한 주제로 찾아뵙겠습니다.

This post is licensed under CC BY 4.0 by the author.