Skip to content

Latest commit

Β 

History

History
310 lines (263 loc) Β· 14.5 KB

README.md

File metadata and controls

310 lines (263 loc) Β· 14.5 KB


Jober [μžλ²„]

πŸ“Œ μ›Ή μ„œλΉ„μŠ€ μ†Œκ°œ

μžλ²„μ˜ 리뉴얼 및 κ°œμ„ λœ μ„œλΉ„μŠ€

  • μ‚¬μš©μ„±κ³Ό νš¨μœ¨μ„ μ€‘μ‹¬μœΌλ‘œ λ””μžμΈκ³Ό 데이터 μ•ˆμ •μ„± κ°•ν™”
  • μ›Ήκ³Ό μ•± λͺ¨λ‘ μ΅œμ ν™”λœ λ””μžμΈμ„ 제곡
  • μ‚¬μš©μž μΉœν™”μ μΈ κ²½ν—˜κ³Ό 직관적 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ λΉ λ₯Έ 적응 λͺ©ν‘œ
  • κΈ°μ‘΄ κΈ°λŠ₯μ—μ„œ μ‘°κΈˆλ” μ—…λ°μ΄νŠΈλœ κΈ°λŠ₯ κ΅¬ν˜„

μ΄μ œλŠ” μžλ²„μ—μ„œ 더 νŽΈλ¦¬ν•œ μ„œλΉ„μŠ€λ₯Ό λ§Œλ‚˜λ³΄μ„Έμš”!!πŸ€—

개발 κΈ°κ°„ : 2023λ…„ 9μ›” 25일 μ›”μš”μΌ ~



πŸ›  기술 μŠ€νƒ

Front-end 기술 μŠ€νƒ
Front-end 배포
배포 πŸ”— JavaJober[μžλ°”μžλ²„]
λ…Έμ…˜ πŸ‘‰ λ…Έμ…˜ λ°”λ‘œκ°€κΈ°


πŸ’‘ μ£Όμš” κΈ°λŠ₯

μ›Ή ν™”λ©΄ κΈ°λŠ₯
ν™ˆ
- μžλ²„μ—μ„œ 둜그인 ν›„ λ‚˜μ˜€λŠ” ν™ˆνŽ˜μ΄μ§€ APIμž…λ‹ˆλ‹€.
- ν™ˆμ—μ„œ κ°„λ‹¨ν•œ 개인 정보와 슀페이슀, λ¬Έμ„œ 등을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
μΉ΄ν…Œκ³ λ¦¬
- μΉ΄ν…Œκ³ λ¦¬μ— λ§žμΆ°μ„œ 곡유 νŽ˜μ΄μ§€ ν˜•μ‹μ„ 각각 μ œκ³΅ν•©λ‹ˆλ‹€.
블둝 μΆ”κ°€
- 곡유 νŽ˜μ΄μ§€μ—μ„œ 블둝을 μΆ”κ°€,μ‚­μ œ 및 μž‘μ„±ν•˜μ—¬ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- 블둝 μ’…λ₯˜μ—λŠ” 파일 블둝, λͺ©λ‘ 블둝, 자유 블둝, SNS 블둝이 μžˆμŠ΅λ‹ˆλ‹€.
ν…œν”Œλ¦Ώ
- 'ν…œν”Œλ¦Ώ μΆ”κ°€ν•˜κΈ°' νƒ­ 클릭 μ‹œ μ„ νƒν•œ μΉ΄ν…Œκ³ λ¦¬ 별 μΆ”μ²œ ν…œν”Œλ¦Ώμ΄ λ‚˜μ˜΅λ‹ˆλ‹€.
- 'ν…œν”Œλ¦Ώ μ„ νƒν•˜κΈ°' λͺ¨λ‹¬μ—μ„œ 검색 λ°” 클릭 μ‹œ λͺ¨λ“  ν…œν”Œλ¦Ώ 데이터가 μΉ΄ν…Œκ³ λ¦¬ λ³„λ‘œ λΆ„λ₯˜λ˜μ–΄ λ‚˜μ˜΅λ‹ˆλ‹€.
- 'ν…œν”Œλ¦Ώ μ„ νƒν•˜κΈ°' λͺ¨λ‹¬μ—μ„œ ν‚€μ›Œλ“œ 검색 μ‹œ ν‚€μ›Œλ“œμ— λ§žλŠ” ν…œν”Œλ¦Ώμ΄ λ‚˜μ˜΅λ‹ˆλ‹€.
μŠ€νƒ€μΌ μ„ΈνŒ…
- ν…œν”Œλ¦Ώμ— μ‚¬μš©λ˜λŠ” μŠ€νƒ€μΌμ„ μ μš©ν•  수 μžˆλŠ” νƒ­μž…λ‹ˆλ‹€.
- λ°°κ²½, 블둝 μŠ€νƒ€μΌ, ν…Œλ§ˆλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ“œλž˜κ·Έμ•€λ“œλ‘­
- 블둝 λ³„λ‘œ λ“œλž˜κ·Έμ•€λ“œλ‘­ν•˜μ—¬ μˆœμ„œ 이동이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
μž„μ‹œ μ €μž₯
- μž„μ‹œμ €μž₯ 내역이 μžˆμ„ λ•Œ, μ €μž₯ 내역을 μ΄μ–΄μ„œ μž‘μ„±ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ €μž₯ + κ³΅μœ νŽ˜μ΄μ§€ μ™„μ„±
- μ»€μŠ€ν…€ν•œ 블둝과 μŠ€νƒ€μΌμ„ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- μ™„μ„±λœ κ³΅μœ νŽ˜μ΄μ§€λŠ” 'μ™ΈλΆ€ 곡개' 탭을 μ‚¬μš©ν•˜μ—¬ 전체 곡개 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
κ³΅μœ νŽ˜μ΄μ§€ url
- κ³΅μœ νŽ˜μ΄μ§€ νŽΈμ§‘ν•˜κΈ° μ‹œ url도 μ»€μŠ€ν…€μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
- url둜 κ³΅μœ νŽ˜μ΄μ§€μ— 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

