- μ¬μ©μ±κ³Ό ν¨μ¨μ μ€μ¬μΌλ‘ λμμΈκ³Ό λ°μ΄ν° μμ μ± κ°ν
- μΉκ³Ό μ± λͺ¨λ μ΅μ νλ λμμΈμ μ 곡
- μ¬μ©μ μΉνμ μΈ κ²½νκ³Ό μ§κ΄μ μΈν°νμ΄μ€λ₯Ό ν΅ν λΉ λ₯Έ μ μ λͺ©ν
- κΈ°μ‘΄ κΈ°λ₯μμ μ‘°κΈλ μ λ°μ΄νΈλ κΈ°λ₯ ꡬν
μ΄μ λ μλ²μμ λ νΈλ¦¬ν μλΉμ€λ₯Ό λ§λ보μΈμ!!π€
κ°λ° κΈ°κ° : 2023λ 9μ 25μΌ μμμΌ ~
Front-end κΈ°μ μ€ν |
|
Front-end λ°°ν¬ |
|
λ°°ν¬ | π JavaJober[μλ°μλ²] |
λ Έμ | π λ Έμ λ°λ‘κ°κΈ° |
μν€ν
μ³(Architecture) |
---|
![]() |
κ°μ²΄-κ΄κ³ λͺ¨λΈ (ERD) |
![]() |
π API λͺ μΈμ π
API λͺ
μΈμ |
---|
![]() |
리μ‘νΈμμλ stateμ λΆλ³μ±μ μ§μΌμΌ ν©λλ€.
import { useState } from 'react';
export default function App() {
const [cat, setCat] = useState({
name: 'howoo',
age: 6,
});
const handleChangeCatName = () => {
cat.name = 'mango';
setCat(cat);
};
console.log(cat); //{ name: 'mango', age: 6 }
return (
<div style={{ textAlign: 'center' }}>
<div>κ³ μμ΄ μ΄λ¦ : {cat.name}</div>
<button onClick={handleChangeCatName}>μ΄λ¦λ³κ²½</button>
</div>
);
}
λ²νΌμ λλ₯΄λ©΄ console.log(cat)μ ν΅ν΄ μ€μ¬ cat.nameμ λ³κ²½μ΄ λκ²μ νμΈν μ μμ§λ§ cat
μ μ°Έμ‘°κ°μ κ·Έλλ‘μ΄κΈ° λλ¬Έμ μ¬λλλ§μ΄ λ°μνμ§ μμ΅λλ€.
![image](https://private-user-images.githubusercontent.com/87072568/272882723-69c1b757-7c91-46c7-8e94-41ecbcaa42f6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDUyNTcsIm5iZiI6MTczODk0NDk1NywicGF0aCI6Ii84NzA3MjU2OC8yNzI4ODI3MjMtNjljMWI3NTctN2M5MS00NmM3LThlOTQtNDFlY2JjYWE0MmY2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2MTU1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ4MjdlZmQyNTA3YmY0NWE0NmRhZjEyNmIyOGVlYWY3MjM2ODlmN2I3OWNiMzcyODY0NWE5ODM1MmFiMzRlYjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.U45oW_QospV9ADWyDwQT9GykTbQDNAKXu2igEJ0x9R0)
λΆλ³μ±μ μ§μΌμΌνλ€λ μλ―Έλ μμ λΉκ΅λ₯Ό νλ 리μ‘νΈμ νΉμ±μ μ°Έμ‘°ν λ°μ΄ν°μ μλ³Έμ λ³νμ§ μκ²
μ μ§ν΄μΌνκ³ μ¬λλλ§μ μν΄ μλ‘μ΄ μ°Έμ‘°κ°μ setν΄μΌ ν¨μ μλ―Έ ν©λλ€.
λ³Έ νλ‘μ νΈμμλ wall(곡μ©νμ΄μ§μμ 보μ¬μ§λ λͺ¨λ μ 보) κ°μ²΄κ° μμ΅λλ€.
const wall = {
category: 'personal',
memberId: 1,
spaceId: 1,
shareURL: 'howooking',
wallInfoBlock: {
wallInfoBlockId: 9,
wallInfoTitle: 'μ΄νΈμ°',
wallInfoDescription: 'μλ
νμΈμ. κ³ μμ΄ κ°λ°μ μ΄νΈμ°μ
λλ€.',
wallInfoImgURL: 'https://avatars.githubusercontent.com/u/87072568?v=4',
backgroundImgURL:
'https://images.unsplash.com/photo-1696251143046-2d32fb985b59?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=2670&q=80',
},
blocks: [
{
blockUUID: '1108fff1-0106-4340-b505-280e15626ecc',
blockType: 'listBlock',
subData: [
{
listBlockId: 33,
listLabel: 'νλ ₯/κ²½λ ₯',
listTitle: 'νλ ₯',
listDescription: 'μμΈλνκ΅',
isLink: false,
},
],
},
... μλ΅
-> 곡μ νμ΄μ§μμ λ°μνλ λͺ¨λ onChange μ΄λ²€νΈλ wall λ΄λΆ κ°λ€μ μ€μκ°μ λ³κ²½μμΌμΌ ν©λλ€.
μλ₯Ό λ€μ΄ wall.wallInfoBlock.wallInfoTitle
κ°μ μλ‘μ΄ κ°μΌλ‘ λ³κ²½νκΈ° μν΄μλ λ€μκ³Ό κ°μ΄ ν΄μΌ ν©λλ€.
setWall({
...wall,
wallInfoBlock: { ...wall.wallInfoBlock, wallInfoTitle: 'μλ‘μ΄ κ°' },
});
μμ κ°μ΄ wall κ°μ²΄μ κΉμ΄κ° μμ κ²½μ°λ μ΄λ ΅μ§ μκ² λΆλ³μ±μ μ§ν¬ μ μμΌλ κΉμ΄κ° κΉμ΄μ§μ λ°λΌ λΆλ³μ±μ μ§ν€λ κ²μ λΆκ°λ₯μ κ°κΉμ μ§λλ€.
-> μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬κ° 'IMMER' μ
λλ€.
λ¬Έμ μ μ λν ν΄κ²° λ°©λ²μ μ°Ύκ³ ν΄λΉ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°Ύμ μ μ©νκΈ°κΉμ§ λ§μ μκ°μ΄ κ±Έλ Έμ΅λλ€.
μ΄μ μλ react μ μ₯μ λ§ κ²½ννλ λΆλΆκ³Όλ λ€λ₯΄κ², ν΄λΉ λ¬Έμ λ₯Ό κ²ͺμΌλ©΄μ react μ λ¨μ λ νμ°νκ² λλμ μκ² λ κ²½νμ΄μμ΅λλ€.
μ¬μ©νλ κΈ°μ μ€νμ λν΄ μ₯,λ¨μ μ λͺ¨λ κΉ¨λ«μ νμ ν΄κ²° λ°©μμ μ°Ύλ λμ€ reactμ λ¨μ μ μ΅μν ν μ μκ³ , λ λμ μ½λ κ°μ μ μν λΌμ΄λΈλ¬λ¦¬ `IMMER'μ μ ννκ² λμμ΅λλ€.
IMMER
λ₯Ό μ¬μ©νλ©΄ κΈ°μ‘΄μ κ°μ²΄μ κ°λ₯Ό λ€λ£¨λ λ¬Έλ²μ μ¬μ©νμ¬ stateλ₯Ό μ
λ°μ΄νΈ μμΌμ€ μ μμ΅λλ€.
import { produce } from 'immer';
setWall(
produce(wall, (draft) => {
draft.wallInfoBlock.wallInfoTitle = 'μλ‘μ΄ κ°';
}),
);
![]() |
![]() |
![]() |
μ΄μ μ°(νμ₯) (Front-end) |
κΉνμ (Front-end) |
λ°©λ―Έμ (Front-end) |
![]() |
![]() |
![]() |
![]() |
![]() |
μ΄λ―Έμ°(νμ₯) (Back-end) |
μ μμ (Back-end) |
μμν (Back-end) |
κΉν¬ν (Back-end) |
μ€νμ§ (Back-end) |