Feliz: Feliz๋ฅผ ์œ„ํ•œ "๊ทธ๋ƒฅ ์ž‘๋™" ๋‹ท๋„ท ๊ธฐ๋ฐ˜ SSR

์— ๋งŒ๋“  2020๋…„ 10์›” 06์ผ  ยท  7์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Zaid-Ajaj/Feliz

๋‚œ์—์„œ ์ „ํ™˜ ์ดํ›„ ๊ฐ€์žฅ์„ ๊ทธ๋ฆฌ์›Œ ๊ฒƒ์€ Fable.React ๋„์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค Feliz/Feliz.ViewEngine , SSR์€ ๊ณ ํ†ต์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๊ณ  ..์ž˜ ์ž‘๋™ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ํ‰ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Fable.React ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ SSR๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "๊ทธ๋ƒฅ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค." ๊ทธ๋ฆฌ๊ณ  SSR๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ›จ์”ฌ ๋” ๋‚˜์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์ด์ƒํ•œ ํ–‰๋™์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Feliz ์—์„œ๋„ ๊ทธ ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋˜์–ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ(๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ๋‹ค๋ฅธ ๋ฌธ์ œ ์„ธํŠธ๊ฐ€ ์žˆ๋Š” Isomorphic ์‚ฌ์šฉ)์—์„œ #if FABLE_COMPILER ์˜ ๋ณต์žก์„ฑ๊ณผ ์ถ”ํ•จ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ˆจ๊ฒจ์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

open Feliz 

AspNetCore์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ Fable.Remoting ์™€ ํ•จ๊ป˜ SSR์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์ด Feliz/AspNetCore ์Šคํƒ์˜ ๊ฐ€์น˜๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ Full Stack F# ์Šคํ† ๋ฆฌ์— ํฌ๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

enhancement

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

Fable 3์—๋Š” ์ƒ๋‹นํ•œ ์žฌ์ž‘์„ฑ์ด ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ @Zaid-Ajaj์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ ์ ˆํ•œ ์‹œ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‚˜๋Š” @Zaid-Ajaj๊ฐ€ SSR์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—„๋งˆ์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ๊ฐ€ ๊ทธ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค ์ „์ฒด์— ์Ÿ์•„์ง€๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ๋งŒํผ), ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. /๊ทธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ SSR์„ ์—ผ๋‘์— ๋‘๊ณ  ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

๋„ค, ์ €๋Š” ๊ทธ ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

@l3m๋‹˜ , ์ €๋Š” ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ค์–ด์š”. ๋ฌผ๋ก  "

์ง€๊ธˆ ๊ฐ€์žฅ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์€ SSR ๋ถ€๋ถ„์— Fable.React๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— Feliz๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Feliz/Feliz.ViewEngine์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Feliz์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ณ„ํš์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ˆœ์ˆ˜ํ•œ React ์ง€์› ๋ฐ ์ƒํƒœ๊ณ„์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์ ˆํ•œ Svg ์ง€์› #251, Fable 3์˜ ์ ์ ˆํ•œ ๋น ๋ฅธ ์ƒˆ๋กœ ๊ณ ์นจ ์ง€์›(#157 ๋ฐ #260) ๋ฐ ๋ชจ๋“  ์žฅ์ (๋ฌธ์„œ)์œผ๋กœ ๋” ๋งŽ์€ ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌํ˜„ , ์˜ˆ ๋“ฑ)

@Zaid-Ajaj ํ , ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ๋‚ด๊ฐ€ ๋ณด๋Š” ๋ฌธ์ œ๋Š” ๋ชจ๋“  ์ข…์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ SSR์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Feliz์— ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ์ข…์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Feliz๋Š” ์žฅ๋‚œ๊ฐ์ด ์•„๋‹Œ ํ”„๋กœ์ ํŠธ(SSR์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ)์— SSR๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์› ์—†์ด ์ˆœ์ˆ˜ํ•œ Feliz๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋” ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๋” ๋“œ๋ฌธ ๊ฒฝ์šฐ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

