🌊🚒 νŒŒμ΄λ„ν”„λ‘œμ νŠΈ: 여행일정 μ•± TRIPVOTE ν›„κΈ°

SKYΒ·2024λ…„ 2μ›” 15일
0

2023-12-04 ~ 2024-01-29
νŒŒμ΄λ„ν”„λ‘œμ νŠΈ : 여행일정 μ•± TRIPVOTE

ν”„λ‘œμ νŠΈ κΈ°κ°„

  • 전체 κΈ°κ°„ : 2023-12-04 ~ 2024-01-29
  • 기획 / UI : 2023-12-04 ~ 2024-01-05
  • κΈ°λŠ₯ κ΅¬ν˜„ : 2024-01-05 ~ 2024-01-29
  • λ¦¬νŒ©ν† λ§ : 2024-02-14 ~ 2024-02-29
Test ID : test@test.com
Test PW : 1q2w3e4r!Q

λ‹΄λ‹Ή 파트 - 여행지 νˆ¬ν‘œ

κΈ°λŠ₯ μš”μ•½
(1) νˆ¬ν‘œν•˜κΈ° - νˆ¬ν‘œ CRUD, νˆ¬ν‘œν•˜κΈ°, νˆ¬ν‘œ μˆœμœ„ μ •λ ¬
(2) 여행지 후보 - 여행지 후보 μΆ”κ°€&μ‚­μ œ, λ©”λͺ¨ 남기기, λ©”λͺ¨ μž„μ‹œ μ €μž₯
(3) 여행지 후보 지도 - 카카였맡으둜 후보 보기

μΆ”κ°€ νŽ˜μ΄μ§€

1. πŸ€” κ³ λ―Όν•œ κΈ°λŠ₯

(1)β€˜λ©”λͺ¨ μž‘μ„± νŽ˜μ΄μ§€β€™μ˜ μ‹€μ‹œκ°„ μ €μž₯ κΈ°λŠ₯

  • μ»€μŠ€ν…€ ν›… useGetSelectedArray을 μ΄μš©ν•˜μ—¬ μœ μ €κ°€ μ„ νƒν•œ 여행지 λͺ©λ‘κ³Ό 여행지에 μž‘μ„±ν•œ λ©”λͺ¨λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ λ‘œμ»¬μŠ€ν† λ¦¬μ§€μ— μ €μž₯. μ΄λŠ”, λ©”λͺ¨ μž‘μ„± 도쀑 μœ μ €κ°€ νŽ˜μ΄μ§€λ₯Ό μ΄νƒˆν–ˆλ‹€ λŒμ•„μ™€λ„ μ²˜μŒλΆ€ν„° μž‘μ„±ν•  ν•„μš”κ°€ 없도둝 ν•˜κΈ° μœ„ν•¨μ΄λ‹€.
    • useGetSelectedArray
      import {RecoilState, useSetRecoilState} from 'recoil';
      import {SearchItemType} from '@/types/home';
      import {TaglineType} from '@/types/vote';
      
      // λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ 두 가지 νƒ€μž… μ œμ‹œ
      const useGetSelectedArray = <T extends SearchItemType | TaglineType>(selectedState: RecoilState<T[]>) => {
        const setSelectedState = useSetRecoilState(selectedState);
      
      // μ²΄ν¬λ°•μŠ€ ν† κΈ€λ‘œ 배열에 μ•„μ΄ν…œ 아이디 λ‹΄κΈ°
        const toggleItemInNewArray = (data: T) => {
          setSelectedState((currentArray) => {
            const index = currentArray.findIndex((item) => item.id === data.id);
      
            if (index !== -1) {
              const newArray = [...currentArray.slice(0, index), ...currentArray.slice(index + 1)];
              return newArray;
            } else {
              const newArray = [...currentArray, data];
              return newArray;
            }
          });
        };
      
      // λ©”λͺ¨ μž‘μ„± μ‹œ κΈ°μ‘΄ 배열에 λ‹΄κΈ°
        const setMemoArray = (data: T) => {
          setSelectedState((currentArray: T[]) => {
            const index = currentArray.findIndex((item) => item.id === data.id);
            if (index !== -1) {
              const newArray = [...currentArray];
              newArray[index] = data;
              return newArray;
            }
            return currentArray;
          });
        };
      
        return {toggleItemInNewArray, setMemoArray};
      };
      
  • λ˜ν•œ, κΈ€ μž‘μ„± μ‹œ useDebounceλ₯Ό μ΄μš©ν•˜μ—¬ λΆˆν•„μš”ν•˜κ²Œ 지속 μ €μž₯λ˜λŠ” 것을 방지
    • useDebounce
      const useDebounce = (value: string, delay: number) => {
        const [debouncedValue, setDebouncedValue] = useState(value);
      
        useEffect(() => {
          const timer = setTimeout(() => {
            setDebouncedValue(value);
          }, delay);
      
          return () => {
            clearTimeout(timer);
          };
        }, [value, delay]);
      
        return debouncedValue;
      };

