๐ŸŒˆ[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค ํšŒ๊ณ  (3)

์ž„์ง€์„ ยท2023๋…„ 9์›” 6์ผ
1

๐Ÿ€๊ณผ์ œ1. ์˜ํ™” ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ

โญ ๊ณผ์ œ ๋‚ด์šฉ

  • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•ด ์˜ํ™”๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
const handleSearch = () => {
  localStorage.setItem("keyword", keyword.value);
    let str = keyword.value.toLowerCase();
  str = str.trim();
  if (keyword.value) store.getAllMovies(str);
};
  • ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์˜ํ™”์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
<template>
  <main>
    <IsLoading v-if="moviesStore.isLoading" />
    <article class="lg:flex lg:gap-5 lg:justify-between lg:items-center">
      <div
        class="w-full h-64 rounded-md overflow-hidden md:h-80 lg:w-6/12 lg:h-96"
      >
        <img
          :src="moviesStore.movie.Poster"
          class="w-full h-full object-cover"
          :alt="moviesStore.movie.Title"
        />
      </div>
      <div class="my-5 lg:w-5/12 lg:mt-0">
        <p
          class="
            text-gray-400
            font-light
            text-xs
            mt-2
            tracking-wider
            md:text-sm
          "
        >
          {{ moviesStore.movie.Genre }}
        </p>

        <h3
          class="
            my-8
            font-medium
            text-lg text-gray-200
            tracking-wider
            md:text-2xl
          "
        >
          {{ moviesStore.movie.Title }}
        </h3>
        <div
          class="
            flex
            justify-between
            items-center
            flex-wrap
            gap-2
            md:justify-start md:gap-14
          "
        >
          <div class="flex items-center text-gray-400 font-light text-sm">
            <CalendarIcon />

            {{ moviesStore.movie.Released }}
          </div>

          <div class="flex items-center text-gray-400 font-light text-sm">
            <TimeIcon />

            {{ moviesStore.movie.Runtime }}
          </div>

          <div class="flex items-center text-gray-400 font-light text-sm">
            <LocationIcon />

            {{ moviesStore.movie.Country }}
          </div>
        </div>
        <div class="flex items-center text-gray-400 font-light text-sm my-8">
          <StarIcon />

          {{ moviesStore.movie.imdbRating }} -
          {{ moviesStore.movie.imdbVotes }} Votes
        </div>

        <p
          class="
            text-gray-300 text-justify
            tracking-wider
            text-sm
            font-light
            md:tracking-widest
          "
        >
          {{ moviesStore.movie.Plot }}
        </p>
      </div>
    </article>
  </main>
</template>
  • api ํ‚ค๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค. (์‹คํŒจ)
//const API_END_POINT = process.env.VUE_APP_API_END_POINT;
//const API_KEY = process.env.VUE_APP_API_KEY;

โญ ๊ณผ์ œ ํ›„๊ธฐ

vue๋Š” ์ฒ˜์Œ ์ ‘ํ•ด๋ณด๋Š” ๊ฑฐ๋ผ์„œ ๋งŽ์ด ๋‚ฏ์„ค์—ˆ๋Š”๋ฐ ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ vue๋ฅผ ์ œ๋Œ€๋กœ ๋‹ค๋ฃจ์ง€ ๋ชปํ•œ ์ฑ„ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ์— ๋งŽ์ด ๊ธ‰๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ vue์™€ ์นœํ•ด์ง€๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„์ด ๋” ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ์—๋Š” ์˜ํ™” api๋ฅผ ๊ฐ€์ง€๊ณ  ์ œ์ž‘์„ ํ•ด๋ดค๋Š”๋ฐ ์žฌ๋ฏธ์žˆ๋Š” api๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“œ๋Š” ๋ฐ์— ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— tailwind๋„ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ class name์— style์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์‹ ๊ธฐํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
ํ•œ ๊ฐ€์ง€ ์•„์‰ฌ์› ๋˜ ์ ์€ api ํ‚ค๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐ ์‹คํŒจํ•œ ๊ฒƒ์ธ๋ฐ ์ด ๋ถ€๋ถ„์€ ์ข€ ๋” ๊ณต๋ถ€๋ฅผ ํ•ด๋ด์•ผ๊ฒ ๋‹ค ใ… ใ… 




๐Ÿ€๊ณผ์ œ2. ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„

๋ฐฐํฌ๋งํฌ

โญ ๊ณผ์ œ ๋‚ด์šฉ

  • url์ด ๋ฐ”๋€Œ๋ฉด ์•ˆ๋œ๋‹ค.
return (
    <div className='pageContainer'>
      <Header />
      <Image src={src} alt={name} />
      <Text {...CommandText} />
      <Text {...NameText} />
      <Text {...PrizeText} />
      <Button onClick={() => deleteValue()}>
        <Text {...BackButton} />
      </Button>
  	</div>
);
...์ƒ๋žต

<div className="appContainer">
  {typeof currentPageId === 'number' && <Page {...historyValue}></Page>}
</div>
...์ƒ๋žต  

โญ ๊ณผ์ œ ํ›„๊ธฐ

ํ‰์†Œ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋ฉด url์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ์— url์ด ํ•ญ์ƒ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค๋Š” ํŽธ๊ฒฌ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ url์ด ๋ฐ”๋€Œ์ง€ ์•Š์€ ์ฑ„๋กœ๋„ ํŽ˜์ด์ง€ ์ด๋™์ด ๊ฐ€๋Šฅํ–ˆ๊ณ , ์ด๋ฒˆ์—๋Š” ๊ทธ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ฒ˜์Œ ํŽ˜์ด์ง€ ์ด๋™๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์•„ ๊ณ ๋ฏผํ•˜๋˜ ์ค‘ ์›ํ”ผ์Šค ํฌ์Šคํ„ฐ๊ฐ€ ์ƒ๊ฐ๋‚ฌ๊ณ , ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ํŽ˜์ด์ง€ ํ…œํ”Œ๋ฆฟ์„ ์›ํ”ผ์Šค ํฌ์Šคํ„ฐ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. ํŒ€์›๋“ค์˜ ์‚ฌ์ง„๊ณผ ํ˜„์ƒ๊ธˆ, ์ด๋ฆ„ ๋“ฑ์„ ๋ฐ์ดํ„ฐ๋กœ ์ •๋ฆฌํ•œ ๋’ค, ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ ๊ฐ’๋งŒ ๋ฐ”๋€Œ๋„๋ก ์„ค์ •ํ–ˆ์œผ๋ฉฐ, ๋งŒ์•ฝ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์ด ๋‹ค ๋‹ฌ๋ž๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ๋ฐ”๋€Œ๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์ด ๊ณผ์ œ ์—ญ์‹œ ์•„์‰ฌ์šด ์ ์ด ์žˆ๋‹ค๋ฉด ํŠธ๋žœ์ง€์…˜์„ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ข€ ๋” ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ๋„ฃ์–ด ์ง„์งœ ํฌ์Šคํ„ฐ๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค๋ž€ ์•„์‰ฌ์›€์ด ์žˆ๋‹ค.




๐Ÿ€๋ฐ˜์„ฑ & ๋ชฉํ‘œ

โญ ๋ฐ˜์„ฑ

7์›” ํšŒ๊ณ  ๋•Œ ์„ธ์› ๋˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • ๊ณผ์ œ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฐ”๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ๋ง๊ณ , ๋จผ์ € ์šฐ์„ ์ˆœ์œ„์™€ ๊ตฌํ˜„์ˆœ์„œ ๋ฐ ๊ธฐ๋Šฅ์˜ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•ด์•ผ ๊ฒ ๋‹ค.
  • ๋ˆ„๊ตฌ๋“ ์ง€ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ ์˜๋ฌธ์ ๋ณด๋‹ค๋Š” ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‰ฝ๊ฒŒ ์งœ์•ผ๊ฒ ๋‹ค.
  • javascript ํ™•์‹คํ•˜๊ฒŒ ์žก๊ณ  ๊ฐ€์•ผ๊ฒ ๋‹ค.

์ด ๋ฆฌ์ŠคํŠธ์—์„œ ๋‹ฌ์„ฑํ•œ ๊ฒƒ์€ 1๊ฐ€์ง€ ๋ฐ˜ ์ •๋„ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋จผ์ € ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์งœ๋Š” ๊ฒƒ์ธ๋ฐ, ์ด ๋ถ€๋ถ„์€ ๋งŽ์ด ๊ฐœ์„ ๋˜์—ˆ์Œ์„ ๋А๊ผˆ๋‹ค. ์ฝ”๋“œ ๋ฆฌ๋ทฐํ•˜๊ธฐ ์ „์— ์ตœ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด์„œ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๊ณ ์ž ๋…ธ๋ ฅํ–ˆ์œผ๋ฉฐ, ๋ณ€์ˆ˜๋ช…์ด๋‚˜ ํŒŒ์ผ๋ช… ๋“ฑ ๋„ค์ด๋ฐ์— ์‹ ๊ฒฝ์„ ๋งŽ์ด ์“ฐ๊ณ ์ž ํ–ˆ๋‹ค. ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋ฉด์„œ ๋งŽ์ด ๊ฐœ์„ ๋จ์„ ๋А๊ผˆ๊ณ , ์šฐ์„ ์ˆœ์œ„์™€ ๊ตฌํ˜„์ˆœ์„œ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•œ ๋’ค ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ์Šต๊ด€์œผ๋กœ ์ด์–ด์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„์ง ๋งŽ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ, ์ ์  ๋จผ์ € ๊ณ„ํš์„ ์ˆ˜๋ฆฝํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๋ฐ ์ต์ˆ™ํ•ด์ง€๊ณ ์ž ๋…ธ๋ ฅํ•˜๋Š” ์ค‘์ด๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ js๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ์žก๊ณ  ๊ฐ€๊ธฐ๋กœ ํ–ˆ๋Š”๋ฐ ์ด๋Š” ์ง€์ผœ์ง€์ง€ ๋ชปํ•ด ๋งŽ์€ ์•„์‰ฌ์›€์„ ๋А๊ผˆ๋‹ค. vue์™€ react์—๋งŒ ์ง‘์ค‘ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„ ์ˆœ์ˆ˜ js๋„ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์•ผ ํ•จ์„ ๋А๋ผ๋ฉฐ ๋ฐ˜์„ฑํ•œ๋‹ค.

โญ ๋ชฉํ‘œ

  • Next.js ๊ณต๋ถ€ํ•˜๊ธฐ
  • ํ”„๋กœ์ ํŠธํ•˜๋ฉด์„œ ๋ฆฌํŒฉํ† ๋ง ๋งŽ์ด ํ•˜๊ธฐ
  • ๊นƒํ—ˆ๋ธŒ์™€ ์นœํ•ด์ง€๊ธฐ(๊นƒํ—ˆ๋ธŒ ์ด์Šˆ ๊ด€๋ฆฌ ๋ฐ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ, merge conflict ๋“ฑ)
profile
์„ฑ์žฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 9์›” 7์ผ

๋„ค๋น„๊ฒŒ์ด์…˜ ๋„ˆ๋ฌด ๊น”๋”ํ•˜๊ณ  ๊ท€์—ฝ๋„ค์š”ใ…Žใ…Ž ์ด๋ฒˆ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋”์šฑ ์„ฑ์žฅํ•  ์ง€์„ ๋‹˜์ด ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค ๐Ÿ˜†

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