리액트(React) 조건부 렌더링 이해하기(conditional rendering)

안녕하세요?

리액트는 MVC(Model-View-Controller) 패턴에서 보면 View에 해당하는 라이브러리인데요.

그래서 리액트 컴포넌트는 화면에 그려질 DOM 객체를 리턴합니다.

코딩하다가 보면 간혹 가다가 조건에 따라 화면에 그려질 DOM 객체를 선택하고 싶을 때가 있는데요.

이때 쓰이는 게 바로 조건 렌더링 방식인데요.

조건 렌더링이라고 해서 특별하게 어려울 건 없습니다.

단순하게 자바스크립트의 조건식을 이용한 겁니다.


if - else 문을 이용한 조건 렌더링

첫 번째로 if - else 문을 이용한 조건 렌더링은 가장 쉽습니다.

//images to render
const blackHat =
  'https://cdn.pixabay.com/photo/2014/03/25/16/33/fedora-297371_1280.png'
const whiteHat =
  'https://cdn.pixabay.com/photo/2014/04/03/00/35/hat-308778_1280.png'

const isWhite = true

if (isWhite) {
  // If isWhite is true
  return <img src={whiteHat} width='200px' />
} else {
  // If isWhite is not true
  return <img src={blackHat} width='200px' />
}

위와 같이 간단하게 if - else 문을 이용해서 리액트 컴포넌트가 꼭 return 해야 할 DOM 객체를 지정해서 주면 됩니다.


삼항 연산자를 이용한 조건 렌더링

자바스크립트에서 if - else 문을 간단하게 쓰는 삼항 연산자가 있는데요. (? :)

return isWhite ? (
  <img src={whiteHat} width={200} />
) : (
  <img src={blackHat} width={200} />
)

어떤가요? 더 간단하지 않나요?


&& 연산자를 사용한 리액트 조건 렌더링

위에서 살펴본 삼항 연산자 보다 더 간단한 AND 연산자 (&&)가 있습니다.

AND 연산자는 (&&) 는 어떻게 작동하는지 간단히 살펴볼까요?

true && false === false

false && true === false

true && true === true

AND 연산자는 첫 번째 피연산자가 참이어야만 두 번째 피연산자도 계산합니다.

만약 첫 번째 피연산자가 거짓(false)이면 두 번째 피연산자를 참조(계산)할 필요가 없기 때문에 바로 거짓(false)을 리턴해 버립니다.

바로, 이 특성을 이용한 겁니다.

return <>{isWhite && <img src={whiteHat} width={200} />}</>

위 코드를 보시면 isWhite가 참이면 && 연산자 뒤에 있는 걸 참조(계산)하는데요.

만약 isWhite가 거짓이면 && 연산자 뒤에 있는 것 참조(계산) 하지도 않고 바로 거짓이 됩니다.

그래서 만약 isWhite가 거짓이라면

return ( <>false</>) 가 되는데요.

여기서 boolean 값은 렌더링이 안 됩니다. 그래서 빈 <> 태그가 리턴되게 됩니다.

AND 연산자를 이용한 조건 렌더링에서 주의할 점은 바로 첫번 째 피연산자는 무조건 참, 거짓을 나타내는 boolean 타입이어야 합니다.

만약 isWhite가 0, NaN 일 경우 && 연산자는 0 또는 NaN을 그냥 리턴하게 됩니다.

그래서 화면에는 0 또는 NaN이 나타나게 되는데요.

그래서 isWhite 변수처럼 조건 렌더링을 결정짓는 변수를 숫자 타입으로 사용하지 않는게 좋습니다.

만약 숫자 타입이라면 아래와 같이 크기 비교를 통해 꼭 참, 거짓을 나타낼 수 있게 해야 합니다.

isWhite > 0 && <img src={whiteHat} />

지금까지 리액트에서의 조건 렌더링에 대해 알아봤는데요.

저도 && 연산자를 가장 많이 씁니다.

왜 && 연산자를 쓰냐면 조건에 맞으면 화면에 뿌리고 조건에 맞지 않으면 화면에 뿌리지 않고 싶을 때 사용할 수 있는 방식이면서 좀 더 간단하게 쓸 수 있기 때문입니다.

아주 간단한 && 연산자이지만 꼭 왼쪽 피연산자는 참, 거짓을 리턴하게끔 코드를 짜는 게 버그를 미연에 방지할 수 있는 좋은 습관이 될 거로 생각합니다.

그럼.