Skip to content

joohaem/DropCareREADME

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 

Repository files navigation

DropCare w. (μ£Ό)λ‹₯ν„°μŠ€νŒΉ

πŸ”— μ‚¬μš©μž 메뉴얼 :: WIKI λ°”λ‘œ κ°€κΈ°

Care the Uncared Service

DropCareλŠ” ν™˜μžμ˜ IV(Intra Venous) μ£Όμž… μƒνƒœ λ˜λŠ” μ†Œλ³€ 정보에 λŒ€ν•œ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ 및 λͺ¨λ‹ˆν„°λ§ ν•˜λŠ” IoT μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

DropCareλŠ” 병동에 μžˆλŠ” 의료 κ°λ…μ˜ 사각 μ§€λŒ€μ— μžˆλŠ” μ£Όμš” 데이터λ₯Ό μˆ˜μ§‘ν•˜μ—¬ ν™˜μžμ˜ 이상 μ§ˆλ³‘μ— λŒ€ν•œ 예츑 및 κ²€μΆœκΈ° 역할을 ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ κ°„ν˜Έμ‚¬μ˜ 업무 뢀담을 크게 쀄이고 μ˜μ‚¬κ°€ λΉ λ₯΄κ³  μ •ν™•ν•œ 결정을 내리도둝 도와 질 높은 의료λ₯Ό μ œκ³΅ν•˜λ©°, ꢁ극적으둜 ν™˜μžμ˜ 생λͺ…을 ꡬ할 수 μžˆμ„ 것이라 κΈ°λŒ€ν•©λ‹ˆλ‹€.

λ³‘μ‹€μ˜ IoT κΈ°κΈ°λŠ” ν™˜μžμ˜ IVλ°± λ˜λŠ” μ†Œλ³€λ°±μ— μ„€μΉ˜λ˜μ–΄ 정보λ₯Ό Gateway둜 μ†‘μ‹ ν•˜κ³  이 데이터λ₯Ό 웹을 ν†΅ν•˜μ—¬ μˆ˜μ‹ ν•©λ‹ˆλ‹€.

λ“œλžμΌ€μ–΄

πŸ”— [SKT IMPACTUPS] λ‹₯ν„°μŠ€νŒΉ 유투브 μ˜μƒ