(2) 재 μ‚¬μš© κ°€λŠ₯ν•œ 곡용 μ»΄ν¬λ„ŒνŠΈ

  • μ „μ²΄μ μœΌλ‘œ λ™μΌν•˜κ²Œ μ‚¬μš©λ˜λŠ” λͺ¨λ‹¬μ„ 곡용으둜 λ§Œλ“€μ–΄ pr을 톡해 곡유
    • λͺ¨λ‹¬
  • 곡용 μ»΄ν¬λ„ŒνŠΈ 이외에도 checkbox, avatar, button λ“± chakra UIλ₯Ό μ΄μš©ν•œ 곡용 μŠ€νƒ€μΌ ν…Œλ§ˆλ„ 적용

2. ✍ λ¦¬νŒ©ν† λ§ ν•  λ‚΄μš© μ •λ¦¬ν•˜κΈ°

(1) μ‹€μ‹œκ°„ μ €μž₯ κΈ°λŠ₯ μˆ˜μ •
μ‹€μ‹œκ°„ μ €μž₯ κΈ°λŠ₯을 λ§Œλ“€ λ•ŒλŠ” β€˜μ‹€μ‹œκ°„ μ €μž₯’에 μ΄ˆμ μ„ 두어 κ΅¬ν˜„ν–ˆμœΌλ‚˜, κΈ°λŠ₯ μ™„μ„± ν›„μ—λŠ” μ–Έλ§ˆμš΄νŠΈλ₯Ό κΈ°μ€€μœΌλ‘œ μ €μž₯해도 무관할 것 κ°™λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€. 이 뢀뢄은 μΆ”ν›„ μ‹€μ‹œκ°„ μ €μž₯μ—μ„œ μ–Έλ§ˆμš΄νŠΈ μ‹œ μ €μž₯ν•˜λ„λ‘ μˆ˜μ •ν•  μ˜ˆμ •.
그리고 μ €μž₯을 λ‘œμ»¬μŠ€ν† λ¦¬μ§€ 말고 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ ν•  수 μžˆλŠ”μ§€ 더 고민해봐야겠닀.

(2) νˆ¬ν‘œν•˜κΈ°μ—μ„œ νˆ¬ν‘œμ˜ μƒνƒœ 관리
νˆ¬ν‘œμ˜ μƒνƒœλŠ” μ—¬λŸ¬κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.
'진행 쀑', 'κ²°μ •μ™„λ£Œ' 둜 νˆ¬ν‘œ κ²°μ • μ™„λ£Œ μ—¬λΆ€λ₯Ό 따지고,
또 'νˆ¬ν‘œ μ „', 'νˆ¬ν‘œμ™„λ£Œ', 'νˆ¬ν‘œ κ²°κ³Ό 보기' 둜 νˆ¬ν‘œλ₯Ό 3가지 μƒνƒœλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.
'νˆ¬ν‘œ κ²°κ³Ό 보기' μƒνƒœλŠ” κ²°μ • 여뢀와 관계 없이 κ°€μ§ˆ 수 있고, 각 νˆ¬ν‘œλ§ˆλ‹€ 가지고 μžˆλ‹€.
λ¬Έμ œλŠ” 이 결과보기 μƒνƒœ 값을 λ°±μ—μ„œ 각 νˆ¬ν‘œλ§ˆλ‹€ 가지고 μžˆλŠ”κ²Œ μ•„λ‹ˆλΌ 전체 νˆ¬ν‘œ λ¦¬μŠ€νŠΈμ—μ„œ λ°°μ—΄λ‘œ μ£Όκ³  있기 λ•Œλ¬Έμ— ν”„λ‘ νŠΈμ—μ„œμ˜ 처리 과정이 쑰금 λ²ˆμž‘ν•˜κ²Œ λ˜μ–΄μžˆλ‹€.
ν˜„μž¬λŠ” 배열에 λ‹΄κΈ΄ id와 νˆ¬ν‘œidλ₯Ό λΉ„κ΅ν•΄μ„œ boolean값을 recoil에 지정해 μ£Όμ—ˆλ”λ‹ˆ 이 λΆ€λΆ„μ—μ„œ 버그가 λ‚˜κ³  μžˆλ‹€.
특히 μ§€λ„μ—μ„œλ„ 결과보기 값이 ν•„μš”ν•΄μ„œ url에 μΏΌλ¦¬μŠ€νŠΈλ§μ„ λ„£λŠ” λ°©μ‹μœΌλ‘œ ν• κΉŒ 싢은데 이게 λ§žλŠ”μ§€λŠ” 아직 확신이 듀지 μ•ŠλŠ”λ‹€.

