class Table extends React.Component {
  render() {
    return (
      <table>
        <tr>
          <Columns />
        </tr>
      </table>
    );
  }
}
렌더링 된 Table 컴포넌트가 유효하려면 <Columns />가 여러 <td>엘리먼트를 반환해야 한다.
class Columns extends React.Component {
  render() {
    return (
      <div>
        <td>Hello</td>
        <td>World</td>
      </div>
    );
  }
}
//---------------------------------------
 그런데 위와 같이 <Columns />가 <td />를 <div>로 감싸서 반환한다면 실제 dom tree는 아래와 같이 구성될것이다.
<table>
  <tr>
    <div>
      <td>Hello</td>
      <td>World</td>
    </div>
  </tr>
</table>
이렇게 구성된 html은 유효하지 않다.
class Columns extends React.Component {
  render() {
    return (
      <React.Fragment>
        <td>Hello</td>
        <td>World</td>
      </React.Fragment>
    );
  }
}
//---------------------------------------
  <Columns />가 <td />를 <React.Fragment>로 감싸서 반환한다면  Fragment는 dom에 추가되지 않기때문에 실제 dom tree는 아래와 같이 구성될것이다.
<table>
  <tr>
      <td>Hello</td>
      <td>World</td>
  </tr>
</table>
short syntax는 아래와 같이 빈 태그를 적어주는것인데
class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Hello</td>
        <td>World</td>
      </>
    );
  }
}
이 방식을 사용하면 편리하기는 하지만 tag에 attributes나 key를 적어줄 수 없다.
그리고 현재 Fragment에 전달할 수 있는 유일한 어트리뷰트는 key이다. (공식문서에는 추후 이벤트 핸들러와 같은 추가적인 어트리뷰트를 지원할 수도 있다고 명시되어 있다.)
<div>를 추가하게 되면 레이아웃을 유지하기 어려워지므로 fragment를 사용하면 된다.
설명을 좀 알게 쉽게 해놔라 그냥 react는 하나의 태그만 return 되는데 react.fragment는 두개 리턴 시켜준다. 이렇게 설명하면 쉽잖아. 자식아