Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/sangmin802/loa-hands

πŸ“Œ Loa-Hands 개발기
https://github.com/sangmin802/loa-hands

react styled-components typescript

Last synced: 15 days ago
JSON representation

πŸ“Œ Loa-Hands 개발기

Awesome Lists containing this project

README

        

## πŸ” Loa-Hands - λ‘œμŠ€νŠΈμ•„ν¬ μœ μ € 검색 μ•±

### μ„œλ²„ 및 API

- 이벀트 및, μœ μ € 정보λ₯Ό λ°›μ•„μ˜€κΈ° μœ„ν•΄ `heroku` λ₯Ό 톡해 ν”„λ‘μ‹œ κ²Έ 데이터λ₯Ό λ°›μ•„μ˜€λŠ” μ„œλ²„ ν™œμš©

### λͺ¨λ“ˆ

- `React-Router` : `UserInfo`μ—μ„œμ˜ κ²€μƒ‰λœ 값을 `path`둜 κΈ°μ–΅ν•˜μ—¬, μƒˆλ‘œκ³ μΉ¨μ„ ν•˜μ—¬λ„ λ°”λ‘œ κ²€μƒ‰λœ 화면을 λ…ΈμΆœμ‹œν‚€λ„λ‘ 함
- `React-Query` : `request`, `response`λ₯Ό μˆ˜ν–‰ν•˜λŠ” λΉ„λ™κΈ°μž‘μ—…μ„ μž‘λ™ν•˜λŠ”λ° μ‚¬μš©
- `axios` : `fetch api` λŒ€μš©
- `StoryBook` : `UI test`
- `Jest`, `React-testing-library` : `Unit test`
- `styled-components` : `CSS-in-JS`

### src 디렉토리 ꡬ쑰

- `api` : μ „λ°˜μ μΈ μ„œλ²„μ™€μ˜ 비동기 λ©”μ†Œλ“œ 관리
- `components` : μž¬ν™œμš©κ°€λŠ₯ν•œ μ»΄ν¬λ„ŒνŠΈ 관리. λŒ€λΆ€λΆ„ λ‹¨μˆœ `UI`λ₯Ό 그리기 μœ„ν•œ μ»΄ν¬λ„ŒνŠΈ
- `hooks` : κΈ°λŠ₯에 λ”°λΌμ„œ μΆ”μƒν™”λœ λ‘œμ§λ“€μ„ 관리
- `json` : 정적인 `json`데이터 관리
- `pages` : 각쒅 둜직이 μ—°κ²°λ˜λŠ” μ΅œμƒμœ„ μ»΄ν¬λ„ŒνŠΈ
> `Route` κ°œλ…
- `layout` : κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” `UI`
- `style` : ν°νŠΈλ“±μ˜ 정적인 μŠ€νƒ€μΌ
- `utils` : μž¬μ‚¬μš© κ°€λŠ₯ν•œ 이벀트 λ§€λ‹ˆμ €
- `constants` : κ³΅ν†΅μœΌλ‘œ μ‚¬μš©λ˜λŠ” μƒμˆ˜

### Components κ·œμΉ™

1. `Text`, `Input`, `Button`κ³Ό 같은 κ°€μž₯ μž‘μ€ λ‹¨μœ„μ˜ μ»΄ν¬λ„ŒνŠΈλ“€μ€ μ΅œλŒ€ν•œμ˜ μž¬μ‚¬μš©μ„±μ„ μœ„ν•΄ κΈ°λ³Έ `Element`듀을 ν™•μž₯ν•˜μ—¬ μ‚¬μš©

```js
import React, { ButtonHTMLAttributes, PropsWithChildren } from "react";
import * as Styled from "./index.style";

export interface IButton extends ButtonHTMLAttributes {}

const Button = ({ children, ...props }: PropsWithChildren) => (
{children}
);

export default Button;
```

