React Academy · 강의

Portal로 모달 구성 요소 만들기

createPortal을 통해 document.body에 렌더링되는 재사용 가능한 모달을 만듭니다.

레슨 2/413개 단계

Portal로 모달 구성 요소 만들기은(는) CoddyKit의 무료 React Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

환영합니다

이 레슨에서는 React.createPortal을 사용하여 document.body에 렌더링하는 재사용 가능한 Modal 컴포넌트를 만들고, 배경 클릭과 Escape 키를 통한 닫기를 지원합니다.

모달 컴포넌트 기본 골격

기본 구조부터 시작하십시오. `isOpen`, `onClose`, `children` props를 받는 Modal 컴포넌트를 만듭니다. `isOpen`이 false이면 아무것도 렌더링하지 마십시오.
function Modal({ isOpen, onClose, children }) {
  if (!isOpen) return null;
  return createPortal(
    <div className="backdrop" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()}>
        {children}
      </div>
    </div>,
    document.body
  );
}

배경 및 버블링 중지

바깥쪽 `backdrop` div가 화면 전체를 덮습니다. 이 div를 클릭하면 `onClose`가 호출됩니다. 안쪽 `modal` div에서는 `e.stopPropagation()`을 호출하여 모달 내부의 클릭이 배경으로 버블링되어 실수로 모달이 닫히지 않게 하십시오.

Escape 키로 닫기

`keydown` 이벤트를 수신하는 `useEffect`를 추가하십시오. 모달이 열려 있을 때 Escape 키가 눌리면 `onClose`를 호출하십시오. 정리 작업에서 수신기를 제거하십시오.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

본문 스크롤 방지

모달이 열려 있을 때는 보통 모달 뒤의 페이지가 스크롤되지 않도록 해야 합니다. `useEffect` 안에서 `document.body`에 `overflow: hidden`을 추가하고 제거하십시오.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

모달을 위한 기본 CSS

배경은 화면 전체를 덮는 고정 오버레이여야 합니다. 모달 상자는 중앙에 배치해야 합니다. 가장 간단한 CSS 방법은 배경에 flexbox를 사용하여 모달을 중앙에 배치하는 것입니다.
.backdrop {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
}
.modal {
  background: white;
  border-radius: 8px;
  padding: 24px;
  min-width: 320px;
}

모달 사용하기

부모의 불리언 상태 변수로 모달을 제어하십시오. Modal에 `isOpen`과 `onClose` props를 전달하십시오. 원하는 콘텐츠는 children으로 넣으십시오.
function App() {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button onClick={() => setOpen(true)}>Open Modal</button>
      <Modal isOpen={open} onClose={() => setOpen(false)}>
        <h2>Hello from the modal!</h2>
        <button onClick={() => setOpen(false)}>Close</button>
      </Modal>
    </>
  );
}

내부에 닫기 버튼 추가하기

키보드를 사용할 수 없거나 배경을 알아차리지 못하는 사용자를 위해 모달 내부에 명시적인 닫기 버튼을 항상 제공하십시오. children 또는 prop을 통해 콘텐츠에 `onClose`를 전달하십시오.

CSS 전환으로 애니메이션 만들기

페이드 인 효과를 만들려면 닫혀 있을 때 null을 반환하는 대신 포털을 항상 렌더링하고 CSS 클래스를 전환하십시오. 배경에 CSS `opacity` 및 `transform` 전환을 사용하십시오.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

모달 헤더 및 푸터 구성하기

모달을 하위 컴포넌트인 `Modal.Header`, `Modal.Body`, `Modal.Footer`로 나누십시오. 복합 컴포넌트 패턴을 사용하면 사용하는 쪽에서 클래스 이름을 알지 못해도 모달 레이아웃을 구성할 수 있습니다.

빠른 확인

안쪽 모달 div의 onClick handler에서 e.stopPropagation()을 호출하는 이유는 무엇입니까?

정리

createPortal을 사용하여 Modal을 만들었습니다. 배경을 클릭하면 닫히고, Escape 키를 누르면 닫히며, 열려 있는 동안 본문 스크롤이 잠깁니다. 또한 stopPropagation을 사용하여 모달 내부의 클릭으로 모달이 닫히지 않게 했습니다.

다음 학습 내용

다음 레슨에서는 **모달의 포커스 및 키보드 트랩 처리하기**를 다룹니다. 접근성 요구 사항을 충족하도록 모달이 열려 있는 동안 포커스를 모달 내부에 유지해 봅니다.
무료로 시작

AI 튜터와 함께 React을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
88
레슨
324

자주 묻는 질문

“Portal로 모달 구성 요소 만들기” 강의는 무료인가요?

네 — “Portal로 모달 구성 요소 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Academy 강의 전체를 잠금 해제할 수 있습니다. React Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Portal로 모달 구성 요소 만들기”에서 뭘 배우나요?

createPortal을 통해 document.body에 렌더링되는 재사용 가능한 모달을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 React Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

React Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 React Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Portal로 모달 구성 요소 만들기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 React Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 React Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. React Portal이란 무엇인가요
  2. Portal로 모달 구성 요소 만들기
  3. 모달의 포커스 및 키보드 트랩 처리
  4. Portal로 툴팁 및 드롭다운 메뉴 만들기
← React Academy(으)로 돌아가기