inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next.js App router 기반 Chat GPT 만들기

Header 마크업

섹션6 헤더 마크업 - zustand 적용에 오류가 발생합니다

116

작성자 없음

작성한 질문수 0

0

// model.ts

import { create } from 'zustand';

type State = {
    model: string;
};

type Action = {
    updateModel: (model: State['model']) => void;  
};

const useModelStore = create<State & Action>((set) => ({
    model: 'gpt-3.5-turbo',
    updateModel: (model) => set(() => ({ model })),
}));

export { useModelStore };
// ModelSelect.tsx
'use client';

import { useModelStore } from '@/store/model';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select';

const MODELS = ['gpt-3.5-turbo', 'gpt-4', 'gpt-4o'];

export default function ModelSelect() {
    const { model: currentModel, updateModel } = useModelStore((state) => ({
        model: state.model,
        updateModel: state.updateModel,
    }));

    const handleChange = (selectModel: string) => {
        updateModel(selectModel);
    };

    return (
        <Select value={currentModel} onValueChange={handleChange}>
            <SelectTrigger className="w-[180px] border-none focus:ring-transparent">
                <SelectValue placeholder="모델 선택" />
            </SelectTrigger>

            <SelectContent>
                {MODELS.map((model) => (
                    <SelectItem key={model} value={model} disabled={currentModel === model}>
                        {model}
                    </SelectItem>
                ))}
            </SelectContent>
        </Select>
    );
}

위 코드 적용 결과 아래와 같은 무한반복 에러가 발생합니다. 강의 내용과 비교해 보아도 문제를 찾지 못했습니다 ㅜㅜ

image.png

 

 

react typescript next.js tailwindcss zustand chatgpt

답변 2

0

코딩먹방

zustand가 특정 버전 부터는 항상 반환 객체가 새로 만들어 지면 리렌더링이 되도록 수정되었는데요.

useModelStore에서 샐렉터 함수(state => ({ ... })는 매번 새로운 객체를 반환 하기 때문에 내용이 같아도 새로운 참조가 생성되어 이전과 다르다고 판단해 무한 리렌더링이 일어나게 됩니다.

따라서 아래 처럼 각각 가져오시거나 맨아래 링크를 참고해서 useShallow 를 사용해보시면 해결될것으로 보입니다!

const model = useModelStore(state => state.model);

const updateModel = useModelStore(state => state.updateModel);

 

https://zustand.docs.pmnd.rs/guides/prevent-rerenders-with-use-shallow

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. skql2924님.

현재 발생하는 오류는 React에서 최대 업데이트 깊이를 초과해 발생하는 것으로 보이며, 이는 컴포넌트가 지속적으로 상태를 변경하게 되어 무한 반복 루프가 생겼을 때 발생합니다. 코드를 살펴보고 해결을 위한 몇 가지 지침을 제공하겠습니다.

문제의 원인

  • Select 컴포넌트의 value 속성과 onValueChange 이벤트로 인해 업데이트가 끊임없이 발생할 가능성이 있습니다. 특정 조건에서 상태 업데이트가 계속해서 트리거되고 있습니다.

해결 방법

  1. SelectValue 컴포넌트를 정확히 사용하고 있는지 확인하세요:

    • SelectValueplaceholder 속성이 Selectvalue와 잘 연계되어 있는지 점검하세요. placeholder가 아닌 value 속성이 디폴트 선택 값을 주어야 합니다.
  2. 리액트 상태 관리 로직 조정:

    • 상태 업데이트가 올바르게 작동하는지를 확인하기 위해, 상태 변경이 발생할 때마다 불필요한 렌더링이 발생하지 않는지 코드 로직을 검토합니다.
  3. 검증 로직 추가:

    • 상태가 동일할 경우에는 업데이트를 피하도록 조건문을 추가하여 상태 업데이트 작업을 최소화 할 수 있습니다.
const handleChange = (selectModel: string) => {
    if (selectModel !== currentModel) {
        updateModel(selectModel);
    }
};

참고 자료

위 조치를 시도한 후에도 문제가 지속된다면, 기존 코드와 비교하며 상태 관리가 적절히 이루어지는지를 점검하세요. 상태 변경과 관련한 로직이 불필요한 업데이트를 초래할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

깃 관련질문입니다!

0

5

1

53강 질문

0

5

1

styled-components(전역)

0

5

0

misson 6 질문

0

7

1

클로드 설치버전 문의

0

6

1

서브에이전트를 실행했을때 강의내용과 다르게나와요.

0

8

1

커서 설치했는데 강의화면이랑 달라요.

0

10

1

노션 열기에 도움이 필요합니다.

0

11

1

노션 파일 권한

0

15

2

좋은 강의 자료 감사합니다.

0

18

2

PRD 생성 서브에이전트

0

12

1

유튜브 영상보고 강의 등록하였습니다.

0

18

2

클로드 코드 토큰 절약 공식 플러그인 4개

0

15

0

강의 내용 실습관

0

24

1

노션 파일 없음

0

19

3

Claude / 터미널 기본명령어

0

18

4

gitignore에 로컬 셋팅 반영 안됨 이슈

0

16

2

page loading... 이 안보입니다.

0

70

2

Streaming 관련 질문

0

103

2

loading이 동작하지 않습니다.

0

222

2

Runtime Error

0

184

2

Route Handler 에서 Post 코드 작성해봤는데 계속 에러가 납니다 ㅠㅠ

0

250

2

섹션7 사이드바 &대화페이지 연동 9분50초경 질문

0

178

1

섹션7 사이드바 &대화페이지 연동 3분50초경 질문

0

158

1