Skip to content

Knock-Og/FE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation


image



Knock ๐Ÿšช

B2B SaaS ์‚ฌ๋‚ด๋ฌธ์„œ ๊ฒ€์ƒ‰์„œ๋น„์Šค


1. Search

  • #๋™๋ฃŒ์—๊ฒŒ๋ฌผ์–ด๋ณด๊ธฐํž˜๋“ ๊ฒƒ #๋‚ด๊ฐ€๋†“์นœ๊ฒƒ
  • ๊ณ ๋ฏผํ•˜์ง€ ๋ง๊ณ  Knock์— ๋ฌผ์–ด๋ณด์ž!
  • ๊ฐ€์ค‘์น˜, ์ค‘์š”๋„ ๊ณ„์‚ฐ์œผ๋กœ ์—ฐ๊ด€์„ฑ์ด ๋†’์€ ๊ฒŒ์‹œ๊ธ€์ด ๊ฒ€์ƒ‰ ๋ผ์š”!

2. Security

  • #์‚ฌ๋‚ด๋ฌธ์„œ #๋ณด์•ˆ์ด์ƒ๋ช…
  • ๊ฐ ํšŒ์‚ฌ๋ณ„ Admin์ด ์žˆ๊ณ , Admin์„ ํ†ตํ•ด์„œ๋งŒ Member๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์ฝ๊ธฐ/์ˆ˜์ •ํ•˜๊ธฐ ๊ถŒํ•œ์„ ์ง๊ธ‰๋ณ„๋กœ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์–ด์š”!

3. Community

  • ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‚˜๋ˆ„์–ด, ์šฉ๋„๋ณ„๋กœ ๊ด€๋ฆฌํ•ด์š”!
  • #์˜ค๋Š˜์˜์ ์‹ฌ #์ง์žฅ๋‚ด์†Œ๋ชจ์ž„ #์ˆ˜ํ‰์ ๋ฌธํ™” #12๊ธฐ๊ณต์ฑ„์นœ๋ชฉ
  • ์†Œํ†ต์ด ํ™œ๋ฐœํ•œ ์‚ฌ๋‚ด๋ถ„์œ„๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด์š”!

4. D.I.Y

  • #๋‚ด๊ฐ€์›ํ•˜๋Š”๋Œ€๋กœ #๋‚ด๋ง˜๋Œ€๋กœ #๋‹ค๊พธ์•„๋‹Œ๋ฌธ๊พธ
  • ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์ด ์žˆ์–ด, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธ€์„ ์›ํ•˜๋Š” ํด๋”์— ๋„ฃ์–ด ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์–ด์š”!
  • ์ฆ๊ฒจ์ฐพ๊ธฐ ํด๋”๋Š” ๋‚˜๋งŒ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์•ˆ์‹ฌํ•˜๊ณ  ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์š”!



Knock Backend Team

์ด๋ฆ„ Github
FE ํŒ€์žฅ ๋ฐ•์ •ํ˜„ https://github.com/swing-park
FE ํŒ€์› ์†ก์ง„ํ™˜ https://github.com/jinhwansong



ํ”„๋กœ์ ํŠธ ์„ธ๋ถ€์‚ฌํ•ญ

  • ๊ตฌํ˜„ ์˜์ƒ

  • ๊ตฌํ˜„๋ชฉํ‘œ

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

    • ๊ฒ€์ƒ‰ ๋ฐ ์œ ํ˜•๋ณ„ ์กฐํšŒ ๊ธฐ๋Šฅ
    • ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ธํŽ˜์ด์ง€ ๊ธฐ๋Šฅ
    • ๋งˆ์ดํŽ˜์ด์ง€, ์ฆ๊ฒจ์ฐพ๊ธฐ ๊ธฐ๋Šฅ
    • ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ (ํšŒ์‚ฌ, ์‚ฌ์›, ์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ ๊ด€๋ฆฌ)
    • ๋Œ“๊ธ€, ๋กœ๊ทธ ๊ธฐ๋Šฅ
    • ๋‹คํฌ๋ชจ๋“œ ๊ธฐ๋Šฅ
  • ๊ธฐ๊ฐ„ :

    • 2023.03.10 ~ 2023.04.21




Tech Stack









Service Architecture

๐Ÿ› ๏ธ image


API ๋ช…์„ธ์„œ

๐Ÿ“„ API ๋ฐ”๋กœ๊ฐ€๊ธฐ



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