๋„ค, ์ €๋„ ๊ณ ํ†ต์„ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค . ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ธํ•ด ํŒŒ์ผ ์ „์ฒด์— ๋งŽ์€ #if FABLE_COMPILER ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Ionide๊ฐ€์— ์ˆจ์ด ๋˜ํ•œ ReactElement Feliz.ViewEngine์ด ๊ฐ™์€ ์—†๋‹ค๋Š” ReactElement Fable.React์˜. Feliz์—์„œ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: Feliz.MaterialUI ๋ฅผ .ViewEngine์œผ๋กœ ์ด์‹ํ•˜๊ณ  ๋™๊ธฐํ™” ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Feliz.Bulma.ViewEngine์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฏธ ํฌ๊ธฐํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽ ๋ฆฌ ์ฆˆ ์ฝ”๋“œ ์„œ๋ฒ„ ์ธก์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์˜ˆ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค unbox<string>(value) ๋Œ€์‹  string value . ์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ ์ด๋“์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฐจ์ด์ ์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์„œ๋ฒ„ ์ธก์—์„œ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” !!e?value <> !!value then e?value ๊ฐ™์€ Fable.Core.JsInterop ํ•ญ๋ชฉ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Feliz.ViewEngine์€ ReactElement ๋ฅผ HTML๋กœ ๋‹ค์‹œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฒด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ !FABLE_COMPILER ๋•Œ Interop.fs์—์„œ ViewEngine ์œ ํ˜•์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ViewEngine ์œ ํ˜•์€ ์—ฌ์ „ํžˆ ReactElement์—์„œ ์ƒ์† ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„œ๋ช…์ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ Feliz ์ž์ฒด์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ๊ณผ ์•ฝ๊ฐ„์˜ #if FABLE_COMPILER ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @Zaid-Ajaj๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ‘ํ•ฉ ์•„์ด๋””์–ด์— ๋Œ€ํ•ด ์Šน์ธ๋œ ์›์น™์„ ์ œ๊ณตํ•  ๋•Œ๊นŒ์ง€๋Š” ๊ทธ๋Ÿฌํ•œ ๋…ธ๋ ฅ์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค..

์˜ˆ๋ฅผ ๋“ค์–ด unbox<string>(value) ๋„ ์‚ฌ์šฉํ•˜๋Š” Feliz.Bulma ์— ๋Œ€ํ•ด์„œ๋„ ์œ ์‚ฌํ•œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ž‘์—… ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณตํ†ต ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด ์ข…์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ฒฐ๊ตญ์—๋Š” ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ unbox<string> ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

box / unbox ๋Š” JS์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ์— ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

string i ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

// fable-library

export function int32ToString(i: number, radix?: number) {
  i = i < 0 && radix != null && radix !== 10 ? 0xFFFFFFFF + i + 1 : i;
  return i.toString(radix);
}

// Calling site
import { int32ToString } from "fable-library/Util.js";

export const test = int32ToString(1);

unbox<string> 1 ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

export const test = 1;

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

์ด์ œ ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์€ ์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

let inline unboxStr o = 
    #if FABLE_COMPILER  
    unbox<string> o
    #else
    string o
    #endif

๊ทธ๋Ÿฐ ๋‹ค์Œ unbox<string> ์—์„œ ์ฐพ๊ธฐ ๋ฐ”๊พธ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Fable 3์—๋Š” ์ƒ๋‹นํ•œ ์žฌ์ž‘์„ฑ์ด ํฌํ•จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ @Zaid-Ajaj์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ ์ ˆํ•œ ์‹œ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‚˜๋Š” @Zaid-Ajaj๊ฐ€ SSR์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—„๋งˆ์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ๊ฐ€ ๊ทธ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค ์ „์ฒด์— ์Ÿ์•„์ง€๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ๋งŒํผ), ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ๊ณ ํ†ต์Šค๋Ÿฝ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. /๊ทธ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ฒ˜์Œ๋ถ€ํ„ฐ SSR์„ ์—ผ๋‘์— ๋‘๊ณ  ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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