-
Ap**p: ๋ฉ์ธ **์ํธ๋ฆฌ ํ์ผ -
navigation: ๋ด๋น๊ฒ์ด์ ๊ด๋ จ ์ค์ ํ์ผ
-
Api: API ๋ฐ ๋๋ฏธ ๋ฐ์ดํฐ -
Assets: ํฐํธ, ์ด๋ฏธ์ง, SVG ํ์ผ ์ ์ฅ์ -
Components: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ -
Screens: ํ๋ฉด ์ปดํฌ๋ํธ -
Utils: ์์, ํ์ , ๋ณด์กฐ ํจ์
-
๋๋ฏธ ๋ฐ์ดํฐ ๊ฒฝ๋ก:
api/data/ -
๊ตฌ์กฐํ ๋ฐฉ๋ฒ: ํ๋ก์ ํธ ์คํ ์
merge-json.ts๋ก ์ฌ๋ฌ json ํ์ผ์ ๋ณํฉํ์ฌdb.json์์ฑ.{ "points": { "id": 1, "value": "some data" } } -
์: points.json ํ์ผ์ ๋ฐ์ดํฐ๋ /points ๊ฒฝ๋ก์์ ํธ์ถ ๊ฐ๋ฅ.
-
์๋ฒ ๊ฒฝ๋ก ์ค์ : ์ค์ ์๋ฒ URL๊ณผ ๋ง์ถฐ์ ํธ์ถ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํด์ผ ํจ.
-
์:
localhost:8080/api/v1/points๋ก ์๋ฒ๋ฅผ ํธ์ถ ๊ฐ๋ฅ. -
์ด๋ฅผ ์ํด json-server ๋ฒ์ ๋ค์ด๊ทธ๋ ์ด๋ ๋ฐ
--routes์ต์ ์ฌ์ฉํ๊ณ ์ ํ์ผ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์๋ก ๋ค๋ฅธ ๋ฒ์ ์ฌ์ค์น ๋ฐ ํ ์คํธ ์์ (api/routes/routes.json๋ด์ฉ ์ฐธ๊ณ )
-
-
API ๊ธฐ๋ณธ URL์
utils/constants/config.tsํ์ผ์์ ์ค์ .axios.get(`${config.API_SERVER_URL}/api/v1/points`);
-
์๋ฒ ์คํ:
yarn start:api๋ก API ์๋ฒ ์์. -
ํ ์คํธ ๋ช ๋ น์ด: ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก API ๋ฐ์ดํฐ ํ์ธ ๊ฐ๋ฅ.
$ curl http://localhost:8080/api/v1/pets/1
-
ํ์ผ ๊ฒฝ๋ก:
src/api/ -
๊ตฌํ ์์:
import Pet1 from '@data/pets1.json'; // ๋ฐ๋ ค๋๋ฌผ ์ ๋ณด ์กฐํ ํจ์ export const fetchPetInfo = async (petId: number) => { return Pet1; };
-
json-server ์ค์น: json-server์ ํน์ ๋ฒ์ ์ผ๋ก ์ฌ์ค์นํ์ฌ CORS ๋ฌธ์ ์ ๊ฒฝ๋ก ์ค์ ์ ํด๊ฒฐํด์ผ ํจ.
-
json ํ์ผ ์คํค๋ง ํ์ธ: ๊ฐ json ํ์ผ์ ์คํค๋ง๊ฐ ์๋ฒ์ ์ผ๊ด๋๊ฒ ๋ง์ถฐ์ ธ ์๋์ง ์ฌ๊ฒํ ํ์.
-
ํฐํธ: Pretendard ์ฌ์ฉ (
assets/fonts/).-
react-native.config.js๋ฅผ ํตํด ์ฐ๊ฒฐ. -
์คํ์ผ ์์
fontFamily: 'Pretendard-Bold';
-
-
์ด๋ฏธ์ง ์ฌ์ฉ๋ฒ: ๊ฐํธ ๊ฒฝ๋ก๋ก ์ด๋ฏธ์ง ํธ์ถ ๊ฐ๋ฅ.
-
์ :
import bootSplashLogo from '@image/bootsplash/bootsplash_logo.png'; -
์ฃผ์์ฌํญ:
require()๋์ ์ด๋ฏธ์ง์source์์ฑ์ ๋ฐ๋ก ๋ฃ์ด ์ฌ์ฉ.<Image source={bootSplashLogo} />
-
-
RoundedBox: ๋ค์ํ ๋ฒํผ ๋ฐ ํ๋ ์ ์ ๊ณต. (ํต์ฌ UI ์ปจํ ์ด๋)-
ํ ๋ง ์ต์ : A: ํ์ ํ๋ ์ B: ํ์ ๋ฌดํ ํ๋ ์ C: ์์ด์ฝ/์ฌ์ง or ํ ์คํธ ์ ์ฌ๊ฐํ ๋ฒํผ (์ค์ ๋ฐฐ์น)
<RoundedBox> <Text>Button Text</Text> // ๊ทธ ์ด์ธ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ฃ์ ์๋ ์์ </RoundedBox>
-
ํด๋น ์ปดํฌ๋ํธ ํ์ผ์
RoundedFrame,RoundedTextButton,RoundedCircleButton๋ฑ ์ปดํฌ๋ํธ ์กด์ฌ-
shadow ์ต์ ์ ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ์ ์กด์ฌ
-
RoundedBox๋ button/frame ์ ํ ์ต์ ๋ํ ๊ฐ์ง
-
RoundedBox์๋ ๋ชจ์๋ฆฌ ๋์ ์ฌ๋ผ๊ฐ๋ pill-badge ์ถ๊ฐ์ต์ ์กด์ฌ
-
์ปค์คํ ์ต์ ์ ๋ํด์ ์ธ์ ์ธ์๋,
src/utils/constants์ ์์นํ๋types.tsํ์ผ์ ํ๋จ๋ ์ฐธ๊ณ ํ ์ ์์.
-
-
-
StylizedText: ํ ์คํธ ์คํ์ผ๋ง ๋ด๋น.Tailwind์คํ์ผ ํ์์ผ๋ก ์์์ต์ ์ ๋ ฅ (์:text-blue-300).<StylizedText color="text-blue-300" type="header1"> ์๋ ํ์ธ์ </StylizedText>
- StylizedText ์ฝ๋ ํ๋จ์
header1, header2 ...๋ฑ ์ฌ๋ฌ ์์ฑ์ด ์ ์๋์ด์์ผ๋ฉฐ ์ธ๋ถ ๋์์ธ ์์ ๊ฐ๋ฅ.
- StylizedText ์ฝ๋ ํ๋จ์
-
HeaderText: ํ๋ฉด ์ต์๋จ์ ์์ฃผ ๋ฑ์ฅํ๋ ์ ๋ชฉํ ์คํธ๋ฅผ ์ํ ๊ฒ-
ํ์ด๋ผ์ดํธ ๋จ์ด(์ ๊ฒฌ์ด๋ฆ, ํ์์ด๋ฆ ๋ฑ)๋ฅผ primary color๋ก ํ์
-
StylizedText์ ๊ฐ์ ํ์ผ์ ์กด์ฌ
<HeaderText text={${petName}์ ์ผ์ฃผ์ผ์ ์ด๋ ์๊น์?} // petName ์ฌ์ฉ highlight={petName || ''} // ๊ฐ์กฐํ ๋ถ๋ถ />
-
-
ShadowBox: ์๋๋ก์ด๋์ฉ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ์ต๋ํ ํผ๊ทธ๋ง์ ์ผ์นํ๊ฒ ๊ตฌํ. (์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ)<ShadowBox> <Text>๊ทธ๋ฆผ์ ํจ๊ณผ</Text> </ShadowBox>
- (์ฐธ๊ณ )
RoundedBox์ ์์ดํ ๋ค์ ๊ทธ๋ฆผ์ ์ต์ ์์ ์ด ์ปดํฌ๋ํธ๋ฅผ wrapper ์ปจํ ์ด๋๋ก ํ์ฉ.
- (์ฐธ๊ณ )
-
BarChart: ๊ฐ๋ก ๋ฐ ์ธ๋ก ๋ง๋ ๊ทธ๋ํ ์ ๊ณต. (VBar, HBar..) -
ColorMap: ํ๋ก์ ํธ ์ ๋ฐ์์ ์ฌ์ฉ๋๋ ์์ ๊ด๋ฆฌ. -
์ญ์ ์์ : ๋ฒ์ฉ์ฑ์ด ์ ์ด ์ญ์ ๋๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ํตํฉ ์์ .
CircularButton,DiseaseCard,SquareRoundedBox
-
์์ ์์ : ๋ค๋ฅธ ํ์์ ์ฝ๋์์ ์ถ๊ฐ๋จ.
-
CustomImagePicker,CustomTextInput- ์ด์ ํด๊ฒฐ ์งํ ์ค
-
Avatar,Badge,Loading- ๋จธ์ง ์ดํ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ก ์ถ๊ฐ ์์
-
-
Screens/ํด๋๋health,bluetooth,home,profile,walk๋ก ๋ถ๋ฅ. -
ํ์ผ๋ช ์กฐ์ : ํ๋ฉด ์ปดํฌ๋ํธ ์ด๋ฆ๊ณผ ํ์ผ๋ช ์ด ์ผ์นํ๋๋ก ํต์ผํจ.
-
์ด์ ์๋ ํ์ผ๋ช ๊ณผ ์ปดํฌ๋ํธ๋ช ์ด ๊ด๋ จ์ฑ์ด ์ ์ด ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์ ์
-
ํ์ผ๋ช ์ ๊ธธ์ด ๋ฌธ์ ๋ก Screen ์ ๋์ฌ๋ฅผ ์ ์ธํจ.
-
-
ํ๋ก์ ํธ ํ์ผ ์ฌ๊ตฌ์ฑ, ํธ์ถ๊ตฌ์กฐ ์ฌ์ ์
-
์๋ฒ api ํ๋กํ ํ์ ์์ฑ (ํ ์คํธ ๋ฏธ์๋ฃ)
-
json-server apiํ๊ฒฝ ๊ตฌ์ฑ ๋ฐ ๊ด๋ จ ํ ์คํ ์คํฌ๋ฆฝํธ ์ถ๊ฐ
-
๊ธฐ์กด ์ฝ๋ ๋ก์ง ๋ฆฌํฉํ ๋ง (๋ฐ๋ณต๋๋ ์ฝ๋ ์ต์ํ, ํ๋์ฝ๋ฉ ๋์ ๋ณ์-์์๊ฐ์ฒด์์ ์ฐ๊ฒฐ )
-
์ปดํฌ๋ํธํ ๋ฐ api ์ฐ๋ ์ค๊ณ (
WeeklySummary) -
ํ์ฌ ์ด์:
-
Walk ๊ด๋ จ:
PetCalendar,WalkTimer,TodayWalk๋ฑ์ ์์ ์ด ๋ฏธ์์ฑ ์ํ.-
expo ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ฒด๋ก ์ธํ ์ถ๊ฐ ์ด์ (cli ํ๊ฒฝ๊ณผ์ ํตํฉ์ ์ํด)
-
ํฉ์ณ์ผํ ์ฝ๋๊ฐ, ๋ชจ๋ UI์์์ ๋ํด ์ ๋ถ ๊ฐ๋ณ์ ์ธ ์คํ์ผ์ด ์ ์ฉ๋์ด ์์
-
๊ฐ ์คํฌ๋ฆฐ์์, ์ปดํฌ๋ํธ์ ๋ชจ๋ ๋ถ๋ถ์ ๊ณ ์ ํ ์คํ์ผ๋ง์ด ์ ์ฉ๋ ์ํ. (+ ์คํฌ๋ฆฐ ๋ณ๋ก ์คํ์ผ์ํธ ์กด์ฌ)
-
ํ์ฌ ์คํ์ผ์ ์ ์ฉ์ ์ํด, ์คํ์ผ ์ฌ์ค๊ณ ๋ฐ ์ฝ๋ ์๋ก ์์ฑ ์ค.
-
์ฝ๋ ์ฌ๊ตฌ์กฐํ ์, ๋ฐ์ดํฐ ๋ฐ api์ ์ฐ๊ฒฐ์ ๊ณ ๋ คํ์ฌ api ๊ด๋ จ ์ฝ๋ ์ถ๊ฐ ์ค.
-
-
-
-
์์ ๋ฐ ์ค์ ํ์ผ ์์น: ๋ชจ๋ ์์๋ utils/constants/์์ ๊ด๋ฆฌ.
-
ํ์ ๊ด๋ฆฌ: utils/constants/types.ts์์ ํ๋ก์ ํธ ์ ๋ฐ์์ ์ฌ์ฉํ ํ์ ์ ์ ์.
import { SomeType } from '@types';
config.ts: API ๊ธฐ๋ณธ URL ๋ฑ ์ฃผ์ ์ค์ ๊ฐ ์ ์ฅ.types.ts: ํ์ ์ ์ ๋ชจ์.
-
Tailwind ๊ฒฝ๋ก: ํ์ผ ๊ฒฝ๋ก ๋ณ๋์ ์คํ์ผ๋ง ์์ฑ์ด ํฐ ์ํฅ์ ๋ฐ๋๋ค๋ฉด,tailwind.config.js์ src ๊ฒฝ๋ก๋ฅผ ๊ฒํ ํด๋ณผ ๊ฒ. -
API ํ ์คํธ ํ์: ์๋ฒ API ์คํค๋ง์ ๋ง์ถ ์ฝ๋๊ฐ ์ ํํ๊ฒ ์๋ํ๋์ง ํ ์คํธ๊ฐ ํ์ํจ.-
ํ์ฌ ์์ฑ๋ api ํจ์ ์ด์ฉ ์, dummyJson์ ์คํค๋ง ํ์ ๊ณผ ํจ์์ apiํธ์ถ์ ๊ฒํ ํด ๋ณผ ๊ฒ
-
ํ๋ฉด๊ณผ ๋ฐ์ดํฐ๊ฐ ๋ถ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ํด, 1์ฐจ์ ์ผ๋ก jsonํ์ผ ์์ฒด๋ฅผ ๋ฆฌํดํ๋๋ก ํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅ.
import Pet1 from '@data/pets1.json'; // ๋ฐ๋ ค๋๋ฌผ ์ ๋ณด ์กฐํ export const fetchPetInfo = async (petId: number) => { return Pet1; };
-
-
๊ฒฝ๋ก alias ์ฌ์ฉ: ํ๋ก์ ํธ ๊ฒฝ๋ก ๊ด๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํด alias๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉ ์ค.-
Alias ์ค์ ๋ชฉ๋ก
@api:./src/api@data:./src/api/data@components:./src/components@commons:./src/components/commons@screens:./src/screens@constants:./src/utils/constants@types:./src/utils/constants/types.ts@image:./src/assets/image
์ถ๊ฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ํ์์ ๋ง๊ฒ alias๋ฅผ ๊ณ์ ํ์ฅ ๊ฐ๋ฅ.
-
babel.config.js์tsconfig.json์ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ์ฌ, ๊ฐํธ๊ฒฝ๋ก ์ ์ ๋ฐ ์ฌ์ฉ ๊ฐ๋ฅ
-