Skip to content

CSS Modules ​


Next.js가 Global CSS를 제한하는 이유 ​

CSS는 기본적으로 전역 스코프를 가진다. 이로 인해 여러 컴포넌트에서 동일한 클래스 이름을 사용할 경우, 의도하지 않은 스타일 충돌이 발생할 수 있다.

이러한 문제를 방지하기 위해 Next.js는 Global CSS를 import할 수 있는 위치를 의도적으로 제한한다.

  • Page Router: pages/_app.tsx
  • App Router: app/layout.tsx

즉, 애플리케이션의 엔트리 지점에서만 전역 스타일을 선언할 수 있으며,
개별 컴포넌트나 일반적인 React 컴포넌트 파일에서는 Global CSS를 import하는 것이 허용되지 않는다.

이는 전역 스타일의 영향 범위를 명확히 하고, 컴포넌트 단위 스타일링을 유도하기 위한 설계다.


CSS Modules ​

CSS Modules는 파일 단위로 스타일의 스코프를 분리해, 각 컴포넌트가 자신의 스타일만 갖도록 만드는 방식이다.
.module.css 확장자를 사용하는 경우, 해당 스타일은 자동으로 로컬 스코프로 처리된다.

예시 index.module.css ​

css
.h1 {
  color: red;
}

.h2 {
  color: brown;
}
tsx
import style from './index.module.css';

export default function Home() {
  return (
    <>
      <h1 className={style.h1}>Index</h1>
      <h2 className={style.h2}>H2</h2>
    </>
  );
}

이때 실제 브라우저에 적용되는 클래스 이름은 고유하게 생성된다.
(ex. index_h1__JHo3j, index_h2__Txrlj )

이 방식 덕분에 서로 다른 컴포넌트에서 동일한 클래스 이름을 사용하더라도 스타일 충돌이 발생하지 않는다.


전역으로 적용되어야 하는 reset, typography, theme 변수 등은 Global CSS로 관리하는 것이 적절하다.