Skip to content

Latest commit

ย 

History

50 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

variable-recommander

์ด์ŠคํŠธ์†Œํ”„ํŠธ์—์„œ ์ฃผ๊ด€ํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋ถ€ํŠธ์บ ํ”„ '์˜ค๋ฅด๋ฏธ'์—์„œ ๋ฐฐ์šฐ๋ฉฐ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ํ‰์†Œ์—๋„ ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช…์„ ์ง€์„ ๋•Œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•˜๋Š” ํŽธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฃผ์ œ๋ฅผ '๋ณ€์ˆ˜๋ช… ์ถ”์ฒœ๊ธฐ'๋กœ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ChatGPT์˜ API ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ์›นํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. HTML, CSS, JavaScript ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์„ ์—์„œ ์žฌ๋Ÿ‰๊ป ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Bootstrap, Tailwind ๋“ฑ์˜ ์‚ฌ์šฉ๋„ ๊ณ ๋ ค๋˜์—ˆ์ง€๋งŒ ์•„์ง ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฐ์ข… ๊ธฐ๋Šฅ๊ณผ ์–ธ์–ด๊ฐ€ ๋‚ฏ์„ค๊ณ  ์ต์ˆ™ํ•ด์ ธ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์ง€์ƒํƒœ์—์„œ ์ œ์ž‘์„ ์‹œ๋„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์€ 23.08.29 ~ 23.09.06 ์ด 9์ผ์ด์—ˆ์œผ๋ฉฐ, 1์ธ๊ฐœ๋ฐœ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

GitHub: https://github.com/jmkim648/variable-recommander
๋ฐฐํฌ: https://jmkim648.github.io/variable-recommander/



<๋ชฉ์ฐจ>

1. ์ฃผ์š” ๊ธฐ๋Šฅ

  • ํ•จ์ˆ˜๋ช…/๋ณ€์ˆ˜๋ช… ์ถ”์ฒœ ๊ธฐ๋Šฅ
  • ์ฝ”๋“œ ์ž…๋ ฅ์‹œ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ
  • localStorage ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ๊ฒ€์ƒ‰ ์ด๋ ฅ ๊ด€๋ฆฌ

2. ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ

  • Dark Mode ์„ค์ •
  • History(๊ฒ€์ƒ‰ ์ด๋ ฅ) ๋ฉ”๋‰ด ์Šฌ๋ผ์ด๋“œ
  • ์•„์ด์ฝ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜(Dark mode toggle button, history menu slide button)

3. ๊ธฐ๋Šฅ ์„ค๋ช…

  • ๊ตฌํ˜„ ํ™”๋ฉด ๋ฐ ์„ค๋ช…

4. ๊ฐœ๋ฐœ ์ด์Šˆ

5. ๋ฏธํกํ–ˆ๋˜ ์ /์ถ”ํ›„ ๋ชฉํ‘œ

<์ฃผ์š” ๊ธฐ๋Šฅ>

<๋ฉ”์ธUI>

๊ธฐ๋Šฅ์„ค๋ช…1

<๋งˆ์ธ๋“œ๋งต>

๋งˆ์ธ๋“œ๋งต

<ํด๋” ๊ตฌ์กฐ>

root
โ”‚  index.html
โ”‚  README.md
โ”‚
โ”œโ”€css
โ”‚      common.css
โ”‚      darkmode.css
โ”‚      history.css
โ”‚      index.css
โ”‚
โ”œโ”€data
โ”‚      data.js
โ”‚
โ”œโ”€img
โ”‚      favicon.ico
โ”‚
โ””โ”€module
        gpt-api.js
        history.js
        index.js
        page-changer.js
        spin.js

<ํ๋ฆ„๋„>

flow

1. ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช… ์ถ”์ฒœ๊ธฐ๋Šฅ

