Feliz: ํƒ€์‚ฌ ๊ฐ€์ด๋“œ

์— ๋งŒ๋“  2019๋…„ 08์›” 11์ผ  ยท  25์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Zaid-Ajaj/Feliz

์ด๊ฒƒ์€ ํ™˜์ƒ์ ์ธ IMHO์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

Material-UI ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ํ•ญ๋ชฉ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@cmeeren๋‹˜ , ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ํ† ๋ก ์„ ์œ„ํ•ด ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค

๋ชจ๋“  25 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ํ™˜์ƒ์ ์ธ IMHO์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋งˆ์Œ์— ๋“œ์‹ ๋‹ค๋‹ˆ ๋‹คํ–‰์ž…๋‹ˆ๋‹ค :์Šค๋งˆ์ผ:

Material-UI์™€ ๊ฐ™์€ ํƒ€์‚ฌ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ํ™•์žฅ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๊นŒ?

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

  • 1) ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์œผ๋กœ prop ์ •์  ์œ ํ˜• ํ™•์žฅ
  • 2) Mui์— ํ•„์š”ํ•œ ๋ชจ๋“  ์†์„ฑ์ด ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ( Mui ์ผ ์ˆ˜ ์žˆ์Œ)์— ๊ณ ์œ ํ•œ ์œ ์‚ฌํ•œ prop ์ •์  ์œ ํ˜•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Mui $๋กœ prop ๋ณ„์นญ์„ ์ง€์ •ํ•˜๊ณ  Mui ๊ด€๋ จ(์˜ค๋ฒ„๋กœ๋“œ๋œ) ์†์„ฑ ๋ฐ ๊ธฐ๋Šฅ์œผ๋กœ Mui ๋ฅผ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

type prop with
  static member hello (value: string) = Interop.mkAttr "hello" value 

์ด๊ฒƒ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ "์ตœ์ข… ํ˜•ํƒœ"์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋จผ์ € ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”! ์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด API์˜ ์ผ๋ถ€์— ๋Œ€ํ•ด์„œ๋งŒ MUI์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ์ฃผ์ค‘/๋ง์— ๊ณต์œ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ณ  Feliz ์ •์‹ ์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ๋งŒ ๋ด์ฃผ์‹œ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์„ฑ๊ณตํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด prop ์œ ํ˜•์„ ํ™•์žฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค( Feliz.MaterialUI )์— ๋ณ„๋„์˜ prop ์œ ํ˜•์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ‰๋ณด๊ธฐ์— ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Feliz ๋ฐ Feliz.MaterialUI ๋ฅผ ๋ชจ๋‘ ์—ด๋ฉด ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Html ์— ํ•ด๋‹นํ•˜๊ณ  ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” Mui ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(ํ˜„์žฌ #13์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ prop ์˜ ๋ณ„๋„ ํ•˜์œ„ ๋ชจ๋“ˆ์— ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์†Œํ’ˆ์„ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.)

Feliz์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฐœ์„ ์ ์€ string ๊ฐ€ ์•„๋‹ˆ๋ผ ReactElementType $๋ฅผ ํ—ˆ์šฉํ•˜๋Š” reactElement ๋ฐ createElement ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ œ ์ƒ๊ฐ์—๋Š”). createElement (importDefault "@material-ui/core/Button") ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ˜„์žฌ ์ด ๋‘ ๋„์šฐ๋ฏธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋ชจ๋“  ๋ฉค๋ฒ„๊ฐ€ inline ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ„์—์„œ inline ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Feliz์˜ ๋ชจ๋“  ๊ฒƒ์€ inline ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”! ์ž‘๋™ ๋ฐฉ์‹์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด API์˜ ์ผ๋ถ€์— ๋Œ€ํ•ด์„œ๋งŒ MUI์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ์ฃผ์ค‘/๋ง์— ๊ณต์œ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๊ณ  Feliz ์ •์‹ ์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ๋งŒ ๋ด์ฃผ์‹œ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์„ฑ๊ณตํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

