Skip to content

🎩 Form μž…λ ₯을 ν†΅ν•œ κΈ°λ³Έ CRUD κ΅¬ν˜„ νŽ˜μ΄μ§€ (react-hook-form)

Notifications You must be signed in to change notification settings

seolleung2/XMS-form

Repository files navigation

XMS Project

🌺 ν”„λ‘œμ νŠΈ μ„€λͺ…

WMS, TMS, OMS λ“± λ‹€μ–‘ν•œ Management System 듀이 μžˆμŠ΅λ‹ˆλ‹€. νšŒμ‚¬μ—μ„œ WMS ν”„λ‘œμ νŠΈμ˜ ν”„λ‘ νŠΈμ—”λ“œ 뢀뢄을 맑아 κ°œλ°œμ„ ν•˜λ©΄μ„œ λͺ‡ 가지 λŠλ‚€ 사항이 μžˆλŠ”λ°μš”. 그것은 XMS 둜 λŒ€ν‘œν•˜λŠ” ν”„λ‘œκ·Έλž¨λ“€μ˜ 곡톡점은 μž…λ ₯κ°’, λ³΅μž‘ν•œ Form 듀을 μ²˜λ¦¬ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ—¬λŸ¬ μž…λ ₯κ°’ 듀이 μ‘΄μž¬ν•˜λŠ” Form 을 κ΅¬ν˜„ν•΄ 보고 ν™”λ©΄μ—μ„œ 쑰회, 등둝, μ‚­μ œ λ₯Ό κ΅¬ν˜„ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

πŸ‘‘ 간단 μ†Œκ°œ

ν™”λ¬Ό κΈ°μ‚¬μ˜ 배솑 μ£Όλ¬Έ 정보λ₯Ό λ“±λ‘ν•˜κ³  ν…Œμ΄λΈ”μ—μ„œ μ£Όλ¬Έ ν•­λͺ©μ„ 쑰회 및 μ‚­μ œλ₯Ό ν•œ ν™”λ©΄μ—μ„œ ν•  수 μžˆλŠ” XMS μž…λ‹ˆλ‹€.

μž…λ ₯ν•  수 μžˆλŠ” κΈ°λ³Έ ν•­λͺ© (이름 ~ μΆœκ·Όμ§€) 에 μΆ”κ°€λ‘œ 상차지 정보λ₯Ό λ“±λ‘ν•˜λ©°, 상차지 μ •λ³΄λŠ” μ΅œλŒ€ 3κ°œκΉŒμ§€ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

상차지 μ •λ³΄λŠ” μ΅œμ†Œ ν•œ κ°œκ°€ λ“€μ–΄κ°€μ•Ό ν•˜λ©°, κΈ°λ³Έ ν•­λͺ©μ˜ λ¬ΌλŸ‰μ„ μ œμ™Έν•œ λ‚˜λ¨Έμ§€ ν•­λͺ©λ“€μ€ ν•„μˆ˜ ν•­λͺ©μž…λ‹ˆλ‹€.

ν’ˆλͺ© ν•­λͺ©μ—μ„œ 'μ§μ ‘μž…λ ₯' 을 선택 μ‹œ 였λ₯Έμͺ½ μž…λ ₯값은 ν•„μˆ˜ ν•­λͺ©μž…λ‹ˆλ‹€. λ¬ΌλŸ‰ ν•­λͺ©μ—μ„œ ν•­λͺ©μ„ 선택 μ‹œ 였λ₯Έμͺ½ μž…λ ₯값은 ν•„μˆ˜ ν•­λͺ©μž…λ‹ˆλ‹€.

그리고 ν…Œμ΄λΈ”μ˜ page, νŽ˜μ΄μ§€μ˜ size 선택에 λ§žλŠ” 쑰회 (GET) 데이터λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€.

μ‚¬μš©λœ 기술 μŠ€νƒ 및 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • nextjs : v13.2.4
  • react : v18.2.0
  • typescript : v5.0.2
  • react-hook-form : v7.43.8
  • @tanstack/react-query : v4.28.0
  • msw : v1.1.0
  • emotion/react, emotion/styled : v11.10.6
  • tailwindcss : v3.2.7
  • antd : v5.3.2
  • node js: v16.18.0
  • package manager: yarn v1.22.19

