potatos
๐•๐•’๐•ฆ๐•ฃ๐•ฆ๐•ค
potatos
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • Daily
    • Study
      • CS
      • Network
      • Windows
      • Linux
      • HTML & CSS
      • JavaScript
      • React
      • vue.js
      • Flutter
      • DataBase
      • Elastic Se..
      • Log
      • Coding Tes..
    • Work
      • PC
      • Mobile
      • JPGIF

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

  • notice

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • JavaScript
  • Linux
  • Windows
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • MySQL
  • ์œˆ๋„์šฐ
  • ์…€๋ ‰ํ„ฐ
  • CSS
  • ์ˆ˜์ง ์ •๋ ฌ
  • HTML

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
potatos

๐•๐•’๐•ฆ๐•ฃ๐•ฆ๐•ค

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Weather & ๋งˆ๋ฌด๋ฆฌ
Study/Log

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Weather & ๋งˆ๋ฌด๋ฆฌ

2022. 6. 16. 04:40
์‹œ์ž‘์— ์•ž์„œ์„œ ์‚ฌ๋‹ด์„ ์ข€ ํ•˜์ž๋ฉด...... 31์ผ ์ดํ›„์— ์ด์ œ์„œ์•ผ ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์„ ํ•˜๊ฒŒ ๋œ ์ด์œ . ๊ทธ๋™์•ˆ ์ทจ์—…์„ ์œ„ํ•ด ๋ฉด์ ‘์„ ๋ณด๋Ÿฌ ๋‹ค๋‹ˆ๊ณ  ์ด๋Ÿฐ์ €๋Ÿฐ ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ด์„œ ํฌ์ŠคํŒ…์„ ์‰ฌ์—ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์–ด๋А๋ง ๋ฒŒ์จ 6์›” ์ค‘์ˆœ...! 5์›” ๋‚ด๋กœ ๋๋‚ด๋Š” ๊ฒŒ ๋ชฉํ‘œ์˜€๋Š”๋ฐ, ๋ฏธ๋ฃจ๊ณ  ๋ฏธ๋ฃจ๋‹ค ์ด๋ ‡๊ฒŒ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ใ…œใ…œ ๊ทธ๋ž˜๋„ ๋Šฆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฒ•! ๋‹ค์‹œ ๋‹ฌ๋ ค ๋ณด์ž!

 


 

Weather

Momentum์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ๋‚ ์”จ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด๋Š” ํŒŒํŠธ์ด๋‹ค. GPS๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ ์ €๊ฐ€ ํ˜„์žฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ง€์—ญ์˜ ๋‚ ์”จ๋ฅผ ์•Œ์•„๋‚ด๊ณ  ๋ณด์—ฌ ์ค„ ๊ฒƒ์ด๋‹ค.

#1. Geolocation

์ด ํŒŒํŠธ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์€ geolocation์ด๋‹ค. ์œ„์น˜๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ, getCurrentPosition() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ง‘์ค‘ํ•ด์•ผ ํ•  ๊ฒƒ์€? ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ์ธ getCurrentPosition().

getCurrentPosition()๋Š” aargument๊ฐ€ ๋‘ ๊ฐœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜๋‚˜๋Š” ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ํ•จ์ˆ˜, ํ•˜๋‚˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ํ•จ์ˆ˜. ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์„ฑ๊ณต ํ•จ์ˆ˜, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์—๋Ÿฌ ํ•จ์ˆ˜๋ผ๊ณ  ์นญํ•ด ๋ณด์ž. ์„ฑ๊ณต ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋์„ ๋•Œ geolocation์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์œ ์ €์˜ ์œ„์น˜๋ฅผ ์–ป๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋Œ€๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์ฝ˜์†”์„ ํ™•์ธํ•ด ๋ณด์ž. ์ฝ˜์†”์— ์ฐํžŒ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ–ˆ์„ ๋•Œ, ๋‚ด๊ฐ€ ์œ„์น˜ํ•œ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

function onGeoOk(position) {
    console.log(position);
};

function onGeoError() {
    alert("Can't find you, No weather for you.")
};

navigator.geolocation.getCurrentPosition(onGeoOk, onGeoError);