(3) 여행지 후보 지도
μ•„λ§ˆ 2번이 ν•΄κ²°λ˜λ©΄ 3λ²ˆλ„ μžμ—°μŠ€λŸ½κ²Œ ν•΄κ²° 될 것 κ°™μ§€λ§Œ ν˜„μž¬μ˜ κ°€μž₯ 큰 λ¬Έμ œλ‹€.
카카였맡과 swiperλ₯Ό μ—°κ²°ν•΄μ„œ, ν•˜λ‹¨μ˜ μŠ¬λΌμ΄λ“œκ°€ 움직이면 μ„Όν„° μ’Œν‘œλ„ λ°”λ€Œλ„λ‘ λ‘œμ§μ„ μ§°λŠ”λ° 결과보기 μƒνƒœλ₯Ό μΆ”κ°€ν•˜κ³  λ‚˜λ‹ˆ μŠ¬λΌμ΄λ“œ 정렬에 λ¬Έμ œκ°€ 생겼닀. μ΄λ―Έμ§€μ—μ„œλŠ” 보이지 μ•Šμ§€λ§Œ μŠ¬λΌμ΄λ“œλ₯Ό λ„˜κΈΈλ•Œλ§ˆλ‹€ μŠ¬λΌμ΄λ“œκ°€ λ³΅μ œλ˜μ–΄ μ€‘λ³΅μœΌλ‘œ 보이고 μžˆλ‹€.
μ’€ μ΄μƒν•œκ±΄ λͺ¨λ°”μΌμ—μ„œλŠ” μ •μƒμ μœΌλ‘œ 보이고 μžˆλ‹€λŠ” 것.
μš°μ„ , 결과보기 μƒνƒœλΆ€ν„° ν•΄κ²°ν•˜κ³  이 뢀뢄도 μƒˆλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ 봐야 ν•  것 κ°™λ‹€.

(4) react μ„±λŠ₯ μ΅œμ ν™”
항상 λ°”λ‘œλ°”λ‘œ ν•΄μ•Όν•˜λŠ” κ±Έ μ•Œμ§€λ§Œ μ–΄μ©Œλ‹€λ³΄λ‹ˆ 항상 ν›„μˆœμœ„λ‘œ λ°€λ €λ‚˜ μžˆλ‹€.
μ΄λ²ˆμ—λŠ” μœ„μ˜ 1-3 문제λ₯Ό ν•΄κ²°ν•œ λ‹€μŒμ— μ„±λŠ₯ μ΅œμ ν™”κΉŒμ§€ ν•΄ λ³Ό 생각이닀.

(5) νƒ€μž… 정리
μ‹œκ°„μ΄ μ΄‰λ°•ν•΄μ§ˆ 수둝 νƒ€μž…μ„ μ§€μ €λΆ„ν•˜κ²Œ μž‘μ„±ν•œ 뢀뢄이 μžˆλ‹€. μ•„λ§ˆ 이뢀뢄 λ•Œλ¬Έμ— 버그가 λ°œμƒν•œ 것도 μžˆλŠ” 것 κ°™μ•„ 같이 μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.


λ¦¬νŒ©ν† λ§ 이전 κ°„λ‹¨ν•œ ν›„κΈ°

PMλΆ€ν„° λ””μžμ΄λ„ˆ, BEκΉŒμ§€ 총 16λͺ…μ΄μ„œ μ§„ν–‰ν•œ 2λ‹¬μ˜ ν”„λ‘œμ νŠΈμ˜€λ‹€.
λΆ€νŠΈμΊ ν”„μ—μ„œ μ•ˆλ‚΄ν•œ λŒ€λž΅μ μΈ 기간은 12월에 기획과 λ””μžμΈ, 12μ›” 26일뢀터 κ°œλ°œμ΄μ—ˆμ§€λ§Œ 개발 기간은 ν•œ μ£Ό κ°€λŸ‰ 밀리고 마감 직전 μ£ΌκΉŒμ§€λ„ 기획과 μžμž˜ν•œ λ””μžμΈμ΄ λ°”λ€Œμ—ˆμœΌλ©°, API μŠ€ν‚€λ§ˆλ„ 마감 직전 주에 ν™•μ •λ˜μ–΄μ„œ 마감 μ „λ‚ κΉŒμ§€ κ³„μ†ν•΄μ„œ 버그 μˆ˜μ •μ„ ν–ˆμ—ˆλ‹€.