์„ ํƒํ•œ ์–ธ์–ด์™€ ์šฉ๋„์— ๋งž๊ฒŒ ChatGPT๊ฐ€ ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช…์„ ์ถ”์ฒœํ•ด์ค๋‹ˆ๋‹ค. ํ•ด๋‹น ์–ธ์–ด์— ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์–ด๋–ค ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ช…์„ ์ง“๋Š”์ง€ ํ—ท๊ฐˆ๋ฆด ๋•Œ, ๋ฌด์–ธ๊ฐ€๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์€๋ฐ ์ด๋ฆ„์„ ์ง“๊ธฐ ๋ง‰๋ง‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์–ธ์–ด์˜ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ฝ”๋“œ ์ˆ˜์ •

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

3. ๊ฒ€์ƒ‰ ์ด๋ ฅ ์ €์žฅ, ์ถœ๋ ฅ ๋ฐ ์‚ญ์ œ

๋ธŒ๋ผ์šฐ์ €์˜ localStorage๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด History ๋ฉ”๋‰ด๋ฅผ ๊ตฌํ˜„, ๊ฒ€์ƒ‰ ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ ฅ์€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ป๋‹ค๊ฐ€ ์ผœ๋„ ๋‚จ์•„์žˆ์œผ๋ฉฐ, ์ตœ๋Œ€ 15๊ฐœ๊นŒ์ง€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ฒ€์ƒ‰ ์ด๋ ฅ์€ ์„ ํƒํ•œ ์–ธ์–ด๊ฐ€ ์ƒ๋‹จ์— <python>๊ณผ ๊ฐ™์ด ํ‘œ๊ธฐ๋˜๋ฉฐ, ์•„๋ž˜์— ์–ด๋–ค ๋‚ด์šฉ์„ ์ถ”์ฒœ๋ฐ›์•˜๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ์ด๋ ฅ ํ•ญ๋ชฉ์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ ๋‹น์‹œ ํ‘œ์‹œ๋˜์—ˆ๋˜ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ, ์šฐ์ธก์˜ 'X'ํ‘œ์‹œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ์ด๋ ฅ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



<๋ถ€๊ฐ€ ๊ธฐ๋Šฅ>

1. ๋‹คํฌ๋ชจ๋“œ, ๋ผ์ดํŠธ๋ชจ๋“œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜

Dark Mode ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋” ์šฐ์ธก์˜ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ dark mode, light mode๋กœ ํ† ๊ธ€ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. light mode์ผ ๋•Œ๋Š” ์•„์ด์ฝ˜์ด ๊ฒ€์€์ƒ‰ ํ•ด ๋ชจ์–‘์ด๊ณ , dark mode์ผ ๋•Œ๋Š” ํ•˜์–€์ƒ‰ ๋‹ฌ ๋ชจ์–‘์œผ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ „ํ™˜๋  ๋•Œ๋งˆ๋‹ค ๋ฒ„ํŠผ์— ๊ฐ„๋‹จํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. ๋ฉ”๋‰ด ์Šฌ๋ผ์ด๋“œ ์• ๋‹ˆ๋ฉ”์ด์…˜

History(๊ฒ€์ƒ‰์ด๋ ฅ) ๋ฉ”๋‰ด ์™ผ์ชฝ์˜ ํ™”์‚ดํ‘œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด History๋ฉ”๋‰ด๊ฐ€ ์šฐ์ธก์œผ๋กœ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. mainํ™”๋ฉด์ด ๋ฐ˜์‘ํ˜•์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— History ๋ฉ”๋‰ด๊ฐ€ ์ ‘ํž ๋•Œ main ๋ฉ”๋‰ด๊ฐ€ ์˜†์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. History ๋ฉ”๋‰ด๊ฐ€ ์ ‘ํž ๋•Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋ฉฐ ํ™”์‚ดํ‘œ๋„ 180๋„ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. History ๋ฉ”๋‰ด๊ฐ€ ์ ‘ํ˜€์žˆ์„ ๋•Œ ํ™”์‚ดํ‘œ๋ฅผ ๋‹ค์‹œ ๋ˆ„๋ฅด๋ฉด ๋ฉ”๋‰ด๊ฐ€ ํŽผ์ณ์ง‘๋‹ˆ๋‹ค.