geolocation์ด ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์–ป์€ ๊ฒƒ์„ ์จ๋จน์–ด์•ผ ํ•œ๋‹ค. ์„ฑ๊ณต ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๋ฅผ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ด ๋ณด์ž. ์ฝ˜์†”์—์„œ ์œ„๋„์™€ ๊ฒฝ๋„๊ฐ€ ์ž˜ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

function onGeoOk(position) {
    const lat = position.coords.latitude;
    const lng = position.coords.longitude;
    console.log("You live in", lat, lng);
};

์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ์–ป์–ด์˜ค๋Š” ๊ฒƒ๊นŒ์ง€ ๋งˆ์ณค๋‹ค๋ฉด, ๋ณธ๊ฒฉ์ ์œผ๋กœ geolocation API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์—, API ๊ณ„์ •์„ ์—ด์–ด์•ผ ํ•œ๋‹ค.

https://openweathermap.org/ ์›น ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜์—ฌ, ๊ฐ€์ž… ๋˜๋Š” ๋กœ๊ทธ์ธ์„ ํ•ด ์ค€๋‹ค. ๋กœ๊ทธ์ธํ•œ ํ›„์— API๋ผ๋Š” ๋ฉ”๋‰ด์— ๋“ค์–ด๊ฐ€๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ API๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#2. Weather API

๋จผ์ € API๋ผ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด, ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„์™€ ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŽ์€ API ์ค‘์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ๊ฒƒ์€ Current Weather Data์ด๋‹ค.

API doc์„ ์‚ดํŽด ๋ณด๋ฉด API ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค. ๊ฐ๊ฐ ์•Œ๋งž๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด ์ฃผ๋ฉด ๋‚ ์”จ์™€ ์œ„์น˜ ๋“ฑ์„ ์•Œ๋ ค ์ฃผ๋Š” json์ด ๋“ฑ์žฅํ•œ๋‹ค.

API Key๋Š” ํ”„๋กœํ•„์—์„œ My API Key ๋ฉ”๋‰ด์— ๋“ค์–ด๊ฐ€๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}

// ์‚ฌ์šฉ ์‹œ์—๋Š” {} ์ œ๊ฑฐํ•ด ์ฃผ๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด์ œ ์ด url์„ ์ฝ”๋“œ์— ์ ‘๋ชฉํ•ด ๋ณด์ž. ์ด๋ฏธ ์œ„๋„์™€ ๊ฒฝ๋„๋Š” ์–ป๊ณ  ์žˆ์œผ๋‹ˆ API Key๋งŒ ์„ค์ •ํ•ด ์ค€ ํ›„์— url์„ ์„ค์ •ํ•ด ์ฃผ๋ฉด ๋. console.log๊ฐ€ ์•„๋‹Œ fetch๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ™•์ธํ•œ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ URL ์š”์ฒญ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

const API_KEY = "์ž์‹ ์˜ API KEY";

function onGeoOk(position) {
    const lat = position.coords.latitude;
    const lon = position.coords.longitude;
    const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${API_KEY}`;

	fetch(url);
};

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

API ๋ฌธ์„œ๋กœ ๋Œ์•„๊ฐ€ ๋ณด๋ฉด, units์ด๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ํ™”์”จ์™€ ์„ญ์”จ๋ฅผ ์ปจํŠธ๋กคํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ url ๋’ค์— &units=metric ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด, ์„ญ์”จ ์˜จ๋„๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•œ fetch๋กœ ๋Œ์•„์™€์„œ. fetch๋Š” promise์ด๊ธฐ๋„ ํ•œ๋ฐ, promise๋Š” ๋‹น์žฅ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ์ง€๋‚œ ๋’ค์— ์‹คํ–‰๋œ๋‹ค. ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด? ๊ทธ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.

anyway. fetch๊ฐ€ promise๋ผ๋ฉด? ์š”์ฒญ์„ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. then์œผ๋กœ response๋ฅผ ๋ฐ›์•„ ์ฃผ๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ response๋Š” json์„ ๋ฐ›์•„ ์ฃผ๊ฒŒ ๋˜๊ณ , ์ด json์ด ์šฐ๋ฆฌ๊ฐ€ ์—ฌํƒœ๊นŒ์ง€ url๋กœ ํ™•์ธํ–ˆ๋˜ json์ด๋‹ค. 

json์„ ๋ฐ›์•„์™”๋‹ค๋ฉด? ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์™€ ๋ณด์ž. data.name์€ ์ง€์—ญ์„ ์˜๋ฏธํ•˜๊ณ  ์žˆ๊ณ , data.weather์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์—ด์˜ main์€ ๋‚ ์”จ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ธ ๊ฒƒ์ด๋‹ค. ์ด ๋‘˜์„ ์ฝ˜์†”๋กœ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด, ์ž˜ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function onGeoOk(position) {
    const lat = position.coords.latitude;
    const lon = position.coords.longitude;
    const url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${API_KEY}&units=metric`;

    fetch(url).then(response => response.json().then(data => {console.log(`์ง€์—ญ: ${data.name} / ๋‚ ์”จ: ${data.weather[0].main}`)}));
};

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