STEP 1. git clone 을 λ°›μŠ΅λ‹ˆλ‹€.

STEP 2. ν˜„μž¬ μœ„μΉ˜ν•΄ μžˆλŠ” branch λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

κΈ°λ³Έ default branch λ₯Ό develop 으둜 μ„€μ •ν•΄ λ†“μ•˜κ³  μž‘μ—… μ‹œ feature/task1 κ³Ό 같은 브랜치λ₯Ό λ”°μ„œ PR 을 톡해 develop λΈŒλžœμΉ˜μ— merge ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή develop μ—μ„œ main 브랜치둜 ν–₯ν•˜λŠ” Pull Requestλ₯Ό 생성 ν•˜μ˜€κ³  Github μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ μœ„μΉ˜λ˜μ–΄ μžˆλŠ” branch κ°€ develop branch 인지 확인해 μ£Όμ‹œκ³ , 그렇지 μ•Šλ‹€λ©΄ develop 브랜치둜 이동해 μ£Όμ„Έμš”.

STEP 3. package μ„€μΉ˜ 및 μ‹€ν–‰.

  • yarn install 을 톡해 νŒ¨ν‚€μ§€ dependency 등을 μΈμŠ€ν†¨ ν•©λ‹ˆλ‹€.
  • 이후 yarn start μ»€λ§¨λ“œλ‘œ ν”„λ‘ νŠΈμ—”λ“œ 개발 μ„œλ²„λ₯Ό μž‘λ™ν•©λ‹ˆλ‹€.

πŸŽ‡Β κ³Όμ œ ν”„λ‘œμ νŠΈ UI

1. 전체 ν™”λ©΄

https://user-images.githubusercontent.com/69143207/227844996-38122fc2-134e-4faa-b0eb-e71cb7e87d37.png

2. νƒœλΈ”λ¦Ώ ν™”λ©΄

https://user-images.githubusercontent.com/69143207/227846080-1b2f2219-99e5-4bbe-9851-00dc9096ebc5.png

3. λͺ¨λ°”일 ν™”λ©΄

https://user-images.githubusercontent.com/69143207/227846255-91e4770e-0128-48c1-988f-d689732eaca3.png

πŸš—Β μ„ΈλΆ€ κ΅¬ν˜„ 사항

1. ν’ˆλͺ©, λ¬ΌλŸ‰μ˜ Selectbox λ₯Ό 선택 및 세뢀사항 κ΄€λ ¨

μž…λ ₯ νΌμ—μ„œ ν’ˆλͺ©, λ¬ΌλŸ‰μ„ μ„ νƒν•˜κ³  세뢀사항을 Input 에 μž…λ ₯ ν•œ λ’€ λ‹€μ‹œ 선택을 ν•΄μ œ ν•˜λ©΄ ν•΄λ‹Ή μž…λ ₯값이 없어지도둝 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2. λ‚ μ§œ 선택은 Ant-Design 의 DatePicker λ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ μ‚¬μš©

λ‚ μ§œ 선택은 Ant Design 의 DatePicker μ»΄ν¬λ„ŒνŠΈλ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄μ™Έμ˜ input, select, button 은 자체 μ»΄ν¬λ„ŒνŠΈλ‘œ κ°œλ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

3. React.Portal 둜 Modal μ»΄ν¬λ„ŒνŠΈ μž‘μ„± 및 적용

λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈλŠ” 직접 자체 μ»΄ν¬λ„ŒνŠΈλ‘œ κ°œλ°œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

https://user-images.githubusercontent.com/69143207/227846515-d16dd1d0-6dc9-4747-bcb4-f75a264f62e0.png

https://user-images.githubusercontent.com/69143207/227846613-68041715-2c21-4feb-a2c9-71c16aabce86.png

4. 데이터 캐싱, νŽ˜μΉ­μ„ μœ„ν•΄ React-Query 적용 및 λ³„λ„μ˜ Hook 으둜 μ½”λ“œ μž‘μ„±

