๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240117 - ๊ณ ์–‘์ด ์‚ฌ์ง„ ๊ฒ€์ƒ‰ ์‹ค์Šต

๊ฐ€์šค์ด 2024. 1. 18. 09:07

Intro


์—ฌํ–‰ ๋‹ค๋…€์˜ค๋А๋ผ ํ”ผ๊ณคํ•ด์„œ ๊ณต๋ถ€๋ฅผ ๋งŽ์ด ๋ชปํ–ˆ๋‹ค. ์—ฌํ–‰ ํ›„์œ ์ฆ์ด ์‹ฌํ•˜๋‹ค..๐Ÿ˜ญ

์—ฌํ–‰ ๋‹ค๋…€์˜ค๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ๋‹ค ๊นŒ๋จน์€ ๊ธฐ๋ถ„์ด๋‹ค์•„... ๊ฐ์„ ๋‹ค์‹œ ์ตํžˆ์ž!!

 

 

 

์˜ค๋Š˜ ํ•™์Šตํ•œ ๋‚ด์šฉ

FE ์ฑ„์šฉ ๊ณผ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ


์ด๋ฒˆ์ฃผ๋Š” ๊ณ ์–‘์ด ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์Šต์„ ํ•™์Šตํ–ˆ๋‹ค.

๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋ถ€๋ถ„๋“ค์ด ๋งŽ์•„์„œ ์ƒ๊ฐ๋ณด๋‹ค ๊ฝค ๋ณต์žกํ•˜๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ๋”ฐ๋ผํ•ด๋ณด๊ณ  ํ˜ผ์ž์„œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์Šต๋„ ๋งŽ์ด ํ•ด์•ผ๊ฒ ๋‹ค.

 

์‹ค์Šต ์ฒ˜์Œ๋ถ€ํ„ฐ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์„œ.. ์กฐ๊ธˆ ํ—ค๋งธ๋‹ค.

์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์‚ฌ์‹ค ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ํ•ด๊ฒฐํ•˜๋‹ค๊ฐ€ ํž˜๋“ค์–ด์„œ ์‰ฌ์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋‹ˆ๊นŒ ๋˜ ์ž˜๋œ๋‹ค.

 

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ ๋ชจ๋“ˆ์„ ์‚ญ์ œํ•˜๊ณ  ์บ์‹œ๋ฅผ ์ง€์šด ํ›„ ๋‹ค์‹œ npm install์„ ํ•ด๋ณด์•˜๋Š”๋ฐ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๊ณ 

rm -rf node_modules
rm -f package-lock.json
npm cache verify

 

http-server ์‹คํ–‰ํ•  ๋•Œ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ HTTP ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ, ์บ์‹œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ํŒŒ์ผ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์„ ์ œ๊ณตํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์ˆ˜์ •ํ•ด์„œ ์‹คํ–‰ํ•˜์˜€๋Š”๋ฐ๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‹ค.

http-server -c-1 .

 

๊ทผ๋ฐ ๋…ธํŠธ๋ถ์„ ๋‹ค์‹œ ์ผœ๋‹ˆ๊นŒ ์ž˜ ๋œ๋‹ค..!!

๋ญ๊ฐ€ ๋ฌธ์ œ์˜€์„๊นŒ๋‚˜ ํฌ๋กฌ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๊ธฐ๋‘..

 

 

 

์ฝ”๋“œ ๊ตฌ์กฐ ๋ถ„์„

  • index.html

index.html์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋• ์œ ํ‹ธ์ด๋‚˜ ์ปดํฌ๋„ŒํŠธ ํด๋ž˜์Šค ๋“ฑ์„ ๋ชจ๋‘ ๋กœ๋“œํ•œ ํ›„, main์„ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ script ์ˆœ์„œ์— ์œ ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 

  • App.js
class App {
  $target = null;
  data = []; // react, vue ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. setState ๊ด€๋ จ