๊ต‰์žฅํ•ด! ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„๋ณด๊ณ  ํ™•์‹คํžˆ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด prop ์œ ํ˜•์„ ํ™•์žฅํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(Feliz.MaterialUI)์— ๋ณ„๋„์˜ ์†Œํ’ˆ ์œ ํ˜•์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ‰๋ณด๊ธฐ์— ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  Feliz์™€ Feliz.MaterialUI๋ฅผ ๋ชจ๋‘ ์—ด๋ฉด ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ ๋ชจ๋“  ๊ตฌ์„ฑ์›์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Html์— ํ•ด๋‹นํ•˜๊ณ  ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” Mui ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ Mui๋ฅผ ์œ„ํ•ด ํ•  ์ผ์ž…๋‹ˆ๋‹ค.

(ํ˜„์žฌ #13์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ prop์˜ ๋ณ„๋„ ํ•˜์œ„ ๋ชจ๋“ˆ์— ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ props๋ฅผ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.)

์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— Mui์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

Feliz์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฐœ์„ ์ ์€ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ReactElementType(๋‚ด ์ƒ๊ฐ์—๋Š”)์„ ํ—ˆ์šฉํ•˜๋Š” reactElement ๋ฐ createElement๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. createElement(importDefault "@material-ui/core/Button")๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ๋‘ ๋„์šฐ๋ฏธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Interop ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋ฉค๋ฒ„๋ฅผ ๊ฒ€ํ†  ์ค‘์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ณต๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ์žฌ๊ฒ€ํ† ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋ชจ๋“  ๊ตฌ์„ฑ์›์ด ์ธ๋ผ์ธ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ„์—์„œ ์ธ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ Feliz์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ธ๋ผ์ธ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ํ™•์žฅ ๋ฉค๋ฒ„๋ฅผ ์ธ๋ผ์ธํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค!

๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์†์„ฑ ๊ฐ’์ด string/int/bool/enum๊ณผ ๊ฐ™์€ ์›์‹œ์ ์ด๋ฉด ์†์„ฑ์„ ์ธ๋ผ์ธํ•˜์ง€๋งŒ ์†์„ฑ์ด ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ผ์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ „์ฒด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ํ˜ธ์ถœ ์œ„์น˜์— ์ธ๋ผ์ธ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ 10๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์€ ํ•œ ๋ฒˆ ์ •์˜๋˜๊ณ  10๋ฒˆ ์ฐธ์กฐ๋˜๋Š” ๋Œ€์‹  10๋ฒˆ ์ธ๋ผ์ธ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์†์„ฑ ๊ฐ’์ด string/int/bool/enum๊ณผ ๊ฐ™์€ ์›์‹œ์ ์ด๋ฉด ์†์„ฑ์„ ์ธ๋ผ์ธํ•˜์ง€๋งŒ ์†์„ฑ์ด ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ผ์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ „์ฒด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ํ˜ธ์ถœ ์œ„์น˜์— ์ธ๋ผ์ธ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ๋™์ผํ•œ ํ•จ์ˆ˜๋ฅผ 10๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ๋ณธ๋ฌธ์€ ํ•œ ๋ฒˆ ์ •์˜๋˜๊ณ  10๋ฒˆ ์ฐธ์กฐ๋˜๋Š” ๋Œ€์‹  10๋ฒˆ ์ธ๋ผ์ธ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๊ฐ€์›Œ์š”! ๊ทธ๋Ÿฌ๋‚˜ (Fable์˜ ๋งฅ๋ฝ์—์„œ) ์™œ ์ฒ˜์Œ์—๋Š” ์ธ๋ผ์ธ์ž…๋‹ˆ๊นŒ? "๋‹จ์ˆœํ•œ" ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ์˜ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ๋ฒˆ๋“ค ํฌ๊ธฐ: ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ค‘ 100๊ฐœ๊ฐ€ ์žˆ์Œ) ์–ด์จŒ๋“  ์—ฌ์ „ํžˆ ์ปดํŒŒ์ผ๋˜์–ด ๋ฒˆ๋“ค ํฌ๊ธฐ AFAIK๋ฅผ ๋ถ€ํ’€๋ฆฝ๋‹ˆ๋‹ค(์˜ํ–ฅ์€ ๋ฌผ๋ก  ์—ฌ์ „ํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด ํฌ๊ธฐ์— ์ƒ๋Œ€์ ์ž„).
  • ์ผ๋ฐ˜ ์œ ํ˜• ์ธ์ˆ˜: Feliz์™€ ๊ด€๋ จ์ด ์—†์ง€๋งŒ Fable์˜ ์ปจํ…์ŠคํŠธ์—์„œ ํ˜ธ์ถœ ์œ„์น˜๊ฐ€ ์ธ๋ผ์ธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์œ ํ˜• ์ธ์ˆ˜๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ์ผ๋ฐ˜ ์œ ํ˜• ์ธ์ˆ˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ •์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•จ). ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ œ์™ธ ์—ฌ๊ธฐ์„œ [<Inject>] ITypeResolver<'t> ๋ฅผ ์ •์  ํด๋ž˜์Šค์˜ ์„ ํƒ์  ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ณ ๋„๋กœ ์ „๋ฌธํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Fable.SimpleJson/Thoth.Json ์ฐธ์กฐ).

ํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค์„ ๋งŒ๋“ค ๋•Œ babel์ด tree-shaking์„ ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ด๋‹์€ ๊ทธ๊ฒƒ์„ ๋ฌผ๋ฆฌ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Luiz-Monad ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ƒ์ ์œผ๋กœ Feliz์˜ ์–ด๋–ค ๊ฒƒ๋„ ์ธ๋ผ์ธ๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์œ„ํ•œ ์ธ๋ผ์ธ์€ ๋น„์ƒ์‚ฐ์ ์ž…๋‹ˆ๊นŒ?

@Luiz-Monad ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ ์–ด๋„ ์ปดํŒŒ์ผ์ด ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ–ˆ๋‹ค๋ฉด. ๋‹ค์Œ์€ REPL๋กœ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

module App

type prop = 
  // does useless stuff
  static member f() = 
    [ 1 .. 100 ]
    |> List.map (fun x -> x * 20)
    |> List.collect (fun n -> [n; n])
    |> List.fold (+) 0

  // does useless stuff
  static member inline k() = 
    [ 1 .. 100 ]
    |> List.map (fun x -> x * 20)
    |> List.collect (fun n -> [n; n])
    |> List.fold (+) 0

  static member g() = 1

let value = prop.g()

printfn "%d" value

์—ฌ๊ธฐ์„œ prop ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • f() ์—๋Š” ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -> ์ธ๋ผ์ธ๋˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ๋˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.
  • k() ์— ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ํฌํ•จ๋จ -> ์ธ๋ผ์ธ๋˜์—ˆ์ง€๋งŒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ
  • g() ์—๋Š” ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -> ์ธ๋ผ์ธ๋˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ๋จ

f() ๋ฐ g() ๋‘˜ ๋‹ค ์ปดํŒŒ์ผ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. f() (์ธ๋ผ์ธ๋˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)๋Š” ์–ด์จŒ๋“  ์ปดํŒŒ์ผ๋˜์ง€๋งŒ k() (์ธ๋ผ์ธ๋จ, ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)๋Š” ์ปดํŒŒ์ผ๋œ ๋ฒˆ๋“ค๋กœ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

import { fold, collect, map, ofSeq, ofArray } from "fable-library/List.js";
import { type } from "fable-library/Reflection.js";
import { rangeNumber } from "fable-library/Seq.js";
import { toConsole, printf } from "fable-library/String.js";
import { declare } from "fable-library/Types.js";
export const prop = declare(function App_prop() {});
export function prop$reflection() {
  return type("App.prop");
}
export function prop$$$f() {
  return fold(function folder(x$$1, y) {
    return x$$1 + y;
  }, 0, collect(function mapping$$1(n) {
    return ofArray([n, n]);
  }, map(function mapping(x) {
    return x * 20;
  }, ofSeq(rangeNumber(1, 1, 100)))));
}
export function prop$$$g() {
  return 1;
}
export const value = prop$$$g();
toConsole(printf("%d"))(value);

์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด webpack ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๋ฅผ ํ”๋“œ๋Š” ๊ฒƒ์€ ์šฐํ™” ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— REPL์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ „์—

/// Library.fs
module Library

type prop = 
    // does useless stuff
    static member f() = 
      [ 1 .. 100 ]
      |> List.map (fun x -> x * 20)
      |> List.collect (fun n -> [n; n])
      |> List.fold (+) 0

    // does useless stuff
    static member inline k() = 
      [ 1 .. 100 ]
      |> List.map (fun x -> x * 20)
      |> List.collect (fun n -> [n; n])
      |> List.fold (+) 0