사싀 같은 κΈ°λŠ₯을 λ‹΄λ‹Ήν•œ BEλΆ„μ˜ μž‘μ—…μ΄ 점점 λŠ¦μ–΄ μ‘Œμ—ˆλŠ”λ°, μ•Œκ³ λ³΄λ‹ˆ ν•΄λ‹Ή νŒ€μ›μ΄ 취업에 μ„±κ³΅ν•΄μ„œ μž‘μ—… μ‹œκ°„μ΄ λΆ€μ‘±ν–ˆλ˜ κ±°μ˜€λ‹€. 이 λ‚΄μš©μ„ λͺ¨λ‘κ°€ 마감 3,4일 전에 μ•Œκ²Œ λ˜μ—ˆκ³ , 그둜 인해 λ‹€λ₯Έ BE 뢄듀이 남은 μž‘μ—…μ„ λ‚˜λˆ  μ§„ν–‰ν•˜κ²Œ λ˜μ–΄ μ‹œκ°„μ΄ 더 μ΄‰λ°•ν–ˆλ‹€.

개발 기간이 점차 밀리고 ν”„λ‘ νŠΈμ—”λ“œκ°€ μ€‘κ°„μ—μ„œ μ •μ‹  없을 κ±°λž€ 건 μ–΄λŠμ •λ„ μ˜ˆμƒν•˜κΈ΄ ν–ˆμ§€λ§Œ 막상 κ·Έ 상황에 λ†“μ΄κ²Œ λ˜λ‹ˆ μ‘°κΈ‰ν•΄μ§€λŠ” 건 μ–΄μ©” μˆ˜κ°€ μ—†μ—ˆλ˜ 것 κ°™λ‹€.
넉넉할거라 μƒκ°ν–ˆλ˜ 기간은 λ‹€ 같이 밀을 μƒˆλ©° μž‘μ—…μ„ 해도 턱없이 많이 λΆ€μ‘±ν–ˆκ³ , 버그듀이 남겨진 μ±„λ‘œ 마무리 된 게 아쉬웠닀.
λͺ¨λ‘κ°€ μ‰¬λŠ” μ‚¬λžŒ 없이 λ‹€ 같이 μž λ„ μ•ˆμžκ³  λ…Έλ ₯ν–ˆλ˜ 터라 더 μ•„μ‰¬μ› λ˜ 것 κ°™λ‹€.
ν˜„μ—…μ—μ„œλ„ 기획, λ””μžμΈ λ“± κ³„μ†ν•΄μ„œ λ³€κ²½λœλ‹€λŠ” μ΄μ•ΌκΈ°λŠ” 많이 λ“€μ—ˆλŠ”λ° λ‹€λ“€ μ–΄λ–»κ²Œ 잘 ν•΄λ‚˜κ°€μ‹œλŠ” 건지 정말 κΆκΈˆν•΄μ‘Œλ‹€.

그리고 이전에도 λŠκΌˆμ§€λ§Œ 이번 ν”„λ‘œμ νŠΈλ₯Ό 톡해 λ‹€μ–‘ν•œ νŒ€κ³Ό ν˜‘μ—…ν•˜λ©΄μ„œ 더 ν™•μ‹€νžˆ λŠλ‚€κ²Œ μžˆλ‹€. μ½”λ“œλ₯Ό μž‘μ„± ν•˜λ‹€ λ§‰ν˜”μ„ λ•Œ μ΅œλŒ€ν•œ 짧은 μ‹œκ°„ μ•ˆμ— μ²˜λ¦¬ν•˜λŠ” 게 κ°œλ°œμ— μžˆμ–΄μ„œ κ°€μž₯ μ€‘μš”ν•˜λ‹€λŠ” 것.
λ¦¬νŒ©ν† λ§μ„ ν•˜λ©΄μ„œ λ‹€μŒμ—λŠ” μ‹œκ°„ λΆ„λ°°λ₯Ό μ–΄λ–»κ²Œ 할지 같이 κ³ λ―Όν•΄ 봐야겠닀.

+
λ‚œ recoilμ΄λž‘ react-query(tanstack-query)κ°€ λ„ˆλ¬΄ 쒋은 것 κ°™λ‹€. μ‚¬μš© 방법도 κ°„λ‹¨ν•˜κ³  μž‘μ„±λœ μ½”λ“œλ„ κΉ”λ”ν–ˆλ‹€.
λ‹€λ§Œ ν”„λ‘œμ νŠΈ 3개λ₯Ό 두 μ‘°ν•©μœΌλ‘œ ν–ˆλ”λ‹ˆ react만 μ“°λŠ” κ±Έ μžŠμ€ 것 κ°™μ•„ 걱정이닀.
λ¦¬νŒ©ν† λ§μ΄ λλ‚˜λ©΄ react만 썼을 λ•ŒλŠ” μ–΄λ–»κ²Œ μž‘μ„±μ΄ λ˜λŠ”μ§€ 거꾸둜 λ°”κΏ”λ³Ό μ˜ˆμ •μ΄λ‹€.

0개의 λŒ“κΈ€