๋ฌธ์„œ ๊ฒ€์ƒ‰ ๋ฐ ์œ ํ˜•๋ณ„ ์กฐํšŒ ๊ธฐ๋Šฅ ํŽธ์ง‘์ƒํƒœ ์กฐํšŒ ๊ธฐ๋Šฅ
๊ฒ€์ƒ‰ ์กฐํšŒ ํŽธ์ง‘์ƒํƒœ
- ์ œ๋ชฉ, ๋‚ด์šฉ, ํ‚ค์›Œ๋“œ ์กฐํšŒ๋ฅผ ํ†ตํ•œ ์šฐ์ˆ˜ํ•œ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ
- ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒ€์ƒ‰
- ๊ฒ€์ƒ‰ ํ•„ํ„ฐ(์—ฐ๊ด€์ˆœ, ๋Œ“๊ธ€์ˆœ, ์กฐํšŒ์ˆœ, ์ตœ์‹ ์ˆœ) ์ œ๊ณต
- ๊ฒŒ์‹œ๊ธ€ ํŽธ์ง‘ ์ƒํƒœ ์กฐํšŒ
- ํŽธ์ง‘ ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ ์ˆ˜์ •์„ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ
๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ ๋Œ“๊ธ€ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋Šฅ
๊ด€๋ฆฌ์ž ๋Œ“๊ธ€๋กœ๊ทธ
- ์ง์›์˜ ์ง๊ธ‰ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
- ์‚ฌ๋‚ด ๊ฒŒ์‹œ๊ธ€์˜ ์นดํ…Œ๊ณ ๋ฆฌ ๋“ฑ๋ก ๋ฐ ๊ด€๋ฆฌ
- ๋Œ“๊ธ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ
- ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์ด์ „๊ณผ ์ดํ›„ ๊ฒŒ์‹œ๊ธ€ ๋น„๊ต ๊ฐ€๋Šฅ



Trouble Shooting

Toast UI Editor / AWS SDK

-Toast UI Editor๋Š” ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ๋งˆํฌ๋‹ค์šด์„ HTML๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ๋ฆฌํ•˜๊ฒŒ ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ค‘์—์„œ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๊ณ  ๋งํฌ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. AWS SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด Amazon Web Services์˜ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋“ค์„ JavaScript์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ S3 ์„œ๋น„์Šค๋Š” ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค๋กœ, ์ด์šฉ์ž๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ , ๊ฒ€์ƒ‰ํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, AWS SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ Toast UI Editor์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์ปค์Šคํ…€ ํ›…์„ ์ œ์ž‘ํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด๋ฏธ์ง€ ์ฒจ๋ถ€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•˜์˜€์Šต๋‹ˆ.

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ์‹ ์ž… ์‚ฌ์›๋“ค์ด ์ฐพ๊ธฐ ์–ด๋ ค์šด ๋‚ด์šฉ๋„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ์„ ์ž„๋“ค์€ ์ด๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Toast UI Editor์™€ AWS SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  ์ฒจ๋ถ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSE

-SSE(Server-Sent Events)๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด WebSocket๊ณผ ๊ฐ™์€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์„œ๋ฒ„ ์ธก์—์„œ๋„ ๋ถ€๋‹ด์ด ์ ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ SSE API call์„ ํ•  ๋•Œ, request์— ์ธ์ฆ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ธ์ฆ ํ—ค๋”๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•„ API call์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Event-source-polyfill ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” eventSource ๊ฐ์ฒด์— xhr header๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ค๋‹ˆ๋‹ค.

์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSE API call์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ธ์ฆ ํ—ค๋”๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์–ด API call์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜์˜€ SSE API call์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

editing status

- ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ํ›„ editing status๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š” ์ด์Šˆ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ํฐ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ ๊ทน์ ์œผ๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ ์œผ๋กœ, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋ถ„์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •์‹œ์ ์— ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๊ณผ์ •์—์„œ, editing status๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, history ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•ด๋‹น ์‹œ์ ์— editing status๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ ์‹œ์ ์— ํŽ˜์ด์ง€ ์ด๋™ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ ์ ˆํ•˜๊ฒŒ editing status๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ ํŒ€์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•˜๊ณ , ์ด์— ๋”ฐ๋ฅธ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋‚˜์€ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ด์Šˆ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ ํŒ€์€ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋Œ€ํ•œ ์ „๋žต๊ณผ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅด๊ฒŒ ๋Œ€์ฒ˜ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.




header