type AppMain =
    static member g() = 1

//// App.fs
module App

let value = Library.AppMain.g ()

printfn "%d" value

ํ›„์—

  declare(function Library_prop() { 
     // see its empty, this weren't removed too because of `keep_classnames: true, keep_fnames: true ` in the terser plugin
  });
  declare(function Library_AppMain() {
  });
  !function toConsole(arg) {
    return arg.cont(function (x) {
      console.log(x)
    })
  }(printf('%d')) (1),
  __webpack_require__.d(__webpack_exports__, 'value', function () {
    return 1
  })

๋˜ํ•œ ํ…Œ์ŠคํŠธ์— ์ฃผ์˜ํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ ํŒŒ์ผ์€ ๊ธฐ๋Šฅ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ์ผ์ข…์˜ ํŠน๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ( ์ •์  ํด๋ž˜์Šค์˜ ์ดˆ๊ธฐํ™”์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์— ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๊ธฐ ์œ„ํ•ด ์ •์  ์ด๋‹ˆ์…œ๋ผ์ด์ € ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋งŒ๋“  ์ด ์ €์žฅ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://github.com/Luiz-Monad/test-tree-shaking

์˜ˆ์ œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ธ๋ผ์ธ์ด Feliz์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธ๋ผ์ธ์ด Feliz์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์ถ”๊ฐ€๋กœ ์กฐ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฉ‹์ง„, ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค :)

๊ต‰์žฅํ•ด! ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„๋ณด๊ณ  ํ™•์‹คํžˆ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค

cmeeren/fable-elmish-electron-material-ui-demo ์—์„œ feliz ๋ถ„๊ธฐ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” (HTML) API ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ ํ”„๋กœ์ ํŠธ(์ถ”์•…ํ•˜๊ณ  ํ•ด์ปค์ง€๋งŒ ์ž‘์—…์€ ์™„๋ฃŒ๋จ)์™€ ์‹ค์ œ ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ App.fs ์ƒˆ๋กœ์šด Feliz ์Šคํƒ€์ผ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ถ„์ด ์ข‹์„ ๋•Œ ๋ณด์‹œ๊ณ  ๊ถ๊ธˆํ•œ ์ ์ด๋‚˜ ์ƒ๊ฐ์ด ์žˆ์œผ์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

