ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

2025.02.14 (๊ธˆ) Works

 

1. DB ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” & Home ๊ฒŒ์‹œ๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (props ์ „๋‹ฌ)

2. ๊ฒŒ์‹œ๊ธ€ ์ถ”๊ฐ€ ๋ฒ„ํŠผ

3. Layout ์ˆ˜์ • ๋ฐ ํŽ˜์ด์ง€ ์—ฐ๊ฒฐ(Link)

 

 

DB ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”

 

 

 

 

๐Ÿ“์ž‘์—… ๋‚ด์šฉ 1

  1. HomeContext ์ž‘์„ฑํ•˜์—ฌ App ์ตœ์ƒ์œ„์— ์ ์šฉ
    • supabase์—์„œ posts ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
    • posts ๋ฐฐ์—ด์„ state๋กœ ๊ด€๋ฆฌํ•จ
    • value๋กœ posts ๋ฐฐ์—ด ๋‚ด๋ ค์คŒ
  2. HomePostCard ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ
    • users, comments ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
    • users, comments ๋ฐฐ์—ด์„ state๋กœ ๊ด€๋ฆฌํ•จ
    • card ์ƒ๋‹จ user profile ๊ฐ’์„ ์ถœ๋ ฅํ•จ (setUserProfile ํ•จ์ˆ˜)
    • card ํ•˜๋‹จ comments ๊ฐ’์„ ์ถœ๋ ฅํ•จ (setComment ํ•จ์ˆ˜)
  3. posts, users, comments ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
  4. ๋กœ๊ทธ์ธ, ์ƒ์„ธํŽ˜์ด์ง€ ์ด๋™ ๊ตฌํ˜„
    • Link ํƒœ๊ทธ ์‚ฌ์šฉ
  5. ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ
    • ์ด๋ฏธ์ง€ํŒŒ์ผ 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 ์ˆ˜์ • ๋ฐ ํŽ˜์ด์ง€ ์—ฐ๊ฒฐ

 

๋‹ค๋ฅธ ํŒ€์›๋ถ„์€ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋กœ ํ—ค๋”๋ฅผ ๋งŒ๋“œ์…”์„œ ๋‚ด๊ฐ€ ์ž„์‹œ๋กœ ๋งŒ๋“  ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

  • ๋กœ๊ทธ์ธ ์กฐ๊ฑด๋ถ€ ๋ฒ„ํŠผ(๋กœ๊ทธ์•„์›ƒ: ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…,  ๋กœ๊ทธ์ธ: ๋กœ๊ทธ์•„์›ƒ/๋งˆ์ดํŽ˜์ด์ง€)
  • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํŽ˜์ด์ง€ ์ด๋™
  • ์นด๋“œ ํด๋ฆญ ์‹œ ํŽ˜์ด์ง€ ์ด๋™ -> ์ถ”ํ›„ ๋ชจ๋‹ฌ์ฐฝ ๋„์šฐ๊ธฐ๋กœ ๋ณ€๋™ ์˜ˆ์ •

 

์•„์ง ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์ด ๋งŽ์ง€๋งŒ.. ์ค‘๊ฐ„ ๊ณผ์ • ์˜์ƒ์„ ๊ธฐ๋กํ•ด๋ณธ๋‹ค.

 

๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