μ£Όμš” 기술

  • VAC νŒ¨ν„΄ (components/.../~View.tsx)

    • Box / BoxView μ»΄ν¬λ„ŒνŠΈ λ“±, μ—¬λŸ¬ μ»΄ν¬λ„ŒνŠΈμ—μ„œ View μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆ„λ¦¬ν•˜μ—¬ UI μž‘μ—…κ³Ό state 관리, handling을 λΆ„λ¦¬ν•˜μ—¬ κ°€μ Έκ°”λ‹€
    • VAT 라이브러리λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈ μž‘μ„±μ΄ νŽΈλ¦¬ν•˜μ˜€κ³ , ν•΄λ‹Ή λ””μžμΈ νŒ¨ν„΄μœΌλ‘œ μœ μ§€ 보수 μž‘μ—…μ΄ μš©μ΄ν•˜μ˜€λ‹€
    • ν•˜μ§€λ§Œ, 이에 μ˜ν•΄ props drilling ν˜„μƒμ„ μ•ΌκΈ°ν•˜κ³  λ‹€λŸ‰μ˜ prop 이 λ„˜κΉ€μœΌλ‘œμ¨ 단점이 μ‘΄μž¬ν•œλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜λ‹€
    • 이후 μ»΄ν¬λ„ŒνŠΈμ˜ ꡬ성에 따라 μ μ ˆν•œ μ»΄ν¬λ„ŒνŠΈ 뢄리 νŒ¨ν„΄μ„ κ°€μ§€κ³  κ°œλ°œν•˜κ²Œ 될 것이라고 μƒκ°ν•œλ‹€
  • useCallback κ³Ό React.memo (components/aBox/BoxChartView.tsx)

    • λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ Stateκ°€ ν•˜λ‚˜λΌλ„ λ°”λ€Œλ©΄, μžμ‹ μ»΄ν¬λ„ŒνŠΈ λͺ¨λ‘κ°€ λ¦¬λ Œλ”λ§λ˜λŠ” 문제 (1μ΄ˆλ‹Ή λ°”λ€ŒλŠ” λ°μ΄ν„°λ‘œ μ‹¬κ°ν•œ μ„±λŠ₯ 문제λ₯Ό μ•ΌκΈ°ν•˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€)
    • prop이 λ°”λ€Œμ§€ μ•Šμ„ λ•Œ λ¦¬λ Œλ”λ§μ„ λ§‰λŠ” React.memo (μ‹€μ‹œκ°„ λ³€ν™”ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μ•„λ‹Œ κ³³, 특히 차트λ₯Ό λ³΄μ—¬μ£ΌλŠ” ChartView μ»΄ν¬λ„ŒνŠΈμ— memo μ‚¬μš©ν•˜μ˜€λ‹€)
    • memo λ₯Ό μœ„ν•œ props ν•¨μˆ˜μ—λŠ” useCallback μ‚¬μš©ν•˜μ—¬ λΉ„νš¨μœ¨μ μΈ λ¦¬λ Œλ”λ§μ΄ μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€
    • 직접적인 μ„±λŠ₯ 비ꡐλ₯Ό ν†΅ν•œ μ„±λŠ₯ κ°œμ„ μ΄ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ, μ„±λŠ₯ 기둝 도ꡬ듀을 많이 ν™œμš©ν•˜μ§€ λͺ»ν•΄ μ•„μ‰¬μš΄ 마음이 μžˆλ‹€
  • SWR vs React Query

    πŸ”— [React][비ꡐ] SWR vs React Query vs Recoil selector ?

    • 1μ΄ˆμ— ν•œ λ²ˆμ”©μ˜ μž¦μ€ 리패칭이 ν•„μš”ν•˜μ—¬, 패칭 라이브러리둜 React Queryλ₯Ό κ²°μ •ν•˜μ˜€λ‹€
    • React Query둜 정보λ₯Ό 1~2μ΄ˆλ§ˆλ‹€ λΆˆλŸ¬μ˜¨λ‹€
      • ν•΄λ‹Ήν•˜λŠ” 정보λ₯Ό λ°•μŠ€ 내에 μ•Œλ§žκ²Œ 보여주고, 정보에 ν•΄λ‹Ήν•˜λŠ” 링거 및 μ†Œλ³€ 정보가 μ‚¬μš©μžκ°€ μ„€μ •ν•œ μ œν•œ λ²”μœ„μ—μ„œ λ²—μ–΄λ‚˜κ²Œ λœλ‹€λ©΄, ν•΄λ‹Ήν•˜λŠ” μ—λŸ¬(isAlertFromRangeValue)λ₯Ό ν™•μΈν•˜κ³  κ²½κ³  μ•ŒλžŒμ„ ν‘œμ‹œ(isAlarmCycle, isAlertAnywhere)ν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€
    • React Query둜 λ„€νŠΈμ›Œν¬ λŠκΉ€ ν™•μΈν•˜κΈ° (components/aBox/hooks/useFetchJsonData.ts)
      • useQueryλŠ” axios λ₯Ό ν†΅ν•œ fetchλ₯Ό μ§„ν–‰ν•˜κ³ , κ·Έ κ²°κ³Όλ₯Ό query둜 λ°˜ν™˜ν•œλ‹€
      • 의료 λͺ¨λ‹ˆν„°λ§μ„ ν•˜λŠ” μ„œλΉ„μŠ€ νŠΉμ„±μƒ, 더 μ‹ μ†ν•˜κ²Œ 10초 이상 연결에 μ‹€νŒ¨ν–ˆμ„ λ•Œ μš°λ¦¬λŠ” λ„€νŠΈμ›Œν¬κΈ° 끊긴 connection lost μƒνƒœ(isFetchError)λ₯Ό κ²½κ³ ν•˜λŠ” 것이 ν•„μˆ˜μ μ΄μ—ˆλ‹€
      • 이λ₯Ό μœ„ν•΄ axios 의 timeout 값을 11초둜 μ§€μ •ν•΄μ£Όμ—ˆκ³ , react-query의 failureCount 속성을 μ΄μš©ν•˜μ—¬ 11μ΄ˆλ™μ•ˆ 1번 timeout이 일어났을 λ•ŒλΆ€ν„° κ²½κ³ ν•˜λ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€
  • κ·Έλž˜ν”„ 차트 (components/aBox/chart/chartConfig.ts)

    • JSON & CSV :link: JSON & CSV 1μ΄ˆμ— ν•œ λ²ˆμ”© ν™˜μž 정보λ₯Ό λ°›κΈ° μœ„ν•΄ JSON 톡신을 ν•˜μ˜€κ³ , μΆ•μ λœ 데이터λ₯Ό 차트둜 κ°€μ‹œν™”ν•˜κΈ° μœ„ν•΄μ„œ CSV ν…Œμ΄λΈ”μ„ ν†΅μ‹ ν•˜μ—¬ μˆ˜μ‹ ν•˜μ˜€λ‹€ λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό CSV ν…Œμ΄λΈ”λ‘œ λ°›μ•„μ˜΄μœΌλ‘œμ¨ 보닀 더 μž‘μ€ μš©λŸ‰μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆμ—ˆλ‹€
    • 차트 라이브러리둜, Zoom in & out κΈ°λŠ₯이 νŽΈλ¦¬ν•˜κ²Œ κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” apexchart 라이브러리 μ‚¬μš©ν•˜μ˜€μœΌλ‚˜, 큰 λͺ¨λ“ˆ 크기둜 νŽ˜μΈνŒ… μ‹œκ°„μ΄ λ°©λŒ€ν•˜μ—¬ chartjs 라이브러리 μ‚¬μš©ν•˜μ—¬ μ§„ν–‰ν•˜μ˜€λ‹€
    • react-chartjs-2 라이브러리λ₯Ό μ‚¬μš©ν•˜μ—¬ stateλ₯Ό ν™œμš©ν•˜μ—¬ μ„€μ • 정보λ₯Ό κ΅¬μ„±ν•˜κ³  λ Œλ”λ§ν•˜μ˜€λ‹€
    • 직접 panning κ³Ό zoom κΈ°λŠ₯을 λ²„νŠΌ 클릭을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€λ‹€
    • 차트 데이터 λ°°μ—΄ μ²˜λ¦¬μ™€ DOMμš”μ†Œ useRef 훅을 μ‚¬μš©ν•΄, CSV 파일과 PDF 파일 λ‹€μš΄λ‘œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ˜€λ‹€
  • Recoil κ³Ό Local Storage κ΄€λ¦¬μ˜ 이유

    • Recoil: λ°•μŠ€ 리슀트의 ꡬ성 정보듀을 λ‹΄κ³  첫 λ Œλ”λ§ μ‹œμ— 이λ₯Ό ν™œμš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” state
      • 이λ₯Ό 톡해 λ°•μŠ€ 리슀트λ₯Ό μ„Ήμ…˜μ— μ•Œλ§žκ²Œ μ •λ ¬ν•˜μ—¬ λ³΄μ—¬μ€Œκ³Ό λ™μ‹œμ— μ„Ήμ…˜ μ’…λ₯˜λ₯Ό λ°”κΏ€ 수 μžˆλŠ” λͺ¨λ“œ 체인지 κΈ°λŠ₯κ³Ό λ°•μŠ€ 리슀트의 ν™œμ„±ν™” 유무λ₯Ό ν† κΈ€λ§ν•˜λŠ” κΈ°λŠ₯ λ“± 을 κ΅¬ν˜„ν•˜μ˜€λ‹€
    • Local Storage: 각 λ°•μŠ€λ“€μ˜ λΉ„νœ˜λ°œμ„± 정보듀을 λ‹΄κ³  첫 λ Œλ”λ§ μ‹œμ— μ΄ˆκΈ°κ°’λ“€μ„ μ„€μ •ν•˜λ„λ‘ ν•˜λŠ” string κ°’
  • λ“œλž˜κ·Έ μ•€ λ“œλž (components/main/MainBoxSection.tsx)

    • react-beautiful-dnd 라이브러리λ₯Ό ν™œμš©ν•˜μ˜€λ‹€
    • λ°•μŠ€μ˜ 헀더λ₯Ό 작고 λ“œλž˜κ·Έν•˜μ—¬ μ›ν•˜λŠ” μœ„μΉ˜λ‘œ μ΄λ™μ‹œν‚¬ 수 μžˆλ„λ‘ κ΅¬ν˜„ν•˜μ˜€λ‹€
    • DragDropContext μ»¨νƒμŠ€νŠΈ λ‚΄μ—μ„œ DropResult 의 λ“œλž˜κΉ… 이벀트λ₯Ό μ •μ˜ν•œλ‹€ Droppable λ°•μŠ€λ₯Ό λ°°μΉ˜ν•΄μ£Όκ³  κ·Έ λ‚΄μ—μ„œ λ°•μŠ€λ§ˆλ‹€μ˜ Draggable μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•΄μ£Όμ–΄ μ‚¬μš©ν•œλ‹€ 이 λ•Œ Draggable μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ°•μŠ€λ₯Ό μ •μ˜ν•˜λ©΄μ„œ provided.dragHandleProps λ₯Ό λ°•μŠ€μ˜ 헀더에 μ „λ‹¬ν•˜μ—¬ 작고 λ“œλž˜κ·Έ ν•  수 μžˆλŠ” 속성을 λΆ€μ—¬ν•œλ‹€

