Game Buddy๋ ์ค์๊ฐ์ผ๋ก ๊ฒ์ ์ฐธ์ฌ์๋ฅผ ๋ชจ์งํ๋ฉฐ, ๋ค์ํ ์ ์ ๋ค๊ณผ ์ํตํ ์ ์๋ ๊ณต๊ฐ์ ๋๋ค.
Game Buddy๋ฅผ ํตํด ์ง์ ํ BUDDY๋ฅผ ๋ง๋๋ณด์ธ์!
๐ฎGameBuddy ๋ฐฐํฌ URL๐ฎ
// ํ
์คํธ์ฉ ๊ณ์
Email: gamebuddytest@buddy.com
Password: gamebuddytest
| ๋ฐฉํ์ง | ๋ฐํ์ค | ์ต์ฐ์ | ๋ฐ์คํ |
|---|---|---|---|
| Hajin-Bang | GedFlow | yeonjeonge-e | JJamVa |
| ํ์ | ํ์ | ํ์ | ํ์ฅ |
| ๋ฐ์คํ | ๋ฐํ์ค | ๋ฐฉํ์ง | ์ต์ฐ์ |
|---|---|---|---|
| UI - ๋ฉ์ธ(ํ๋กํ) ๊ฒ์๊ธ ๋ฆฌ์คํธ - ๋ฉ์ธ(ํ๋กํ) ๊ฒ์๊ธ ์์ธ๋ณด๊ธฐ ๋ชจ๋ฌ(๋ชจ๋ฐ์ผ ๋ฒ์ ) - ๊ณต์ฉ ํ์ธ Alert ๋ชจ๋ฌ์ฐฝ ๊ธฐ๋ฅ - ๊ฒ์๊ธ ๋๊ธ ์ถ๊ฐ/์ญ์ /์ ๊ณ - ๊ฒ์๊ธ ์ข์์ / ์ข์์ ์ทจ์ํ๊ธฐ - ๊ฒ์๊ธ ๋ฆฌ์คํธ ๋ถ๋ฌ์ค๊ธฐ - ๊ฒ์๊ธ ์์ - ํ๋กํ ์์ - ํ๋กํ ํ์ด์ง์ ๋ชจ์ง์ค์ธ ๊ฒ์ ๋ฐ์ดํฐ ํธ์ถ - ํ๋ก์ฐ / ์ธํ๋ก์ฐ์ ๋ฐ๋ฅธ ํ๋ฉด ํํ ๊ธฐ๋ฅ ๊ธฐํ - PR๋ฆฌ๋ทฐ ๋ฐ Merge ๊ด๋ฆฌ - ํ๋ก์ ํธ ์ด๊ธฐ ์ค์ - ๊ฐ์ข ์ปดํฌ๋ํธ ํ ์คํธ ๋ฐ ์์ธ์ฒ๋ฆฌ ์์ - ์ค๋ณต ์ปดํฌ๋ํธ ์ฝ๋ ๋ฆฌํฉํ ๋ง - README.md ์์ฑ |
UI - ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ - ํ๋ก์ ๋ฐ ํ๋ก์ ๋ฆฌ์คํธ - ๊ฒ์ ๋ชจ์ง๊ธ ๋ชจ๋ฌ์ฐฝ - ๊ฒ์ ์ฐธ๊ฐ์ ๋ฆฌ์คํธ ๋ชจ๋ฌ์ฐฝ ๊ธฐ๋ฅ - ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ - ํ๋กํ ํ์ด์ง์ ProfileDetail ๋ถ๋ถ - ํ๋ก์ ๋ฆฌ์คํธ, ํ๋ก์ ๋ฆฌ์คํธ - ๊ฒ์ ๋ชจ์ง๊ธ ์์ธ ๋ชจ๋ฌ - ๊ฒ์ ์ฐธ์ฌ, ๋ ๋๊ธฐ ๊ธฐ๋ฅ - ๊ฒ์ ์ฐธ๊ฐ์ ๋ฆฌ์คํธ - ๋ก๊ทธ์์ ๊ธฐํ - AWS ๋ฐฐํฌ - ๋ฉ์ธ ํฌ์คํฐ ์์ |
UI - Splash - Loading - Header - Footer - Menu Modal - ๊ฒ์ - ์ฑํ - ๋ฉ์ธ ํผ๋ - ํ๋กํ ์์ธ - ํ๋กํ ๊ฒ์๊ธ ๋ฆฌ์คํธ - ๊ฒ์๊ธ ์์ธ๋ชจ๋ฌ ๊ธฐ๋ฅ - ๊ฒ์ - ํ๋กํ ๊ฒ์๊ธ ๋ฆฌ์คํธ - ๋ฉ๋ด ๋ชจ๋ฌ - ์ฑํ ๊ธฐํ -๋์์ธ ๋ชฉ์ - ๊ธฐ๋ฅ ๋ช ์ธ์ ์์ฑ - ์์ด์ดํ๋ ์ ์ค๊ณ - GlobalStyle(Reset.css) / Font.css ์ค์ |
UI - 404 ์๋ฌ ํ์ด์ง - ํ๋ก์ ์์ ์ ๋ฉ์ธํผ๋ ํ์ด์ง - ํ๋กํ ์์ ํ์ด์ง - ๊ฒ์ ๊ฒ์๊ธ - ๊ฒ์ ๋ชจ์ง๊ธ ๊ธฐ๋ฅ - ํ๋กํ ์์ ํ์ด์ง - ๊ฒ์ ๊ฒ์๊ธ ์์ฑ / ์์ - ๊ฒ์ ๋ชจ์ง๊ธ ์์ฑ ๊ธฐํ - ๋ ธ์ ํ์ด์ง ์์ฑ - ํ๊ณ ๋ก ์์ฑ |
๊ฐ๋ฐ ๊ธฐ๊ฐ : 2023๋ 10์ 16์ผ ~ 2023๋ 11์ 7์ผ
| ์ฃผ์ฐจ | ๋ด์ฉ |
|---|---|
| 1์ฃผ์ฐจ (10/16 ~ 10/21) |
- ์ฃผ์ ์ ์ ๋ฐ ๊ธฐํ - ๊ธฐ์ ์คํ ์กฐ์ฌ - ๋ชฉ์ ๋์์ธ ๋ฐ ๊ธฐ์ ๋ฆฌ์คํธ ์์ฑ - GIT ํ์ ๊ณต๋ถ - ํ๋ก์ ํธ ์ด๊ธฐ ์ ํ (Prettier, Convention ๋ฑ) |
| 2์ฃผ์ฐจ (10/22 ~ 10/28) |
- ๋์์ธ ๋ฐ ๊ธฐ๋ฅ ๊ฐ๋ฐ ์์ |
| 3์ฃผ์ฐจ (10/29 ~ 11/03) |
- 1์ฐจ ์ ๊ฒ ํ, ์ฝ๋ ์์ ๋ฐ ์์ธ์ฒ๋ฆฌ ์์
์์ - ํ์ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ - ์น ๋ฐ์ํ ์์ - ๋ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ(์ํ ํ๋งค API ์ปค์คํ ) |
| 4์ฃผ์ฐจ (11/04 ~ 11/06) |
- ๋์์ธ ๋ณด์ ๋ฐ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์์
- README.md ์์ฑ - ์๋น์ค ๋ฐฐํฌ(AWS) |
-
์ปค๋ฎค๋์ผ์ด์
-
๊ธฐ๋ฅ ๋ช ์ธ์ ๋ฐ ์์ด์ด ํ๋ ์
-
๋ฐ์ผ๋ฆฌ ์คํฌ๋ผ
- ๋งค์ผ ์ค์ 10์, ์คํ 6์ ํ์
- ํ์ ์ฃผ์ ์งํ ์ํฉ ๊ณต์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
-
GitHub ํ์ ๋ฐฉ์
- GitHub์ Projects ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ TodoList์์ฑ
- GitFlow๋ฅผ ์ด์ฉ
master: ํ๋ก์ ํธ์ ์ต์ข ๋ณธdevelop: feature branch์์ ์์ ๋ฌผ์ ํฉ์น๋ branchfeature: ๊ธฐ๋ฅ ๊ฐ๋ฐ branch
| Front-End |
|
| ํ์ |
|
| ๋์์ธ |
|
| IDE |
|
| ๋ฐฐํฌ |
|
| ๊ธฐ์ | ์ค๋ช |
|---|---|
| Recoil | ์ํ ๊ด๋ฆฌ์ ํธ๋ฆฌ์ฑ ๋ฐ ์ปดํฌ๋ํธ ๊ฐ ์ํ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ์ฌ ์ฌ์ฉ |
| Styled-Components | Props๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ ์ ์ฉ ๋ฐ ์คํ์ผ ์์์ด ๊ฐ๋ฅํ์ฌ ์ฌ์ฉ |
| Axios | ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์๋ ๋ณํ ๋ฐ ํ์ฑ, headers์ content-type์ด JSON์ธ ๊ฒฝ์ฐ headers ์์ฒด๋ฅผ ์๋ต์ด ๊ฐ๋ฅํ์ฌ ์ฌ์ฉ |
| Image Compressor | ์ด๋ฏธ์ง์ ํฌ๊ธฐ ์กฐ์ ๋ฐ ํ์ผ ์ฉ๋์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉ |
์ปจ๋ฒค์ ๊ท์น ๋ชฉ๋ก
feature-#(์ด์๋ฒํธ)-(๊ฐ๋จํ ๊ธฐ๋ฅ๊ตฌํ ์ค๋ช
)
ex) feature-#17-๋ก๊ทธ์ธ ํ๋ฉด ๊ตฌํ
| Commit Convention | Content |
|---|---|
[Feat]- |
๊ธฐ๋ฅ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ |
[Fix]- |
๋ฒ๊ทธ, ์ค๋ฅ ์์ |
[Docs]- |
README.md, json ํ์ผ ๋ฑ ์์ , ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น |
[Style]- |
UI ๋์์ธ ๋ณ๊ฒฝ |
[Refactory]- |
์ฝ๋ ๋ฆฌํฉํ ๋ง |
[Test]- |
ํ ์คํธ ์ฝ๋ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ |
[Config]- |
npm ๋ชจ๋ ์ค์น ๋ฑ |
[Chore]- |
ํจํค์ง ๋งค๋์ ์ค์ ํ ๊ฒฝ์ฐ |
[Comment]- |
ํ์ํ ์ฃผ์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ |
[Init]- |
์ด๊ธฐ ์ค์ ํ ๊ฒฝ์ฐ |
- ์์: ๋ฒํผ ๊ธฐ๋ฅ์ ๊ตฌํํ์ ๊ฒฝ์ฐ
ex) git commit -m "[Feat]-๋ก๊ทธ์ธ ํ๋ฉด ๋ฒํผ ๊ธฐ๋ฅ ์ถ๊ฐ"
- Issue Title Convention
| Issue Title | ์ค๋ช |
|---|---|
[Feat]- |
๊ธฐ๋ฅ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ |
[Design]- |
๋์์ธ ์์ ์ถ๊ฐ, ์ญ์ , ๋ณ๊ฒฝ |
[Refactor]- |
์ฝ๋ ๋ฆฌํฉํ ๋ง |
[Bug]- |
๋ฒ๊ทธ ์์ |
- Issue Template
# Title
<!-- [Issue Title]-๊ฐ๋จ ์ค๋ช
-->
<!-- ex) [Design]-๋ฒํผ Border ์์ -->
# Description
<!--๊ธฐ๋ฅ ์ค๋ช
ํด์ฃผ์ธ์-->
# Todo
- [ ] <!--ํด์ผํ ์์
1-->
- [x] <!--ํด์ผํ ์์
2-->
# ETC
<!--๊ธฐํ ์์
--># PR ์ ๋ชฉ
<!-- ex) ๋ฒํผ ๊ธฐ๋ฅ ๊ตฌํ -->
# ๋ณ๊ฒฝ ์ฌํญ
- []<!-- ๋ณ๊ฒฝ์ฌํญ ๋ชฉ๋ก์ ์์ฑ-->
- []<!-- ex) 1. ๋ฒํผ ๋์์ธ ๋ณ๊ฒฝ-->
# ๊ด๋ จ ์ด์
<!-- #์ด์๋ฒํธ - ํด๊ฒฐ -->
<!-- ex) #17-APIํต์ ์ค๋ฅ ํด๊ฒฐ-->module.exports = {
semi: true, // ์ธ๋ฏธ์ฝ๋ก ์ฌ๋ถ
printWidth: 80, // ์ฝ๋๊ธธ์ด ์ ํ
tabWidth: 2, // ํญ์ ๊ธธ์ด
singleQuote: false, // ์๋ฐ์ดํ ์ฌ์ฉ
jsxSingleQuote: false, // ์๋ฐ์ดํ ์ฌ์ฉ
trailingComma: "none", // ๋ฐฐ์ด,๊ฐ์ฒด ๋ง์ง๋ง ์์์ , ์ฌ์ฉ
bracketSpacing: true, // ์ค๊ดํธ ์์ ๊ณต๋ฐฑ
bracketSameLine: true, // ๊บฝ์ ์ค๋ฐ๊ฟ ์ฌ๋ถ
jsxBracketSameLine: true, // ๊บฝ์ ์ค๋ฐ๊ฟ ์ฌ๋ถ
arrowParens: "always" // ํ๋ผ๋ฏธํฐ๊ฐ 1๊ฐ์ผ๋, ๊ดํธ ์๋ต
};1. ์ปดํฌ๋ํธ ๋ถ๋ฆฌ๋ ํ์ผ์ `PasCalCase` ์ ์ฉ
ex) Header.jsx, Footer.jsx
2. ์ปดํฌ๋ํธ ์๋ ํ์ผ์ `lower CamelCase` ์ ์ฉ
ex) loginApi.jsx, store.js
3. CSSํ์ผ ์ฌ์ฉ ์, ์ ์ฉํ ํ์ผ๋ช
๊ณผ ์ผ์น
ex) Header.jsx์ cssํ์ผ์ Header.module.css
1. var ๋ณ์ ์ฌ์ฉ ๊ธ์ง
2. ๋ณ์๋ช
๋ฐ ํจ์๋ช
์ `CamelCase`๋ก ์์ฑ
ex) ๋ณ์: let isTrue = true; ํจ์: onClickHanlder() => {}
๐ฎย GameBuddy
โโ .github
| โโ Issue_template โโโโโโโโโโโโโโ ์ด์ํ
ํ๋ฆฟ.md
| โโ PULL_REQUEST_TEMPLATE.MD โโโโ PRํ
ํ๋ฆฟ.md
โโ public โโโโโโโโโโโโโโโโโโโโโโโโโ Public ํด๋
| โโ index.html
โโ ๐ย src
โโ ๐ย API โโโโโโโโโโโโโโโโโโโโโโ API ํธ์ถ ํจ์ ๋ชจ์
โโ ๐ย assets โโโโโโโโโโโโโโโโโโโ ํฐํธ, ์ด๋ฏธ์ง ๋ฑ ๊ฐ์ข
์ ์ ํ์ผ ๋ชจ์
โโ ๐ย Components โโโโโโโโโโโโโโโ ์ปดํฌ๋ํธ ๋ชจ์
| โโ ๐ย Chat โโโโโโโโโโโโโโโโโโ ์ฑํ
| โโ ๐ย Commons โโโโโโโโโโโโโโโ ๊ณต์ฉ์ผ๋ก ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ
| โโ ๐ย Main โโโโโโโโโโโโโโโโโโ ๋ฉ์ธ ํ๋ฉด
| โโ ๐ย Profile โโโโโโโโโโโโโโโ ํ๋กํ
| โโ ๐ย Search โโโโโโโโโโโโโโโโ ํ์ ๊ฒ์
| โโ ๐ย Sign
| | โโ ๐ย Login โโโโโโโโโโโโโโโ ๋ก๊ทธ์ธ
| | โโ ๐ย SignUp โโโโโโโโโโโโโ ํ์๊ฐ์
| โโ ๐ย Splash โโโโโโโโโโโโโโโโ ์คํ๋์
| โโ ๐ย Write โโโโโโโโโโโโโโโโโ ๊ฒ์๊ธ ์์ฑ
โโ ๐ย Functional โโโโโโโโโโโโโโโโโ ๋ฐ์ดํฐ ํ์ฑ ํจ์ ๋ชจ์
โโ ๐ย Pages
โโ Router โโโโโโโโโโโโโโโโโโโโ ์ด๋ํ ํ์ด์ง ๊ฒฝ๋ก ์ง์
โโ Store โโโโโโโโโโโโโโโโโโโโโ ์ ์ญ ์ํ ๊ด๋ฆฌ ๊ณต๊ฐ
โโ styles
โโโโ App.js
โโโโ index.js
โโ .gitignore
โโ .prettierrc.js
โโ package-lock.json
โโ package.json
โโ README.md
| ์คํ๋์ | ํ์๊ฐ์ /ํ๋กํ ์ค์ | ๋ก๊ทธ์ธ/๋ฉ์ธ |
|---|---|---|
![]() |
![]() |
![]() |
| ๊ฒ์ | ๋ฉ์ธ ํผ๋ |
|---|---|
![]() |
![]() |
| ์ข์์ | ๋๊ธ ์ญ์ /์ ๊ณ | ๋ชจ๋ฌ ๋ซ๊ธฐ |
|---|---|---|
![]() |
![]() |
![]() |
| ์ฑํ | myprofile | ํ๋ก์/ํ๋ก์ | ํ๋กํ ์์ |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| ๊ฒ์๊ธ | ๋ชจ์ง๊ธ | ๋ชจ์ง์ธ์ |
|---|---|---|
![]() |
![]() |
![]() |
| 404 | ๋ก๋ฉ | ๋ก๊ทธ์์ |
|---|---|---|
![]() |
![]() |
![]() |
๊ฒ์ ๋ชจ์ง ์์ API ์ปค์คํ ์ฝ๋
- API ์์ฒญ ์, ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ ๋ฑ๋ก
import axios from "axios";
import masterTokenAPI from "../masterTokenAPI";
async function gameRecruitAPI(
gameTitle,
people,
detail,
itemImage = "",
accountName
) {
try {
const token = await masterTokenAPI();
const itemName = [gameTitle, accountName];
const link = [people, detail, [accountName]];
const response = await axios.post(
"https://api.mandarin.weniv.co.kr/product",
{
product: {
itemName: JSON.stringify(itemName),
price: 1,
link: JSON.stringify(link),
itemImage: itemImage
}
},
{
headers: { Authorization: `Bearer ${token}` }
}
);
return "๊ฒ์ ๋ชจ์ง๊ธ ๊ฒ์๋์์ต๋๋ค!";
} catch (e) {
return false;
}
}
export default gameRecruitAPI;Footer ๋ฏธ๋์ด ์ฟผ๋ฆฌ ์ฝ๋
| ์น ๋ฐ์ํ |
|---|
![]() |
![]() |
- Footer Icon์ ์ ์ํ๋ ์ฝ๋
const menus = [
{ name: "ํ", icon: StyledHomeIcon, path: "/main", id: "home" },
{ name: "๊ฒ์", icon: StyledSearchIcon, path: "/search", id: "search" },
{ name: "์ฑํ
", icon: StyledChatIcon, path: "/chat", id: "chat" },
{ name: "๊ฒ์๊ธ ์์ฑ", icon: StyledWriteIcon, path: "/write", id: "write" },
{
name: "ํ๋กํ",
icon: StyledProfileIcon,
path: `/profile/${myData.accountname}`,
id: "profile"
}
];
const getInitialActive = () => {
const matchedMenu = menus.find((menu) =>
location.pathname.startsWith(menu.path)
);
return matchedMenu ? matchedMenu.id : "profile";
};
const [$active, setActive] = useState(getInitialActive);
return (
<S.FooterContainer>
{menus.map((menu) => {
const Icon = menu.icon;
return (
<S.Item
id={menu.id}
key={menu.id}
onClick={() => {
setActive(menu.id);
navigate(menu.path);
}}
$active={$active === menu.id}>
<Icon $active={$active === menu.id} />
<span>{menu.name}</span>
</S.Item>
);
})}
</S.FooterContainer>
);- ํ๋ฉด ๋๋น์ ๋ฐ๋ผ Footer์ ์์น๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ FooterContainer ์ฝ๋
export const FooterContainer = styled.footer`
display: flex;
justify-content: space-around;
align-items: center;
background-color: #25282d;
position: fixed;
bottom: 0;
left: 0;
width: 100vw;
z-index: 900;
border-top: 1px solid #5c5c5c;
@media screen and (min-width: 768px) {
left: 0;
width: 72px;
height: calc(100vh - 55px);
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 20px;
}
`;- ํ๋ฉด ๋๋น์ ๋ฐ๋ผ Footer Icon์ ๋ฐฐ์น
export const Item = styled.button`
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
padding: 12px 10px 6px 10px;
background: none;
border: none;
cursor: pointer;
color: ${({ $active }) => ($active ? "#5865F2" : "#a4a4a4ff")};
&:hover {
transform: scale(1.2);
}
@media screen and (max-width: 767px) {
${({ id }) =>
id === "search" &&
`
display: none;
`}
}
@media screen and (min-width: 768px) {
font-size: 0px;
flex-direction: row;
align-items: center;
gap: 10px;
height: auto;
padding: 50px 0 0 23px;
position: relative;
span {
position: absolute;
top: 85%;
left: 100%;
transform: translateY(-50%);
opacity: 0;
background: var(--color-purple);
color: white;
border-radius: 4px;
padding: 4px 8px;
font-size: 12px;
white-space: nowrap;
transition: opacity 0.3s ease-in-out;
box-shadow: 0px 0px 8px #ffffff90;
}
&:hover span {
opacity: 1;
}
}
`;์ํ ์์ API์ ํ๊ณ์
๋ฌธ์
์ ๊ณตํด์ฃผ์ ์ํ API๋ฅผ ์ ํ์ฉํ์ฌ ๋ชจ์ง ๊ธฐ๋ฅ์ ๊ตฌํํ์์ง๋ง, ๊ฒ์ ๋ชจ์ง๊ธ ๋ด๋ถ์์ ๋ชจ์ง ์ฐธ์ฌํ๊ธฐ, ๋ ๋๊ธฐ ๊ธฐ๋ฅ๊น์ง ๊ตฌํํ ์๋ ์์์ต๋๋ค. ์๋ ์ํ API๋ ์ํ์ ๋ฑ๋กํ ์ ์ ์ ํ ํฌ๊ฐ์ ํค๋์ ๋ณด๋ด์ค์ผ๋ง ์ ์ ์๋ํฉ๋๋ค. ํ์ง๋ง ์ฐธ์ฌํ๊ฑฐ๋ ๋ ๋๋ ๊ฒ์ ์๋ก ๋ค๋ฅธ ๋ ์ ์ ์ ๊ฒ์๊ธ ์ฌ์ด์์ ์๋ํด์ผํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์, ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์๋ ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ํ์๊ฐ ์์์ต๋๋ค.
ํด๊ฒฐ
์ด๋ฅผ ์ํด์ ๊ฒ์ ๋ชจ์ง๊ธ์ ๊ด๋ฆฌํ๋ ๊ณ์ ์ธ, ๋ง์คํฐ ๊ณ์ ์ ๋ง๋ค๊ณ ๊ฒ์ ๋ชจ์ง, ์์ , ์ญ์ ๊ธฐ๋ฅ ๋ชจ๋ ์ด ๊ณ์ ํ ๊ณณ์์ ๋์ํ๊ฒ ํ์์ต๋๋ค.
์ด๋ค ์ ์ ๊ฐ ๋ชจ์ง์ ํ๋ ๋ง์คํฐ๊ณ์ ์ ํ ํฐ์ ํตํด ๋ชจ์งํ๊ณ , ์์ ํ๊ณ , ์ญ์ ํ๊ฒ ๋ฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ํ API๋ฅผ ํ์ฉํด ๊ฒ์ ๋ชจ์ง๊ณผ ์ฐธ์ฌ, ๋ ๋๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์์ต๋๋ค.
๋ง์คํฐ ๊ณ์ ์ ๋ฑ๋ก๋ ๋ชจ๋ ๋ชจ์ง๊ธ์ ์ํํ๋ฉด์ accountName์ ์ต์ ํํด์ฃผ์ด ์ ์ ๊ฐ accountName์ ์์ ํ์์ ๋ ์๊ธฐ๋ ๋ฒ๊ทธ๋ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
์์ฌ์ด ์
๋ค๋ง ์ฌ๊ธฐ์ ์กฐ๊ธ ์์ฌ์ด ๋ถ๋ถ์ด ์๋ค๋ฉด, API๋ฅผ ์๋ ๋ชฉ์ ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , ๊ฐ์ ๋ง๊ตฌ์ก์ด๋ก ๋ฃ๋ค๋ณด๋ ๊ฒ์ ๋ชจ์ง๊ธ์ด ๋ง์์ง์๋ก ํน์ ์ํฉ์์ ํ๋กํ ์์ ํ๋ ๋ฐ์๋ง 6์ด ์ด์ ์์๋๋ ๋ฑ์ ์ฌ๊ฐํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๊ฒ ๋์์ต๋๋ค.
์ถ๊ฐ ๊ฐ์ ์
์ด๋ฌํ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๋ ์ง๊ธ API๋ฅผ ๊ฐ์กฐํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๊ธฐ์๋ ํ๊ณ๊ฐ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์๋ฃ ํ FireBase๋ AWS Lambda๊ฐ์ ์๋ฒ๋ฆฌ์ค ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ ํฌ๋ง์ API ์๋ฒ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ์ฌ ํด๊ฒฐํด๋ณผ ๊ณํ์ ๋๋ค.
๋ ๋๋ง ์, Footer ๋ฐ์ดํฐ ์์ค ๋ฌธ์
๋ฌธ์
์๋ก๊ณ ์นจ์ ํ๋ฉด Atom์ ๋ฐ์ดํฐ๊ฐ ์ ๋ถ ๋ ์๊ฐ๋ ๋ฌธ์
ํด๊ฒฐ
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ชจ๋ ํ์ด์ง์ ์กด์ฌํ๋ Footer ๋ด๋ถ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์ฝ์ผ ์ฝ๋๋ฅผ ์์ฑํ์๊ณ ์๋ก๊ณ ์นจํ์ฌ๋ Footer์ ๋ฆฌ์ฝ์ผ ์ฝ๋๋ฅผ ํตํด API๋ฅผ ํธ์ถํ๊ณ Atom์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ์ ์ญ์ํ๋ฅผ ์ ์งํ ์ ์์์ต๋๋ค.
์์ฌ์ด ์
ํ์ง๋ง ์ด ๋ํ Footer๊ฐ ์๋ ํ์ด์ง๋ฅผ ์ด๋ํ ๋๋ง๋ค API ํธ์ถ ๋ฐ ๋ฆฌ์ฝ์ผ ๊ฐ ์ ์ฅ ๋ก์ง์ด ์๋ํ์ฌ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๊ฒ ๋์์ต๋๋ค.
์ถ๊ฐ ๊ฐ์ ์
์ด๋ฌํ ์ฑ๋ฅ ๋ฌธ์ ๋ ํ์๋ค๊ณผ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์ ํตํด recoil-persist๋ ์ธ๋ถ API ์ฌ์ฉ ๋ฑ์ ๊ณ ๋ คํด ํด๊ฒฐํด๋ณด๊ณ ์ ํฉ๋๋ค.
๋ฐ์คํ
์ด๋ฒ ํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ํ์ฅ์ผ๋ก์ ํ์ ์ด๋์ด ๋๊ฐ๋ ๋ฆฌ๋์ญ๊ณผ ํ๋ก์ ํธ์ ๋ฐฉํฅ ์ค์ ์ ๋ํด ๋ง์ด ๋ฐฐ์ ์ต๋๋ค. ๋๊ตฌ๋ ํํ๋ก์ ํธ ํ์ ๊ณผ์ ์์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ํ ์ธ์ฌํ ์ฃผ์, ์ปดํฌ๋ํธ์ ์ธ๋ถํ, ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ค์์ฑ์ ์ฒด๊ฐํ ์ ์์์ต๋๋ค. ์๋ฃ์ดํ์ ํ์๋ค๊ณผ ๊ฐ์ ํด์ผํ ๋ถ๋ถ์ ๋ํด ์๋ ผํ๊ณ ๊ฐ๋ฐํ์ฌ ํ๋ก์ ํธ์ ์์ฑ๋๋ฅผ ๋ ๋ํ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ํ๋ฌ์ด๋ผ๋ ์๊ฐ๋์ ํ์ 10์กฐ? ํ์๋ค๊ณผ ํ๋ก์ ํธ๋ฅผ ์งํํด์ ์ฆ๊ฑฐ์ ๊ณ ๋ ธ๋ ฅํด์ฃผ์ ์ ๋๋ฌด ๊ฐ์ฌํฉ๋๋ค.
๋ฐํ์ค
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ ๋ฐ์ ์ธ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ํด ๊ฐ์ ์ก์ ์ ์์์ต๋๋ค. ํนํ githubFlow๋ฅผ ๋ฐ๋ฅด๋ฉฐ ๋์ ์ฒ์์ผ๋ก GitHub๋ฅผ ํ์ ํด๋ก์จ ์ฌ์ฉํด๋ณผ ์ ์์ด ์ข์ ๊ฒฝํ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ์ ๋ง ์ ๊ฒฝ์ธ๊ฒ ๋ง์ ๊ฒ ๊ฐ๊ณ , ์์ง ๊ฐ๊ธธ์ด ๋ฉ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ๋ํ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ํด ๊ฐ์ ์ก๊ณ ์์ ๊ฐ์ ์ป์์ต๋๋ค. ํจ๊ปํ ํ์๋ถ๋ค ๊ณ ์๋ง์ผ์ จ๊ณ ๊ฐ์ฌํฉ๋๋ค.
๋ฐฉํ์ง
์ฒ์ ํ๋ ํ๋ก์ ํธ๋ผ์ ๋ง์ฐํ ๋๋ ค์์ด ์์์ต๋๋ค. ํ์ง๋ง ๋ง์ ์์ํ๊ณ ๋ณด๋ ํ๋ก์ ํธ์ ํ๋ฆ์ ์ตํ๋๊ฐ๋ ๊ณผ์ ์ด ๋งค์ฐ ์ฆ๊ฑฐ์ ๊ณ , ๋ ธ๋ ฅํ๋ฉด ๋ค ํ ์ ์๋ค๋ผ๋ ์์ ๊ฐ์ ์ป๋ ์ข์ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค. ์๋ฃ ํ์๋ ํ์๋ค๊ณผ ๋ ๋์ ์ฝ๋๋ฅผ ๊ณ ๋ฏผํ๊ณ ๊ฐ์ ํ๋ ๊ณผ์ ์ ํตํด ์ฑ์ฅํ๊ณ ์ถ์ต๋๋ค. ํจ๊ป ์๊ณ ํด์ค ํ์๋ถ๋ค๊ป ๊ฐ์ฌํฉ๋๋ค!
์ต์ฐ์
์ฒ์ ๋ฐฐ์ด ๋ฆฌ์กํธ์ ๊นํ๋ธ์ ๋ํด ์กฐ๊ธ์ด๋๋ง ์ต์ํด์ง ์๊ฐ์ด์์ต๋๋ค. ์ฌ์ค ์์ ์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋๋ก ์ํํ์ง ๋ชปํ๊ณ ์ค๋ ฅ๋ ๋ง์ด ๋ถ์กฑํด์ UI๋ ๊ธฐ๋ฅ ๊ตฌํ์ ์์ด์ ์ ์ญํ ์ ์ ํด๋๋ค๊ณ ๋ ์๊ฐํ์ง ์์ง๋ง, ์ข์ ํ์๋ถ๋ค ๋๋ถ์ ํ๋ก์ ํธ ๋ฐํ๊น์ง ๋ง๋ฌด๋ฆฌ ํ ์ ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋ฌ ๋จ์งํ ๊ธฐ๊ฐ๋์ ๊ณ ์ํ๋ ํ์๋ถ๋ค ๋ชจ๋์๊ฒ ๊ฐ์ฌํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค!




















