โœ๏ธ TIL

์œ ๋ฐ๋ฏธ ์ทจ์—…๋ถ€ํŠธ์บ ํ”„ - ํ”„๋ก ํŠธ์—”๋“œ&๋ฐฑ์—”๋“œ : 31์ผ์ฐจ TIL

Yuuuki 2024. 1. 26. 16:08

โœจํ˜„์žฅ์ˆ˜์—… 1์ผ์ฐจ

๐Ÿ™Œ๐Ÿป Javascript

 

 

SEO

SEO๋Š” "Search Engine Optimization"์˜ ์•ฝ์ž๋กœ, ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ์›น์‚ฌ์ดํŠธ๊ฐ€ ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ๋†’์€ ์ˆœ์œ„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„์€ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ ๋†’์€ ์›นํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ์ค€์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘‰๐Ÿป h1 ํƒœ๊ทธ๋Š” ํ•œ ํŽ˜์ด์ง€๋‹น 1๊ฐœ์”ฉ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ‘‰๐Ÿป imgํƒœ๊ทธ์˜ alt๋Š” next.js์—์„œ ์—๋Ÿฌ์˜ ์›์ธ์ด ๋ ์ˆ˜ ์žˆ๊ณ , ์ ‘๊ทผ์„ฑ SEO์ ์ˆ˜์—์„œ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๐Ÿ‘‰๐Ÿป ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ ๋˜ํ•œ SEO ์ตœ์ ํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

 

 

 

์ฒซ ํ˜„์žฅ๊ฐ•์˜ ์‹ค์Šต์ด์˜€๋‹ค! 

์งง์€ ์‹œ๊ฐ„๋‚ด์— ๋™์ผํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋А๋ผ ์ข€ ํž˜๋“ค์—ˆ์ง€๋งŒ

๋‹คํ–‰ํžˆ ์ œ์‹œ๊ฐ„ ๋‚ด์— ์™„์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฒซ ํƒ€์ž„์–ดํƒ์ด๋ผ ๋‘๊ทผ๋‘๊ทผํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค..

 

.main-reply button {
  width: 80px;
  margin-top: 16px;
  align-self: flex-end;
  /* margin-left: auto; */
}

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ ๋ฒ„ํŠผ์„ ์˜ค๋ฅธ์ชฝ๋ฐฐ์น˜ ํ•ด์•ผํ•˜์ง€๋งŒ, ๋‹น์—ฐํžˆ align-item์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ์ง€? ํ•˜๊ณ ์žˆ์—ˆ๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ์—†์–ด ๊ต‰์žฅํžˆ ๋‹นํ™ฉํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ align-self๋ฅผ ํ•ด๋ณผ๊นŒ..? ํ–ˆ๋”๋‹ˆ ์ด์ œ์„œ์•ผ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์น˜๋กœ ์ ์šฉ๋˜์—ˆ๋‹ค..

 

align-item VS align-self

 

align-items:

  • ์ ์šฉ ๋Œ€์ƒ: ๋ถ€๋ชจ ์š”์†Œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ์ : ๋ถ€๋ชจ ์š”์†Œ ๋‚ด์˜ ๋ชจ๋“  ์ž์‹ ์š”์†Œ์— ๋Œ€ํ•ด ์ˆ˜์ง(์„ธ๋กœ) ์ •๋ ฌ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

align-self:

  • ์ ์šฉ ๋Œ€์ƒ: ์ž์‹ ์š”์†Œ์— ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชฉ์ : ํŠน์ • ์ž์‹ ์š”์†Œ์— ๋Œ€ํ•ด ๋ถ€๋ชจ์˜ align-items ์†์„ฑ๊ณผ๋Š” ๋‹ค๋ฅธ ์ˆ˜์ง ์ •๋ ฌ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

.main-reply button {
  width: 80px;
  margin-top: 16px;
  margin-left: auto;
}
๐Ÿ’ก margin-left: auto;๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฒ•์ด ์žˆ๋‹ค๊ณ  ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค.

 

์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ ์ƒ๊ฐํ•ด๋ณธ์ ์ด ์—†์—ˆ๋Š”๋ฐ left๋ฅผ auto๋กœ ์ง€์ •ํ•˜๋ฉด, ๋ฒ„ํŠผ์˜ ํฌ๊ธฐ๋ฅผ ์ œ์™ธํ•œ ์—ฌ๋ฐฑ์ด ์ž๋™์œผ๋กœ ์ˆ˜ํ‰๋„ˆ๋น„๋ฅผ ๊ฐ€๋“์ฑ„์šฐ๋ฉด์„œ, ์ญ‰ ๋Š˜์–ด์ ธ์„œ ๋งจ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฐฐ์น˜๊ฐ€ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค!

 

 

 

 