<div id="weather">
    <span></span>
    <span></span>
</div>
fetch(url).then(response => response.json().then(data => {
    const weatherContainer = document.querySelector("#weather span:first-child");
    const city = document.querySelector("#weather span:last-child");

    const weather = data.weather[0].main;
    const name = data.name;

    weatherContainer.innerText = `${weather} / ${data.main.temp}`;
    city.innerText = name;
}));


๋งˆ๋ฌด๋ฆฌ (Conclusions)

์ด์ œ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋๋‹ค! ์ด์ œ ๋‚จ์€ ๊ฑด CSS๋กœ ๋ชจ๋ฉ˜ํ…€์ฒ˜๋Ÿผ ๊พธ๋ฉฐ๋‚ด๋Š” ๊ฒƒ๋ฟ! ๊ฐ•์˜์—์„œ๋Š” CSS๋ฅผ ๊ตณ์ด ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š”๋‹ค. CSS ์ •๋„์•ผ, ๊ทธ๋ฆฌ ๋ณต์žกํ•œ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋‚œํ•˜๊ฒŒ ํ˜ผ์ž ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹  ๋“ฏ? ๋ฌผ๋ก  ๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๊ณ . ์•Œ๊ณ  ์žˆ๋˜ ๊ธฐ์ˆ ๋“ค์„ ๋ณต์Šตํ•˜๊ณ , ๋‹ค๋ฅธ ๊ธฐ์ˆ ๋“ค์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ฐ•์˜์˜€๋‹ค. ๊ฐ€๋ณ๊ฒŒ ๋“ฃ๊ธฐ ๋”ฑ ์ข‹์•˜๋˜? ๋ฌด๋ฃŒ ๊ฐ•์˜์ง€๋งŒ ์•Œ์ฐผ๋‹ค. ์‚ฌ์‹ค, ๋‚ด๊ฐ€ ์›ํ–ˆ๋˜ ๊ฑด ์‹ค์ œ๋กœ ๋ชจ๋ฉ˜ํ…€์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋กฌ ์•ฑ์ด์—ˆ์ง€๋งŒ...... ๋ญ ์–ด๋•Œ! ๊ทธ๊ฑด ๋˜ ํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ๊ณ . ใ…Žใ…Ž
์–ด์จŒ๊ฑฐ๋‚˜, ์•„๋ž˜์— CSS๊นŒ์ง€ ๋„ฃ์–ด ํ˜ธ์ŠคํŒ…ํ•œ ๋‚ด ๋ชจ๋ฉ˜ํ…€ ํด๋ก  ํŽ˜์ด์ง€์˜ ๋งํฌ๋ฅผ ๋‹ฌ์•„ ๋‘๊ณ  ํฌ์ŠคํŒ…์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ฒ ๋‹ค.

https://bunchsh.github.io/Momentum_clone/

'Study > Log' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #To Do List  (0) 2022.05.31
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Quotes And Background  (0) 2022.05.19
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Clock  (0) 2022.05.17
[JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Momentum ์†Œ๊ฐœ ๋ฐ Login  (0) 2022.05.15
    'Study/Log' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #To Do List
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Quotes And Background
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Clock
    • [JS] ๋…ธ๋งˆ๋“œ์ฝ”๋” - ๋ฐ”๋‹๋ผ JS๋กœ ํฌ๋กฌ ์•ฑ ๋งŒ๋“ค๊ธฐ #Momentum ์†Œ๊ฐœ ๋ฐ Login
    potatos
    potatos

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”