2023-12-04 ~ 2024-01-29
νμ΄λνλ‘μ νΈ : μ¬νμΌμ μ± TRIPVOTE
Test ID : test@test.com
Test PW : 1q2w3e4r!Q
κΈ°λ₯ μμ½
(1) ν¬ννκΈ° - ν¬ν CRUD, ν¬ννκΈ°, ν¬ν μμ μ λ ¬
(2) μ¬νμ§ ν보 - μ¬νμ§ ν보 μΆκ°&μμ , λ©λͺ¨ λ¨κΈ°κΈ°, λ©λͺ¨ μμ μ μ₯
(3) μ¬νμ§ ν보 μ§λ - μΉ΄μΉ΄μ€λ§΅μΌλ‘ ν보 보기μΆκ° νμ΄μ§
(1)βλ©λͺ¨ μμ± νμ΄μ§βμ μ€μκ° μ μ₯ κΈ°λ₯
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};
};
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) μ¬ μ¬μ© κ°λ₯ν κ³΅μ© μ»΄ν¬λνΈ
(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λ§ μΌμ λλ μ΄λ»κ² μμ±μ΄ λλμ§ κ±°κΎΈλ‘ λ°κΏλ³Ό μμ μ΄λ€.