πŸ“‚ ν”„λ‘œμ νŠΈ ꡬ성도

아킀텍쳐(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

λΆˆλ³€μ„±μ„ μ§€μΌœμ•Όν•œλ‹€λŠ” μ˜λ―ΈλŠ” 얕은 비ꡐλ₯Ό ν•˜λŠ” λ¦¬μ•‘νŠΈμ˜ νŠΉμ„±μƒ μ°Έμ‘°ν˜• λ°μ΄ν„°μ˜ 원본은 λ³€ν•˜μ§€ μ•Šκ²Œ μœ μ§€ν•΄μ•Όν•˜κ³  μž¬λžœλ”λ§μ„ μœ„ν•΄ μƒˆλ‘œμš΄ 참쑰값을 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λ₯Ό μ—…λ°μ΄νŠΈ μ‹œμΌœμ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… IMMER 적용 방법

import { produce } from 'immer';

setWall(
  produce(wall, (draft) => {
    draft.wallInfoBlock.wallInfoTitle = 'μƒˆλ‘œμš΄ κ°’';
  }),
);

πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦ 개발 νŒ€ μ†Œκ°œ

πŸ’œ Front-end
μ΄μ •μš° ν”„λ‘œν•„ κΉ€ν•˜μ€ ν”„λ‘œν•„ λ°©λ―Έμ„  ν”„λ‘œν•„
μ΄μ •μš°(νŒ€μž₯)
(Front-end)
κΉ€ν•˜μ€
(Front-end)
λ°©λ―Έμ„ 
(Front-end)
πŸ’œ Back-end
이미연 ν”„λ‘œν•„ μ„ μ˜ˆμ€ ν”„λ‘œν•„ μ–‘μˆ˜ν˜„ ν”„λ‘œν•„ κΉ€ν¬ν˜„ ν”„λ‘œν•„ μœ€ν˜„μ§„ ν”„λ‘œν•„
이미연(νŒ€μž₯)
(Back-end)
μ„ μ˜ˆμ€
(Back-end)
μ–‘μˆ˜ν˜„
(Back-end)
κΉ€ν¬ν˜„
(Back-end)
μœ€ν˜„μ§„
(Back-end)