ํฐ์คํ ๋ฆฌ ๋ทฐ
2025.02.14 (๊ธ) Works
1. DB ๋ฐ์ดํฐ ๋๊ธฐํ & Home ๊ฒ์๊ธ ๋ถ๋ฌ์ค๊ธฐ (props ์ ๋ฌ)
2. ๊ฒ์๊ธ ์ถ๊ฐ ๋ฒํผ
3. Layout ์์ ๋ฐ ํ์ด์ง ์ฐ๊ฒฐ(Link)
DB ๋ฐ์ดํฐ ๋๊ธฐํ

๐์์ ๋ด์ฉ 1
- HomeContext ์์ฑํ์ฌ App ์ต์์์ ์ ์ฉ
- supabase์์ posts ํ ์ด๋ธ์ ๊ฐ์ ๊ฐ์ ธ์ด
- posts ๋ฐฐ์ด์ state๋ก ๊ด๋ฆฌํจ
- value๋ก posts ๋ฐฐ์ด ๋ด๋ ค์ค
- HomePostCard ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
- users, comments ํ ์ด๋ธ์ ๊ฐ์ ๊ฐ์ ธ์ด
- users, comments ๋ฐฐ์ด์ state๋ก ๊ด๋ฆฌํจ
- card ์๋จ user profile ๊ฐ์ ์ถ๋ ฅํจ (setUserProfile ํจ์)
- card ํ๋จ comments ๊ฐ์ ์ถ๋ ฅํจ (setComment ํจ์)
- posts, users, comments ํ ์ด๋ธ์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ ์ถ๋ ฅ
- ๋ก๊ทธ์ธ, ์์ธํ์ด์ง ์ด๋ ๊ตฌํ
- Link ํ๊ทธ ์ฌ์ฉ
- ์์ด์ฝ ์ด๋ฏธ์ง ์ถ๋ ฅ
- ์ด๋ฏธ์งํ์ผ import, src์ ๋ณ์ ๋ฃ์ด์ฃผ๊ธฐ
2. HomePostCard ์ปดํฌ๋ํธ ๋ถ๋ฆฌ
// Home.jsx (๋ก์ง ๋จ์ํ)
{posts.map(post => {
return (
<HomePostCard post={post} />
);
})}
๐ Context๋ก ๋ฐ์ ๊ฐ ์ธ์๋ map์ ํตํด ๋๊ฒจ์ค์ผ ํ๋ ๊ฐ์ ์ง์ props๋ก ์ ๋ฌํ๊ธฐ !
// HomePostCard.jsx
// card ๋ด user ์ ๋ณด ๋ํ๋ด๊ธฐ
const setUserProfile = post => {
const a = users.find(user => post.uid === user.uid);
if (!a) return null; ๐๐ป user์ ์ ๋ณด๊ฐ ์์ ์ null์ return
return (
<StCardTextWrap key={a.uid}>
<StNickName>{a.nickname}</StNickName>
<StMbti>{a.mbti}</StMbti>
</StCardTextWrap>
);
};
// comments ๋ํ๋ด๊ธฐ
const setComment = post => {
const b = comments.find(comment => post.post_id === comment.post_id);
if (!b) return null;
return <div key={b.post_id}>{b.content}</div>;
};
return (
<>
<StHomeCard>
<StCardTop>
<StProfileImg />
<div>{setUserProfile(post)}</div> โญ๏ธ
</StCardTop>
<StPostImg />
<StIcons>
<img src={CommentIcon} alt="comment img" />
<img src={HeartIcon} alt="heart img" />
</StIcons>
<StComents>{setComment(post)}</StComents> โญ๏ธ
</StHomeCard>
</>
);
};
โญ๏ธ
ํจ์ ์์ฒด๋ jsx ํ์ผ์์ ์ถ๋ ฅ ๋ถ๊ฐ => div๋ก ๊ฐ์ธ๊ธฐ
props๋ก ๋ฐ์ post์ ๊ฐ์ ์ธ์๋ก ์ค
5. ์์ด์ฝ ์ด๋ฏธ์ง ์ถ๋ ฅ