νŒ€μ›

PM & Design @nayoung

Develop @SNUPI

Main Layout Design @jihyun

κΈ°κ°„

22/03 ~ 22/05, upper than 400 commits

폴더 ꡬ쑰

.
β”œβ”€β”€src
β”‚   β”œβ”€β”€ assets
β”‚   β”‚   β”œβ”€β”€ icons
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”œβ”€β”€ images
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   └── assets.d.ts
β”‚   β”œβ”€β”€ styles
β”‚   β”‚   β”œβ”€β”€ aBox
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   └── popUp.ts
β”‚   β”œβ”€β”€ utils
β”‚   β”‚   β”œβ”€β”€ libs
β”‚   β”‚   β”‚   └── fetchJsonData.ts
β”‚   β”‚   β”œβ”€β”€ tempCsvData.ts
β”‚   β”‚   β”œβ”€β”€ initialJsonData.ts
β”‚   β”‚   β”œβ”€β”€ atoms.ts
β”‚   β”‚   └── types.ts
β”‚   β”œβ”€β”€ components
β”‚   β”‚   β”œβ”€β”€ Router.tsx
β”‚   β”‚   β”œβ”€β”€ pages
β”‚   β”‚   β”‚   β”œβ”€β”€ Error404.tsx
β”‚   β”‚   β”‚   β”œβ”€β”€ PreMain.tsx
β”‚   β”‚   β”‚   └── Main.tsx
β”‚   β”‚   β”œβ”€β”€ hooks
β”‚   β”‚   β”‚   └── useClosingModal.ts
β”‚   β”‚   β”œβ”€β”€ main
β”‚   β”‚   β”‚   β”œβ”€β”€ popUp
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”œβ”€β”€ aBox
β”‚   β”‚   β”‚   β”œβ”€β”€ common
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ fluidBox
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ urineBox
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ popUp
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ chart
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ BoxChart.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ BoxChartView.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ chartConfig.ts
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ util
β”‚   β”‚   β”‚   β”‚   └── parseToDoubleDigits.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ useRangeValueInput.ts
β”‚   β”‚   β”‚   β”‚   └── useFetchJsonData.ts
β”‚   β”‚   β”‚   β”œβ”€β”€ ABox.tsx
β”‚   β””   β”΄   └── ABoxView.tsx
β”œβ”€β”€ .eslintrc.json
β”œβ”€β”€ .prettierrc
└── tsconfig.json