  constructor($target) {
    this.$target = $target;

    // ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ (searchInput, searchResult, imageInfo)
    this.searchInput = new SearchInput({
      $target,
      onSearch: keyword => {
        api.fetchCats(keyword).then(({ data }) => this.setState(data));
      }
    });

    this.searchResult = new SearchResult({
      $target,
      initialData: this.data,
      onClick: image => {
        this.imageInfo.setState({
          visible: true,
          image
        });
      }
    });

    this.imageInfo = new ImageInfo({
      $target,
      data: {
        visible: false,
        image: null
      }
    });
  }

  setState(nextData) {
    console.log(this);
    this.data = nextData;
    this.searchResult.setState(nextData);
  }
}

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค๋“ค์„ ๊ฐ€์ง€๊ณ  App.js์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main.js ์—์„œ

new App(document.querySelector("#App"));

App์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ

<div id="App"></div>

์ตœ์ข…์ ์œผ๋กœ id๊ฐ€ App์ธ ์—˜๋ฆฌ๋จผํŠธ ์•„๋ž˜๋กœ js๋กœ ๋งŒ๋“  DOM์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

 

 

๋‹คํฌ๋ชจ๋“œ ์„ค์ •

@media (prefers-color-scheme: dark) {
  body {
    background-color: #000;
    color: white;
  }
}

๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด ์ปดํ“จํ„ฐ์˜ ์ƒํƒœ๊ฐ€ ๋‹คํฌ๋ชจ๋“œ์ธ์ง€ ๋ผ์ดํŠธ๋ชจ๋“œ์ธ์ง€์— ๋”ฐ๋ผ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งฅ์—์„  ์„ค์ • > ํ™”๋ฉด ๋ชจ๋“œ์—์„œ ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹คํฌ๋ชจ๋“œ์ธ ๊ฒฝ์šฐ์— ๋ฏธ๋””์–ด์ฟผ๋ฆฌ์˜ ๋‚ด์šฉ์ด ์ ์šฉ๋œ๋‹ค.

 

๋‹ค์Œ์€ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์˜ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

window.matchMedia('(prefers-color-scheme: dark)').matches

matches ๋ช…๋ น์–ด๋Š” Boolean ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋ฉฐ ํ•ด๋‹น ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๊ฐ€ ์ ์šฉ๋˜๋ฉด true ์•ˆ๋˜์–ด์žˆ์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

CSS ๋ณ€์ˆ˜

:root[color-mode="dark"] {
  --background: #000;
  --textColor: white;
}

body {
  background-color: var(--background);
  color: var(--textColor);
}

css์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.

 

https://developer.mozilla.org/ko/docs/Web/CSS/Using_CSS_custom_properties

 

์‚ฌ์šฉ์ž ์ง€์ • CSS ์†์„ฑ ์‚ฌ์šฉํ•˜๊ธฐ (๋ณ€์ˆ˜) - CSS: Cascading Style Sheets | MDN

์‚ฌ์šฉ์ž ์ง€์ • ์†์„ฑ(CSS ๋ณ€์ˆ˜, ์ข…์† ๋ณ€์ˆ˜)์€ CSS ์ €์ž‘์ž๊ฐ€ ์ •์˜ํ•˜๋Š” ๊ฐœ์ฒด๋กœ, ๋ฌธ์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•  ์ž„์˜์˜ ๊ฐ’์„ ๋‹ด์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์†์„ฑ์€ ์ „์šฉ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ •์˜ํ•˜๊ณ , (--main-color: black;)

developer.mozilla.org

์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์ด๋ฆ„์œผ๋กœ var()๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

:root๋กœ ์„ค์ •ํ•˜๋ฉด HTML ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉ์ž ์ง€์ • ์†์„ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

๋งˆ๋ฌด๋ฆฌ


ํ‰์†Œ๋ณด๋‹ค ์ง‘์ค‘๋ ฅ๋„ ๋–จ์–ด์ง€๊ณ  ๋„ˆ๋ฌด ํ”ผ๊ณคํ•ด์„œ ํ•™์Šต์„ ๋งŽ์ด ๋ชปํ–ˆ๋Š”๋ฐ ๋‚ด์ผ์€ ์ข€ ๋” ์ง‘์ค‘ํ•ด์„œ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.