인프런 커뮤니티 질문&답변

황지호님의 프로필 이미지

작성한 질문수

[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

4.2) 첫 React App 생성하기

리액트로 로그인 부분 처리하는데 질문이 있습니다.

해결된 질문

24.09.30 18:03 작성

·

30

·

수정됨

0

리액트 강의를 듣고 스프링부트랑 연동해서 리액트 코드를 짜고 있습니다. 지금 로그인 부분 처리하다가 막혀서 정말 구글링도 해보고 며칠째 하다가 도저히 해결이 안돼서 질문 드립니다.

지금 로그인처리가 되면 sessionStorage에 로그인 회원 정보를 담고 navigate함수를 이용해 Main컴포넌트로 보냈습니다. 근데 다른 컴포넌트들에서도 이 로그인회원 정보를 사용하기 위해 최상위컴포넌트인 App컴포넌트에서 sessionStorage.getItem()해서 state값에 저장하고 그걸 context로 하위 컴포넌트들에게 제공했는데 로그인되고 navigate함수로 Main컴포넌트로 가면 context로 저장한 state값이 null이 되고 새로고침해보면 state값이 잘 들어오더라고요ㅠㅠ 비동기함수인것과 관련있을까요??

새로고침없이 컴포넌트에서 바로 state값을 이용하고 싶으면 어떻할까요? state값 이용해서 바로 화면에도 렌더링도 해야하는 상황입니다 ㅠㅠ

강의와 관련된 내용은 아니지만 프로젝트를 혼자 만들다보니 잘 안되는 부분이 많아 질문드립니다 !

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

2024. 10. 01. 10:55

안녕하세요 이정환입니다.

최상위 컴포넌트인 App 컴포넌트에 auth State를 만들어 다음과 같이 처리하시면 어떨까요?

  • auth State를 보관하고 관리하기 위한 Context 생성 : AuthContext

  • 위 Context의 Provider 컴포넌트를 App 컴포넌트의 자식 요소들로 설정하여 전역으로 적용되는 컨텍스트로 설정함

  • 사용자 로그인시 AuthContext의 auth State 값 변경

  • AuthContext 에서는 useEffect로 auth State의 값이 변경될 때 sessionStorage(or localStorage)에 인증 정보 갱신

     

위와 같이 설정하시면 State에 먼저 정보를 보관하고 그리고 나서 useEffect를 통해 sessionStorage에 정보를 저장하는 형태로 변경됩니다. 우리 강의의 감정일기장과 동일한 순서라고 보시면 될 것 같아요

추가로 새로고침시에 로그인 정보를 유지하는 방법은 간단하죠?! 감정일기장과 동일하게 App 컴포넌트의 마운트 시점에 AuthContext의 auth State의 값을 sessionStorage에 저장된 값으로 갱신시켜주시면 됩니다.

황지호님의 프로필 이미지
황지호
질문자

2024. 10. 02. 12:57

정성스러운 답변 너무 감사합니다!!

선생님께서 알려주신 답변 중에서 '사용자 로그인시 AuthContext의 auth State 값 변경'

이 부분을 제가 안해서 처음에 자꾸 null이 나온것 같아요 ㅠㅠ

이론 들을땐 나름 혼자 해결할 수 있을 것 같았는데 직접 해보니 정말 생각보다 훨씬 어렵네요ㅠㅠ

며칠동안 해결안돼서 정말 좌절스러웠는데 로그인 부분 덕분에 해결했습니다!

정말 감사합니다!!!

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 30. 18:06

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

로그인 상태를 다루면서 sessionStorage와 상태 관리 주제로 인한 문제는 많은 분들이 겪는 어려움입니다. 이와 관련하여 유사한 문제를 해결한 기존 게시글이 있습니다. 여기에서 필요한 힌트를 얻으실 수 있을 것입니다.

아래 링크에서 관련 정보를 확인해보세요:
- React에서 로그인 상태 유지하기 - sessionStorage와 useEffect

요약: sessionStorage에 로그인 정보를 저장하고 이를 통해 상태를 관리할 때는 useEffect를 활용하여 컴포넌트가 렌더링될 때마다 sessionStorage에서 값을 가져와 상태를 업데이트할 수 있습니다.

  1. sessionStorage에 로그인 정보 저장: 로그인 후 sessionStorage에 정보를 저장합니다.
  2. useEffect를 활용한 상태 업데이트: 최상위 컴포넌트(App 컴포넌트)에서 useEffect를 사용하여 컴포넌트가 마운트될 때 sessionStorage에서 값을 가져와 상태를 설정합니다.
  3. context로 상태 제공: 최상위 컴포넌트에서 context를 통해 하위 컴포넌트에 상태를 제공합니다.

다음은 예시 코드입니다:

// App 컴포넌트
import React, { useEffect, useState, createContext } from 'react';

export const UserContext = createContext(null);

const App = () => {
  const [user, setUser] = useState(null);

  useEffect(() => {
    const loggedInUser = sessionStorage.getItem('user');
    if (loggedInUser) {
      setUser(JSON.parse(loggedInUser));
    }
  }, []);

  return (
    <UserContext.Provider value={user}>
      <MainComponent />
      {/* 다른 컴포넌트들 */}
    </UserContext.Provider>
  );
};

// Main 컴포넌트
import React, { useContext } from 'react';
import { UserContext } from './App';

const MainComponent = () => {
  const user = useContext(UserContext);

  return (
    <div>
      {user ? <p>Welcome, {user.name}</p> : <p>Please log in.</p>}
    </div>
  );
};

이 방법을 통해 새로고침 없이 로그인 상태를 유지하고 하위 컴포넌트에서도 상태값을 사용할 수 있습니다.

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