section 17 useEffect 부분
const [dog, setDog] = useState("");
const res = axios.get("https://dog.ceo/api/breeds/image/random");
console.log(res.data.message); // 사진 주소
setDog(res.data.message);위 코드에서 강사님이 설명 해주실 때, res 값이 변경되고 state 값이 바뀌니까 계속 무한루프로 리렌더링이 된다고 하셨는데, 계속 state 값이 바뀌는 이유가 이 api 자체가 fetch 할 때마다 랜덤으로 사진이 바뀌는 api라서 그런 걸까요 ? ??
답변 2
0
안녕하세요! 냐냐님!
setState의 내부적으로 들어가면, 더 복잡한 이유들 뿐만 아니라 state 리렌더 조건 등이 함께 고려되어야 하겠지만, 해당 수업 당시에 설명드렸던 내용은 API로 받아오는 사진이 매번 달라지는 것에 대한 설명이 맞습니다!^^
0
안녕하세요, 인프런 AI 인턴입니다.
냐냐님, 질문하신 useEffect와 관련된 내용은 주신 정보에 따른 것이 아니라 일반적인 React의 동작 원리를 기반으로 설명이 가능합니다.
여러분이 작성하신 코드에서는 axios.get을 통해 HTTP 요청으로 개 사진을 가져오는 부분이 있습니다. 이 코드는 컴포넌트가 렌더링될 때마다 실행되고 있습니다. 그리고 setDog 함수를 통해 state를 갱신하게 됩니다. 이렇게 될 경우, React는 state가 업데이트됨을 감지하고 컴포넌트를 다시 렌더링하는 과정을 반복하게 되죠.
여기서 문제는 API 자체가 랜덤한 사진을 제공한다는 점과는 별개입니다. state가 변경될 때마다 컴포넌트 렌더링이 발생하고, 그 렌더링 과정에서 다시 API 요청이 이루어지면서 state가 업데이트되고, 이로 인해 또 다시 렌더링이 발생하는 무한 루프에 빠지게 되는 것입니다.
이 문제를 해결하기 위해 보통은 useEffect 훅을 사용하여, 컴포넌트가 마운트될 때 단 한 번만 API 요청이 이루어지도록 할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성할 수 있습니다.
useEffect(() => {
axios.get("https://dog.ceo/api/breeds/image/random")
.then(res => {
setDog(res.data.message);
});
}, []);
위와 같이 useEffect 내부에 API 요청을 넣고, 의존성 배열(dependency array)을 빈 배열로 설정하면, 컴포넌트가 처음 마운트될 때만 API 요청이 실행되어 무한 루프를 방지할 수 있습니다.
이렇게 useEffect를 사용하면, 데이터를 가져오는 로직이 렌더링과 분리되어, 필요한 시점에만 데이터를 가져오고 state를 업데이트할 수 있게 됩니다.
fetchBoardsOfMine, fetchBoardsCountOfMine 에러 문의드립니다
0
36
1
댓글 기능 구현 중 질문드립니다.
0
66
1
쿠폰코드 발급
0
132
2
example 서버 플레이그라운드, API 접속 모두 안됩니다.
0
86
2
문의드립니다!! ㅠㅠ
0
101
2
graphql 백엔드 서버가 포폴용 빼곤 접속이 안됩니다.
0
76
2
_app.js 작성 이후로 에러가 발생하네요
0
93
2
학습자료
0
70
2
학습자료가 안열립니다.
0
49
2
플레이 그라운드 퀴즈 문제 질문이 있습니다.
0
59
0
기존강의 구매자, 업데이트 끝인가요?
0
109
3
업데이트 버전 수강
0
88
2
완벽한 프론트엔드
0
136
2
나만의 쇼핑몰 샘플 페이지 접속 확인부탁드립니다.
0
81
1
graphql 접속이 안됩니다.
0
100
2
const, let 사용 질문 드립니다.
0
70
2
싸이월드 만들기 1탄 피드백 부탁드립니다.
0
122
2
회원가입 과제 피드백 부탁드립니다.
0
80
2
styled.span / styled.input "CSS 자동완성"
0
47
1
쿠폰 발급 관련
0
166
2
서버 502 error
0
247
2
쿠폰 다시 부탁드려도 될가여?
0
140
2
a태그 패딩했을때 왜 크기가 줄어들지 않고 늘어나나요
0
184
2
2분 44초 질문
0
131
3