2. `margin`κ³Ό 같은 컨텐츠 외뢀에 영ν–₯을 μ£ΌλŠ” μŠ€νƒ€μΌλ“€μ€ μƒμœ„μ»΄ν¬λ„ŒνŠΈμ—μ„œ 지정
3. μ΅œλŒ€ν•œ 좔상화 단계 톡일화
4. `UI`λ₯Ό κ΅¬μ„±ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μƒνƒœκ°’μ„ κ³„μ‚°ν•˜λŠ” λ‘œμ§μ„ μ΅œλŒ€ν•œ `hooks`둜 좔상화 ν•˜μ—¬ μ„ μ–Έν˜•μœΌλ‘œ μ‚¬μš©

### UX κ°œμ„ μ‚¬ν•­

1. `Home`μ—μ„œ `calendar`, `event` μ»΄ν¬λ„ŒνŠΈμ˜ λΉ„λ™κΈ°μž‘μ—…μ„ λΆ„λ¦¬ν•˜μ—¬, 정적인 `data`듀은 μ¦‰μ‹œ μƒμ„±ν•˜κ³ , λ‚˜λ¨Έμ§€ `data`듀이 `response`λœλ‹€λ©΄ κ·Έλ•Œ μ΄μ–΄μ„œ μƒμ„±ν•˜λ„λ‘ 함.
> `Next.js`λ₯Ό μ‚¬μš©ν•˜κ²Œ 될 경우, `getStaticProps`둜 λŒ€μ²΄λ  것 κ°™μŒ.
2. μ„œλ²„μ™€μ˜ 톡신을 ν•˜λŠ” λΉ„λ™κΈ°μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ, 효율적으둜 μ§„ν–‰ν•˜κΈ° μœ„ν•΄ `React-Query` μ‚¬μš©
> `Suspense`와 `ErrorBoundary`λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈμ˜ 기본적인 λͺ©μ μ„ λ²—μ–΄λ‚˜λŠ” `loading`κ³Ό `error`λ₯Ό μ™ΈλΆ€λ‘œ 뢄리
> `Suspense`의 경우 λΆˆμ™„μ „ν•œ μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μ—λŸ¬λ₯Ό λ°œμƒμ‹œμΌœ 제거
> `stale` 및 `cache` μ‹œκ°„μ„ μ„€μ •ν•˜μ—¬ μ§€μ •ν•œ μ‹œκ°„ 이내에 μž¬κ²€μƒ‰λ˜μ—ˆλ‹€λ©΄, μΊμ‹±λœ κ°’μœΌλ‘œ λ Œλ”λ§ 그렇지 μ•Šλ‹€λ©΄ μƒˆλ‘­κ²Œ `data` μš”μ²­
3. μ„œλ²„λ‘œμ˜ μš”μ²­μ΄ 쀑첩될 경우, μ΄μ „μ˜ μš”μ²­μ„ μ·¨μ†Œν•˜λ„λ‘ 함
4. `UserInfo`μ—μ„œ `userData`, `collection` λ‘κ°€μ§€μ˜ `data` μš”μ²­ λΉ„λ™κΈ°μž‘μ—…μ΄ μˆ˜ν–‰λ˜λŠ”λ°, `collection`의 경우 `userData`의 값이 μ‘΄μž¬ν•˜μ—¬μ•Ό 진행될 수 μžˆλŠ” μƒν™©μ—μ„œ `collection`의 `response`λ₯Ό λ°›κΈ°κΉŒμ§€ 초기 λ Œλ”λ§μ΄ μ§€μ—°λ˜λŠ” 상황
> 두가지λ₯Ό λΆ„λ¦¬ν•˜μ—¬ `userData`만 μ™„λ£Œλœλ‹€λ©΄ λ Œλ”λ§μ„ μˆ˜ν–‰ν•˜κ³ , 이후에 `collection`을 λ³„λ„λ‘œ μ§„ν–‰ν•˜λ„λ‘ ν•˜μ—¬ 1초의 μ‹œκ°„ μ ˆμ•½
5. μ‚¬μš©μžμ—κ²Œμ„œ κΆŒν•œμ„ ν—ˆλ½λ°›λŠ”λ‹€λ©΄, `timer`κ°€ μ μš©λ˜μ–΄μžˆλŠ” 컨텐츠듀은 μ•Œλ¦Όμ„ μˆ˜ν–‰ν•  수 있음