this -> ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์œผ๋กœ ๊ฒฐ์ •

์ฝ˜์†”๋กœ๊ทธ์—์„œ thiS๋Š” ์ „์—ญwindpw, global

 

โœจ ํ™”์‚ดํ‘œํ•จ์ˆ˜๋Š” this๊ฐ€ ๊ฐ์ฒด๋กœ ๊ณ ์ •์ด๋œ๋‹ค????

 

JSON

JSON์˜ ์ž๋ฃŒํ˜•์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๋ผ๊ณ  ๊ฐ•์‚ฌ๋‹˜์ด ์งˆ๋ฌธ์„ ํ•˜์…จ์„๋•Œ

object๋ผ๋Š” ๋‹ค์ˆ˜์˜ ๋‹ต๋ณ€์ด ๋‚˜์™”์ง€๋งŒ json์€ objectํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ text์ด๋‹ค.

 

text๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด์—์„œ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, JS์˜ ํŠน์ˆ˜ํ•œ object์˜ ๊ฒฝ์šฐ๋ผ๋ฉด, ์ „๋‹ฌ์— ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•˜์…จ๋‹ค.

 

 

 

Promise

์š”์ฒญํ•œ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ›์œผ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ด๋ ‡๊ฒŒ ํ•ด์ค„๊ฒŒ, ์‹คํŒจํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ํ•ด์ค„๊ฒŒ ๋ง๊ทธ๋Œ€๋กœ ํ”„๋กœ๋ฏธ์Šค๋Š” ์•ฝ์†์ด๋‹ค

const a = (callback) => {
  setTimeout(() => {
    console.log(1);
    callback();
  }, 1000);
};

const b = () => console.log(2);

a(() => {
  b();
});

 

์ด ์ฝ”๋“œ๋ฅผ Promise๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž.

const a = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(1);
      resolve();
    }, 1000);
  });
};

const b = () => console.log(2);

a().then(() => b());


// a(() => {
//   b();
// });

a์˜ ํ•จ์ˆ˜๋Š” promise์˜ ๊ฐ์ฒด๋ฅผ returnํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ ,

then์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜(b)๋Š” resolve์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋“ค์–ด๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, then์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค

 

โœจresolve๋Š” ๊ธฐ์กด์˜ callback ์ฝ”๋“œ ๋Œ€์‹  ๋‹ค์Œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์œ„์น˜๋ฅผ ๋ช…์‹œํ•ด์ค€๋‹ค.

์ˆœ์„œ ์‹คํ–‰๋ณด์žฅ ์—ญํ• !

 

resove์™€ reject

 

then์—๋Š” resolveํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ ,

catch์— error callback(reject)ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

resolve์™€ reject๋Š” ์ƒ์ถฉ๋˜๋Š” ๊ฐœ๋…์œผ๋กœ ๋‘˜์ค‘์— ํ•˜๋‚˜๋งŒ ์‹คํ–‰๋ ๊ฒƒ์ด๋‹ค.

 

peding ๐Ÿ‘‰๐Ÿป resolve/reject ๐Ÿ‘‰๐Ÿป await

 

 

const a = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(1);
      resolve();
    }, 1000);
  });
};
const b = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(2);
      resolve();
    }, 1000);
  });
};
const c = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log(3);
      resolve();
    }, 1000);
  });
};
const d = () => {
  console.log(4);
};

1,2,3,4๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰์ด ๋ณด์žฅ๋˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•œ๋‹ค.

 

a().then(() => {
  b().then(() => {
    c().then(() => {
      d();
    });
  });
});

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ ‡๋‹ค๋ฉด ์ฝœ๋ฐฑ์ง€์˜ฅ๊ณผ ๋‹ค๋ฅผ๊ฒŒ ์—†๋‹ค..

 

โ—๏ธthen์•ˆ์— ์ œ๊ณต๋˜๋Š” ์ฝœ๋ฐฑ๋ถ€๋ถ„์—์„œ promise ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ๋˜๋ฉด, then๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์ด์–ด์„œ then ๋ฉ”์†Œ๋“œ๋ฅผ ํ•œ๋ฒˆ ๋” ์“ธ์ˆ˜์žˆ๋‹ค.

 

