ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”์Šค ๊ฐœ์ธ ๊ณผ์ œ ํšŒ๊ณ 
    ETC 2022. 2. 24. 19:15

     

    ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•œ ์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”์Šค๋Š” 2022/01/24๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ค‘๊ฐ„์— ์„ค๋‚  ์—ฐํœด๊ฐ€ ๊ปด ์žˆ๋‹ค. ํ•ด์„œ 1์ฃผ์ฐจ ๋ฐฐ์šฐ๊ณ  ํ•œ ์ฃผ๋ฅผ ์‰ด ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐœ์ธ ๊ณผ์ œ๋„ ํ•˜๋‚˜ ์žˆ์—ˆ๋‹ค. ์—ฐํœด์— ๋†€์ง€ ๋ง๊ณ  ๊ณต๋ถ€๋‚˜ ํ•˜์ž ํ•ด์„œ ์‹œ๋„ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์‚ฌ์‹ค ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ, ๋ฆฌ๋•์Šค ๋“ฑ ์—„์ฒญ ๋ฐฐ์šธ ๊ฒŒ ๋งŽ์•˜๋˜ ์ผ์ฃผ์ผ์ด์—ˆ์Œ

     

     

    ๊ธฐ๋Šฅ์€ ์ด ๋งํฌ์— ์žˆ๋Š” ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑฐ์˜€๊ณ , ์ฒ˜์Œ ๋ดค์„ ๋• ์ข€ ์–ด๋ ต๊ฒ ๋Š”๋ฐ? ์‹ถ์—ˆ์œผ๋‚˜ ์€๊ทผ ๋นจ๋ฆฌ ๋๋‚œ ๊ณผ์ œ์˜€๋‹ค.

     

     

     

     

    1. API ์—ฐ๋™

     

    ์‚ฌ์‹ค API ์—ฐ๋™ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ ธ๋‹ค. ๋ฒจ๋กœํผํŠธ ๋ฆฌ์•กํŠธ๋กœ ๋ฆฌ๋•์Šค๋ฅผ ์กฐ๊ธˆ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜์„œ ๊ณผ์ œ์— ๋Œ์ž…ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ฑฐ๊ธฐ์„œ ๋ฐฐ์šด ์ปค์Šคํ…€ ํ›…์„ ์“ฐ๋ ค๋‹ค ๋ญ๊ฐ€ ์ž˜ ์•ˆ ๋˜๋”๋ผ.... 

     

     

     

    ์•„๋ฌดํŠผ API ํ˜ธ์ถœ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. 

    export async function getHome(dispatch) {
      dispatch({ type: "GET_HOME" });
      try {
        const response = await axios.get(
          "https://cdn.ggumim.co.kr/test/image_product_link.json"
        );
        dispatch({ type: "GET_HOME_SUCCESS", data: response.data });
      } catch (e) {
        dispatch({ type: "GET_HOME_ERROR", error: e });
      }
    }
    function Home() {
      const state = useHomeState();
      const dispatch = useHomeDispatch();
    
      const { data: home, loading, error } = state.home;
      useEffect(() => {
        getHome(dispatch);
      }, [dispatch]);
    }

     

    ์š”๋ฒˆ์—๋„ Context API๋กœ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ–ˆ๊ณ , state๋ž‘ dispatch ๋‚˜๋ˆ ์„œ context๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์ด๊ฒŒ ํ›„์— ๋ฆฌ๋•์Šค ๋ฐฐ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋งŽ์ด ๋๋‹ค. ๋ฆฌ๋•์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜์‹œ๋Š”๋ฐ ์กฐ๊ธˆ ์–ด๋ ต๋‹ค ์‹ถ์€ ๋ถ„๋“ค์—๊ฒŒ ์ถ”์ฒœํ•œ๋‹ค. ์ฐธ๊ณ ํ•œ ๋งํฌ์ด๋‹ค.

     

     

     

     

    2. ๊ฐ€๊ตฌ ์ƒ์„ธ ์ •๋ณด ๋ฒ„ํŠผ ๊ตฌํ˜„

     

    ์ƒ์„ธ ์ •๋ณด ๋ฒ„ํŠผ์€ API์— ์ด๋ฏธ์ง€ x, y์ถ• ์ขŒํ‘œ ๊ฐ’์ด ํ•จ๊ป˜ ๋“ค์–ด๊ฐ€ ์žˆ์–ด ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒ„ํŠผ์„ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๋†“์•„์•ผ ํ–ˆ๋‹ค. ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ์™€ ์ขŒํ‘œ ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ฒ˜์Œ์—๋Š” ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ๋ณ€ํ™˜์„ ํ•ด ์ค˜์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ? ํ–ˆ๋Š”๋ฐ ์ด๊ฒŒ ์›ฌ๊ฑธ. ๊ทธ๋ƒฅ position: absolute ์„ค์ •ํ•˜๊ณ  top, left์— ๊ฐ๊ฐ x ์ขŒํ‘œ, y ์ขŒํ‘œ ์ฐ์–ด ์ฃผ๋‹ˆ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ฒ„ํŠผ์„ ๋†“์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

     

    ์ง‘๊พธ๋ฏธ๊ธฐ ์‚ฌ์ดํŠธ์— ๊ฐ€ ๋ณด๋ฉด ์ด๋ฏธ์ง€ ์Šคํƒ€์ผ์€ 800px์œผ๋กœ ๋งž์ถฐ์ ธ ์žˆ๋Š”๋ฐ 800px์œผ๋กœ ์„ค์ •ํ•˜๋‹ˆ ๋‚˜๋Š” ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋ณด์ด๊ธธ๋ž˜ 500px๋กœ ์„ค์ •ํ–ˆ๊ณ , ๊ทธ๋ž˜์„œ์ธ์ง€ ์ž˜ ๋งž์•„๋–จ์–ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.

     

    ๋‹ค๋ฅธ ๋ถ„๋“ค์€ 1.6์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๊ณฑํ•˜์…จ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ทธ๋ถ„๋“ค์€ ์ด๋ฏธ์ง€๋ฅผ 800px๋กœ ๋ Œ๋”๋งํ•˜์‹  ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์›๋ณธ ์ด๋ฏธ์ง€๋Š” 1000px์ธ๋ฐ 800px์— ๋งž์ถ”๋ ค๋ฉด 0.8์ด ์•„๋‹Œ 1.6์„ ๊ณฑํ•ด์•ผ ๋งž์•„ ๋–จ์–ด์ง„๋‹ค๋Š” ๊ฒŒ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ”๋Š”๋ฐ, ์ง€๊ธˆ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ 500์— ์ž˜ ๋งž์•„๋–จ์–ด์กŒ์œผ๋ฉด 1.6์„ ๊ณฑํ•˜๋ฉด 800์— ์ž˜ ๋งž๋Š” ๊ฒฐ๊ณผ์ธ ๊ฒŒ ๋‚ฉ๋“์ด ๊ฐ„๋‹ค. 500*1.6=800์ด๋‹ˆ๊นŒ.... ์• ์ดˆ์— ์ขŒํ‘œ๊ฐ€ 500์— ๋งž์ถฐ์ง„ ์ขŒํ‘œ์˜€๋‚˜ ๋ณด๋‹ค. 

     

    // ๋ฒ„ํŠผ ์Šคํƒ€์ผ ์ฝ”๋“œ ์ผ๋ถ€
    const Button = styled.button`
      ${(props) =>
        css`
          top: ${props.x}px;
          left: ${props.y}px;
        `}
    `;

     

     

     

     

    3. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๊ฐ€๊ตฌ ์ƒ์„ธ ๋…ธ์ถœ

     

    ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ฐ€๊ตฌ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํˆดํŒ์œผ๋กœ ๋ณด์—ฌ ์ค€๋‹ค.
    ๋‹ค๋ฅธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ƒˆ๋กœ์šด ํˆดํŒ์ด ๋ณด์ด๊ณ  ์—ด๋ ค ์žˆ๋˜ ํˆดํŒ์€ ๋‹ซ์•„ ์ค˜์•ผ ํ•œ๋‹ค.
    ๋™์‹œ์— ๋ฐ‘์— ๋ Œ๋”๋งํ•œ ๊ฐ€๊ตฌ ๋ชฉ๋ก์— ํ˜„์žฌ ์„ ํƒํ•œ ๊ฐ€๊ตฌ๋Š” ํ‘œ์‹œ๋ฅผ ํ•ด์ค€๋‹ค.

     

    ๊ณผ์ œ๋ฅผ ์ฒ˜์Œ ๋ดค์„ ๋•Œ ์–ด๋ ต๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‹ค. ๊ทธ์น˜๋งŒ ๊ฒ€์ƒ‰ํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์„๊นŒ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋ฉด์„œ okky ์‚ฌ์ดํŠธ์—์„œ ํžŒํŠธ๋ฅผ ์–ป์—ˆ๋‹ค. ํด๋ฆญํ•œ ๊ฐ€๊ตฌ์˜ id๋ฅผ ์ €์žฅํ•ด id๊ฐ€ ์ผ์น˜ํ•˜๋ฉด active ํด๋ž˜์Šค๋ฅผ ๋ถ€์—ฌํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

     

     

     

    ๋‹๋ณด๊ธฐ ๋ฒ„ํŠผ๊ณผ ๊ฐ€๊ตฌ ๋ชฉ๋ก์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ฆญํ•œ ๊ฐ€๊ตฌ์˜ id๋ฅผ ์ €์žฅํ•˜๋Š” FurnitureIdx๋ฅผ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค.

    const FurnitureIdxContext = createContext(null);
    
    export function FurnitureProvider({ children }) {
      const [clickIdx, setClickIdx] = useState("0");
      return (
        <FurnitureIdxContext.Provider value={{ clickIdx, setClickIdx }}>
          {children}
        </FurnitureIdxContext.Provider>
      );
    }
    
    export function useFurnitureIdx() {
      const idx = useContext(FurnitureIdxContext);
      if (!idx) {
        throw new Error("Cannot find FurnitureProvider");
      }
      return idx;
    }

     

     

     

     

    const { clickIdx, setClickIdx } = useFurnitureIdx();
    
      const onClick = (e) => {
        setClickIdx(e.target.id);
        if (clickIdx === id.toString()) {
          setClickIdx("0");
        }
      };
      
    // ๋ฒ„ํŠผ ์ด๋ฏธ์ง€ ์„ค์ •
    <Button
        backgroundImg={clickIdx === id.toString() ? X_BUTTON : MAGNIFYING_GLASS}
    />

    ๊ทธ๋ฆฌ๊ณ  ํด๋ฆญํ•˜๋ฉด ์Šคํƒ€์ผ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋„๋ก ์ด๋Ÿฐ ์‹์œผ๋กœ img๋ฅผ ๋ฐ”๊ฟ” ์ค€๋‹ค๋“ ๊ฐ€, class ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค. 

     

     

    ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ํˆดํŒ๊ณผ ๊ฐ€๊ตฌ ๋ชฉ๋ก ๋™์‹œ์— ํšจ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ๋„ฃ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค~

     

     

     

     

    ํšŒ๊ณ ๋ฅผ ๋งˆ์น˜๋ฉฐ

    ์ƒ๊ฐ๋ณด๋‹ค ๋น ๋ฅธ ์‹œ๊ฐ„ ์•ˆ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ณผ์ œ๊ธฐ์— ๋ญ๋“  ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ž์‹ ๊ฐ์ด ๋ถ™์€ ๊ณ„๊ธฐ๊ฐ€ ๋œ ๊ณผ์ œ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์–ด๋ ค์›Œ ๋ณด์ด๋Š” ๊ณผ์ œ๋”๋ผ๋„ ์ž์‹ ๊ฐ์„ ํ’€ ์ถฉ์ „ํ•œ ์ž์„ธ๋กœ ์ž„ํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ์•„๋ฌด๋„ ๋ง‰์ง€ ๋ชปํ•˜๋Š” ์ฝ”๋”ฉ ์ „์‚ฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ์„.......

     

     

    ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ styled-component๋ฅผ ์ฒ˜์Œ ์จ ๋ดค๋Š”๋ฐ ์šฐ์„  JS ํŒŒ์ผ์— ํ•จ๊ป˜ css ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ๊ต‰์žฅํžˆ ํŽธํ–ˆ๊ณ  ๊ทธ ์™ธ์—๋„ css์™€ ๋‹ฌ๋ฆฌ ์ค‘์ฒฉ ํ˜•ํƒœ๋กœ ์Šคํƒ€์ผ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋“ ๊ฐ€, ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด ๊ทธ์— ๋งž๋„๋ก ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•„์ฃผ ์‹ ์„ธ๊ณ„์˜€๋‹ค. css๋งŒ ์ผ๋˜ ๋‚˜์˜ ๊ณผ๊ฑฐ๋ฅผ ๋ฐ˜์„ฑํ–ˆ์Œ. ์•„์ง css๋งŒ ์“ฐ๋Š” ๋ถ„ ๊ณ„์‹œ๋ฉด ์–ด์„œ ๊ฐˆ์•„ํƒ€์„ธ์šฉ. ๊ทผ๋ฐ ๋‚˜๋งŒ ๊ทธ๋žฌ์„ ๋“ฏ.

     

     

     

    ์ „์ฒด ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”. ๐Ÿฅฐ

     

    GitHub - ttaerrim/home-ggumim: ์ง‘๊พธ๋ฏธ๊ธฐ ํด๋ก  ๊ณผ์ œ๊ฐ€ ๋‹ด๊ธด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค

    ์ง‘๊พธ๋ฏธ๊ธฐ ํด๋ก  ๊ณผ์ œ๊ฐ€ ๋‹ด๊ธด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. Contribute to ttaerrim/home-ggumim development by creating an account on GitHub.

    github.com

     

    ๋Œ“๊ธ€

Designed by Tistory.