TILs

67일차 TIL( FE 질문 / supabase 저장된 Data 읽어오기() )

API284 2023. 8. 26. 01:13

#5. useRef에 대해 설명해보세요.

 

리액트에서 제공하는 라이브러리 Hook 중 하나로 컴포넌트에서 DOM 요소나 변수 등을 참조하고 관리하기 위해 사용 !

useRef를 사용하면 컴포넌트의 생명주기와 관계 없이 요소,변수에 접근할 수 있음

또한 컴포넌트의 렌더링과 관련 없이 데이터를 저장하고 유지할 때 사용하기도 하는데 컴포넌트의 상태나 props가 변경되어도 해당 데이터가

초기화되지 않는다

단순한 참조를 생성하거나 기존 값을 유지하기 위해 useRef를 사용할 수 있지만 이를 통해 상태관리를 하지는 않는다

상태 변화에 따라 컴포넌트가 리랜더링될 때는 useState나 useReducer 같은 타Hook을 사용해야함 !

 

Supabase - Table editor - 생성된 Table 중 하나를 선택하여 내부의 우측 상단 API에서

 Table에 지정한 각 column에 접근하여 선택해서 불러오거나, 패치, data 삽입. filtering 등을 해줄 수 있다 !

 

예시로는 

유저가 북마크한 store를 모아서 한 곳에 보여주고 싶었다.

 

1. 우선 로그인한 user_id 를 이용해 table 중 bookmark에 접근하여 user_id가 북마크한 store_id의 배열이 필요하다.

 

 

 const [fetchSubs, setFetchSubs] = useState<Bookmark[]>([]);

 

useEffect(() => {
    const Subs = async () => {

   현재 전역으로 관리되고 있는 로그인유저의 정보인 currenUser를 이용한다

   if (currentUser) {
        const userPostId = currentUser.id;
        let { data } = await supabase.from('bookmark').select('*').eq('user_id', userPostId);

         공식문서에서 제공하는 방법이다

         북마크 테이블에 접근하여 * 전체 중에 usr_id(테이블의 행을 선택) 하여 currentUser의 id에 해당하는 배열을 불러온

         다
        if (data) {
          setFetchSubs(data);
          const storeIds = data.map((bookmark) => bookmark.store_id);
          그 data를 담아주고 이 data의 sotre_id만 다시 걸러준다

        if (storeIds.length > 0) {
            let { data: storeData } = await supabase.from('store').select('*').in('id', storeIds);
            걸러진 store_id를 sotreIds로 선언해주고 이를 불러오고자 하는 store 테이블로 접근한다.

.            전체 배열 * 에서 id라는 행에 storeIds에 해당하는 배열들만 불러온다.

             이 data를 storeData로 선언해주며 이 배열을 추출된 배열로 변환하는 작업을 거친다.

             store 객체의 필요한 정보를 추출하여 새로운 객체 배열을 생성하는데,

            if (storeData) {
              const extractedData: Store[] = storeData.map((store) => ({
                id: store.id,
                location: store.location,
                period_start: store.period_start,
                period_end: store.period_end,
                title: store.title,
                body: store.body,
                opening: store.opening,
                images: store.images,
                link: store.link
              }));

              console.log(extractedData);
              setExtractedData(extractedData); // extractedData 설정

              이런식으로 가져온 data를 set해주고 return문에 .map을 활용하여 할당해준다.
            }
          }
        }
      }
    };

    Subs();
  }, [currentUser]);

 

가져오게 되는 data에는 HTML방식으로 전체를 다 받아오는 행도 있을 수 있으며

이미지를 저장할 때 파일명을 변환해서 저장한 경우도 있기 때문에 읽어 올 때 꽤나 번거로운 작업을 해줘야 한다.

supabase를 쓰면서 장점을 알기에 계속해서 시도를 해보는 과정이긴 하지만,

해당 관련 자료나 레거시들이 거의 없기 때문에 공식문서나 외국인들의 남긴 github comment들을 따라가며

해결할 수 밖에 없는게 꽤나 답답한 부분인 거 같다.