a()
  .then(() => {
    return b();
  })
  .then(() => {
    return c();
  })
  .then(() => {
    d();
  });

promise ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” then๋’ค์— ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹ ํ˜•ํƒœ๋กœ ๋ถ™์—ฌ์„œ ์“ธ ์ˆ˜์žˆ๋‹ค.

 

//then์•ˆ์— ๋„ฃ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ b()๊ฐ™์ด ํ”„๋กœ๋ฏธ์Šค๋ฅผ returnํ•œ๋‹ค๋ฉด, then ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋งŒ return b() ์ด๋Ÿฐ์‹์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

 

a()
  .then(b)
  .then(c)
  .then(() => {
    console.log('done')
  });

์ค‘๊ด„ํ˜ธ์•ˆ์— ๋ฐ”๋กœ return๋‚˜์˜ค๋ฉด ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

d๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์ด๊ธฐ๋•Œ๋ฌธ์— return์ด ์•„๋‹ˆ๋ฏ€๋กœ, ์ค‘๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

before

const getMovies = (movieName, callback) => {
  fetch(`url/${movieName}`)
    .then((res) => res.json())
    .then((res) => {
      console.log(res);
      callback();
    });
};

getMovies("frozen", () => {
  console.log("๊ฒจ์šธ์™•๊ตญ");
  getMovies("avengers", () => {
    console.log("์–ด๋ฒค์ ธ์Šค");
    getMovies('avatar',()=>{
      console.log("์•„๋ฐ”ํƒ€");
    })
  });
});

 

after

const getMovies = (movieName) => {
  return new Promise((resolve) => {
    fetch(`url/${movieName}`)
      .then((res) => res.json())
      .then((res) => {
        console.log(res);
        resolve();
      });
  });
};

getMovies("frozen")
  .then(() => {
    console.log("๊ฒจ์šธ์™•๊ตญ");
    return getMovies("avengers");
  })
  .then(() => {
    console.log("์–ด๋ฒค์ ธ์Šค");
    return getMovies("avatar");
  }).then(()=>{
    console.log("์•„๋ฐ”ํƒ€");
  })

 

 

 

await- async

 

async ํ•จ์ˆ˜

:async ํ‚ค์›Œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ์•ˆ์—์„œ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

โ—๏ธasync ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด, ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. → then์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด๋ณด๋‹ค ํšจ์œจ์ ์ด๋‹ค.

 

await ํ‘œํ˜„์‹:

  • await๋Š” async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • await๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๋ฉฐ, Promise๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • await๋Š” ์ฃผ๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ํฌํ•จ๋œ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โ—๏ธawaitํ‚ค์›Œ๋“œ์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ

 

 

aํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”๊ฒƒ์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€, ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€ bํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

await์„ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•ด async wrapํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

ํ›จ์”ฌ ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค!

 

โ—๏ธconsole.log๊ฐ™์€ promise ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ ์•ž์— await๋ฅผ ๋ถ™์ด๋ฉด ์•ˆ๋œ๋‹ค.

 

 

fetch

 

fetch ํ•จ์ˆ˜๋Š” Promis๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ,  Prototype์„ ํ™•์ธํ•ด๋ณด๋ฉด, 

 

 

then, catch, finally ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๐Ÿง then๋ฉ”์†Œ๋“œ๋กœ promise๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜์ธ res๋Š” ๋ฌด์—‡์ด ๋‹ด๊ฒจ์žˆ์„๊นŒ?

 

response์˜ ์‘๋‹ต๊ฐ์ฒด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค!

ํ•˜์ง€๋งŒ, ์‘๋‹ต์ฒ˜๋ฆฌ์ƒํƒœ๋“ฑ

์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค

 

์‘๋‹ต๊ฐ์ฒด์— json์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.

๐Ÿ‘‰๐Ÿป json์„ ํ˜ธ์ถœํ•ด์•ผ์ง€๋งŒ fetch๋กœ ๊ฐ€์ ธ์˜จ ์‘๋‹ต์˜ ๊ฒฐ๊ณผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ์ˆ˜์žˆ๋‹ค!

 

json๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด, Promise์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ , promis์ด๋ฏ€๋กœ then์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๊บผ๋‚ด ๋“œ๋””์–ด data๋ฅผ ์–ป๋Š”๋‹ค!

 

 

async-awaitํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๋‘๋ฒˆ์งธ ์‹ค์Šต : ๊ณ„์‚ฐ๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