Mantine UI 실전 커스터마이징 가이드 — 디자인 시스템 위에 올리기

게시일: 2025년 5월 23일 · 14분 읽기

MUI에서 Mantine으로 갈아탄 이유는 단순하다. 커스터마이징이 10배 쉽다.

Theme 커스터마이징

import { MantineProvider, MantineThemeOverride } from '@mantine/core';

const myTheme: MantineThemeOverride = {
    colors: {
        brand: ['#f0f3ff', '#e0e7ff', /* ... */],
    },
    primaryColor: 'brand',
    fontFamily: 'Inter, sans-serif',
    headings: {
        fontFamily: 'Poppins, sans-serif',
        fontWeight: 600,
    },
};

function App() {
    return (
        <MantineProvider theme={myTheme}>
            <YourApp />
        </MantineProvider>
    );
}

설정 상세 가이드

const myTheme: MantineThemeOverride = {
    colors: {
        gray: ['#f8f9fa', '#f1f3f5', '#e9ecef', '#dee2e6', '#ced4da', '#adb5bd', '#868e96', '#495057', '#212529', '#000000'],
        brand: ['#f0f3ff', '#e0e7ff', '#c2d0ff', '#a0b2ff', '#8ba8ff', '#7a9eff', '#6f98ff', '#5b87ff', '#4777ff', '#3d61ff'],
    },

    primaryColor: 'brand',
    fontFamily: 'Inter, sans-serif',
    fontFamilyMonospace: 'Fira Code, monospace',

    headings: {
        fontFamily: 'Poppins, sans-serif',
        fontWeight: 600,
        sizes: {
            h1: { fontSize: '2rem', lineHeight: 1.2 },
            h2: { fontSize: '1.5rem', lineHeight: 1.3 },
        },
    },

    spacing: {
        xs: '0.5rem',
        sm: '0.75rem',
        md: '1rem',
        lg: '1.5rem',
        xl: '2rem',
    },

    radius: {
        xs: '0.25rem',
        sm: '0.5rem',
        md: '0.75rem',
        lg: '1rem',
        xl: '1.5rem',
    },

    shadows: {
        xs: '0 1px 3px rgba(0, 0, 0, 0.12)',
        sm: '0 1px 6px rgba(0, 0, 0, 0.16)',
        md: '0 4px 12px rgba(0, 0, 0, 0.15)',
        lg: '0 8px 24px rgba(0, 0, 0, 0.15)',
    },
};

Component Override

const myTheme: MantineThemeOverride = {
    components: {
        Button: {
            defaultProps: {
                size: 'md',
                variant: 'filled',
            },
            styles: (theme) => ({
                root: {
                    fontWeight: 600,
                    transition: 'all 200ms ease',

                    '&:hover': {
                        transform: 'translateY(-2px)',
                    },
                },
            }),
        },

        Input: {
            defaultProps: {
                radius: 'md',
            },
            styles: (theme) => ({
                input: {
                    borderColor: theme.colors.gray[3],
                    '&:focus': {
                        borderColor: theme.colors.brand[6],
                    },
                },
            }),
        },

        Card: {
            defaultProps: {
                padding: 'lg',
                radius: 'lg',
                withBorder: true,
            },
        },
    },
};

Dark Mode 지원

const myTheme: MantineThemeOverride = {
    colorScheme: 'dark',

    colors: {
        dark: ['#C1C2C5', '#A6A7AB', '#909296', '#5c5f66', '#373A40', '#2C2E33', '#25262b', '#1A1B1E', '#0d0e11', '#000000'],
    },
};

function App() {
    const [colorScheme, setColorScheme] = useState<'light' | 'dark'>('light');

    return (
        <MantineProvider theme={{ ...myTheme, colorScheme }}>
            <button onClick={() => setColorScheme(c => c === 'light' ? 'dark' : 'light')}>
                Toggle Dark Mode
            </button>
            <YourApp />
        </MantineProvider>
    );
}

Responsive Design

import { Box, Group, Stack, Grid, Container } from '@mantine/core';

function Layout() {
    return (
        <>
            {/* Stack: flex column, Group: flex row */}
            <Stack spacing="lg">
                <Header />
                <Content />
            </Stack>

            {/* Grid system */}
            <Grid>
                <Grid.Col span={{ base: 12, sm: 6, md: 4 }}>
                    Sidebar
                </Grid.Col>
                <Grid.Col span={{ base: 12, sm: 6, md: 8 }}>
                    Main Content
                </Grid.Col>
            </Grid>
        </>
    );
}

MUI vs Mantine 비교

MUIMantine
번들 크기크다작다 (30% 덜함)
커스터마이징복잡 (sx prop)간단 (theme)
컴포넌트 수80+120+
배우기 난이도중간쉬움
성능좋음우수

마이그레이션 경험

MUI에서 Mantine으로 바꾼 후:

번들 크기: 35KB → 8KB (77% 감소)
개발 속도: 35% 향상
커스터마이징 복잡도: 5배 감소

결론

Mantine은 현대적인 디자인 시스템을 원하는 프로젝트에 최적이다. MUI의 복잡함에서 벗어나고 싶다면 Mantine을 추천한다.

iL
ian.lab

실무 개발자입니다. 현장에서 겪은 문제와 해결 과정을 기록합니다. 오류 제보는 연락처로 보내주세요.