<๊ธฐ๋Šฅ ์„ค๋ช…>

1. ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช… ์ถ”์ฒœ

1๋ฒˆ๊ธฐ๋Šฅ์‹œ์—ฐ

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

2. ์–ธ์–ด์— ๋งž๋Š” ์ปจ๋ฒค์…˜ ์ ์šฉ

2๋ฒˆ๊ธฐ๋Šฅ์‹œ์—ฐ

  • ์ƒ๋‹จ ์–ธ์–ด์„ ํƒ ๋ฉ”๋‰ด์—์„œ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‹จ์˜ ์ฝ”๋“œ ์ž…๋ ฅ๋ž€์— ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๋”ฉ ํ›„ ๊ฒฐ๊ณผ์ฐฝ์— ์ˆ˜์ •๋œ ์ฝ”๋“œ, ์ฃผ์š” ์ˆ˜์ •์‚ฌํ•ญ์ด ์ฃผ์„์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

3. history(๊ฒ€์ƒ‰ ์ด๋ ฅ)

ํžˆ์Šคํ† ๋ฆฌํด๋ฆญ

  • ์ถ”์ฒœํ•˜๊ธฐ! ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์–ธ์–ด, ์šฉ๋„๊ฐ€ ์šฐ์ธก ๊ฒ€์ƒ‰์ด๋ ฅ ๋ฉ”๋‰ด์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ์ด๋ ฅ ๋ฉ”๋‰ด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ํ•ญ๋ชฉ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐ๊ณผ์ฐฝ ํ™”๋ฉด์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์ŠคํŠธ ์˜ค๋ฅธ์ชฝ์˜ X ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด ํ•ญ๋ชฉ์ด ์‚ญ์ œ๋˜์–ด ๊ฒ€์ƒ‰ ์ด๋ ฅ์—์„œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ์ด๋ ฅ์€ ์ตœ๋Œ€ 15๊ฐœ๊นŒ์ง€๋งŒ ์ €์žฅ๋˜๋ฉฐ, ๊ทธ ์ด์ƒ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ๋ถ€ํ„ฐ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

4. ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€

๋‹คํฌ๋ชจ๋“œ

  • ์šฐ์ธก ์ƒ๋‹จ์˜ ์•„์ด์ฝ˜์„ ํด๋ฆญ์‹œ ๋‹คํฌ๋ชจ๋“œ, ๋ผ์ดํŠธ๋ชจ๋“œ๊ฐ€ ํ† ๊ธ€๋ฉ๋‹ˆ๋‹ค.
  • ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

5. ๊ฒ€์ƒ‰ ์ด๋ ฅ ๋ฉ”๋‰ด ์Šฌ๋ผ์ด๋“œ ์• ๋‹ˆ๋ฉ”์ด์…˜

๋ฉ”๋‰ด์Šฌ๋ผ์ด๋“œ

  • ๊ฒ€์ƒ‰ ์ด๋ ฅ ๋ฉ”๋‰ด ์ขŒ์ƒ๋‹จ์˜ โ–ถ๋ฅผ ํด๋ฆญ ์‹œ ๋ฉ”๋‰ด์˜ width๊ฐ€ ์ค„์–ด๋“ค๋ฉฐ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • โ—€๋กœ ๋ฐ”๋€ ์•„์ด์ฝ˜์„ ๋‹ค์‹œ ํด๋ฆญํ•˜๋ฉด ๋ฉ”๋‰ด๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ์ค‘ ๋‚ด๋ถ€ ๊ธ€์”จ๊ฐ€ ์‚ด์•„์žˆ์œผ๋ฉด ์ค„๋ฐ”๋€œ์ด ์ ์šฉ๋˜๋ฉด์„œ ๊ธ€์ด ๊ธธ์ญ‰ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, โ–ถ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ฆ‰์‹œ ๋‚ด๋ถ€ ๋‚ด์šฉ์„ ์‚ญ์ œ์‹œํ‚ต๋‹ˆ๋‹ค. โ—€๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚œ ํ›„ ๋‚ด๋ถ€ ์š”์†Œ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


