๐ ๋ค์ด๊ฐ๋ฉฐ
React + Typescript ํ๊ฒฝ์์ React Testing library์ jest๋ฅผ ์ด์ฉํด์ ํ ์คํธ ์ฝ๋ ์์ฑ์ ๋ํด์ ๊ณต๋ถํ๋ ค๋ ๋์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ํด์ผ ํ ๊ฒ์ ๋ณ ๊ฑฐ ์๋์์ง๋ง ํ๋ค๊ฒ(?) ํด๊ฒฐ ๋ฐฉ์์ ์ฐพ์์ ๊ธฐ๋ก์ ํด๋๋ ค๊ณ ํ๋ค.
1. ๋ฌธ์ ๋ฐ์
CRA typescript๋ก ํจํค์ง๋ค์ ์ค์นํ๊ณ ๋ ํ์ npm test ๋ช ๋ น์ด๋ฅผ ํตํด์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋์ด ์๋ ํ ์คํธ ์ฝ๋๋ค์ด ์ ์คํ์ด ๋๋์ง ํ์ธ์ ํด๋ดค๋ค.
ํ์ง๋ง ReactDOM.render is no longer supported in React 18 ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํ ์คํธ ์ฝ๋ ์์ฒด๋ PASS๊ฐ ๋๋ฉด์ ์ ์คํ์ด ๋์์ง๋ง ์์ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋งค์ฐ ์ ๊ฒฝ ์ฐ์๋ค.
2. ๋ฐ์ ์์ธ
ReactDOM.render๋ React 18์์ ๋ ์ด์ ์ง์๋์ง ์์ต๋๋ค. ๋์ createRoot๋ฅผ ์ฌ์ฉํ์ธ์.
์ API๋ก ์ ํํ ๋๊น์ง ์ฑ์ React 17์ ์คํํ๋ ๊ฒ์ฒ๋ผ ์๋ํฉ๋๋ค.
https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html
๊ณต์ ๋ฌธ์์ ์ ํ์๋ฏ์ด React 18 ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ฉด์ ReactDOM.render๋ ๋ ์ด์ ์ง์๋์ง ์๋๋ค๊ณ ํ๋ค.
3. ํด๊ฒฐ ๋ฐฉ๋ฒ
3-1 ์ฒซ ๋ฒ์งธ
๋จผ์ ๊ณต์๋ฌธ์์ ๋์์๋ ์์ ์ฝ๋์ฒ๋ผ index.tsx๋ฅผ ์์ ํด๋ดค๋ค.
import React from "react";
import { createRoot } from "react-dom/client";
import App from "./App";
const container = document.getElementById("root");
const root = createRoot(container);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
๊ฒฐ๊ณผ๋ ์คํจ.
๋๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
react-dom/client์ type์ ์ฐพ์ ์ ์๋ค๊ณ createRoot๋ฅผ ์ฌ์ฉํ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. (์ด๋ ๊ฒ ํ๋ผ๋ฉด์ ์ด์ฉ๋ ๊ฑฐ์ง)
3-1-1 ์ฒซ ๋ฒ์งธ ์๋์ ํด๊ฒฐ ๋ฐฉ์
๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์๋ ์ฝ๋๋ฅผ React 18๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ง๋ง TypeScript์ ๋ํด ํ์คํ ์ ํ์ด ์ง์ ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์์๋ค.
๊ทธ๋์ @types/react-dom ํจํค์ง๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ค.
npm install @types/react-dom@17.0.14
์ด ์ ๋ฐ์ดํธ๋ type ์ ์์๋ React 18์ ๋ํ ์ ๋ฐ์ดํธ๋ ์ ์ธ์ด ํฌํจ๋๋ค.
import React from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';
import App from './App';
// React 18
const container = document.getElementById('root') as HTMLElement;
const root = createRoot(container);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
์ด๋ ๊ฒ ํด์ค์ผ๋ก์จ createRoot์ type์ด ์๋ค๋ ์ค๋ฅ๋ ํด๊ฒฐ๋์๋ค.
3-2 ๋ ๋ฒ์งธ
์ง๊ธ๊น์ง ํ ๊ฑธ๋ก ๋๋ ์ค ์์๋๋ฐ npm test๋ฅผ ์คํํ ์ ReactDOM.render is no longer supported in React 18 ์ค๋ฅ๊ฐ ์ฌ์ ํ ๋ฐ์ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋์ด ์๋ app.test.tsx์์ render() ํจ์๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ํ๋ ๋ฌธ์ ์๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ฌ์ฉ ์ค์ธ ๋ชจ๋ React Testing library ํจํค์ง์ ๋ฒ์ ์ ์ ๋ฐ์ดํธํด์ผ ๋๋ค.
npm install --save-dev @testing-library/react@latest
npm install --save-dev @testing-library/jest-dom@latest
npm install --save-dev @testing-library/user-event@latest
๊ฐ ํจํค์ง๋ค์ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ํ๊ณ ํ์ธํด ๋ณด๋ฉด ๋ชจ๋ ์ค๋ฅ๊ฐ ์์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ ๋ง๋ฌด๋ฆฌ
ํด๊ฒฐํ๊ณ ๋ณด๋ ๋ณ ๊ฑฐ ์๋์์ง๋ง ๋๋ฌด ์ฝ์ง์ ํ ๊ฑฐ ๊ฐ์์ ๋์ ๊ฐ์ ๊ณ ํต์ ๊ฒช๋ ์ฌ๋์ด ์๋ค๋ฉด ์์ฝ๊ฒ ํด๊ฒฐํ์ผ๋ฉด ๋ฐ๋ผ๋ ๋ง์์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฐธ๊ณ ํ ์ ์๋๋ก ์ ๋ฆฌ๋ฅผ ํด๋ ๊ฒ๋ ์ด์ ์ค ํ๋์ด๋ค.
์ฐธ๊ณ :
https://stackoverflow.com/questions/71684417/upgrading-to-react18-and-react-dom18-fails
https://bobbyhadz.com/blog/react-testing-library-reactdom-render-not-supported