[project] ๐ŸŽฌMovyes: ์˜ํ™” ์ปค๋ฎค๋‹ˆํ‹ฐ React ํ”„๋กœ์ ํŠธ - Pick(์ฐœ)

์˜ค์˜ค๊ตฌยท2023๋…„ 1์›” 10์ผ
0

'Pick' ๋ฆฌ์ŠคํŠธ

๊ด€์‹ฌ์žˆ๋Š” ์˜ํ™”๋ฅผ ๋ชจ์•„๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
ํŽธ์˜์ƒ ์—ฌ๊ธฐ์„  '์ฐœ' ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ๋‹ค.


์„ธ๋ถ€ ๊ธฐ๋Šฅ

  • pickํ•จ์— ์˜ํ™” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€
  • pickํ•œ ์˜ํ™” ๋ชฉ๋ก์„ ๋ชจ์•„์„œ ์กฐํšŒ
  • pickํ•จ์—์„œ ์˜ํ™” ๋ฐ์ดํ„ฐ ์‚ญ์ œ
  • pickํ•จ์— ์ถ”๊ฐ€๋œ ์˜ํ™”์™€ ์•„๋‹Œ ์˜ํ™” ์•„์ด์ฝ˜ ๊ตฌ๋ถ„

๊ณ ๋ฏผ

1. ์ฐœ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋”” ์ €์žฅ๋˜์–ด์•ผ ํ• ๊นŒ

์ฒ˜์Œ์—” ๋ง‰์—ฐํ•˜๊ฒŒ movie์— ์ฐœ ์—ฌ๋ถ€๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ ๊นŒ ์‹ถ์—ˆ๋Š”๋ฐ ๋ง๋„ ์•ˆ๋˜๋Š” ์ƒ๊ฐ์ด์—ˆ๋‹ค. ์ฐœ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ €๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š”๋ฐ movie๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋“  ์œ ์ €์—๊ฒŒ ๋™์ผํ•˜๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ์ฒ˜์Œ ์ƒ๊ฐ์ฒ˜๋Ÿผ movie๋ฐ์ดํ„ฐ๊ฐ€ ์ฐœ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด A์œ ์ €๊ฐ€ ์ฐœ ํ•œ ์˜ํ™”์ธ๋ฐ B์œ ์ €์—๊ฒŒ๋„ ์ฐœ์ด ๋๋‹ค๊ณ  ๋‚˜์˜ค๋Š” ๋ถˆ์ƒ์‚ฌ๊ฐ€ ์ƒ๊ธด๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋”ฐ๋กœ ์ €์žฅํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

/picks/์œ ์ €ID/์˜ํ™”ID

๊ฒฝ๋กœ๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ ์„ค์ •ํ•ด์„œ ์œ ์ €๋ณ„๋กœ ์ฐœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜๋ˆ„์–ด์ง€๋„๋ก ํ–ˆ๋‹ค.

2. ์˜ํ™”์˜ ์ฐœ ์—ฌ๋ถ€ ์กฐํšŒ

์‡ผํ•‘๋ชฐ์—์„œ์˜ '์ฐœ' ๊ธฐ๋Šฅ ์ฒ˜๋Ÿผ ์˜ํ™” ๋ชฉ๋ก์ด ์กฐํšŒ๋  ๋•Œ ์ฐœ ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋˜๊ณ , ์•„์ด์ฝ˜์ด ํด๋ฆญํ• ๋•Œ๋งˆ๋‹ค ์ฐœ ์—ฌ๋ถ€๊ฐ€ ํ† ๊ธ€ ๋˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ ค๋ฉด ์˜ํ™” ์ •๋ณด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ์ฐœ ์ •๋ณด๋„ ํ•จ๊ป˜ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์งœ์•ผํ• ์ง€๊ฐ€ ๊ณ ๋ฏผ์ด์—ˆ๋‹ค.

์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ์ด๋ ‡๋‹ค.

  1. ๊ฐœ๋ณ„ ์˜ํ™” ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ
  2. ์œ ์ €๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ์ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
  3. ์ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์˜ํ™”id์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค.
  4. ์ฐพ์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ๋•์Šค์˜ ์ฐœ state์— ์—…๋ฐ์ดํŠธ์‹œํ‚จ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด ์˜ํ™”์˜ ์ฐœ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์˜ํ™” ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ui๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ณ , ์ฐœ ํŽ˜์ด์ง€์—์„œ ์กฐํšŒ๋  ๋ชจ๋“  ์ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๊นŒ์ง€ ํ•œ๋ฒˆ์— ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌํ˜„

pick-action

// ์ „์ฒด ์ฐœ ์˜ํ™” ๊ฐ€์ ธ์˜ค๊ธฐ
export const getPickFetch = (userUid) => {
  return (dispatch) => {
    getPick(userUid, (movies) => dispatch(pickAction.get(movies)));
  };
};

// ์ฐœ ์ถ”๊ฐ€
export const addPickFetch = (userUid, movie) => {
  return () => {
    addPick(userUid, { ...movie, pickDate: new Date().getTime() });
  };
};

// ์ฐœ ์ œ๊ฑฐ
export const removePickFetch = (userUid, movieId) => {
  return () => {
    removePick(userUid, movieId);
  };
};

pick-slice

firebase์˜ onvalue API๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฆฌ๋•์Šค ๋ฆฌ๋“€์„œ์—์„œ๋Š” add, remove๊ธฐ๋Šฅ์ด ํ•„์š”์—†๋‹ค.

import { createSlice } from "@reduxjs/toolkit";

export const pickSlice = createSlice({
  name: "pick",
  initialState: { pick: [] },
  reducers: {
    get: (state, action) => {
      if (action.payload) {
        state.pick = Object.values(action.payload);
      } else {
        state.pick = [];
      }
    },
  },
});

export const pickAction = pickSlice.actions;

fireabse


// ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— pick ์ €์žฅ
export const addPick = (userId, movie) => {
  set(ref(db, `/picks/${userId}/${movie.id}`), movie);
};

// ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œpick ๋ฐ์ดํ„ฐ ๋“ค๊ณ ์˜ค๊ธฐ
export const getPick = (userUid, callback) => {
  const pickRef = ref(db, `/picks/${userUid}`);
  onValue(pickRef, (snapshot) => {
    callback(snapshot.val());
  });
};

// pick ๋ฐ์ดํ„ฐ ์‚ญ์ œ
export const removePick = (userUid, movieId) => {
  remove(ref(db, `/picks/${userUid}/${movieId}`));

๊ตฌํ˜„ํ™”๋ฉด

  • ์ฐœ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์•„์ด์ฝ˜
  • ์ „์ฒด ์ฐœ ๊ฐฏ์ˆ˜
  • ์ฐœ ์กฐํšŒ ํŽ˜์ด์ง€
profile
๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€