ν•œλ²ˆ μš”μ²­ν•œ API 의 데이터 (pagination 의 νŽ˜μ΄μ§€ 선택 λ“±) λŠ” μΊμ‹±ν•˜μ—¬ API λ₯Ό 재 호좜 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그리고 λ³„λ„μ˜ ν›…μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό μ΅œμ†Œν™” ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

export const useAddOrderMutation = (
  successCallback: (result: {
    success: boolean;
    message: string;
    data: OrderFields;
  }) => void
) => {
  const client = useQueryClient();
  return useMutation((body: ReqBody) => api.addOrder(body), {
    onSuccess: (result) => {
      client
        .invalidateQueries(['orderlist'])
        .then(() => successCallback(result));
    },
  });
};

5. 상차지 정보 ν•­λͺ© 생성은 react-hook-form 의 useFieldArray μ‚¬μš©

μž…λ ₯ 폼을 효과적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ react-hook-form 을 μ‚¬μš©ν•˜μ˜€κ³  useFieldArray λ₯Ό 톡해 상차지 정보 μΆ”κ°€ 및 μ‚­μ œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

6. 폼 제좜 (μΆ”κ°€), μ‚­μ œ μš”μ²­μ„ μœ„ν•œ λ²„νŠΌμ— 더블 클릭 방지 적용

μΆ”κ°€, μ‚­μ œ λ²„νŠΌμ„ 클릭 μ‹œ 쑰건의 μƒνƒœ (boolean) κ°€ λ°”λ€œμ— 따라 λ²„νŠΌμ΄ disabled 처리 λ˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

7. Table μ»΄ν¬λ„ŒνŠΈ - Ant Design 의 Table μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©

ν…Œμ΄λΈ” 높이λ₯Ό μ§€μ •ν•˜μ—¬ 슀크둀이 생기며 헀더가 κ³ μ •λ˜μ–΄ 보이게 λ©λ‹ˆλ‹€. (ν˜Ήμ‹œ μΆ”κ°€ μš”μ²­ ν›„ 데이터가 잘 μ•ˆλ³΄μΌ λ•Œ μŠ€ν¬λ‘€μ„ ν•œλ²ˆ μœ„λ‘œ 올렀 μ£Όμ‹œκΈΈ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€)

πŸ‘¨πŸ»β€πŸ’»Β λ§ˆμΉ˜λ©΄μ„œ

WMS κ°œλ°œμ— μ°Έμ—¬ν•΄ λ³΄λ©΄μ„œ λ‹€μ–‘ν•œ κ²½ν—˜μ„ ν•΄ λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ μ΄λŸ¬ν•œ μž‘μ—… 내역을 포트폴리였의 gif ν™”λ©΄ λ“±μœΌλ‘œλ§Œ λ³΄μ—¬μ§€λŠ” λ°μ„œ μ‹€μ œ Form 을 μ½”λ“œλ‘œ μ–΄λ–»κ²Œ λ‹€λ£¨λŠ”μ§€ μ•Œ 수 μ—†μ–΄ μ•„μ‰¬μš΄ 점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ 이번 κΈ°νšŒμ— Form 을 μ–΄λ–»κ²Œ λ‹€λ£¨λŠ”μ§€, λ°±μ—”λ“œμ—μ„œμ˜ 데이터가 없을 λ•Œ msw λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€, λ¦¬μ•‘νŠΈ μΏΌλ¦¬λŠ” μ–΄λ–»κ²Œ μ μš©ν•΄ λ³΄μ•˜λŠ”μ§€μ— λŒ€ν•΄ λ―Έλ‹ˆ ν”„λ‘œμ νŠΈλ‘œ λ§Œλ“€μ–΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λΆ€μ‘±ν•œ μ μ΄λ‚˜ 이해가 잘 λ˜μ§€ μ•ŠλŠ” 뢀뢄에 λŒ€ν•΄μ„œλŠ” 이슈 생성 ν˜Ήμ€ seolleung22@gmail.com 으둜 메일 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

About

🎩 Form μž…λ ₯을 ν†΅ν•œ κΈ°λ³Έ CRUD κ΅¬ν˜„ νŽ˜μ΄μ§€ (react-hook-form)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published