<๊ฐœ๋ฐœ ์ด์Šˆ>

1. ๋ฉ”๋‰ด ์Šฌ๋ผ์ด๋“œ ๊ตฌํ˜„ ์‹œ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ ์ผ๋ถ€ ์ ์šฉ

๋ฉ”๋‰ด๋ฅผ ๋‹ซ์„ ์‹œ ํ•ด๋‹น ์š”์†Œ๋งŒํผ width๊ฐ’์ด ๋ณ€ํ•˜๋ฉด์„œ ๊ธฐํšํ–ˆ๋˜ ์˜๋„์™€ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๋””์ž์ธ์ด ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ธ ํ™”๋ฉด์˜ width๊ฐ’์„ ๊ณ ์ •๊ฐ’์ด ์•„๋‹ˆ๋ผ %๋ฅผ ์‚ฌ์šฉํ•œ ๋น„์œจ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ณ , max-width๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์˜ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

.main-container {
    height: calc(100vh - 80px);
}
/.../
.chat-wrap {
    width: 50%;
    max-width: 650px;
}

๋ฉ”๋‰ด ์Šฌ๋ผ์ด๋“œ ์‹œ ์„ค์ •ํ•œ ์ตœ๋Œ€ width๊ฐ’์„ ๋„˜์ง€ ์•Š๋Š” ์„ ์—์„œ ๋ฉ”์ธ ํ™”๋ฉด์ด ๊ฐ€๋กœ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

2. class ์ถ”๊ฐ€/์ œ๊ฑฐ์™€ transition์„ ์ด์šฉํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ค„ ์•„์ด์ฝ˜์— transition: all ease 0.5๋ฅผ ์ฃผ๊ณ  toggle ์‹œ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด transform์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋ฅผ ์ฒ˜์Œ ๊ทธ๋ฆด ๋•Œ ์•„์ด์ฝ˜์œผ๋กœ ์ผ๋˜ ์ด๋ชจ์ง€ โ˜€๏ธ์— ์ ์šฉ๋œ scale, color ๋“ฑ์˜ ํšจ๊ณผ๊นŒ์ง€ ์„œ์„œํžˆ ์ ์šฉ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๋กœ transform์„ ์ ์šฉํ•˜์˜€์„ ์‹œ, โ˜€๏ธ์—์„œ ๐ŸŒ™๋กœ ๋ณ€ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•˜๊ณ  ๐ŸŒ™์—์„œ โ˜€๏ธ๋กœ ๋ณ€ํ•  ๋•Œ๋„ ๋ณ„๊ฐœ์˜ ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

.dark-mode-button {
    scale: 1.5;
    border: 0;
    color: transparent;
    margin-right: 15px;
    transition: text-shadow ease 0.3s, transform ease 0.3s;
}

.scale-down {
    transform: scale(0) rotate(180deg);
}
$darkModeButton.addEventListener("click", (e) => {
    e.preventDefault();
    let currentClass = $body.className;
    $body.className = currentClass === "dark-mode" ? "light-mode" : "dark-mode";
    //button animation
    $darkModeButton.classList.add('scale-down');
    setTimeout(()=>{
        $darkModeButton.classList.remove('scale-down');
        $darkModeButton.innerHTML = $darkModeButton.innerHTML === "๐ŸŒ™" ? "โ˜€๏ธ" : "๐ŸŒ™";
    }, 200);
});

์œ„์˜ ๋ฌธ์ œ๋Š” class์†์„ฑ์„ ์„ค์ • ํ›„ ํ•ด๋‹น class๋ฅผ add, remove ํ•˜๋Š” ํ˜•ํƒœ๋กœ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ ธ ํšจ์œจ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ์˜ฌ๋ž์œผ๋ฉฐ, ๊ฒธ์‚ฌ๊ฒธ์‚ฌ setTimeout์„ ์ด์šฉํ•œ ๋”œ๋ ˆ์ด๊นŒ์ง€ ๋ฐฐ์›Œ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

