React로 웹페이지를 작성하던 도중,

조건을 할당하여 useEffect의 동작이상을 개선하였습니다.

 

- 상황 -

서버에서 fetch해 온 데이터를 state에 담고,

해당 state를 이용하여 페이지를 렌더링 합니다.

 

프론트엔트 소스코드는 하기와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { Fragment, useEffect, useState } from 'react';
function Test() {
const [hi, setHi] = useState([]);
 
// 본 페이지가 렌더링 되면 서버로부터 데이터를 fetch하고 'hi' state에 추가함
fetch('http://localhost:8000/fetch')
.then((res) => res.json())
.then((data) => {
setHi((hi) => [...hi, data.message]);
});
 
return (
<Fragment>
<div style={{ marginLeft: 30, marginTop: 30 }}>
{/* 'hi'state의 값으로 li를 생성함(렌더링) */}
{hi.map((fetchedData, i) => (
<li key={i}>{fetchedData}</li>
))}
</div>
</Fragment>
);
}
 
export default Test;
cs

 

백엔드 소스코드는 하기와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import express from 'express';
import http from 'http';
import cors from 'cors';
 
const app = express();
const server = http.createServer(app);
 
app.use(express.json());
app.use(cors({ origin: '*' }));
 
server.listen(8000, () => {
console.log('server is listening on port 8000!');
});
 
///fetch uri로 get요청이 있을 경우, 하기 response 객체를 보냄
app.get('/fetch', (req, res) => {
res.json({ message: '안녕하세요?' });
});
 
cs

 

- 문제점 - 

데이터가 필요한 것은 한 번 뿐인데,

계속해서 fetch가 발생하여 페이지가 무한렌더링에 빠집니다.

이게 머선129?

 

- 원인 -

해당 문제의 원인을 도식화 하면 하기와 같습니다.

 

- 해결 -

fetch부분을 useEffect에 삽입하여,

페이지가 렌더링 될 때 1회만 렌더링 되도록 수정하였습니다.

(useEffect의 끝부분에 빈배열 []삽입)

useEffect끝에 빈배열을 삽입하여 렌더링 조건을 제어

+ Recent posts