@cmeeren ํ˜„์žฌ API IMHO๋ณด๋‹ค ๋งค์šฐ ํ›Œ๋ฅญํ•˜๊ณ  ํ›จ์”ฌ ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์˜ ํŠน์„ฑ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์นœ์ˆ™ํ•ด์•ผ ํ•˜๋Š” ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Mui.appBar [
  prop.className c.appBar
  prop.appBar.position.fixed'
  prop.children [
    Mui.toolbar [
      prop.children [
        Mui.typography [
          prop.typography.variant.h6
          prop.typography.color.inherit'
          prop.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

์ด ์Šค๋‹ˆํŽซ์˜ ๊ฐœ์ธ์ ์ธ ์™„๋ฒฝํ•œ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Mui.appBar [
  AppBar.className c.appBar
  AppBar.position.fixed'
  AppBar.children [
    Mui.toolbar [
      Toolbar.children [
        Mui.typography [
          Typography.variant.h6
          Typography.color.inherit'
          Typygraphy.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Mui ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mui๋ฅผ "์ ์œผ๋กœ ํ‘œ์‹œ"ํ•  ์ˆ˜ ์žˆ๊ณ  ์š”์†Œ๋ฅผ ์ฐพ์œผ๋ฉด( appBar ) ๋ชจ๋“ˆ ์ด๋ฆ„( AppBar )์„ "์ ์œผ๋กœ ํ‘œ์‹œ"ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์†์„ฑ ๋“ฑ์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด

AppBar ๋„ ์†Œ๋ฌธ์ž๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

์•„์ด๋””์–ด๋Š” ์•Œ๊ฒ ์ง€๋งŒ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ด API์˜ ์ผ๋ฐ˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ {Element} ๋Š” ๋ฐ˜์‘ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

Mui.{element} [
  {Element}.{propName}.{propValue}
  {Element}.children [
    Mui.{otherElem} [
      {OtherElem}.{propName}.{propValue}
      // etc.
    ]
  ]
]

์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”? ์ด API๋Š” ๋˜ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฉ‹์ง„ ๋‹จ์ˆœ ์š”์†Œ ์•„์ด๋””์–ด์— ์˜๊ฐ์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์™„๋ฒฝํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ๊ฒƒ์„ prop ์•„๋ž˜์— ๋‘๊ธฐ๋กœ ์„ ํƒํ–ˆ์ง€๋งŒ ๋ฌผ๋ก  ์‹ค์ œ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์†Œํ’ˆ์ด ์—†๋Š” ๋ฐ˜๋ฉด MUI์—๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์†Œํ’ˆ์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.

์†Œ๋ฌธ์ž ๋ชจ๋“ˆ ์ด๋ฆ„์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ(์ถ”๊ฐ€ ํ‚ค ์ž…๋ ฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ) ๋ฐ˜๋ก ์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•ญ๋ชฉ์„ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธํ•˜์—ฌ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํŠนํžˆ ํ•œ ๊ฐ€์ง€ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ClassName ๋ฌผ๊ฑด์ž…๋‹ˆ๋‹ค. makeStyles ํ›„ํฌ๋Š” ์ „๋‹ฌ๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ props๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ๋ชจ๋“  (JSS) ์š”์†Œ๋Š” ์‚ฌ์šฉํ•  ํด๋ž˜์Šค ์ด๋ฆ„์ธ ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: prop.className ).

์ด์ œ F#์— ์ž…๋ ฅํ•  ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒ€์ผ ๊ฐœ์ฒด์˜ ๋ชจ๋“  ์†Œํ’ˆ์€ IStyleAttribute list ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ IStyleAttribute list prop.className ์— ๋Œ€ํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์ง“๋ง์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ IStyleAttribute list ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. prop.className ์™ธ์—๋„ ์ด๊ฒƒ์€ ๋ชจ๋“  classes.<element>.<classesName> ( <element>.classes [ ... ] ์—์„œ ์‚ฌ์šฉ๋จ)์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ด๋ฆ„(๋ฌธ์ž์—ด)๋„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ ๋‚ด๊ฐ€ ํ•œ ์ผ์€ ์Šคํƒ€์ผ ๊ฐœ์ฒด์˜ ๋ชจ๋“  IStyleAttribute list ์†์„ฑ์„ asClassName ๋กœ "์š”๊ตฌ"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค IClassName (์›ํ•˜๋Š” ๊ฒฝ์šฐ string ์— ๋Œ€ํ•œ ํ”„๋ก์‹œ). ๊ทธ๋Ÿฐ ๋‹ค์Œ IClassName prop.className ์— ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชจ๋“  classes ์†Œํ’ˆ์ด IClassName ์ˆ˜๋ฝํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ํƒ€์ดํ•‘๋˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ํƒ€์ดํ•‘์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋“  ์ตœ์ƒ์œ„ CSS ๊ทœ์น™์— ๋Œ€ํ•ด asClassName ). ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋†“์น˜๋ฉด ๋ถˆํ‰ํ•  ๊ฒƒ์ด์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๋งํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ์—ฌ์ „ํžˆ ์—ฌ๋ถ„์˜ ์žก์Œ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค:

f# listItem.divider ((page = Home))

์—ฌ๊ธฐ์—์„œ ์ด์ค‘ ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด F#์ด $# ๋Œ€์‹  Home ๋กœ ์„ค์ •๋œ (์กด์žฌํ•˜์ง€ ์•Š๋Š”) page ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ $ listItem.divider ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค value ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ page = Home ๋กœ ์„ค์ •๋จ). ๊ทธ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ณด์ด์‹ญ๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š” @cmeeren ์šฐ์„ , ์ €๋Š” ์ด ๊ตฌ๋ฌธ์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

Mui.appBar [
  prop.className c.appBar
  appBar.position.fixed'
  appBar.children [
    Mui.toolbar [
      toolbar.children [
        Mui.typography [
          typography.variant.h6
          typography.color.inherit'
          prop.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

๋ณด๊ธฐ๋งŒํ•ด๋„ ๋„ˆ๋ฌด ๊น”๋”ํ•˜๊ณ  ์‹ฌํ”Œํ•ด์š”! ๋‚ด๊ฐ€ ๋‹น์‹ ์ด์—ˆ๋‹ค๋ฉด prop.className ๋Œ€์‹ ์—(๋˜๋Š” ํ•จ๊ป˜) prop.className appBar.className ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์†Œํ’ˆ์— ์ผ๋ฐ˜ prop ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณต์ œํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋Œ€์นญ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ makeStyles ๋„ Mui ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ prop.className ๋Œ€์‹  Mui ์ „์šฉ ๊ตฌ์„ฑ์š”์†Œ์— IClassName ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ Mui ๊ตฌ์„ฑ ์š”์†Œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

makeStyles ๊ฐ€๋Šฅํ•œ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ง€๊ธˆ ๋‹น์žฅ์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( asClassName , ์•„๋งˆ๋„ Styles.createClass ์˜ ์—ด๋ ฌํ•œ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ

listItem.divider ((page = Home)) ์— ๊ด€ํ•ด์„œ๋Š” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋”๋ฏธ ํ•จ์ˆ˜ let when (x: bool) = x ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋…ธ์ด์ฆˆ์ž…๋‹ˆ๋‹ค. F# ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜์˜ ์ ์ ˆํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ๋กœ ์‹ ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์‹œ๋„ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ๋˜๋ฉด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €๋Š” ์ด๋ฒˆ ์ฃผ์— ํ‰์†Œ์ฒ˜๋Ÿผ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ํœด๊ฐ€ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์„ ์ฝ๊ฑฐ๋‚˜ ํ™•์ธํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์ด์—ˆ๋‹ค๋ฉด ์•„๋งˆ๋„ prop.className ๋Œ€์‹ ์—(๋˜๋Š” ํ•จ๊ป˜) prop.className appBar.className ์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์†Œํ’ˆ์œผ๋กœ ์ผ๋ฐ˜ prop ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณต์ œํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋Œ€์นญ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ makeStyles ๋„ Mui ์ „์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ prop.className ๋Œ€์‹  Mui ์ „์šฉ ๊ตฌ์„ฑ์š”์†Œ์— IClassName ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์ด๋ฉฐ Mui ๊ตฌ์„ฑ ์š”์†Œ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ํ™•์ธํ•ด๋ณด์„ธ์š” :) ์ง€๋‚œ ๋ช‡ ์ผ๊ฐ„ ๊ณผ๊ฐํ•œ ๊ฐœ์„ ๊ณผ ํ™•์žฅ์„ ํ–ˆ๊ณ  ๊ทธ๋ƒฅ ๋ฐ€์–ด๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค(์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒ์„ฑ๋œ props๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  MUI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

makeStyles ๊ฐ€๋Šฅํ•œ ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ง€๊ธˆ ๋‹น์žฅ์€ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( asClassName , ์•„๋งˆ๋„ Styles.createClass ์˜ ์—ด๋ ฌํ•œ ํŒฌ์€ ์•„๋‹ˆ์ง€๋งŒ ๋Œ€์‹ 

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

listItem.divider ((page = Home)) ์— ๊ด€ํ•ด์„œ๋Š” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋”๋ฏธ ํ•จ์ˆ˜ let when (x: bool) = x ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋…ธ์ด์ฆˆ์ž…๋‹ˆ๋‹ค. F# ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜์˜ ์ ์ ˆํ•œ ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ๋กœ ์‹ ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์‹œ๋„ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ๋˜๋ฉด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/dotnet/fsharp/issues/7423

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €๋Š” ์ด๋ฒˆ ์ฃผ์— ํ‰์†Œ์ฒ˜๋Ÿผ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ํœด๊ฐ€ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์„ ์ฝ๊ฑฐ๋‚˜ ํ™•์ธํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•  ๊ฒƒ์ด๊ณ  ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์‹œ๊ฐ„์— ๋‹ต์žฅ์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

์ง€๊ธˆ ํ™•์ธํ•ด๋ณด์„ธ์š” :) ์ง€๋‚œ ๋ช‡ ์ผ๊ฐ„ ๊ณผ๊ฐํ•œ ๊ฐœ์„ ๊ณผ ํ™•์žฅ์„ ํ–ˆ๊ณ  ๊ทธ๋ƒฅ ๋ฐ€์–ด๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค(์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒ์„ฑ๋œ props๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  MUI ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

์ƒ์„ฑ๋œ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ ์ •๋ง ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ˜ ์–ด์ฉŒ๋ฉด ์ž์ฒด ์ €์žฅ์†Œ์— ๋„ฃ์„ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

๊ทธ๊ฒƒ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Fable ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•ญ์ƒ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์†์ž…๋‹ˆ๋‹ค ;)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค: dotnet/fsharp#7423

์—„์ฒญ๋‚œ! ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

์ƒ์„ฑ๋œ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ ์ •๋ง ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค ๐Ÿ˜ ์–ด์ฉŒ๋ฉด ์ž์ฒด ์ €์žฅ์†Œ์— ๋„ฃ์„ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: #27). ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ™์€ ์žฅ์†Œ์— ๋‘๋Š” ํŽธ๋ฆฌํ•จ์œผ๋กœ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ฑฐ๊ธฐ์— ๋ณด๊ด€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. nuget์˜ ํ”„๋ฆฌ๋ฆด๋ฆฌ์ฆˆ์šฉ(๋„ˆ๋ฌด ๊ธธ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค).

@Zaid-Ajaj Feliz.MaterialUI ์ž‘์—…์ด ๊ฑฐ์˜ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ณง ๋ณ„๋„์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ฒŒ์‹œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒ€ํ† ํ•˜์—ฌ ์ผ๋ถ€ ๋””์ž์ธ ๊ฒฐ์ •์„ ํ™•์ธํ•˜๊ณ  Feliz์™€์˜ ์ผ๊ด€์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์ผ๋ถ€ ๊ตฌํ˜„ ํ•ญ๋ชฉ(์˜ˆ: ๋‚ด๋ถ€์—์„œ ๋งŒ๋“ค ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด Feliz์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ).

์ƒˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฒ€ํ† ํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

์ด์ œ Feliz.MaterialUI ์ดˆ์•ˆ์„ cmeeren/Feliz.MaterialUI ์— ์—…๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ† ํ•˜๊ณ  ์‹ถ์€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์„ ๋‚ด์„œ ๋ด์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

๊ฐ ๋ฌธ์ œ์— ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ ๋‘ ๋ฒˆ์งธ ์˜๊ฒฌ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด ์žก์ดˆ ์†์œผ๋กœ ๋“ค์–ด๊ฐ€๋„ ์ข‹๊ฒ ์ง€๋งŒ "์ด๊ฑด ๊ดœ์ฐฎ์•„ ๋ณด์ธ๋‹ค"๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ข‹๊ฒ ์–ด.

๋ฌผ๋ก  ์„œ๋‘๋ฅด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. :)

๋ฉ‹์ง„ ์ž‘ํ’ˆ @cmeeren! ์–ธ๋œป๋ณด๊ธฐ์— ๋ฐ”์ธ๋”ฉ์€ ๋งค์šฐ ๊นจ๋—ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋ฉฐ์น  ๋™์•ˆ ๊ฐ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค.์Šค๋งˆ์ผ:

์ด๋ด! ๋ฌธ์ œ๋ฅผ ๊ณ„์† ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์‹œ ํ•œ ๋ฒˆ ์„œ๋‘๋ฅด์ง€ ๋งˆ์„ธ์š”. ๋ช‡ ์ฃผ ๋™์•ˆ ์—ฐ๋ฝ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์นœ์ ˆํ•œ ์•Œ๋ฆผ์ž…๋‹ˆ๋‹ค ๐Ÿ˜ƒ

์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด API๊ฐ€ ์ข‹์€์ง€ ์•„๋‹Œ์ง€๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์•ŒํŒŒ ๋ฒ„์ „์„ ๊ฒŒ์‹œํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ–ˆ์ง€๋งŒ ์•„์ง ์‹œ๊ฐ„์€ ์•„์ง ์ž…๋‹ˆ๋‹ค(์ด๋ฒˆ ์ฃผ ์ƒ๊ฐ์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค :์Šค๋งˆ์ผ :)

@cmeeren๋‹˜ , ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ ํ† ๋ก ์„ ์œ„ํ•ด ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