๐Ÿ’ค ์ฝ”๋กœ๋‚˜ ์–ธํƒํŠธ ์‹œ๋Œ€, ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ˆ˜์—… ์‹œ๊ฐ„์— ์ž˜ ์ˆ˜ ์žˆ์„๊นŒ์š”?

โฐ ๊ณ ๋“ฑํ•™๊ต, ์‹œ๊ฐ„ ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ

์ž‘๋…„๊นŒ์ง€๋งŒ ํ•ด๋„ ์ €๋Š” ํ•™๊ต๋ฅผ ๋‹ค๋‹ˆ๊ณ  ์žˆ์—ˆ์–ด์š”. ํ•˜๋ผ๋Š” ๊ณต๋ถ€๋Š” ์•ˆํ•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋”ด์ง“์„ ๋งŽ์ด ํ–ˆ์—ˆ์ฃ .
ํ•˜์ง€๋งŒ ํ•˜๋ฃจ๋Š” ๊ณ ์ž‘ 24์‹œ๊ฐ„, ์ธ๊ฐ„์ด ๋”ด์ง“์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์€ ํ•œ์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ˆ˜๋ฉด ์‹œ๊ฐ„ ๋ณด์กด์˜ ๋ฒ•์น™(Law of conservation of sleep hours)์— ์˜ํ•œ ๊ฒƒ์ธ๋ฐ์š”. ์ธ๊ฐ„ ์ค‘์—์„œ๋„ ๋‚˜์•ฝํ•œ ํŽธ์— ์†ํ•˜๋Š” ์ €๋Š” ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ 8์‹œ๊ฐ„์€ ์ฑ„์›Œ ์ž๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฏธ์ธ์€ ์ž ๊พธ๋Ÿฌ๊ธฐ์ธ ๋ฒ•์ด๋‹ˆ๊นŒ์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ์ฝ”๋”ฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๋Š˜๋ฆฌ๋ ค๋ฉด ํ•™๊ต ์ˆ˜์—… ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ, ์ฆ‰ ์ž๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค(25%๋งŒ ์ž๋Š” ๋ฐ ์จ๋„ 2์‹œ๊ฐ„์„ ๋ฒŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
๊ณ ๋“ฑํ•™๊ต 1ํ•™๋…„์„ ๋งˆ์น˜๋ฉด์„œ ์„ ์ƒ๋‹˜๋“ค๊ป˜์„œ๋Š” ์ œ๊ฒŒ ์ด์ œ 2ํ•™๋…„์ด ๋˜๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ชฉํ‘œ๋ฅผ ๋งˆ์Œ์†์— ์ƒˆ๊ธฐ๋ผ๋Š”, ์–ด... ๋Œ€์ถฉ ๋ฉ‹์ง„ ๋ง์”€์„ ํ•ด ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์„ ์ƒ๋‹˜ ๋ง์”€์„ ์ž˜ ๋“ฃ๋Š” ์ฐฉํ•œ ์•„์ด์ธ ์ €๋Š” 2020๋…„์ด ๋˜๊ณ  ์ผ๋…„ ๋ชฉํ‘œ๋ฅผ ์‹œ๊ฐ„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋กœ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ ๋ฉ‹์ง„ ๊ณ„ํš์€ ๋ชจ๋‘ ํ‹€์–ด์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋กœ๋‚˜ ๋•๋ถ„์— ์ €ํฌ ํ•™๊ต๋„ ์˜จ๋ผ์ธ์œผ๋กœ ๊ฐœํ•™์„ ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ง์ด์ฃ . ์–ด๋–ค ํ•™๊ต๋Š” EBS๋กœ ์ˆ˜์—… ์ฃผ๋ฅด๋ฅต ๋“ค์–ด๋†“์œผ๋ฉด ์ถœ์„ ์ธ์ •๋˜๊ณ  ๊ทธ๋Ÿฌ๊ธฐ๋„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์•„์‰ฝ๊ฒŒ๋„ ์ €ํฌ ํ•™๊ต๋Š” ์คŒ(ZOOM)์„ ํ†ตํ•ด ์ˆ˜์—…์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์•„... ๋‚ด ์ˆ˜๋ฉด...!

๐ŸŽ ํ•™๊ต์—์„œ ์คŒ์„ ์คŒ.

์คŒ

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

๊ทธ๋ž˜๋„ ์ƒˆ์‚ผ ๋Š๋‚€ ์ ์€ ์ œ๊ฒŒ ์ฐธ ์ข‹์€ ์นœ๊ตฌ๋“ค์ด ๋งŽ์•˜๋‹ค๋Š” ๊ฒƒ! ์นœ๊ตฌ๋“ค์•„ ๊ณ ๋งˆ์› ๊ณ  ์‚ฌ๋ž‘ํ•œ๋‹ค!!!

๋งจ๋‚  ์นจ๋Œ€์— ๋ˆ„์›Œ์„œ ์ž๋‹ค๊ฐ€ ๋ณด์ด์Šคํ†ก ์†Œ๋ฆฌ๋ฅผ ๋“ฃ๊ณ  ์ผ์–ด๋‚˜์„œ ๋Œ€๋‹ตํ•˜๊ณ  ๋‹ค์‹œ ๋ˆ„์› ์—ˆ๋„ค์š”. ํ•˜์ง€๋งŒ ํ•˜๋ฃจ๋Š” ์นœ๊ตฌ๋“ค์—๊ฒŒ ๋ฏธ์•ˆํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์ด์™• ์ž˜ ๊ฑฐ๋ผ๋ฉด ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๊ณ  ํ‘น ์ž๊ณ  ์‹ถ์–ด์„œ(?) ์ด๊ฑธ ์ข€ ์ž๋™ํ™”ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ป ์ˆ˜์—… ๋“ฃ๊ธฐ๋ฅผ ์ž๋™ํ™”ํ•ด ๋ณด์ž

๐Ÿซ ์ˆ˜์—… ๋“ค์–ด๊ฐˆ ์ˆ˜๋Š” ์žˆ์–ด?

์ œ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ๋” ์ด์ƒ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์•ˆ ๋ณด์—ฌ์„œ ๊ตฌ๊ธ€๋ง์œผ๋กœ ์˜์–ด ๋ฒ„์ „ ์Šคํฌ๋ฆฐ์ƒท์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์คŒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ค์น˜๋œ ์ƒํƒœ์—์„œ, zoommtg://๋กœ ์‹œ์ž‘ํ•˜๋Š” ์คŒ ๋”ฅ๋งํฌ๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๋ฉด ์œ„์™€ ๊ฐ™์€ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋งํฌ๋ฅผ ์—ฐ๊ฒฐ๋œ ์•ฑ์—์„œ ์—ด๊ธฐ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์งˆ๋ฌธ ์—†์ด ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

๋”ฅ๋งํฌ๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด Query string์œผ๋กœ action, pwd, confno๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ ๋ช‡ ๊ฐœ๋ฅผ ๋Œ€์กฐํ•ด ๋ณด๋ฉด์„œ ์‰ฝ๊ฒŒ ๊ทธ ๋œป์„ ์œ ์ถ”ํ•ด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.

  • action์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋‚˜์„œ ๋ฐ›์€ ํšŒ์˜์‹ค ์ •๋ณด๋กœ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. join ๋ง๊ณ  ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ญ๊ฐ€ ์žˆ์„์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ €ํฌ๋Š” ๊ฐ•์˜์‹ค์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒŒ ๋ชฉํ‘œ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋„ค์š”.
  • pwd๋Š” ๊ฐ•์˜์‹ค์˜ ํŒจ์Šค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ €ํฌ ํ•™๊ต๋Š” ๋ชจ๋“  ๊ฐ•์˜์‹ค์˜ ํŒจ์Šค์›Œ๋“œ๋ฅผ dimigo๋กœ ํ†ต์ผํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ํ•˜๋“œ์ฝ”๋”ฉ ํ–ˆ์—ˆ์–ด์š”.
  • confno๋Š” ๊ฐ๊ฐ์˜ ๊ฐ•์˜์‹ค์— ํ• ๋‹น๋˜๋Š” ๊ณ ์œ  ID์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ•์˜์‹ค๋ณ„๋กœ ์ด ๊ฐ’๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋„ค์š”.

ํŒŒ์ด์ฌ์—๋Š” webbrowser๋ผ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ URL์„ ์—ด ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ์š”. ์ด๊ฑธ ์ด์šฉํ•˜๋ฉด ํšŒ์˜์‹ค ์ •๋ณด๋ฅผ ๋ฐ›์•„ ์ž๋™์œผ๋กœ ์ ‘์†ํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜ open_classroom์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!

def open_classroom(classroom: dict) -> None:
  name = classroom['name']
  code = classroom['code']
  webbrowser.open_new_tab(f'zoommtg://zoom.us/join?action=join&pwd=dimigo&confno={code}')
  console.print(f'โœ” {name} ์ˆ˜์—… ์ ‘์† ์™„๋ฃŒ', style='dim')

๐Ÿ—“ ์ €... ์ €๊ธฐ ํ˜น์‹œ ์‹œ๊ฐ„ํ‘œ ์žˆ์–ด?

์ด์ œ ์ €ํฌ๊ฐ€ ๋งŒ๋“ค ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋“ค์„ ๋ชจ์•„๋ณผ๊ฒŒ์š”!

์ˆ˜์—… ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

// periods.json
{
  "์กฐํšŒ": ["08:42", "08:57"],
  "1๊ต์‹œ": ["08:58", "09:50"],
  "2๊ต์‹œ": ["09:58", "10:50"],
  "3๊ต์‹œ": ["10:58", "11:50"],
  "4๊ต์‹œ": ["11:58", "12:50"],
  "5๊ต์‹œ": ["13:48", "14:40"],
  "6๊ต์‹œ": ["14:48", "15:40"],
  "7๊ต์‹œ": ["15:48", "16:40"],
  "์ข…๋ก€": ["16:45", "17:55"]
}

์•„๋ฌด๋ž˜๋„ ์ˆ˜์—…์ด ์–ธ์ œ ์‹œ์ž‘ํ•ด์„œ ์–ธ์ œ ๋๋‚˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•˜๊ฒ ์ฃ ?
์ €ํฌ ํ•™๊ต์—์„œ๋Š” ์กฐํšŒ์™€ ์ข…๋ก€ ์—ญ์‹œ ๋‹ด์ž„ ์„ ์ƒ๋‹˜ ํšŒ์˜์‹ค์—์„œ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ์š”.
์ข…๋ก€์— ๋Šฆ์—ˆ๋‹ค๊ฐ€๋Š” ๋ฐ˜ ์ „์ฒด๊ฐ€ ์ € ํ•˜๋‚˜๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋นผ๋†“์ง€ ๋ง๊ณ  ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค! ๐Ÿ”ฅ

์•„ ใ…‹ใ…‹ใ…‹ ์ €๊ฑฐ ์ €๋•Œ ์ฝ”๋“œ์— ์ข…๋ก€๊ฐ€ 1์‹œ๊ฐ„์œผ๋กœ ์žกํ˜€ ์žˆ์—ˆ๋„ค์š”... ์–ด์ฉ์ง€ ๊ณ„์† ๋‚จ์•„์žˆ๋Š”๋‹ค ํ–ˆ์–ด

์‹œ๊ฐ„ํ‘œ ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

// timetable.json
[
  [
    "ํ™”ํ•™ I",
    "์šด๋™๊ณผ ๊ฑด๊ฐ•",
    "์ˆ˜ํ•™ II",
    "์ •๋ณด๋ณดํ˜ธ ๊ด€๋ฆฌ",
    "์ •๋ณด๋ณดํ˜ธ ๊ด€๋ฆฌ",
    "์„ฑ๊ณต์ ์ธ ์ง์—…์ƒํ™œ",
    "์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™”๋ฉด๊ตฌํ˜„"
  ],
  ...
]

๋Œ€๋ถ€๋ถ„์˜ ๊ณ ๋“ฑํ•™๊ต์—์„œ๋Š” 1์ฃผ์ผ๋งˆ๋‹ค ๊ฐ™์€ ์‹œ๊ฐ„ํ‘œ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ณ , ์ €ํฌ ํ•™๊ต ์—ญ์‹œ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ์˜€์Šต๋‹ˆ๋‹ค.
ํ•˜๋ฃจ์— ์ง„ํ–‰๋˜๋Š” ์ˆ˜์—… ๊ณผ๋ชฉ๋ช…(6~7๊ฐœ)์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋„ฃ์–ด์„œ ๊ธธ์ด 5์˜ Nested Array๋ฅผ ๋งŒ๋“ค๋ฉด ๋!

ํšŒ์˜์‹ค ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

// classrooms.json
[
  {
    "name": "ํ™”ํ•™ I",
    "teacher": "์ƒนํฌ์Šค",
    "code": 4361766687
  },
  {
    "name": "์šด๋™๊ณผ ๊ฑด๊ฐ•",
    "teacher": "๋ชฝํ‚ค D. ๋ฃจํ”ผ",
    "code": 7864104388
  },
  {
    "name": "์ˆ˜ํ•™ II",
    "teacher": "๋กค๋กœ๋…ธ์•„ ์กฐ๋กœ",
    "code": 7965443330
  },
  {
    "name": "HR",
    "teacher": "๋‚˜๋ฏธ",
    "code": 7864104388,
    "homeroom": true
  },
  ...
]

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ•์˜์‹ค ๋ชฉ๋ก. ๋“ค์–ด๊ฐˆ ์ˆ˜์—…์˜ ๊ณผ๋ชฉ์— ๋งž๋Š” ๊ฐ•์˜์‹ค์„ ์—ด์–ด ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค!
๊ณผ๋ชฉ ์ด๋ฆ„์ธ name, ์„ ์ƒ๋‹˜ ์„ฑํ•จ์ธ teacher, ๊ทธ๋ฆฌ๊ณ  ์คŒ ๊ฐ•์˜์‹ค์˜ ๊ณ ์œ  ID์ธ code๋กœ ์ด๋ฃจ์–ด์ง€๋Š” Object Array๋ฅผ ๋งŒ๋“ค๋ฉด ๋˜๊ฒ ๋„ค์š”.

์ด๋•Œ ์กฐํšŒ์™€ ์ข…๋ก€๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๋‹ด์ž„์„ ์ƒ๋‹˜์˜ ํšŒ์˜์‹ค์€ homeroom ํ•„๋“œ๋ฅผ true๋กœ ์„ค์ •ํ•ด ์ €์žฅํ•ด ์ค์‹œ๋‹ค. ์šฐ๋ฆฌ์˜ ์ข…๋ก€๋Š” ์†Œ์ค‘ํ•˜๋‹ˆ๊นŒ! ๐Ÿ™

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

์ด์ œ ์šฐ๋ฆฌ์˜ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์œ„์—์„œ ๋งŒ๋“  JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ๊ฒ ๋„ค์š”.

def load_json_file(filename: str) -> dict:
  with open(filename) as file_stream:
    data = json.load(file_stream)
  return data

์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ๊ธฐ ๊ท€์ฐฎ์œผ๋‹ˆ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ›์•„, ์ ํžŒ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ load_json_file์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

timetable = load_json_file('./timetable.json')
classrooms = load_json_file('./classrooms.json')
periods = load_json_file('./periods.json')
period_names, period_list = map(list, [periods.keys(), periods.values()])

์ด๋ ‡๊ฒŒ ์‹œ๊ฐ„ํ‘œ, ๊ฐ•์˜์‹ค, ์ˆ˜์—… ์‹œ์ž‘/์ข…๋ฃŒ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ค๋‹ˆ๋‹ค.
์ด๋•Œ periods.json์—์„œ ์•„์ดํ…œ ๊ฐ๊ฐ์˜ key์™€ value๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋‚˜์ค‘์— ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž๊ณ ์š”!

๐Ÿง‘โ€๐Ÿซ ์ˆ˜์—… ๊ณผ๋ชฉ๋ช…์— ๋”ฐ๋ผ ๋“ค์–ด๊ฐˆ ํšŒ์˜์‹ค ๊ตฌํ•˜๊ธฐ

def get_classroom_from_subject_name(subject_name: str) -> dict:
  for classroom in classrooms:
    if subject_name == classroom['name']:
      return classroom

๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋˜์—ˆ์œผ๋‹ˆ ์ด์ œ ์ด ์ •๋„์ฏค์€ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ฃ ! ๐Ÿ˜
๊ณผ๋ชฉ๋ช…์œผ๋กœ ํšŒ์˜์‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

๐Ÿค– ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ์•Œ์•„์„œ ๋“ค์–ด๊ฐ€๊ธฐ

์ž ์ด์ œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŒŒํŠธ!
์Šคํฌ๋ฆฝํŠธ๋งŒ ์ผœ๋‘๋ฉด ์ž๋™์œผ๋กœ ์ˆ˜์—…์„ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

weekday = datetime.datetime.today().weekday()
classrooms_for_today = [
  get_classroom_from_subject_name(subject_name)
  for subject_name in timetable[weekday]
]

๋จผ์ € Weekday๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. Weekday๋Š” ์˜ค๋Š˜์ด ์ผ์ฃผ์ผ์—์„œ ๋ช‡ ๋ฒˆ์งธ ๋˜๋Š” ๋‚ ์ด๋ƒ๋ฅผ ๋œปํ•˜๋Š”๋ฐ์š”.
0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์›”์š”์ผ์ด 0์ด๊ณ , ๊ธˆ์š”์ผ์ด 4์ž…๋‹ˆ๋‹ค.

Weekday๋ฅผ ์•Œ๋ฉด ๊ทธ๊ฑธ timetable ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค๋กœ ํ•ด์„œ ์˜ค๋Š˜์˜ ์‹œ๊ฐ„ํ‘œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”!
์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐˆ ํšŒ์˜์‹ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ classrooms_for_today์— ์ €์žฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

def get_homeroom() -> dict:
  for classroom in classrooms:
    if 'homeroom' in classroom and classroom['homeroom']:
      return classroom

homeroom = get_homeroom()
classrooms_for_today.insert(0, homeroom)
classrooms_for_today.append(homeroom)

์•„๊นŒ ์ถ”๊ฐ€ํ•œ ๋‹ด์ž„์„ ์ƒ๋‹˜ ํšŒ์˜์‹ค์„ ๊ตฌํ•˜๋Š” get_homeroom ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ๋ฐ˜ํ™˜๋œ ํšŒ์˜์‹ค homeroom์„ ๋ฆฌ์ŠคํŠธ์˜ ์•ž๋’ค์— ํ•˜๋‚˜์”ฉ ๋ถ™์—ฌ์ค์‹œ๋‹ค. ์กฐํšŒ์™€ ์ข…๋ก€๋ฅผ ์œ„ํ•ด์„œ์ฃ !

for classroom in classrooms_for_today:
  schedule.every().day.at(classroom['start_time']).do(open_classroom, classroom=classroom)

console.print('์ˆ˜์—…์ด ๋๋‚˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...', style='dim')
while True:
  schedule.run_pending()

schedule ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์‹œ๊ฐ„์— ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์Šค์ผ€์ค„๋ง ํ•  ์ˆ˜ ์žˆ์–ด์š”.
์ˆ˜์—…์ด ์‹œ์ž‘๋˜๋Š” classroom['start_time']๋งˆ๋‹ค classroom์œผ๋กœ open_classroom ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด ์ฃผ๋ฉด ์™„์„ฑ์ด๋„ค์š”! ๐ŸŽ‰

๐Ÿ˜ˆ ๊ฐ‘๋ถ„์‹ธ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด๋ ‡๊ฒŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง  ๋‹ค์Œ ์‹คํ–‰ํ•ด ๋ดค๋Š”๋ฐ, ๋ฏธ์ฒ˜ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์–ด์š”.

๐Ÿ˜ฌ ์ฃผ๋…ธ ์•ˆ ๋‚˜๊ฐ€๊ณ  ๋ญํ•ด..? ์ฃผ๋…ธ...? (์–ด์ƒ‰ํ•œ ์ •์ )

๋ฐฉ๊ธˆ ๋งŒ๋“  ์Šคํฌ๋ฆฝํŠธ๋Š” ์ˆ˜์—…์ด ์‹œ์ž‘๋˜๋Š” ์‹œ๊ฐ„๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํšŒ์˜์‹ค์„ ์—ฌ๋Š” ๊ตฌ์กฐ์˜€์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ "์ˆ˜์—… ๋~"์„ ์™ธ์น˜๊ณ ๋„ ์ œ๋•Œ ๋ฐฉ์„ ๋‚˜๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„ ์ƒ๋‹˜๋“ค๊ป˜์„œ ์ œ๊ฐ€ ์ž๋Š”์ง€ ์˜์‹ฌํ•˜์‹ค ์ˆ˜ ์žˆ๋”๊ตฐ์š”!
๊ฒŒ๋‹ค๊ฐ€ ์ œ ์นœ๊ตฌ๋Š” ์ˆ˜์—… ๋•Œ ์ž์„œ ๋ฐฉ์„ ๋น ์ ธ๋‚˜์˜ค์ง€ ๋ชปํ–ˆ๋Š”๋ฐ, ์„ ์ƒ๋‹˜๊ป˜์„œ ํšŒ์˜์‹ค์—์„œ ๊ฐ•์ œํ‡ด์žฅ ์‹œํ‚ค๋Š” ๋ฒ•์„ ๋ชฐ๋ผ์„œ ๋ˆˆ์„ ๋–  ๋ณด๋‹ˆ ๋‹ค๋ฅธ ๋ฐ˜ ์• ๋“ค์ด ์›ƒ๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ... ์ƒ์ƒ๋งŒ ํ•ด๋„ ๋”์ฐํ•œ ์‚ฌํƒœ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜๋„ ์žˆ๊ฒ ๊ตฐ์š”.
์ˆ™๋ฉด์„ ์œ„ํ•ด์„œ ์ด๋Ÿฐ ์‹ค์ˆ˜๋Š” ์šฉ๋‚ฉํ•  ์ˆ˜ ์—†๋Š” ๋ฒ•!
์ œ๋•Œ ํšŒ์˜์‹ค์„ ๋น ์ ธ๋‚˜๊ฐ€๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋ด…์‹œ๋‹ค. ๐Ÿ’ช

๐Ÿ” ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์คŒ ํด๋ผ์ด์–ธํŠธ์˜ PID ๊ฐ€์ ธ์˜ค๊ธฐ

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์ข…๋ฃŒํ•  ์‹œ๊ฐ„์ด ๋˜๋ฉด ์คŒ ํด๋ผ์ด์–ธํŠธ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์•„, ์ฃฝ์—ฌ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด์ฃ .
์ด๊ฑธ ์œ„ํ•ด์„œ๋Š” ์คŒ ํด๋ผ์ด์–ธํŠธ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ๋ ค์„œ ์ฐพ์•„๋ณผ๊ฒŒ์š”.

import psutil

process_pid_list = psutil.pids()
for process_pid in process_pid_list:
  process = psutil.Process(process_pid)
  print(process)

psutil ๋ชจ๋“ˆ์€ ํŒŒ์ด์ฌ์—์„œ ํ˜„์žฌ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
psutil.pids ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด ๋ดค์–ด์š”.

...
psutil.Process(pid=53193, name='Google Chrome Helper (Renderer)', status='running', started='04:23:39')
psutil.Process(pid=53216, name='Google Chrome Helper (Renderer)', status='running', started='04:25:31')
psutil.Process(pid=53279, name='LookupViewService', status='running', started='04:29:59')
psutil.Process(pid=53410, name='bluetoothaudiod', status='running', started='04:42:05')
psutil.Process(pid=53501, name='zoom.us', status='running', started='04:54:38')
psutil.Process(pid=53505, name='com.apple.appkit.xpc.openAndSavePanelService', status='running', started='04:54:46')
psutil.Process(pid=53506, name='QuickLookUIService', status='running', started='04:54:47')
psutil.Process(pid=53507, name='ACCFinderSync', status='running', started='04:54:47')
...

์ฐพ์•˜์Šต๋‹ˆ๋‹ค! name์ด zoom.us์ธ ๋ฐ”๋กœ ์ € ํ”„๋กœ์„ธ์Šค(53501)๋„ค์š”.

import psutil

def get_zoom_process():
  process_pid_list = psutil.pids()
  for process_pid in process_pid_list:
    process = psutil.Process(process_pid)
    process_name = str(process.name())
    if 'zoom' in process_name:
      print(process)
      return process
  return None

์ด์ œ ์คŒ ํด๋ผ์ด์–ธํŠธ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ get_zoom_process๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ซ ์คŒ ํด๋ผ์ด์–ธํŠธ ์ข…๋ฃŒ์‹œํ‚ค๊ธฐ

def kill_zoom_process():
  try:
    process = get_zoom_process()
    if process != None:
      process.kill()
      return 1
  except:
    return 0
  return 0

process.kill์„ ์ด์šฉํ•ด ์ฐพ์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ํ•จ์ˆ˜ kill_zoom_process ์ž…๋‹ˆ๋‹ค.
์ข…๋ฃŒ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ 1(์„ฑ๊ณต) ๋˜๋Š” 0(์‹คํŒจ)์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ–ˆ์–ด์š”. if ๋ฌธ์œผ๋กœ ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ง€์š”!

๐Ÿ™Œ ๊ฒฐ๊ณผ ์ฐ์–ด์ฃผ๊ธฐ

def close_classroom() -> None:
  if kill_zoom_process():
    console.print(f'โœ˜ ์ˆ˜์—… ๋‚˜๊ฐ€๊ธฐ ์™„๋ฃŒ', style='dim')
  else:
    console.print(f'โœ˜ ์ˆ˜์—… ๋‚˜๊ฐ€๊ธฐ ์‹คํŒจ', style='dim')

์ด๋ ‡๊ฒŒ ์˜ˆ์˜๊ฒŒ ๊ฒฐ๊ณผ๊นŒ์ง€ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

for classroom in classrooms_for_today:
  schedule.every().day.at(classroom['start_time']).do(open_classroom, classroom=classroom)
  schedule.every().day.at(classroom['end_time']).do(close_classroom)

console.print('์ˆ˜์—…์ด ๋๋‚˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...', style='dim')
while True:
  schedule.run_pending()

์ˆ˜์—…์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„์ธ classroom['end_time']์— ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์Šค์ผ€์ค„์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋! ๐Ÿ‘

๐Ÿš€ ๊ฟ€์ž  ์„ฑ๊ณต!

์™„์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต

์ง ! ๊ฒฐ๊ตญ ์ €๋Š” ํŒŒ์ด์ฌ ๋•๋ถ„์— ๋งค์ผ๋งค์ผ ํ‘น ์ž๊ณ  ์ผ์–ด๋‚˜ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋„ˆ๋ฌด ์นผ ๊ฐ™์ด ์ˆ˜์—…์ด ๋๋‚˜์ž๋งˆ์ž ์ข…๋ฃŒ๋˜๋Š” ๋ฐ”๋žŒ์— ํ•œ๋ฒˆ์€ ์ˆ˜ํ•™ ์„ ์ƒ๋‹˜์ด ์ˆ˜์—… ๋๋‚˜๊ณ ๋„ ํ•˜์‹ค ๋ง์”€์ด ์žˆ์œผ๋‹ˆ ๊ธฐ๋‹ค๋ฆฌ๋ผ๊ณ  ํ•˜์…จ๋Š”๋ฐ๋„ ํ˜ผ์ž ์Œฉ ๋‚˜๊ฐ€ ๋ฒ„๋ ค์„œ... ๋’ค๋Šฆ๊ฒŒ ์„ ์ƒ๋‹˜๊ป˜ ์—ฐ๋ฝ์„ ๋ฐ›๊ณ  ๋งค์šฐ ์ซ„์•˜์ง€๋งŒ ์ปดํ“จํ„ฐ๊ฐ€ ์ˆ˜์—…์ด ๋๋‚˜๊ธฐ ์ „์— ํŠ•๊ฒผ๋‹ค๊ณ  ํ•‘๊ณ„๋ฅผ ๋Œ€๋ฉฐ ์žฅ๋ฌธ์˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋„˜์–ด๊ฐ”๋˜ ๊ฒŒ ๊ธฐ์–ต์ด ๋‚˜๋„ค์š”. ์ดํ›„ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด(?) ์กฐ๊ธˆ์”ฉ ์ข…๋ฃŒ ์‹œ๊ฐ„์„ ๋Šฆ์ถฐ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
์Œค...! ๊ฑฐ์ง“๋ง์ด์˜€์–ด์š”ใ…œใ… ใ…œใ…  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค๐Ÿฅฐ

๊ทธ๋ž˜๋„ ์ €๊ฑฐ ์—†์ด๋Š” ์ˆ˜์—… ๋ชป ๋“ค์–ด๊ฐˆ ๋งŒํผ ๋•์„ ๋˜‘๋˜‘ํžˆ ๋ดค์—ˆ๋„ค์š”! โญ๏ธ

๐ŸŽธ ๊ธฐํƒ€

  • ์œ„ ์ฝ”๋“œ์—์„œ ๋กœ๊ทธ ์ฐ์„ ๋•Œ ์ œ๊ฐ€ print ํ•จ์ˆ˜ ๋Œ€์‹  ์‚ฌ์šฉํ•œ console.print๋Š” rich ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๊ฐ€ ์˜ˆ๋ป์ ธ์š”.
  • ์Šคํฌ๋ฆฐ์ƒท์— ์žˆ๋Š” ํ…Œ์ด๋ธ” ์—ญ์‹œ rich์˜ Table ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์—ˆ์–ด์š”.

๐Ÿ™ ์ด์ œ๋Š” ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฐ–์—๋„ ํ•™๊ต์—์„œ IT ์™ธ๊ธธ์ธ์ƒ์„ ๊ฑธ์œผ๋ฉฐ ์‚ด์•„๋‚จ๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ์š”.
์ด์ œ๋Š” ๋งํ•  ์ˆ˜ ์žˆ๋‹ค! ํ•˜๊ณ  ๋ช‡ ๊ฐœ ์ฐ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๐Ÿ B ๋ชจ ์˜จ๋ผ์ธ ํ•™์Šต ์‹œ์Šคํ…œ: ์ €ํฌ ํ•™๊ต์—์„œ ์•„์นจ๋งˆ๋‹ค ๋ช‡ ๋ฌธ์ œ์”ฉ ํ’€๋„๋ก ์ •ํ•ด์ง„ ๊ต๋‚ด ํ•™์Šต ์‹œ์Šคํ…œ์ธ๋ฐ์š”. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑธ ๋ฐœ๊ฒฌํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ง€ ์•Š๊ณ ๋„ ์ •๋‹ต์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋Œ€๋†“๊ณ  ๋‹ต์„ ๋งž์ถ”๋ฉด ๋“คํ‚ค๋‹ˆ๊นŒ bias๋ฅผ ์ค˜์„œ ์ผ์ • ํ™•๋ฅ ๋กœ ์ฐ๊ฒŒ ํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜๋„ค์š”(์ œ ์‹ค๋ ฅ์ฒ˜๋Ÿผ ์„ธํŒ…ํ•ด๋‘ฌ์„œ ์‚ฌ์‹ค์ƒ ๊ฑฐ์˜ ๋žœ๋ค์ด์˜€๋„ค์š”). TypeScript์™€ Puppeteer๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๐Ÿง‘โ€๐Ÿ’ป ์ธ๊ฐ•์‹ค ์‹ ์ฒญ ๋งคํฌ๋กœ: ์ €ํฌ ํ•™๊ต๋Š” ๊ธฐ์ˆ™์‚ฌ ํŠน์„ฑํ™”๊ณ ๋ผ์„œ ์•ผ์ž ์‹œ๊ฐ„์ด ์กด์žฌํ•˜๋Š”๋ฐ์š”. ์•ผ์ž ๋•Œ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•™๊ต ์ธํŠธ๋ผ๋„ท์œผ๋กœ '์ธ๊ฐ•์‹ค ์ขŒ์„'์„ ์‹ ์ฒญํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์› ์ œํ•œ์ด ์žˆ๋Š”๋ฐ 1ํ•™๋…„ ์ดˆ์—๋Š” ๋„ˆ๋ฌด ๊ฒฝ์Ÿ์ด ๋นก์„ธ์„œ ์‹ ์ฒญ ์‹œ์ž‘ ์‹œ๊ฐ„์— ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ณด๋‚ด๊ณ , ์‹ ์ฒญ์— ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋ˆ„๊ฐ€ ํ‹ฐ์ผ“์„ ํฌ๊ธฐํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ–ˆ๋‹ค ์–ผ๋ฅธ ์ค์คํ•˜๋Š” ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ๋“ค์ผœ์„œ ์Œค๋“คํ•œํ…Œ ํ˜ผ๋‚˜๊ณ  ์šธ์—ˆ๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. ์„ ๋„ ๊ฐˆ ๋ป”ํ–ˆ๋„ค์š” ใ…Žใ…Ž
  • โฐ ์˜จ๋ผ์ธ ์ˆ˜์—… ์‹œ๊ฐ„์— ๋งž์ถฐ์„œ ์›น ๋…ธํ‹ฐํ”ผ์ผ€์ด์…˜์„ ๋ณด๋‚ด์ฃผ๋Š” ์„œ๋น„์Šค: ์ € ๋ง๊ณ  ๋‹ค๋ฅธ ์• ๋“ค๋„ ๋งŽ์ด ์žค์—ˆ๋Š”๋ฐ ์ด๋“ค์„ ์œ„ํ•ด์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋ฅผ ๊ณต๋ถ€ ์ค‘์ด๋˜ ํ›„๋ฐฐ๋ž‘ ๊ฐ™์ด ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์˜€์Šต๋‹ˆ๋‹ค.
  • ๐Ÿ“† ํ•™๊ธ‰ ์‹œ๊ฐ„ํ‘œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํฌ๋กฌ ์ต์Šคํ…์…˜: 1ํ•™๋…„ ๋•Œ ์นœ๊ตฌ๊ฐ€ ๋…ธํŠธ๋ถ ํ•˜๋Š๋ผ ์ˆ˜์—… ์ค€๋น„๋ฅผ ๋ชปํ•˜๋Š” ๊ฑธ ๋ณด๊ณ  ๋งŒ๋“ค์–ด์ค€ ํฌ๋กฌ ์ต์Šคํ…์…˜์ž…๋‹ˆ๋‹ค.

๐Ÿฅ‘ ์—ฌ๋‹ด

์นœ๊ตฌ๊ฐ€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ์ œ์•ˆํ•ด ์คฌ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ JUST DO IT

๋น„๋ก ํž˜๋“  ์ˆœ๊ฐ„๋„ ์žˆ์—ˆ์ง€๋งŒ ํ•™๊ต์—์„œ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋“ค์„ ์ง„ํ–‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์ •๋ง ์žฌ๋ฏธ์žˆ๋Š” ์ถ”์–ต์œผ๋กœ ๋‚จ์•˜๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์›ƒํ”ˆ ํ—คํ”„๋‹๋„ ์žˆ์—ˆ๊ณ , ๋ฟŒ๋“ฏํ–ˆ๋˜ ์ˆœ๊ฐ„๋“ค๋„ ์žˆ์—ˆ์œผ๋‹ˆ๊นŒ์š”.

๊ทธ๋ƒฅํ•ด

๋Œ์•„๋ณด๋‹ˆ ์•ฝ๊ฐ„ ์ปจ์…‰๋ผ ๋„˜์น˜๋Š” ๊ธ€์ด ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์žฌ๋ฏธ์žˆ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋Š”๋ฐ๋„ ์ฃผ์ €ํ•˜๋Š” ํ•™์ƒ ๋ถ„๋“ค์ด ๊ณ„์‹œ๋‹ค๋ฉด ๋‚จ๋“ค ๋ˆˆ์น˜๋ณด์ง€ ๋ง๊ณ  ๊ทธ๋ƒฅ ํ•ด๋ณด์…จ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ๋œป์—์„œ ์“ฐ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

ํ˜น์‹œ ๋ฐ˜๋ณต๋˜๋Š” ํšŒ์˜๋‚˜ ์ˆ˜์—…์œผ๋กœ ์ธํ•ด ๊ณ ํ†ต๋ฐ›๋Š” ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด, ์˜ค๋Š˜ ๋‹ค๋ฃฌ ์ฝ”๋“œ์˜ ์ „์ฒด ์†Œ์Šค๋Š” ๊นƒํ—ˆ๋ธŒ ์—ฌ๊ธฐ์— ์žˆ์œผ๋‹ˆ ํฌํฌํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ธฐ์—ฌ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜Ž

โœจKakaoPay๋กœ ํ›„์›ํ•ด์„œ ๋‹ค์Œ ๊ธ€ ์‘์›ํ•˜๊ธฐ

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