3. ๋””์ž์ธ ์ƒ‰์ƒ ๋ฐ class ํ†ต์ผ, ๋ณ€์ˆ˜ ์‚ฌ์šฉ

์ฒ˜์Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ „ Layout์„ ์งœ ๋†“์€ ๋’ค, ๊ธฐ๋Šฅ ๊ตฌํ˜„๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค๋งˆ๋‹ค ์ƒˆ๋กœ CSS๋ฅผ ๊ถ๋ฆฌํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„๊ณผ ์‹ฌ๋ ฅ์†Œ๋ชจ๊ฐ€ ๊ทน์‹ฌํ•œ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํฌ๋ชจ๋“œ๋ฅด ๊ตฌํ˜„ํ•  ๋•Œ ์ƒ‰์ƒ์„ ํ•œ๋ฒˆ ๋” ๊ณ ๋ฏผํ•˜๊ณ  ์ง€์ •ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ‰์ƒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

/* variable */
:root {
  --black: #151515;
  --white: rgb(230, 230, 230);

  /* dark */
  --dark-color-header: rgb(32, 33, 35);
  --dark-color-main: rgb(70, 70, 85);
  --dark-color-history: rgb(53, 53, 65);

  /.../

  /* input */
  --dark-input-textbox: rgb(230, 230, 230);
  --dark-input-textarea: rgb(230, 230, 230);
  --light-input-textbox: rgb(220, 220, 220);
  --light-input-textarea: rgb(220, 220, 220);
}

/* subject-title holder, title */
body.dark-mode .subject-title {
  color: var(--white);
}
body.light-mode .subject-title {
  color: var(--black);
}

๋˜ํ•œ ๋ชจ๋“  ์š”์†Œ์— ์ ์šฉํ•˜์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ, ๊ณตํ†ต๋œ ์šฉ๋„๋ฅผ ๊ฐ–๋Š” ์š”์†Œ์— ๋™์ผํ•œ ํด๋ž˜์Šค๋ช…์„ addํ•˜์—ฌ ํ•œ๋ฒˆ์— ์Šคํƒ€์ผ ์ง€์ •์„ ํ•  ์ˆ˜ ์žˆ์–ด ํšจ์œจ์„ฑ์„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

4. ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ์…‹ init ๊ด€๋ จ

์ถ”ํ›„ ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์˜ data๋กœ ์“ธ ๋ฌธ์ž์—ด์„ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ

//./data.js
export const python = [
  {
      "role": "system",
      "content": "assistant๋Š” ์‚ฌ๋ฌด์ ์ธ Python ์ „๋ฌธ๊ฐ€์ด๋‹ค."
  },
  {
      "role": "system",
      "content": "assistant๋Š” ํ•จ์ˆ˜๋ช…, ๋ณ€์ˆ˜๋ช… ์ถ”์ฒœ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค."
  },
  {
      "role": "system",
      "content": "assistant๋Š” Python ์ด์™ธ์˜ ์งˆ๋ฌธ์—๋Š” ๋‹ต๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค."
  },
]

์˜ ํ˜•ํƒœ๋กœ ๋”ฐ๋กœ jsํŒŒ์ผ์— Objectํ˜•ํƒœ๋กœ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณธ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์–ด๋ณ„, ๊ธฐ๋Šฅ๋ณ„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด 8๊ฐœ์˜ ๋ฐ์ดํ„ฐ์…‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ผ์ผ์ด ์„ ์–ธ, Init์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

let currentData = [];
let dataPython = [];
let dataJava = [];
let dataCpp = [];
let dataJs = [];
let conventionPython = [];
let conventionJava = [];
let conventionCpp = [];
let conventionJs = [];

dataPython = jsonObject.python;
...
conventionCpp = jsonObject.conCpp;
conventionJs = jsonObject.conJs;