assets ํด๋์ ๋ชจ์ ๋ ์์ด์ฝ png ํ์ผ๋ค
์ด์ ์๋ img ํ๊ทธ์ src="{์ด๋ฏธ์ง๊ฒฝ๋ก}" ๋ก ์ ๋ ฅํ์ง๋ง, ์๋ก์ด ๋ฐฉ์์ ์์๋๋ค.
๋ฐ๋ก import๋ก ๊ฐ์ ธ์ค๊ธฐ!
๋ก์ง ์๋จ์ ๋ณ์๋ฅผ ์ ์ธํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ค๊ณ
ํ๋จ img ํ๊ทธ ๋ด src์ { ๋ณ์๋ช } ์ผ๋ก ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
// HomePostCard.jsx
import CommentIcon from "../assets/icon_comment.png";
import HeartIcon from "../assets/icon_heart_fill.png";
...
<StIcons>
<img src={CommentIcon} alt="comment img" />
<img src={HeartIcon} alt="heart img" />
</StIcons>
๊ฒ์๊ธ ์ถ๊ฐ ๋ฒํผ
์ฌ๋ฌ ํ์ด์ง์์ ์ฐ์ด๋ ๋ก์ง์ ๊ณตํต ์ปดํฌ๋ํธ๋ก ๋ง๋ค๊ธฐ๋ก ํ๋ค.
๊ทธ ์ค ๋๋ '๋ก๊ทธ์ธ ์ ๋ณด์ด๋ ๊ฒ์๊ธ ์ถ๊ฐ ๋ฒํผ(ํ, ๋ง์ดํ์ด์ง)' ์ ๋ง๋ค๊ฒ ๋์๋ค.

์คํฌ๋กค ์์๋ ๊ฐ์ ์๋ฆฌ์ ๊ณ ์ ๋๊ฒ ํ๊ธฐ ์ํด 'position : fixed;' ๋ฅผ ์ฌ์ฉํ๋ค.
// ADDPostButton.jsx
import React from "react";
import { Link } from "react-router-dom";
import styled from "styled-components";
import AddBtn from "../assets/icon_add_white.png";
const AddPostButton = () => {
return (
<>
<Link
to={"/posting"}
style={{ textDecoration: "none", color: "inherit" }}
>
<StAddBtn>
<img src={AddBtn} />
</StAddBtn>
</Link>
</>
);
};
export default AddPostButton;
const StAddBtn = styled.div`
position: fixed;
top: 80%;
right: 5%;
font-weight: 200;
font-size: 250%;
display: flex;
justify-content: center;
align-items: center;
width: 70px;
height: 70px;
color: white;
background-color: #005eff;
border-radius: 70%;
`;
Layout ์์ ๋ฐ ํ์ด์ง ์ฐ๊ฒฐ
๋ค๋ฅธ ํ์๋ถ์ ๊ณตํต ์ปดํฌ๋ํธ๋ก ํค๋๋ฅผ ๋ง๋์ ์ ๋ด๊ฐ ์์๋ก ๋ง๋ ํค๋๋ฅผ ์์ ํ๋ค.

- ๋ก๊ทธ์ธ ์กฐ๊ฑด๋ถ ๋ฒํผ(๋ก๊ทธ์์: ๋ก๊ทธ์ธ/ํ์๊ฐ์ , ๋ก๊ทธ์ธ: ๋ก๊ทธ์์/๋ง์ดํ์ด์ง)
- ๋ฒํผ ํด๋ฆญ ์ ํ์ด์ง ์ด๋
- ์นด๋ ํด๋ฆญ ์ ํ์ด์ง ์ด๋ -> ์ถํ ๋ชจ๋ฌ์ฐฝ ๋์ฐ๊ธฐ๋ก ๋ณ๋ ์์
์์ง ์์ ํ ๋ถ๋ถ์ด ๋ง์ง๋ง.. ์ค๊ฐ ๊ณผ์ ์์์ ๊ธฐ๋กํด๋ณธ๋ค.
'Forntend > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [NewsFeed-Day 5] data ํํฐ๋งํ๊ธฐ(๊ฒ์์ด ๋ฐ ์นดํ ๊ณ ๋ฆฌ) (0) | 2025.02.17 |
|---|---|
| [NewsFeed-Day 4] Modal ์ฐ๊ฒฐ (0) | 2025.02.15 |
| [NewsFeed-Day 2] supabase ๊ฐ ์ก๊ธฐ (0) | 2025.02.14 |
| ๊ตฌ์กฐ๋ถํดํ ๋น (Context ์ฌ์ฉ ์์) (0) | 2025.02.10 |
| TIL | 09 (0) | 2025.01.24 |