๊ฐœ๋ฐœ ์ค‘ ๊ฐ€๋…์„ฑ๊ณผ ํŽธ์˜์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๋А๊ปด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค.

const dataMap = {
  1: {
      python: [],
      java: [],
      cpp: [],
      javascript: [],
  },
  2: {
      python: [],
      java: [],
      cpp: [],
      javascript: [],
  },
};
function initData() {
  dataMap[1].python = jsonObject.python;
  dataMap[1].java = jsonObject.java;
  dataMap[1].cpp = jsonObject.cpp;
  dataMap[1].javascript = jsonObject.javascript;
  dataMap[2].python = jsonObject.conpython;
  dataMap[2].java = jsonObject.conjava;
  dataMap[2].cpp = jsonObject.concpp;
  dataMap[2].javascript = jsonObject.conjavascript;
}

5. ํŒŒ์ผ ๋กœ๋“œ์™€ DOM ํŒŒ์‹ฑ ์ˆœ์„œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— DOM์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ๋’ค ๋งž์ดํ–ˆ๋˜ ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค.

Uncaught TypeError: Cannot set properties of null (setting 'innerHTML')

๋ Œ๋”๋ง ์—”์ง„์ด jsํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ํŒŒ์‹ฑ์„ ์ค‘๋‹จํ•˜๊ณ , jsํŒŒ์ผ์„ ๋กœ๋“œํ•œ ํ›„ ํ•ด๋‹น ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ํ•ด๋‹น js ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋˜๋‹ค ๋งŒ DOM์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ 1. scriptํƒœ๊ทธ๋ฅผ ๋ณธ๋ฌธ ์•„๋ž˜์— ์œ„์น˜์‹œํ‚จ๋‹ค. 2. async, defer ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜€์Šต๋‹ˆ๋‹ค.

 <script defer src="./module/index.js" type="module"></script>
 <script defer src="./module/page-changer.js" type="module"></script>
 <script defer src="./module/history.js" type="module"></script>
 <script defer src="./module/gpt-api.js" type="module"></script>

์šฐ์„  ์—๋Ÿฌ๊ฐ€ ๋‚  ๋•Œ ํ™•์ธ ํ›„ defer๋ฅผ ๋ถ™์—ฌ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดํ›„ defer๋ฅผ ์—†์• ๋„ ๋‹ค์‹œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š” ๋“ฑ ์ •ํ™•ํ•œ ์šฉ๋„์™€ ์‚ฌ์šฉ๋ฒ• ํŒŒ์•…์— ๋ฏธ์ˆ™ํ•จ์„ ๋А๊ปด ๋” ์ฐพ์•„๋ณผ ํ•„์š”๋ฅผ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

6. ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง

์ฒ˜์Œ์—๋Š” ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ์–ด๋ง์„ '์›ํ•˜๋Š” ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•™์Šตํ•˜๋Š” ๊ฒƒ'์œผ๋กœ ์ดํ•ดํ–ˆ์ง€๋งŒ ๋ฉฐ์น  ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ•™์Šต์ด ์•„๋‹ˆ๋ผ '๋Œ€ํ™”๋ฅผ ํ•˜๋ฉด์„œ ํ๋ฆ„์„ ์žก์•„์ฃผ๋Š” ๊ฒƒ'์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

  {
      //GPT์˜ ์—ญํ•  ์ง€์ •
      "role": "system",
      "content": "assistant๋Š” Python ์ „๋ฌธ๊ฐ€์ด๋‹ค."
  /.../
  {
      //GPT์™€ ๋Œ€ํ™”๋ฅผ ํ•˜๋ฉด์„œ ์š”์ฒญ, ๊ทœ์œจ ๋ช…์‹œ
      "role": "system",
      "content": "assistant๋Š” ์ฝ”๋“œ๋ฅผ Python ์Šคํƒ€์ผ๋กœ ๋ณด์—ฌ์ค€๋‹ค."
  },
  {
      //๋‹ต๋ณ€ ํ˜•ํƒœ ์š”์ฒญ
      "role": "user",
      "content": "์•ž์œผ๋กœ ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช… ์งˆ๋ฌธ์€ list๋กœ ๋‹ตํ•ด์ค˜."
  },
  /.../
  {
      //GPT์˜ ๋‹ต๋ณ€์„ ์ €์žฅํ•ด ์•ž์œผ๋กœ์˜ ๋‹ต๋ณ€ ํ˜•์‹๊ณผ ๋ฐฉํ–ฅ์„ฑ์„ ์œ ๋„
      "role": "assistant",
      "content": "ํ•จ์ˆ˜๋ช…: \n 1. multiply: ๊ณฑ์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ \n 2. product: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ \n 3. calculate_product:/.../ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ \n 2. result: ๊ณฑ์…ˆ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜ \n 3. multiplier, multiplicand: ๊ณฑ์…ˆ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ \n 5. operand1, operand2: ๊ณฑ์…ˆ์— ์‚ฌ์šฉ๋˜๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜"
  },

์ฒ˜์Œ์—๋Š” ๊ฐ์„ ์žก์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์‹คํ—˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งฅ๋ฝ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

GPT์˜ ๋‹ต๋ณ€์— ๊ทœ์น™๊ณผ ์ œ์•ฝ์„ ์ •ํ•˜๋Š” ๊ฒƒ์€ role: system์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. role: user๋กœ ์š”์ฒญ์„ ํ•ด๋„ ๋ฐ›์•„๋“ค์—ฌ์ง€์ง€๋งŒ ์ƒ๋Œ€์ ์œผ๋กœ system์— ๋น„ํ•ด ๊ฐ•๊ฑดํ•˜์ง€๋Š” ๋ชปํ•œ ๋А๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€์˜ ๊ตฌ์ฒด์ ์ธ ํ˜•ํƒœ๋Š” role: user๋กœ "~~ํ•˜๊ฒŒ ๋‹ตํ•ด์ค˜." ๋ผ๋Š” ํ˜•ํƒœ๋กœ ์š”์ฒญํ•ด๋„ ๋ฐ›์•„๋“ค์—ฌ์ง€๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ ๋ฌด์‹œ๋˜๋Š” ๊ฒฝํ–ฅ์ด ๊ฐ•ํ–ˆ์Šต๋‹ˆ๋‹ค. role: assistant๋กœ GPT์˜ ๋‹ต๋ณ€ ์ค‘ ์ด๋Ÿฐ ํ˜•ํƒœ๊ฐ€ ์œ ํšจํ–ˆ๋‹ค๊ณ  ์ž…๋ ฅํ•˜๋ฉด ๋†’์€ ํ™•๋ฅ ๋กœ ๊ทธ ํ˜•ํƒœ์— ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ role: user๋กœ ๊ฐ™์€ ์œ ํ˜•์˜ ์งˆ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๋ฉด GPT์˜ ๋Œ€ํ™”์™€ ๋‹ต๋ณ€์˜ scope๊ฐ€ ๊ทธ๊ฒƒ์— ์ง‘์ค‘๋˜๋Š” ๊ฒฝํ–ฅ์„ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

7. GPT์˜ ๋‹ต๋ณ€ ํ›„์ฒ˜๋ฆฌ ๋ฐ ์ •๊ทœํ™”

"ํ•จ์ˆ˜๋ช…:  1. multiply: ๊ณฑ์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜  2. product: ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜  3/..../๊ณฑ์…ˆ์˜ ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜  5. operand1, operand2: ๊ณฑ์…ˆ์— ์‚ฌ์šฉ๋˜๋Š” ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜"

GPT์˜ ๋‹ต๋ณ€์„ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ํ…์ŠคํŠธ๊ฐ€ ์œ„์™€ ๊ฐ™์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. consol.log(answer)๋กœ ์ฐ์–ด๋ณด๋‹ˆ ๋ฌธ์ž์—ด์— ์ด์Šค์ผ€์ดํ”„ ๊ฐœํ–‰๋ฌธ์ž '\n'์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ , HTML์—์„œ๋Š” ์ด๊ฒƒ์ด ์ธ์‹๋˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

function replaceNltoBr(answer) {
    if (typeof answer !== 'string') {
        return answer;
    }
    return answer.replace(/\n/g, "<br>");
}

'\n'์„
๋กœ ๋ฐ”๊ฟ” HTML์—์„œ๋„ ๊ฐœํ–‰์ด ์ธ์‹๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‘๋ฒˆ์งธ ์ฃผ์š” ๊ธฐ๋Šฅ '์ฝ”๋“œ ์ž…๋ ฅ ํ›„ ๋ณ€ํ™˜ ์ถœ๋ ฅ'์—์„œ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

const printAnswer = (answer) => {
saveHistoryData(answer);
saveLocalStorage(localData);
displayLocalStorage();
$chatList.innerText = "";
let li = document.createElement("li");
li.class_name = "answer";
add-pre-tag(li, answer);
$chatList.appendChild(li);
};

๋‹ต๋ณ€์ด ์ด๋Ÿฐ์‹์œผ๋กœ ์˜ค๋ฉด ๊ฐœํ–‰๋ฟ ์•„๋‹ˆ๋ผ tab๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— <br>ํƒœ๊ทธ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋’ค๋Šฆ๊ฒŒ HTML์˜ li์— text์š”์†Œ๋กœ ๋‹ต๋ณ€์„ ๋„ฃ์„ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ preํƒœ๊ทธ์™€ codeํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

function addPreTag(li, answer) {
    if (currentPage === 1) {
        li.innerText = answer;
    }
    else {
        let pre = document.createElement("pre");
        let code = document.createElement("code");
        code.className = `language-${selectedLang}`;
        code.innerText = answer;
        pre.appendChild(code);
        li.appendChild(pre);
    }
}

์ฝ”๋“œ ๋ธ”๋ก์„ ๋‹ต๋ณ€์œผ๋กœ ๋ฐ›์„ ๋•Œ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ li์š”์†Œ์— pre, code์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฝ”๋“œ ๋ธ”๋ก ์งธ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.



<๋ฏธํกํ–ˆ๋˜ ์ /์ถ”ํ›„ ๋ชฉํ‘œ>

Velog - ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ด๊ณ ..๋А๋‚€์ /๋ฏธํกํ–ˆ๋˜ ์ 

1. ์ตœ์†Œํ•œ์˜ ๊ธฐํš๊ณผ ๋””์ž์ธ์€ ๊ตฌ์„ฑ์„ ํ•œ ๋’ค ๊ฐœ๋ฐœํ•  ๊ฒƒ

  • ํŠนํžˆ, ์ดˆ๋ฐ˜ ๊ธฐํš์€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•  ๊ฒƒ
  • ์ต์ˆ™์น˜ ์•Š์•„๋„ ๋ฒ„๋ฆ‡์„ ๋“ค์ผ ๊ฒƒ

2. ๋ชจ๋“ˆํ™”๋ฅผ ์˜์‹ํ•˜๊ณ  ๊ณต๋ถ€ํ•  ๊ฒƒ

  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ์ตœ์šฐ์„ ์ ์œผ๋กœ ๊ณ ๋ ค
  • ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ชจ๋“ˆํ™”๋ผ๊ณ  ์ธ์‹ํ•˜์ง€ ๋ง๊ณ  ํ™•์‹คํžˆ ์•Œ๊ณ  ์“ธ ๊ฒƒ

3. ๊ธฐ๋Šฅ๊ตฌํ˜„, ์ตœ์ ํ™”์— ๊ท€์ฐฎ์•„ํ•˜์ง€ ๋ง ๊ฒƒ

  • ๋‚ด ์Šค์Šค๋กœ๋ฅผ ๊ณผ๋Œ€ํ‰๊ฐ€ํ•˜์ง€ ๋ง ๊ฒƒ
  • ์ด ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ๋” ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ๋” ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages