UI๋ฅผ ๋น๋ํ๋ ์ฝ๋๋ ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค. Dart๋ Java์ ๊ฐ๋จํ ๋ฒ์ ๊ณผ ๋น์ทํ์ง๋ง ์ค์ ๋ก UI๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์๋๋๋ค. ์๋ฅผ ๋ค์ด ๋ซ๋ ํ๊ทธ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ์ฝ์ ์ ์๋ ์ฝ๋๋ก ๋ง์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
๋ํ Flutter๋ React์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. Flutter์ JSX๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ ์ด๋ฐ ์ข ๋ฅ์ ์ฝ์ ์ ์๋ ์ฝ๋๊ฐ ์์ ์ ์์ต๋๊น? ๋๋ Flutter๊ฐ AnglurJs์ ์ด์ฐฝ๊ธฐ์ฒ๋ผ ๊ณง ์ฃฝ๊ฒ ๋ ๊น๋ด ๋งค์ฐ ๋๋ ต์ต๋๋ค.
Google์์ ์ผํ๋ ์ฌ๋๋ค์ด ๋๋ํ๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ค์ ๋ก ๋๋ํ์ง ์์ ์ฌ๋๋ค๋ Dart ๋์ React๋ฅผ ์ ํํ๊ณ ์ด๊ฒ์ด ๊ณผ๊ฑฐ Dart๊ฐ ์ฃฝ์ ์ด์ ์ค ํ๋์ ๋๋ค.
์ด๊ฒ์ ์ค๋ซ๋์ ์์ฒญ๋์์ต๋๋ค.
https://github.com/flutter/flutter/issues/11609
๊ฐ๋ฐ๋ ๊ธฐ๋ฅ์ ํ๋กํ ํ์
:
https://spark-heroku-dsx.herokuapp.com/index.html
๊ทธ๊ฒ์ ๋์๊ณผ ๋ช ๊ฐ์ง ์ด์ ์ ๋ณด์ฌ์ค๋๋ค ...
DSX์ ํ์ฌ ๋ฌธ์ ๋ .dsx ํ์ผ์์ ์์ ํ๋ ๋๋ฒ๊ฑฐ, ์๋ ์์ฑ ๋ฑ์ ํ๋ฅญํ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด Flutter ๋๊ตฌ์์ ์ ์ ํ ํตํฉ์ ๊ดํ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์์๊ฒ DSX๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ ์๊ฒ๋ ์์ํ๊ธฐ ์ด๋ ค์ด ์ผ์ ๋๋ค. ๋๊ตฐ๊ฐ ๋์์ฃผ๊ณ ์ถ๋ค๋ฉด ๋ด๊ฐ ํ์ํ ๊ฒ์ Dart ๋๊ตฌ ๋ฐ VS Code Dart ํ๋ฌ๊ทธ์ธ์ ์ ์ฒด ์ ์ฒ๋ฆฌ ์ง์(์์ค ๋งต ํฌํจ)์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ๋๊ตฌ๊ฐ DSX ๋๋ ๋ค๋ฅธ ํธ๋์คํ์ผ๋ง ์ธ์ด( Dart์ ์์ ์งํฉ์ด์ง๋ง ๋ชจ๋ ๊ฒ์ Dart๊น์ง ์ปดํ์ผํจ)์ด ์๋ํฉ๋๋ค.
๋น์ ์ด ๋์ธ ์ ์๊ณ ๋๊ณ ์ถ๋ค๋ฉด ์ ์๊ฒ ์๋ ค์ฃผ์ญ์์ค.
๋์ํ ์ ์์ต๋๋ค. ํนํ Dart Code์ ๊ฐ์ IDE๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ์ป์ ์ ์์ต๋๋ค. new
๋ฅผ ์๋ตํ ์ ์๋ Dart2๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋์์ง ๊ฒ์
๋๋ค.
๋ํ ์์ ฏ ํด๋์ค๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ ์๊ฒ ๋ถํดํ์ง ์๊ณ ๋๋ฌด ํฐ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ ๋ ์๋๋ก์ด๋ ์คํ๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ ๋ซ๋ ํ๊ทธ์กฐ์ฐจ ๋ณด์ด์ง ์์ต๋๋ค. ๊ฐ์์ ๋ซ๋ ํ๊ทธ๊ฐ ์์ง๋ง ๋ชจ๋ ์ฌ๋์ด ์ซ์ดํ๋ HTML๋ณด๋ค ๋ณต์กํฉ๋๋ค. Dart๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ผ ๋ฟ์ ๋๋ค. Google์ ์ฌ๋๋ค์ ๋จ์ํ์ ์ค์์ฑ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ๋ ์ํ์ง ์์ง๋ง ์, IntelliJ๋ฅผ ์ฌ์ฉํ๊ณ UI ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๋๊ตฌ๋ก ๋ญ๊ฐ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
๋ํ ์์ ฏ ํด๋์ค๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ ์๊ฒ ๋ถํดํ์ง ์๊ณ ๋๋ฌด ํฐ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด JSX์ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค... ํธ๋ฆฌ๊ฐ ์ปค์ง์๋ก ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์์ ํ์ ํธ๋ฆฌ๋ก ๋๋ ์ ์์ต๋๋ค.
JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ๋ ์ํ์ง ์์ง๋ง ์, IntelliJ๋ฅผ ์ฌ์ฉํ๊ณ UI ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๋๊ตฌ๋ก ๋ญ๊ฐ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
Intellij๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํ๋ซํผ์์ ์ฝ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค. ์ฝ๋๋ฅผ ๊ฒํ ํ ๋ Bitbucket์์ ์ฝ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค. ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ ๋๋ ์ ํจํด์ผ ํฉ๋๋ค. ์ด '์ฃผ์ ์ฃผ์'์ผ๋ก 'vi'๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ๊ฑฐ๊ธฐ์ ๋ค๋ฅธ ์ฃผ์์ ์ ๋ ฅํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
์ด๊ฒ์ ์ ๊ธด #11609์ ๋ณต์ ์
๋๋ค.
@sethladd ?
์ฃ์กํฉ๋๋ค. IntelliJ ๋ฐ Android Studio์์ "๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ"๊ฐ ํ์๋์ด์ผ ํฉ๋๋ค.
cc @devoncarew ๋ ์ด๋ค ๋ฒ์ ์ด ํด๋น ๊ธฐ๋ฅ์ ์ผฐ๋์ง ํ์ธํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ตํธ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ?
JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ธ์ด, ๋๊ตฌ ๋ฐ ํ๋ฌ๊ทธ์ธ ์ ๋ฐ์ ๊ฑธ์ณ UI ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ํธ์งํ ์ ์๋ ๊ธฐํ๊ฐ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
์ด๊ฒ์ ์์์ #11609๋ฅผ ์ํํ์ง๋ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ @devoncarew ๋๋ @mit-mit์์ "๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ"๋ฅผ ์ผ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฌ ํด์!
@JonathanSum , ๋ซ๊ธฐ ๋ ์ด๋ธ์ ๋ถํํ๋ Android Studio 3.0์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. IntelliJ 2017.3 ๋๋ Android Studio 3.1 ์ด์์ด ํ์ํฉ๋๋ค. Android Studio 3.1์ ํ์ฌ ์ถ์ ํ๋ณด ๋จ๊ณ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ง์ํ๋ Flutter ํ๋ฌ๊ทธ์ธ์ ๋ด์ผ ์ถ์ํ ์์ ์ ๋๋ค.
JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ๋ํ ๋ํ์ ์๊ด์์ด IntelliJ/Android Studio ๋ฐ VS Code ๋ชจ๋์์ Dart์์ UI ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ๋ ธ๋ ฅํ๊ณ ์ถ์ต๋๋ค. ์ฒ์์๋ ๋ซ๋ ๋ ์ด๋ธ ์์ ์ด์ง๋ง ์ต๊ทผ Flutter ๊ฐ์ ๋ณด๊ธฐ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๋ ๊ฐ์ ๋ณด๊ธฐ์์ build() ๋ฉ์๋์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์์ ฏ์ ํ์ํ๊ณ ์์/ํ์ ๊ด๊ณ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ โโ๋ณผ ์ ์๋๋ก ํฉ๋๋ค. ํ์ฌ IntelliJ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. VS Code์์๋ ์ฌ์ฉํ ์ ์์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@zoechi - ์ด๊ฒ์ ์์์์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ค์ ๊ฐ์ด๋์ด ์ ๊ฒผ์ต๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ค์ ๊ทธ ๋ํ์ ๊ธฐ์ฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋๋ ์ฌ๋๋ค์ด ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ๊ฒ์ ์ข์ํ์ง ์๋๋ค๊ณ ํด์ ์ด ์ค๋ ๋๋ฅผ ์ค๋ณต์ผ๋ก ๋ซ์์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด๊ฒ์ JSX ์ง์(๋๋ ์ ์ฌํ ๊ธฐ๋ฅ)์ ์์ฒญํ๋ ์๋ก์ด ์ฌ๋๋ค์ ๋ํ ์๋ต์ ์ํ ์ ์ค๋ ๋์ฌ์ผ ํฉ๋๋ค.
@sethladd - ์ด ์ค๋ ๋๋ฅผ ์ ๊ทธ์ง ๋ง์ญ์์ค. ์ปค๋ฎค๋ํฐ์์ ๋์ ๋ ์ด์์ ๋ฐฉ๋ฒ์ ๋ํ ์ฐฌ๋ฐ ์๋ก ์ ํ ๋ก ํ๋ ๊ฒ์ด ์ ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๊ฒจ ์์ง ์์๋ค๋ฉด #11609์ ์ฐธ์ฌํ์ ๊ฒ์ ๋๋ค.
์ ๋ NativeScript ๋ฐฐ๊ฒฝ์์ ์์ต๋๋ค. ์ด๊ฒ์ด Flutter๋ณด๋ค NativeScript๊ฐ ํจ์ฌ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๊ณ ๋๋ผ๋ ์์ญ ์ค ํ๋์ ๋๋ค. ์๋นํ ๋ณต์กํ ํ๋ฉด์ 5๋ถ ์ด๋ด์ ์์ ํ ์ ์๊ณ ๋์์ธ์ ๋น ๋ฅด๊ฒ ๋ฐ๋ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋ฉด์ ์คํํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
NativeScript์๋ ์ค์ ๋ก ๋ค์ ํ์ผ์ด ์์ต๋๋ค.
screen.js
/ screen.ts
(.ts๋ typescript๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ .js๋ก ๋ณํ๋ฉ๋๋ค). ์ด๊ฒ์ ํ์ฌ ํ์ํ๊ณ ์๋ ํ๋ฉด์ ์ฃผ์ ๋
ผ๋ฆฌ์
๋๋ค.screen.css
(๋๋ screen.android.css
๋ฐ/๋๋ screen.ios.css
) CSS์ ํจ์ฌ ๋ ์ ํ๋ ๋ฒ์ ์ด์ง๋ง ๋์ด, ๋๋น, ์์, ๋ฐฐ๊ฒฝ ๋ฑ์ ์ง์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋จ์ผ CSS ํ์ผ๋ง ํ์ํ์ง๋ง ๊ฐ๋ ์ด์ํ ์์
์ ์ํํ๋ ๊ฒฝ์ฐ CSS๋ฅผ Android ๋ฐ iOS์ฉ์ผ๋ก ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ํด๋์ค, ์์ ๋ฐ ID๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๋ฏ๋ก TextArea.Login #Password
๋ฅผ ์ํํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก๋ ํน์ ์์ ์ฒด์ธ์ผ๋ก๋ง ์ ํ๋ฉ๋๋ค.screen.xml
(๋ค์ ๋๋ screen.android.xml
๋ฐ/๋๋ screen.ios.xml
) - ํ๋ฉด ๋ ์ด์์์
๋๋ค. ์ํ๋ ๊ฒฝ์ฐ JS์์ ๋ ์ด์์์ ์ฝ๋ฉํ ์ ์์ต๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ฌํฐ์ ์ ์ฌ). ๊ทธ๋ฌ๋ XML์ ํจ์ฌ ๋ ์ฝ์ต๋๋ค. ์์:<Page onLoad="loadme">
<ActionBar title="Blah"><NavigationButton click="back" title="Back"/></ActionBar>
<StackLayout>
<Label text="Hi" id="Hi" style="color: red"/>
<Label text="{{name}}" class="name"></Label>
<Button text="Click Me" tap="clicker"/>
</StackLayout></Page>
ํฅ๋ฏธ๋ก์ด ์ ์ ActionBar๊ฐ ํน์ ํ์ด์ง ์ ์ฉ ๊ตฌ์ฑ ์์๋ผ๋ ๊ฒ์
๋๋ค(์ฆ, Page์๋ง ํด๋น). ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก XML ํ์ See์ ํ์ด์ง๊ฐ ๋ฐ์ํฉ๋๋ค. ์ ํ์ด์ง ์์๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ActionBar ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ ๋ค์ Page ๊ตฌ์ฑ ์์์์ builderChild ํจ์๋ฅผ ์คํํฉ๋๋ค. ํ์ด์ง ๊ตฌ์ฑ ์์๋ ๊ธฐ๋ณธ builderChild๋ฅผ ์ฌ์ ์ํ๊ณ ์์์ด ActionBar์ธ์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด; ๊ทธ๋ฐ ๋ค์ ๋ด๋ถ์ ์ผ๋ก ์ ์ ํ ๋ณ์์ ํ ๋นํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋จธ์ง๋ ์์/์์๋ฅผ ํตํด ์ ๋ฌ๋ ๋ค์ ์๋์ผ๋ก "์์" ๋๋ "์์" ๊ตฌ์ฑ ์์์ ํ ๋น๋ฉ๋๋ค. ๋น๋ ์์คํ
์ ๊ฐ ๊ตฌ์ฑ ์์๊ฐ ๋ถ๋ชจ์ builderchild ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ด๋ฅผ ์ฌ์ ์ํ์ฌ <Label>Hi</Label>
์ง์๊ณผ ๊ฐ์ ์ถ๊ฐ ํญ๋ชฉ์ ์ํํ๊ณ ์ด๋ฅผ Text ๊ฐ์ ์๋์ผ๋ก ํ ๋นํ ์ ์๋ค๋ ์ ์์ ๋งค์ฐ ๋ค์ฌ๋ค๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ๋ ์์ด๋ ๋ ์ด์์์ ๋งค์ฐ ์ฝ๊ฒ ์์ํ๊ณ ์คํํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ํธ์ง๊ธฐ๋ ์ฐ์ํ XML ํธ์ง ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์์์ด ์ง์ ๋๊ณ ์ ์ ํ xsd ์ ์ intellij(& vscode)๊ฐ ์๋ ๊ฒ์ฌ ๋ฐ ์ ํ๋ ์ปจํ ์คํธ ์ง์์ ์ํํฉ๋๋ค.
์ด์ ๊ธฐ์ ์ ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ์ค์ ๋ก JavaScript ๊ตฌ์ฑ ์์์ ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ชจ๋ ์์ ์ ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค(Flutter๊ฐ ํ๋ ๊ฒ์ฒ๋ผ). ํ์ง๋ง NativeScript์์๋ ํ๋ฉด ๋ ์ด์์์ด ๊ฐ๋จํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ์ ์์ํ ๋ JS๋ CSS๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ CSS๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค(์ผ๋ฐ์ ์ผ๋ก ๋ ์ด์์์์ CSS ๊ธฐ๋ฐ ์์ฑ์ ํ๋ ์ฝ๋ฉํ์ง ์์ง๋ง ์ํ๋ ๊ฒฝ์ฐ ํ ์ ์์).
์ด๊ฒ์ ๋ํ ์ข์ ์ ; ์น ๊ฐ๋ฐ์๊ฐ ์ฌ๊ต์ก์ ๊ฑฐ์ ๋ฐ์ง ์๊ณ ๋ฐ๋ก ์์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ์ค๋ก; ์ ์ฐํ ๋ ๋๋ฌ์ JS ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ NativeScript๋ ์ค์ ๋ก Angular์ Vue๋ฅผ ์ง์ํ๋ฏ๋ก Angular ๋๋ Vue๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์น๊ณผ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ์ ์ฝ๋ ๊ธฐ๋ฐ์ ๊ฑฐ์ 95%๋ฅผ ์ค์ ๋ก ๊ณต์ ํ ์ ์์ต๋๋ค. react native์ ๊ฐ์ ๊ธฐ๋ณธ OS ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ (cordova์ ๊ฐ์ webview๊ฐ ์๋); ๊ทธ๊ฒ์ ์ ๋ง๋ก ๊ด์ฐฎ์ ํฌ๋ก์ค ํ๋ซํผ ์์คํ ์ ๋๋ค(์ฆ, React Native๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค). ๊ทธ๋ฌ๋ Flutter๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ช ๊ฐ์ง ๊ฐ์ ์ด ์์์ ์ ์ ์์ต๋๋ค. ์ผ๋ถ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ ์ํ ์ข์ ๋ณด์ ๋๊ตฌ๊ฐ ๋๋ ์ด์ ๋ ์ผ๋ถ ์ฑ์ด NativeScript๊ฐ ๋ ๋์ฉ๋๋ค. ์ผ๋ถ ์ฑ์ ์ฌ์ ํ โโ๋ด ์๋ต์ ๊ธฐ๋ฐ์ผ๋ก ํจ์ฌ ๋ ๋ซ๊ธฐ ๋๋ฌธ์ ๋๋ค. Ian์ ๋ฌธ์ ; ์ด๋ฌํ ์์ญ์์ ํจ์ฌ ๋ ๋์ ๋๊ตฌ๋ก ๋จ์ ๊ฒ์ ๋๋ค.
์ ๊ธด ์ค๋ ๋๋ฅผ ์ด๊ณ ์ด ๋๊ธ์ ๋ณต์ฌํ์ฌ ์ ์ฒด ํ ๋ก ๊ธฐ๋ก์ ํ๋ณดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@JonathanSum ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ํ๋์ง ์ํ์ง ์๋์ง์ ๊ดํ ๊ฒ์ด ์๋๋๋ค.
์ฌ๊ธฐ๊ฐ ๊ทธ๊ฒ์ ๋ํด ์ด๋ค ํ ๋ก ์ ํ ์ฅ์์ธ์ง ์ฌ๋ถ์
๋๋ค. reddit์ด๋ ๋น์ทํ ๊ณณ์ด ๋ ๋์ ๊ฒ ๊ฐ์์.
@cbazza - ๋์ํ์ง ์์ต๋๋ค. ํ์ง๋ง ๋ฏธ๋์ ์ฌ๋๋ค์ ๋ํด ์์ํ์ง ์๋๋ก ๋งค์ฐ ์กฐ์ฌํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ๊ทธ๋ค์ด ์ผ๋ง๋ ๋ฐ๋ณด ๊ฐ๋ค๊ณ ์๊ฐํ๋๋ผ๋ ํ ๋ก ์ ๋ถ์ ๋ถ์ผ ๋ฟ์ ๋๋ค.
@zoechi - ์ฌ์ค ์ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ๋ชจ๋ ๋ ผ์๊ฐ ์ฌ๊ธฐ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. John Doe๊ฐ ์ง๊ธ์ผ๋ก๋ถํฐ ํ ๋ฌ ํ์ ์์ XYZ ๊ธฐ๋ฅ์ ๋ํด ๊ฒ์ํ ๋ ๋ค์์ ์ํํ ์ ์๋๋ก ๊ธฐ๋ก์ ์ ์งํด์ผ ํฉ๋๋ค. +1: ๊ธฐ์กด ๊ธฐ๋ฅ ๋ฐ/๋๋ ์ด์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
์ ๋๊ธ ๋๋ฌธ์ ๊ทธ ์ฐ๋ ๋๊ฐ ์ด๋ ๊ฒ ์ค๋ซ๋์ ์ ๊ฒจ ์์ง๋ ์์ ๊ฒ ๊ฐ์์. ๋ด๊ฐ ๋งํ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์๋ค๋ฉด ์ด๋ป๊ฒ ์๋ฅผ ๋ค์ด ์ด ์ค๋ ๋์ ๊ฐ์ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ํด ๋ ผํํ ์ ์์ต๋๊น?
Flutter ํ์ ์ด ์์ ์ ๊ด์ฌ์ด ์๊ณ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ง ์๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๊ฐ ์ ๊ฒจ ์์ต๋๋ค.
JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํ ์ฌ์ฉ ์ฌ๋ก์ ์์ ์ด์ ์ ๋ง์ถ ์ด๋ฒ ํธ์ ๋ ผ์๋ฅผ ๊ณ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
์ค์ ๋ก NativeScript๊ฐ ๊ทธ๋ ๊ฒ ์ข์ ๊ฒฝ์ฐ Flutter NativeScript๋ฅผ ์ข์ํ๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ ๋์ Flutter๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
์ ๋ XML ๊ธฐ๋ฐ ํ๋ซํผ(Xamarin Forms)์์ ์์ผ๋ฉฐ ์ฒ์์๋ ์ฝ๋๋ก ๋์์ธํ๋ ๊ฒ์ด ๋ ์ด๋ ค์ธ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ฐ๋๋ก ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ณ๋์ ํด๋์ค๋ก ๋์์ธ์ ๋ถ๋ฅํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
JSX๋ ์ฝ๋๋ก ๋์์ธํ๊ณ ์์ต๋๋ค!!!
@sethladd
JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํ ์ฌ์ฉ ์ฌ๋ก์ ์์ ์ด์ ์ ๋ง์ถ ์ด๋ฒ ํธ์ ๋ ผ์๋ฅผ ๊ณ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
์, ์ฌ๊ธฐ์์ ๋ณผ ์ ์๋ ๋ด DSX ๋์์ธ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
์์ ฏ์ด ๋น๋๋๋ ํ์ฌ ๋ฐฉ์์ ๋ํ ์ง์ ์ ์ธ ๋งคํ์ ์ ๊ณตํ๋ฉด์๋ ๋งค์ฐ ๊ฐ๋ณ๊ณ React ๊ฐ๋ฐ์์๊ฒ ์น์ํ JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋์์ธ์ ๋น ์ง ๊ฒ์ด ์์ต๋๊น? ์ด ๋์์ธ์ด ๋ชจ๋ ๊ฐ๋ฅํ ์์ ฏ์ ์ผ์์์ ์์ฑํ ์ ์์ต๋๊น?
๊ฒฝํ์ ๋๋ํ ํ๋๋ก ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐ๋๋ฉด ํค๋ณด๋์์ ํ ๋ฐ์ง ๋จ์ด์ ธ ํด์์ ์ทจํด์ผ ํฉ๋๋ค.
์ ๋ Android์ Java์ ๋ํ ์ฝ๊ฐ์ ๊ฒฝํ๋ง ๊ฐ์ง๊ณ ์๋ Flutter์ ์ด๋ณด์์ด๋ฉฐ ์ฌ๊ธฐ์์ ์ ์๋ ๊ฒ๋ณด๋ค Flutter๊ฐ ์ ๊ณตํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ซ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค. ๋๋ XML์ด ์ถํ๊ณ ๋ค๋ฃจ๊ธฐ ํ๋ค๋ค๋ ๊ฒ์ ์๊ฒ ๋๋ ๊ฒฝํฅ์ด ์๋ค. ๋ฐ๋ค์ ๋ฐ๋ค๋ณด๋ค ํ๋์ ๋ซ๋ ๋ฌธ์๊ฐ ์๋ ๊ฒ์ด ํจ์ฌ ๋ ์๋ฆ๋ต์ต๋๋ค.
React๊ฐ ์ด๋ฐ ์์ผ๋ก ํ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ง์ง๋ง์ผ๋ก ํ์ธํ์ ๋ ์ด ๊ณณ์ Flutter์ ๋๋ค. React๊ฐ ์ํํ๋ค๊ณ ํด์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ๋น์ ๋ง์ด ์ฌ๊ธฐ๋ก ๋ฐ์ด๋๋ ๊ฒ์ ์๋๋๋ค! @escamoteur ์ ๋ชจ๋ ์์ ์ ๋งค์ฐ ๋์ํฉ๋๋ค. Flutter๋ฅผ ์ฌ์ฉํ ๋ ์ฌ๋๋ค์ด ์ฒ๋ฆฌํด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ค์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ์ Dart๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ง์คํฐํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ง์ ์์ ์ด ํ์ํ์ง ์์ต๋๋ค! ์ผ๊ด์ฑ๊ณผ ๋จ์์ฑ์ ํ๊ฐํด์ผ ํฉ๋๋ค.
DSX์ ์์ฑ๋ Dart ์ค๋ํซ์ ์ผ๋ถ ์ค๋ช :
์ฃผ๊ด์ : ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ํฅ์๋์ง๋ ์์์ต๋๋ค. ์ฅํฉํจ์ ๋น์ทํฉ๋๋ค - ์กฐ๊ธ ๋ ๊ธธ์ง๋ ์๋๋ผ๋. Dart IDE ํ๋ฌ๊ทธ์ธ์ ์ ์ธ์ ๋งํฌ์ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ๋ฏธ๋ฌ๋งํ๋ ์๋ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค. JSX๊ฐ ์ฝ๋๋ก ๋์์ธ๋ ๊ฒฝ์ฐ Dart์ ์์ ฏ์ด ์ด๋ป๊ฒ ๊ทธ๋ ์ง ์์์ง ์ ์ ์์ต๋๋ค.
<vars>
์ ์ฌ๋ฌ ์์ฑ
@<vars>
var textStyle = {
"textDirection": "TextDirection.ltr",
"textAlign": "TextAlign.center",
"overflow": "TextOverflow.ellipsis",
"style": "new TextStyle(fontWeight: FontWeight.bold)"
};
</vars>@
์ฌ๋ฌ ์์ฑ์ ํผํฉํ์ฌ ์ ์ญ ์คํ์ผ์ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ์ข์ ์๊ฐ์
๋๋ค.
๊ทธ๋ฌ๋ ๋ด ๊ฒธ์ํ ํ๋ฌํฐ ๊ฒฝํ์ ๋์ด์ผ ๋ณผ ๋ ๋๋ ์ด๊ฒ์ ์ด๋์ ์ฌ์ฉํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Text
์ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๋๋ถ๋ถ์ด ์ฌ๋ฌ ์์ฑ์ ํผํฉํ๋ ๋์ TextStyle
์ ์ ์๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ Text
์ด์ธ์ ๋ค๋ฅธ ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
TextStyle
๋ฅผ ๋ณด๋ฉด ํ์ฌ immutable + copy() ๊ฐ Dart์์ ์ฌ์ฌ์ฉ ๋ฐ ์์ฑ์ ์ ํฉํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
class Style {
static const TextStyle avenirNextMedium =
const TextStyle(
fontFamily: 'Avenir Next',
fontWeight: FontWeight.w500,
);
static TextStyle title =
avenirNextMedium.copyWith(
color: ColorKit.blue,
fontSize: 45.0,
);
}
new Text(
'Hello',
style: Style.title,
),
new Text(
'Hello2',
style: Style.title.copyWith(
color: ColorKit.red,
),
),
๋์ผํ ์คํ์ผ์ ๊ณต์ ํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ Container
์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ ์ํ ๋น์ ์ฅ ์์ ฏ์ ๋ง๋๋ ๊ฒ์ด ์ธ๋ถ ์ ์ <vars>
๋ณด๋ค ๋ ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํจ๋ฉ, ์ํฌ, ์ ์ค์ฒ ์์ ๊ธฐ ๋๋ ๊ทธ๋ฆผ์๋ ํ์ํฉ๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ Container
๋ฅผ ๋ค๋ฅธ ์์ ฏ์ผ๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. Material
, Padding
, Center
๋ฑ ์ด์จ๋ ์ฌ์ฉ์ ์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ "์ปจํ
์ด๋" ์์ ฏ์ ์ฌ์ฉํ๋๋ผ๋, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ฏ ๊ณ์ธต ๊ตฌ์กฐ์์ ๋จ์ผ ์์ ฏ์ ์์ฑ์ ์ ์ํ๋ ์ธ๋ถ <vars>
์คํ์ผ์ ๊ฐ๋ ๊ฒ์๋ ๋ง์ ์ด์ ์ด ์์ต๋๋ค.
Flutter์ "๋ชจ๋ ๊ฒ์ด ์์ ฏ์ ๋๋ค"๊ฐ "์ฌ๋ฌ ์์ฑ" ์คํ์ผ๊ณผ ์ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Dart์์ ๋์์ธ์ ํ ๋ children
์ ํน์ ์์ ฏ์ ์ถ๊ฐํ๊ฑฐ๋ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ์ฝ๊ณ ํธ๋ฆฌํฉ๋๋ค.
์์ ฏ์ ๋ค๋ฅธ ์์ ฏ์ผ๋ก ๋์ ์ผ๋ก ๋ํํ๋ ๊ฒ๋ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. build() ํจ์๋ฅผ ์ ์ฐฝํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
var children = <Widget>[];
if(a) {
children.add(wa);
}
var wb = Text();
if(b) {
wb = Padding(child: wb);
}
children.add(wb);
@SirComputer1 DSX ์ ์์ ์ถ๊ฐ ์ฌํญ์ด๋ฉฐ ํ์ฌ ๋ฐฉ์์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ๋ง๊ณ ์ง๊ธ์ฒ๋ผ ๊ณ์ํ์ญ์์ค.
<var>
๋ ์ ์ฒด Dart๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ถ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ชจ์ฉ์ผ๋ก๋ง ์ํ๋์์ต๋๋ค. ์ต์ข
์๋ฃจ์
์ <var>
๋ฅผ ํฌํจํ์ง ์์ง๋ง ๋ชจ๋ dart ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ '@'๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ฐ๋ชจ์ฉ์ผ๋ก๋ง ์ํ๋์์ต๋๋ค. ์ต์ข
์๋ฃจ์
์๋ ํฌํจ๋์ง ์์ต๋๋ค.
ํ์ผ์ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ์ผ๋ฐ Dart ์ฝ๋์ด๋ฏ๋ก ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์์์ ์์ง ๋ง์ญ์์ค.
var children = <Widget>[];
if(a) {
children.add(wa);
}
// You can mix and match both
var wb = <Text/>;
if(b) {
wb = Padding(child: wb);
}
// or
var wb = Text();
if(b) {
wb = <Padding> {wb} </Padding>;
}
children.add(wb);
children.add(
<Center>
{sayHello == true ?
<Text ['Hello, world!']/>
:
<Text ['Good bye']/>
}
</Center>
);
DSX๋ฅผ ํ์ฌ ๋ฐฉ์๊ณผ ๋น๊ตํ๋ ๊ฒ์ ๊ทธ๋งํฉ์๋ค. ํ๋๋ ๋ค๋ฅธ ํ๋์ ๊ฒฝ์ํ์ง ์์ต๋๋ค. ์ด๋ค ์ฌ๋๋ค์ JSX๋ฅผ ์ ํธํ ๊ฒ์ด๊ณ ์ด ์ค๋ ๋๋ ๊ทธ๋ค์ ์ํ ๊ฒ์ ๋๋ค. ๋ด๊ฐ ์๊ณ ์ถ์ ๊ฒ์ DSX๊ฐ ์๋ํ์ง ์๋ ๊ฒ์ ์ฒ๋ฆฌํ๋๋ก DSX๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
@escamoteur - ์ ๋ ๋ง์น๋ฅผ ๋๋ผ์ด๋ฒ๋ก ์ฌ์ฉํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ๋ค์ํ ๊ธฐ์ ์ ํ๊ฐํ๊ณ ์ ์ ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ ํ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ๊ฐ ํ๋ซํผ์์ ๋ ๋์ ๋ฐฉํฅ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. :์์์ด ๋์น๋:
์๋ฅผ ๋ค์ด; ํ์ฌ ํ๋ฌ๊ทธ์ธ ํตํฉ. NativeScript๋ ๋ค๋ฅธ ๋ชจ๋ ํฌ๋ก์ค ํ๋ซํผ์ ์ง์ ํ ์์ ๋๋ค. ์๊ฒฉ์ผ๋ก NativeScript์ ๊ทผ์ ํ ์ ์๋ ๊ฒ์ ์์ต๋๋ค. ๋ฐ ํ์ฌ ํตํฉ. https://github.com/vipulasri/Timeline-View ์ฌ์ฉ์ ๋ํด ๋ฌป๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ต๋๋ค. Flutter๋ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. NativeScript๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์๊ฐ์ด ์์๋๋ฉฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ์์ ํ ์๋ํ๋๋ผ๋ ๋ค๋ฅธ NS ์ปจํธ๋กค์ฒ๋ผ ์๋ํฉ๋๋ค. ๋ฐ๋ฉด์ ํ๋ฌํฐ๋ NS ํ๋๊ทธ๊ฐ ...
์์ ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค. :์์์ด ๋์น๋:
๋๋ XML ๊ธฐ๋ฐ ํ๋ฉด ๋ ์ด์์์ ์ข์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ํ์ง๋ง ์ฌ๋๋ค์ด ์ ๊ทธ๋ ์ง ์์์ง ์ดํดํฉ๋๋ค. XML ๊ธฐ๋ฐ ๊ตฌ์ถ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๊ณ ํด์ ๊ธฐ์กด ๋ฐฉ๋ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ณด์์ ์ ๋๋ค. ์ ํ. ์ฝ๊ธฐ ๊ท์ฐฎ์ผ์ ๋ถ๋ค์ ์ํด, ์ฐ๋ฆฌ๊ฐ flutter์์ ํ๋ ๊ฒ๊ณผ ๋์ผํ ์ผ๋ จ์ ํธ์ถ์ NS์์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ xml์ ์ฌ์ฉํ๋ฉด ํ์ดํ์ด ํจ์ฌ ์ ๊ณ ์ฝ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ์ฌ๋๋ง๋ค ์ทจํฅ์ด ์์ผ๋...
์ ๋ ์ค์ ๋ก XML ๊ธฐ๋ฐ ๋ ๋๋ฌ๋ฅผ Flutter์ POC๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ์ฌ์ ๊ฐ ์์์ด์. ์ ๋ ๋จ์ง ๋ํ์ ๊ธฐ์ฌํ๊ณ ์ถ์๊ณ ์ด๋ฌํ ์์ง์์ ๋ณด๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ํต์ฌ ํ์ด ์์ ํ ๊ฒ์ผ๋ก ๊ธฐ๋ ํ์ง๋ ์์ต๋๋ค . NS XML ํ์์ ๊ด์ฌ ์๋ ์ฌ๋๋ค(์: ์๋ง ๋:์๋ ์ค:)์ด ๊ธฐ๊บผ์ด ์์ ์ ์ํํ ์ ์๋ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ๋ก ์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ @sethladd ์ ๋๋ค. ํจ์น์ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ํต์ฌ ํ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฅ๋ ฅ์ ์ ๋์ ์ผ๋ก ๋ฐ๋ํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ถ๋ฉ๋๊น? ์ด๊ฒ์ด ๋ด๊ฐ ์ด๊ฒ์ ์๊ฐ์ ๋ณด๋ด๊ธฐ ์ ์ ๋จผ์ ์ ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค ...
@NathanaelA ํ์์ ์ธ ๊ด์ !!!!!! ๋๋ํ๋ฅผ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค ;-) ๋ง ๊ทธ๋๋ก ๋จธ๋ฆฌ์ ๋ชป์ ๋ฐ์์ต๋๋ค.
์, ์ ๋ DSX๋ฅผ ํ ์ ์์ง๋ง ํ์ฌ Flutter ๋น๋ ์์คํ ์ ํตํฉํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฏ๋ก ๊ณ์ ์งํํ๊ธฐ ์ ์ ํ์ฌ Flutter ํ์ ์ฝ์์ด ํ์ํฉ๋๋ค. IDE ํตํฉ์ VS Code์์ ์ฌ์ค์ ์ฌ์ํ์ง๋ง Intellij์์๋ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ต๋๋ค(Google์ด Intellij JSX ์ง์์ ์ก์ธ์คํ ์ ์๋ ๊ฒฝ์ฐ).
@zoech , ์๋์! ๋๋ ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋ค. ๋ค์ดํฐ๋ธ ์๋ฐ์ XML๋ก ์๋๋ก์ด๋ ์ฑ์ ๊ฐ๋ฐํ๋ ๊ธฐ์ต์ด ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ UI ์ธ์ด ๋ถ๋ถ์ XML์ ์ฌ์ฉํฉ๋๋ค. ๋ ผ๋ฆฌ์ UI์ Dart๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด์ํ๊ณ ์ด ๋ฌธ์ ๋ ๋ถ๋ช ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ Google์ด Flutter์ React์ UI ์์ด๋์ด๋ฅผ ์ถ๊ฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. React์ UI ๋ถ๋ถ์ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ ๊ฐ๊ฒฐํฉ๋๋ค.
@JonathanSum ์ด์ ๋ํ ๋ง์ ์๊ฒฌ์ ๋ณด์์ต๋๋ค.
๋์๊ฒ๋ ์ฌ์ ํ ์ฌ๋๋ค์ด ์ต๊ด์ ๋ฐ๊พธ๋ ๊ฒ์ ๊บผ๋ คํ๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ๊ทธ๊ฒ์ด ํ๋ซํผ์ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค.
์ด๋ค ์ฌ๋๋ค์ jsx๋ฅผ ์ข์ํ๊ณ ์ด๋ค ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. UI๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? jsx์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์์ผ๋ฉฐ ๋ง์นจ๋ด ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ํ๋ฌํฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@ yuu2lee4 https://github.com/flutter/flutter/issues/11609#issuecomment -364811331
@zoechi
์ฌ๋๋ค์ด ์ต๊ด์ ๋ฐ๊พธ๋ ๊ฒ์ ๊บผ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ฌ๋๋ค์ด ์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด๊ฒ์ ๊ณต์ ํ ๊ด์ฐฐ์ด์ง๋ง Flutter๊ฐ ์กฐ๋ ฅ์๊ฐ ๋์ด (Google ์ธ๋ถ) ์ฌ๋๋ค์ด Flutter๋ฅผ ์ฑํํ ์ ์๋๋ก ๊ฐ๋ฅํ ํ ๋ง์ ๋ง์ฐฐ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ ์ข์ง ์์๊น์? ์ด ๊ฒ์ดํธ ํคํ ๋์์ ๊ฐ๋ฐ์์ ๋ง์์ ์ฌ๋ก์ก๋ ๊ฒ์ด ์๋๋๋ค.
@yuu2lee4
์ด๋ค ์ฌ๋๋ค์ jsx๋ฅผ ์ข์ํ๊ณ ์ด๋ค ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. UI๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? jsx์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์์ผ๋ฉฐ ๋ง์นจ๋ด ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ํ๋ฌํฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํ๋ฅญํ ์ง๋ฌธ์ ๋๋ค. JSX์ ๊ฐ์ DSX์์ ๋ชจ๋ ์์ ์ ์ํํ๊ณ ์๊ณ @Hixie ๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์งํ ์ํฉ์ ๋ํด ํฅ๋ถ๋ ์ด๋ฉ์ผ์ ๋ณด๋์์ ๊ฐ์ํ ๋ ์ง์ํ์ง ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. '๋ฌด์์ ๋์๋๋ฆด๊น์? ๋น์ ์ด ์ด๊ฒ์ ํ๋ ๊ฒ์ ๋ง๋ ๊ฒ์ ๋ฌด์์ ๋๊น?'
์์งํ, ์ด ์ ๋ชฉ์ ์ด์ ์ ๋ชฉ๊ณผ ๋น์ทํ ๋ฐฉํฅ์ผ๋ก ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค. ๋์์ด ๋์ง ์์ ๊ฒ์ ๋๋ค...
@cbazza
@Hixie๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์งํ ์ํฉ์ ๋ํด ํฅ๋ถํ ์ด๋ฉ์ผ์ ๋ณด๋์ต๋๋ค..
๊ณ์ํด์ ๋์์ ์ค ์ ์๋ ๋ค๋ฅธ ์ฌ๋๋ค๋ ์ฐธ์ฌํ๊ณ ๋์์ผ ํ์ง ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ด ๋ค๋ฅธ ์ค๋ ๋์ฒ๋ผ ๋ํ๋์ง ์๋๋ก ํ๋ ค๋ฉด... ๋ธ๋ก์ด ๋ฌด์์ธ์ง, ๋ธ๋ก์ ๋ํด ์ด๋ป๊ฒ ํด์ผ ํ๋์ง, ์ด๋ป๊ฒ ์๋ํ๊ฒ ํ๊ณ ๊ฑฐ๊ธฐ์ ๋ฐฐ์นํ๋์ง ๋
ผ์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค... ๊ทธ๋ฆฌ๊ณ ๋๋ ๋ํ flutter์ dart ํ์ด UI ์์ฑ์ ์ฅํฉํ ํน์ฑ์ ์ค์ด๋ ์์
์ ์ด๋ค ์์ผ๋ก๋ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค...
์ง๊ธ์ ํ์ด ํฉ๋ฅํ ์ ์์ ์๋ ์์ง๋ง, ๋ด๊ฐ ์๊ฐํ๋ ํฉ๋นํ ์ด์ ๋ผ๋ฉด ์ด๋ค ์ ๊ทผ ๋ฐฉ์์ด๋ ๊ด์ฐฎ์ต๋๋ค...๊ทธ๋ค์ ์ด๋ ์์ ์์ ๋ฐ๋ผ์ก์ ๊ฒ์
๋๋ค...๊ทธ๋์ @cbazza ๋ ๊ณ์ํด์ ๋ฌด์์ ํ ์ ์๋์ง ๋น์ ์ ํ๊ณ ์๊ณ ๊ทธ๊ฒ์ ๊บผ๋ด์ญ์์ค ...์ด ์ฌ๋์ด ์ด๊ธฐ์ http://mutisya.com/ ํ ๊ฒ์ฒ๋ผ ์ํ๋ฅผ ์์ง ๋ชปํ์ง๋ง ... ๋ํ @NathanaelA ๊ฐ ๊ธฐ์ฌํ๊ธฐ ๋๋ฌธ์ ๋์์ด ๋ ์ ์๋ค๋ ๊ฒ์ ์๋๋ค. Nativescript๋ฅผ ์ํ ์ ๋ง ๋๋ผ์ด ๋ฌผ๊ฑด๊ณผ ๋๊ตฌ...๋ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ๋ ๋ง์ ์ต์
์ ์ ๊ณตํ ์ ์๋๋ก ...
@MichaelSowah
์ด๊ฒ์ ๋ ๋ง์ ์๊ฐ์ ํฌ์ํ์ง ์๋ ์ด์ ๋ @NathanaelA ๊ฐ ๋งํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๋ @sethladd ์ ๋๋ค. ํจ์น์ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ํต์ฌ ํ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฅ๋ ฅ์ ์ ๋์ ์ผ๋ก ๋ฐ๋ํ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๋ถ๋ฉ๋๊น? ์ด๊ฒ์ด ๋ด๊ฐ ์ด๊ฒ์ ์๊ฐ์ ๋ณด๋ด๊ธฐ ์ ์ ๋จผ์ ์ ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค ...
์ข์, ์ฌ๊ธฐ ๋ด๊ฐ ๊ฐ์ง ๊ฒ์ด ์์ต๋๋ค.
(a) *.dsx ํ์ผ์ ๊ฐ์ ธ์ค๊ณ *.dart ํ์ผ์ ์ถ๋ ฅํ๋ ์ ์ฒ๋ฆฌ๊ธฐ.
ํ์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(1) 'VS์ฝ๋' ํตํฉ์ ๋ด๋นํ ์ฌ๋. ๋ด ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด ๊ฐ๋จํด ๋ณด์
๋๋ค.
(2) ๋๋ฒ๊น
์ด ์ ๋๋ก ์๋ํ๋๋ก ์ ์ฒ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ Flutter ๋น๋ ์์คํ
์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ผ ์ฌ๋. ๋ด ๋ง์ ์ฝ๋ ์คํ
ํ์ด ์์ค๋งต ๋ฑ๊ณผ ๊ฐ์ ๊ฒ์ ํตํด *.dsx ํ์ผ์ ์๋ค๋ ๋ป์
๋๋ค.
์์ 2๊ฐ์ง ํญ๋ชฉ์ด ์๋ฃ๋๋ฉด ๋ณผ์ ๊ตด๋ฆฌ๊ธฐ ์ํ ์ด๊ธฐ ์๋ ํฌ ์๋ ์์คํ ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. ํ ์ด์ปค?
๋ฐ๋ผ์ ์์์ ๋ณผ ์ ์๋ฏ์ด (1) ๋ฐ (2)๋ Flutter ํ์ด ๊ฑฐ๋ถํ ์ ์๋ Flutter ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ๋ฏ๋ก ์ง์/์ฝ์ ์์ด ์ด ๊ธฐ๋ฅ์ด ์ค๋จ๋ฉ๋๋ค.
@cbazza ํ๋ฅญํฉ๋๋ค. ์ฌ๊ธฐ ํ๋ฌํฐ ํ ๊ตฌ์ฑ์ ์ค ํ ๋ช ์ ๋ถ๋ฌ์ 1๊ณผ 2๋ฅผ ๋ฐ์๋ค์ผ ์ํฅ์ด ์๋์ง ์๋ ค์ฃผ๋๋ก ํฉ์๋ค...๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์งํํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ ์ฌ๋์ ๋๊ตฌ์ธ๊ฐ์...?
(2) ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ง๋ [email protected] ๋๋ ๋ฌธ์ ์ถ์ ๊ธฐ๋ฅผ ํตํด Dart ํ์ ์ฐ๋ฝํ๋ ๊ฒ์ ๋๋ค. Dart 2์ ๋ชฉํ ์ค ํ๋๋ ์ธ์ด์ ๋ํ ๋ ๋ง์ ์คํ์ ์ํ ์ธํ๋ผ๋ฅผ ๋ง๋ค๊ณ ์ปค๋ฎค๋ํฐ๊ฐ DSX์ ๊ฐ์ ์คํ์ ๋ง๋ค ์ ์๋๋ก ํ๋ ๊ฒ์ด์์ต๋๋ค. @anders-sandholm @mit-mit ๋๋ @mraleph ๊ฐ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ ์๋ ค์ค ์ ์์ต๋๋ค.
@sethladd ๋น ๋ฅธ ์๋ต์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ ๋ฆฌ์์ค ๋ด๋น์ ๋ฐ ๊ฐ๋ฅํ๋ฉด ๋ณต์ฌํ ์๋ ์์ต๋๋ค.
๋คํธ ํ๋ ์ด ์ค๋ ๋์
@cbazza ๋์ด๋ ๋ฆฌ์์ค ๋ด๋น์์ ํจ๊ป ์ด ๋ด๋ก ์ ์งํํ๊ธฐ ์ํด ๋ฐ์ด๋ค ์ ์์ต๋๊น?
'VS Code' ํตํฉ๊ณผ ๊ด๋ จํ์ฌ 2๊ฐ๋ฅผ ์ ๊ฑฐํ๋ฉด @DanTup ์ด ๋์์ ์ฃผ๋ ๋ฐ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค.
๊ทธ๋ฅ ๋ช ๊ฐ์ง ์๊ฐ
์ข์, ์ฌ๊ธฐ ๋ด๊ฐ ๊ฐ์ง ๊ฒ์ด ์์ต๋๋ค.
(a) *.dsx ํ์ผ์ ๊ฐ์ ธ์ค๊ณ *.dart ํ์ผ์ ์ถ๋ ฅํ๋ ์ ์ฒ๋ฆฌ๊ธฐ.
์ด๊ฒ์ ์๋ง๋ ์์ํ๋ ๋ฐ ํ์ํ ์ ๋ถ์ด๋ฉฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๋ค์ ๋น๋ํ๊ธฐ ์ํ ํ์ผ ๊ฐ์์์
๋๋ค. FileSystemEntity ์ฐธ์กฐ. ๋ฌธ์ ๋ ์ด .dx
๋ฌธ๋ฒ์ด dartlang์ ์์ ์งํฉ์ด๋ฏ๋ก Dart๋ ๋ชจ๋ ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. JavaScript์ ๋ฌ๋ฆฌ <
๋ฐ >
๊ฐ ๋ ๋ง์ ๊ณณ์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๊น๋ค๋ก์ธ ๊ฒ์
๋๋ค. Dart ํ์๋ ์ด๋ฏธ Dart์ sdk repo ๋ด๋ถ ์ด๋๊ฐ์ ์์ฑ๋์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ด๋์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
vscode ๋ฐ Intellij ํตํฉ์ ๊ฒฝ์ฐ ํ๋ฌํฐ ๋น๋ ์์คํ ์ด ์๋๋ผ ์ํ๋ ๋คํธ ๋ถ์๊ธฐ ์ ๋๋ค. dx๋ฅผ ์ฌ์ฉํ๊ณ dart๋ก ๋ณํํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์๋ณธ ํ์ผ์ ๋งคํํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ ์ด html ํ์ผ์ ์๋ ์์ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค.
๋น๋ ๋ฌ๋ ๋ฅผ ์ํฉ๋๋ค. ์ด๊ฒ์ a
๋ฅผ ์ํํ๊ธฐ ์ํ ํจ์ฌ ๋ ์ ๊ตํ ํจํค์ง์
๋๋ค.
@MichaelSowah
ํ๋ฅญํฉ๋๋ค. (1)๊ณผ (2)๋ฅผ ๋งก์์ ์ ๊ฐ ํธ๋์คํ์ผ๋ฌ์ ์ง์คํ ์ ์๋๋ก ํ์๊ฒ ์ต๋๊น?
@jonahwilliams
๋๋ ์ฒซ ๋ฒ์งธ ๋ฆด๋ฆฌ์ค(https://spark-heroku-dsx.herokuapp.com/index.html)์ ๋ด ๋ง์ปค๋ฅผ ํญ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ๋คํธ ๊ตฌ๋ฌธ ๋ถ์์ด ๋ณต์กํ๊ณ ์ง๊ธ ๋น์ฅ์ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ์๋๋ค.
๊ทธ๋ฌ๋ ํ ๊ฐ์ง ํ์คํ ๊ฒ์ IDE์ ๋๋ฒ๊ฑฐ๊ฐ ์ ๋๋ก ์๋ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฌ๋๋ค์ ์ ์ถฉ์์ด ๋๋ฌด ์ปค์ DSX๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ด ๋ง์ 'DSX๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ๋ณผ๋ฆญ ๋๋ฒ๊น ์ ์์ด๋ผ'๋ ๊ฒ์ด์ง ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ธ ์ ์์ ์๋๋๋ค. ์ด๊ฒ์ด ๋ด๊ฐ ์ต์ํ ํ๋์ IDE๋ฅผ ์ง์ํ๊ณ VS Code๊ฐ ํ์ด๋งํผ ๊ฐ๋จํ ์ ์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค(์ด๋ฏธ Typescript ๋ฐ Javascript ๊ตฌ๋ฌธ ์ ์ json ํ์ผ์์ JSX๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์)
re: IDE ๋ฐ ๋๋ฒ๊ฑฐ, ์๋ง๋ Dart 2 ์ธํ๋ผ ๋ฐ "๊ณตํต ํ๋ก ํธ ์๋" ๋ด๋ถ์์ ์ด ๊ธฐ๋ฅ์ ๊ตฌํํจ์ผ๋ก์จ ๋ ๋์ ์์ค์ ์คํ์ด DSX๋ฅผ ์ธ์ํ๋๋ก ํ ์ ์์ด์ผ ํฉ๋๋ค. Dart ํ๊ณผ ํ๋ ฅํ์ฌ Common Front End ๋ฐ ํด๋น API์ ๋ค์ํ ๋ถ๋ถ์ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@MichaelSowah https://github.com/flutter/flutter/issues/15922#issuecomment -376960770์์ Dart์ ์ฌ๋๋ค์ ์ฐธ์กฐํ์ต๋๋ค.
@NathanaelA ํ์ ์ง์์ด ๋ถ๋ช ํ ์์ผ๋ฏ๋ก (1) & (2)์ ์ฐธ์ฌํ๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์ญ๋๊น?
ํ์คํ์ง ์๋ค; ์ด ์๊ฐ -- ์ ๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ํ๋ก์ ํธ์ ํฉ์ธ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปดํ์ผ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํ๊ณ ์ ์ฌ์ ์ผ๋ก ์์ค ๋งต์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๊บผ์ด ์กฐ์ฌํ๊ณ ์ถ์ต๋๋ค. (ie 2) ๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ทธ๋ ๊ฒ ํ ์ ์๊ธฐ๊น์ง ๋ช ์ฃผ๊ฐ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
@NathanaelA ์๋๋ฅด๊ฑฐ๋ ํ์ง ์์ผ๋ ๊ด์ฐฎ์ต๋๋ค :-)
DSX
๊ฐ ๋จ์ํ Dart
+ Virtual closing tag
์ด๋ฉด ์ค์ง์ ์ธ ์ด์ ์ด ์์ต๋๋ค. ๋คํธ์ ํ ๊ฐ์ง ์ด์ ์ ํจ์์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ฏ์ ์ผ๋ถ๋ฅผ ๋ง๋ค๊ณ ๊ฐ๋
์ฑ์ ๋์ผ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ํ DSX์ ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด 1์ด ๋ฏธ๋ง์ ํซ ๋ฆฌ๋ก๋ ๊ธฐ๋ฅ์ ์๊ฒ ๋ฉ๋๋ค. @cbazza ?
์๋์, DSX๋ JSX์ ๊ฐ์ผ๋ฉฐ ํ์ฌ Dart ์ ์ฉ ์์ ฏ ํธ๋ฆฌ์ IDE๋ก ํ ์ ์๋ 'Dart + ๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ'์๋ ์์ ํ ๋ค๋ฆ ๋๋ค.
DSX๋ ์ฌ๊ธฐ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
DSX๋ Dart์ด๋ฏ๋ก ์ค๋ช ํ๋ Dart์ ๋ชจ๋ ์ด์ ์ด ์์ต๋๋ค. JSX์ ์ต์ํ ์ฌ๋๋ค์ ์ฆ์ ๊ทธ๊ฒ์ ์ป๊ณ ๊ทธ๊ฒ์ ์ข์ํ ๊ฒ์ ๋๋ค.
์๋์, ๋น์ ์ ์๋ฌด๊ฒ๋ ์์ง ์์ ๊ฒ์
๋๋ค, ๋น์ ์ด ๋ง๋๋ ์ผ๋ฐ *.dart ํ์ผ์ ๋ํด ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋น์ ์ ์ฌ์ ํ โโ1์ด ๋ฏธ๋ง์ ํซ ๋ฆฌ๋ก๋ฉ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ด์ *.dsx ํ์ผ์ด ์์ผ๋ฉด ๋จผ์ *.dart๋ก ๋ณํ๋๋ฉฐ ๊ทธ ํ๋ก์ธ์ค๋ ๋ด๊ฐ ๊น๋ฐํ ์ ์๋ ๊ฒ๋ณด๋ค ๋น ๋ฆ
๋๋ค!!! ๋ฐ๋ผ์ DSX ์ฌ์ฉ์์๊ฒ๋ ๋์ ๋์ง ์์ ๊ฒ์
๋๋ค.
์ด ๊ธ์ ๋ค์ ๋ซ๊ธฐ ์ ์ ๋จผ์ ํ๊ณ ์ถ์ ๋ง์ ๋ง์น๊ฒ ์ต๋๋ค.
ํ์ฌ Flutter ๋ถ๋ถ์ UI๊ฐ ๋ฌธ์ ์ด๋ฉฐ React์ ์์ด๋์ด๋ฅผ ํ๋งคํ๋ ค๋ ๊ฒ์ด ์๋๋๋ค.
Flutter์ UI ๊ตฌ์กฐ๋ ์ด๋ฌํ ๊ดํธ๋ก ๋จธ๋ฆฟ์์์ ๊ตฌํํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ ์ ์ด ์ ๋ง ํ์ํฉ๋๋ค. ๋๋ React Native ๋๋ React์ ๊ฐ์ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. React๋ ์ฌ๋๋ค์ด ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๋ฟ๋ง ์๋๋ผ ๊ฑฐ๋ํ UI ์ฝ๋๋ฅผ ์ฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ฑฐ๋ํ๊ณ ๋ณต์กํ UI ์ฝ๋๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ด๋ฆฌํ๊ณ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค. ํํธ, ํ๋ญ์ผ ๋๋ง ๊ดํธ๊ฐ ์๋ ๋๋ฌด๊ฐ ๋ง์์ ์ด๋ป๊ฒ ์ฝ์ด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@JonathanSum ๋ซ๋ ๋ ์ด๋ธ์ด ์๋ Android Studio(3.1)์ ๋ง์ง๋ง ๋ฒ์ ์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
@14n ๋ค, ๊ฐ์์ ๋ซ๋ ํ๊ทธ์ ๋๊ธ์ด ๋ณด์ ๋๋ค.
ํฐ XML๊ณผ ๊ฐ์ ์์ ฏ ํธ๋ฆฌ๋ Dart, JSON, YAML ๋๋ JSX์ ๊ฐ์ ๋ค๋ฅธ ํฐ ๊ฒ๋งํผ ์ฝ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. JSX ์์ฒด๊ฐ ๊ฐ๋ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
ํ์ฌ ๊ตฌ๋ฌธ์ผ๋ก ์ ์์ ์ธ ํฌ๊ธฐ์ ์์ ฏ ํธ๋ฆฌ๋ฅผ ์ฝ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. Plus Flutter๋ ๊ตฌ์ฑ์ ์ด์งํ๋ฏ๋ก ํน์ ์์ ฏ์ด ๋๋ฌด ์ปค์ง๋ฉด ์ฌ๋ฌ ๊ฐ์ ์์ ์์ ฏ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค.
์ ์๋ DSX ํ์์ ๋ํ ์ฃผ๊ด์ ์ธ ์๊ฒฌ:
์ฆ, UI๋ฅผ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉํ ๋ Dart๊ฐ ๋ ๋ง์ ํํ๋ ฅ์ ๋ฐํํ ์ ์๋๋ก ๊ฐ์ ์ ์ฌ์ง๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์์ ํ ์๋ก์ด DSL ๋์ ๊ธฐ์กด Dart ๊ตฌ๋ฌธ์ ๋ํ ํ์ฅ ๊ธฐ๋ฅ์ ๋ ์ ํธํฉ๋๋ค.
Flutter๋ฅผ "๋จ๊ฑฐ์ด ์ ๊ฒ"์ฒ๋ผ ๋ง๋ค๋ ค๋ ์๋๋ฅผ ์ค๋จํ์ญ์์ค. ๊ทธ๊ฒ์ ๊ทธ ์์ฒด๋ก ๋จ๊ฑฐ์ด ์๋ก์ด ๊ฒ์ ๋๋ค. ์๋ก์ด ํจ๋ฌ๋ค์์ ํ๊ตฌํ๊ฒ ํ์ญ์์ค.
@naiveaiguy ๋์ด ๊ฒ ๊ฐ์์. ๋งค์ฐ ์์ฐ์ ์ด๋ฉฐ ๋ธ๋ผ์ฐ์ ๋ฐ ์๋ฒ ์ฑ๊ณผ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
๋๋ ํ ์ฌ๋ฆ ๋์ ๊ณผ๋ ๊ด๊ณ ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋๋ ๋ด ์ผ์ ์์ํ ์ ์๋ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก Flutter์ Dart๊ฐ ํ๋ ์ผ์
๋๋ค.
์ด ๊ฑฐ์ธ์ ๋ํ ๋ด ์๊ฐ์ @pulyaevskiy๊ฐ https://github.com/flutter/flutter/issues/15922#issuecomment -377666972 ์์ ๋งํ ๊ฒ์ ๋๋ค. ์ฝ์ ์ ์๋ ๋ชจ๋ ์์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ์กด ์ฝ๋์์ ์ ๋ฆฌํ ์ ์์ผ๋ฉฐ Dart์ ์ถ๊ฐ๋ก ๊ฐ์ ํ ์ ์๋ ์ฌ์ํ ๋ณ๊ฒฝ(new/const๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ๊ณผ ์ ์ฌ)์ด ๋ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. . ์์ ํ ๋ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ์์ ํ ์๋ก์ด ๋๊ตฌ ์ฝ๋ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ ๋ค๋ฅธ ํ์ผ ์ธํธ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋์ ์ผ๋ก ์ ์ ์ด๋(FWIW, ์ ๋ JSX ์๋ React๋ ์ ํธํฉ๋๋ค)์ ๋ํ ๋์ ๋น์ฉ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ ์๋ dsx๊ฐ ์ผ๋ฐ Dart ์ฝ๋๋ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ ํ ์ ์ฉ ๊ฐ๋ฅํ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋๊ตฐ๊ฐ๊ฐ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๋ค์ ๋๋ง๋ค Gilad A DOMain of Shadows ์ ์ด ํ๋ฅญํ ๊ฒ์๋ฌผ์ด ์๊ฐ๋ฉ๋๋ค. ์ด๋ฌํ ๊ฒ๋ค์ ์ฌ๋๋ค์ด ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํญ์ ๋ ๋ณต์กํฉ๋๋ค. ์ฌ๋๋ค์ด ์ค์๊ฐ ์ค๋ฅ, ์ฝ๋ ์์ฑ, ๋ฆฌํฉํฐ๋ง, ํดํ ๋ฑ์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ๋ ๊ฒ๋งํผ ๊ฐ๋จํ์ง ์์ต๋๋ค. ์ด๋ ํฐ ์์ ์ ๋๋ค.
์๋ํ๋ ํธ๋์คํ์ผ๋ฌ๋ณด๋ค ์ฝ๊ธฐ ์ด๋ ค์ด ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์ผ๋ถ ์ฝ๋, ์ด ์ ์๋ ๊ตฌ๋ฌธ์์ ์ด๋ป๊ฒ ๋ณด์ผ์ง, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๋๊ดํธ๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๊ธฐ์กด Dart ๊ตฌ๋ฌธ. ์๋ฅผ ๋ค์ด React์์ ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ ์์์ด ๋ง์ง๋ง ๋งค๊ฐ๋ณ์๋ก varargs๋ก ์ ๋ฌ๋๋ค๋ ๊ฒ์
๋๋ค. child
๋ฐ children
๊ฐ Flutter์ ๋ง์ ๋
ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. . ์์์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์์ ฏ ํด๋์ค ์ด๋ฆ์ ๊ฐ์กฐ ํ์ํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์๋์ง ์ฌ๋ถ์ ๋ํ ํ ๋ก ๋ ์์ต๋๋ค. Extract Widget ๋ฆฌํฉํฐ๋ง์ด ๋๊ท๋ชจ ๋น๋ ๋ฉ์๋๋ฅผ ์ฝ๊ฒ ๋ถํดํ๋ ๊ณผ์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก IntelliJ์๋ ํธ๋ฆฌ์ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ Flutter Outline ๋ณด๊ธฐ๊ฐ ์๊ณ ์ ํ ํญ๋ชฉ์ด ํธ์ง๊ธฐ์ ์ปค์ ์์น์ ๋๊ธฐํ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ์ด์ ๊ฐ์ ์ผ๋ถ VS Code ๊ธฐ๋ฅ์ผ๋ก ๐ ์์ ๋กญ๊ฒ ์ฌ์ฉํ์ธ์!).
@pulyaevskiy
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ์ดํดํ์ง๋ง ์คํ์ ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ ์งํ์ ๊ธธ์
๋๋ค. DSX์ ๋ํ ๋์ ์คํ์ด ์คํจํ๋๋ผ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ค๋ฅธ ๋ง์ ๊ฒ์ ์คํํ๊ณ ์ต๊ณ ์ ์์ด๋์ด๋ฅผ ๋ชจ์ ๋๋ผ์ด ๊ธฐ์ ์ ๋ง๋ค๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@sethladd
๋ฆฌ๋ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
@anders-sandholm @mit-mit ๋๋ @mraleph ์ ๋ต๋ณ์ ๋ฃ๊ณ ์ถ์ต๋๋ค.
Dart 2 ์ธํ๋ผ ๋ฐ '๊ณตํต ํ๋ก ํธ ์๋'๋ก ์์
ํ๋ ๋ฐฉ๋ฒ.
@NathanaelA์ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@DanTup
์ด๋ฌํ ๊ฒ๋ค์ ์ฌ๋๋ค์ด ์๊ฐํ๋ ๊ฒ๋ณด๋ค ํญ์ ๋ ๋ณต์กํฉ๋๋ค. ์ฌ๋๋ค์ด ์ค์๊ฐ ์ค๋ฅ, ์ฝ๋ ์์ฑ, ๋ฆฌํฉํฐ๋ง, ํดํ ๋ฑ์ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ๋ ๊ฒ๋งํผ ๊ฐ๋จํ์ง ์์ต๋๋ค. ์ด๋ ํฐ ์์ ์ ๋๋ค.
๊ทธ๋ ์ ํ ํด. ๋ด '์ฌ์ํ๊ณ ๊ฐ๋จํ ๊ตฌํ' ์ฃผ์์ โโํธ์ง๊ธฐ๊ฐ .dsx ๊ตฌ๋ฌธ์ ์ธ์ํ๋๋ก ํ๋ ๋ฐ๋ง ์ ์ฉ๋์์ต๋๋ค. Intellij๋ฅผ ์กฐ์ฌํ ๊ฒฐ๊ณผ ์ด๋ฅผ ์ํ ์์ ํ ์ธ์ด ํ์๊ฐ ํ์ํฉ๋๋ค(๋ณต์กํจ). ๋ฐ๋ฉด VS Code๋ ๊ตฌ๋ฌธ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์ ๊ณ Typescript/Javascript ๊ตฌ๋ฌธ ํ์ผ์๋ ์ด๋ฏธ JSX์ ๋ํ ์ง์์ด ์์๊ณ DSX๋ JSX์์ ์ฝ๊ฐ ๋ณ๊ฒฝ๋จ).
์ฐ๋ฆฌ๋ ์คํ์ ์งํํ๋ ๋ฐ ๋์/์ง์๋ฅผ ์ํด ๋น์ ์ ๊ดด๋กญํ ๊ฒ์ ๋๋ค.
์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
(a) *.dsx ํ์ผ์ ๊ฐ์ ธ์ค๊ณ *.dart ํ์ผ์ ์ถ๋ ฅํ๋ ์ ์ฒ๋ฆฌ๊ธฐ.
https://spark-heroku-dsx.herokuapp.com/index.html
๋์์ด ํ์ํฉ๋๋ค:
(1) 'VS์ฝ๋' ํตํฉ์ ๋ด๋นํ ์ฌ๋.
(2) ๋๋ฒ๊น
์ด ์ ๋๋ก ์๋ํ๋๋ก ์ ์ฒ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ Flutter ๋น๋ ์์คํ
์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์์๋ผ ์ฌ๋. ๋ด ๋ง์ ์ฝ๋ ์คํ
ํ์ด ์์ค๋งต ๋ฑ๊ณผ ๊ฐ์ ๊ฒ์ ํตํด *.dsx ํ์ผ์ ์๋ค๋ ๋ป์
๋๋ค.
@NathanaelA ๊ฐ (2)๋ฅผ ๋์๋๋ฆฝ๋๋ค.
๊ทธ๋์ ์ ๋ ์ฌ์ ํ ๋์์ ์ค ์ฌ๋๋ค์ ์ฐพ๊ณ ์์ต๋๋ค (1)
ํ
์ด์ปค? @birkir @yuriy-manifold @tehfailsafe @alexkrolick @sanketsahusoft
@DanTup - ์ ๋ JSX์ ์ ๋ฌธ๊ฐ๋ ์๋์ง๋ง NativeScript XML ํ์์ ๋ํด ๋งํ ์ ์์ต๋๋ค. ๋ด๊ฐ ํ ์์๋:
StackLayout ํด๋์ค๊ฐ ์ง์ํ๋ ๋ชจ๋ ์์ฑ์ XML์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ผ๋์ผ ๊ด๊ณ์
๋๋ค. ์์ฒญ๋๊ฒ ๋ง์ ๋ถํ์ํ ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค. Flutter ๋ฐ๋ชจ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/gallery/home.dart#L39 -L63
<AnimationBuilder animation="{{animation}}">
<Stack>
<BackgroundLayer top="{{-layer.parallaxTween.evaluate(animation)}}" left=0.0 right=0.0 bottom=0.0>
<Image src="{{layer.assetName}}" package="{{layer.assetPackage}} fit="cover" height="{{maxHeight}"}/>
</BackgroundLayer>
</Stack>
</AnimationBuilder>
์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณํํ๋ฉด ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. :์์์ด ๋์น๋:
@NathanaelA map
๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ณด๋ค ๋์ ์ธ ์์
์ ์ํํด์ผ ํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ฉ๋๊น? ๋ค์์ ๋์ผํ ํ์ผ์ ์ผ๋ถ ์ฝ๋์
๋๋ค.
Widget build(BuildContext context) {
return new AnimatedBuilder(
animation: animation,
builder: (BuildContext context, Widget child) {
return new Stack(
children: _kBackgroundLayers.map((_BackgroundLayer layer) {
return new Positioned(
top: -layer.parallaxTween.evaluate(animation),
left: 0.0,
right: 0.0,
bottom: 0.0,
child: new Image.asset(
layer.assetName,
package: layer.assetPackage,
fit: BoxFit.cover,
height: _kFlexibleSpaceMaxHeight
)
);
}).toList()
);
}
);
}
์ด ๊ตฌ๋ฌธ์์ children: _kBackgroundLayers.map(...)
๋ ์ด๋ป๊ฒ ์๊ฒผ์ต๋๊น?
JSX/DSX๋ ํ๊ทธ ๋ณํ๋ง ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํฉ๋๋ค.
์
๋ ฅ:
<A property="a"/>
๋ฐ:
new A(property: a)
์ ๋ ฅ:
<A property="a">
<B/>
<C/>
</A>
๋ฐ:
new A(property: a,
children: <Widget>[
new B(),
new C()
])
{}๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์ ํ๊ฐ ๋ฐ ์ต๋ช ํจ์ ๋ฑ๊ณผ ๊ฐ์ ์ ํจํ Dart ์ฝ๋๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค. {}๋ 3๊ณณ์ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ์๋ ์์๋ 2๊ณณ(ํ๊ทธ ์์ฑ ๋ฐ ์์)์์ ์ฌ์ฉ๋ {}๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ธ ๋ฒ์งธ๋ ์คํ๋ ๋ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
Widget build(BuildContext context) {
return <AnimatedBuilder
animation={animation}
builder={(BuildContext context, Widget child) {
return <Stack> {
_kBackgroundLayers.map((_BackgroundLayer layer) {
return <Positioned
top={-layer.parallaxTween.evaluate(animation)}
left={0.0}
right={0.0}
bottom={0.0}>
<Image.asset [layer.assetName]
package={layer.assetPackage}
fit={BoxFit.cover}
height={_kFlexibleSpaceMaxHeight}
/>
</Positioned>;
}).toList()
} </Stack>;
}}
/>;
}
์์ ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ฃ๊ณ VS Code/Intellij๋ก ํ์ธํ์ธ์. XML ๋ ธ๋๋ฅผ ์ด๊ณ ์ถ์ํ์ฌ ํธ๋ฆฌ๋ฅผ ๋ ์๊ฒ/๋ ํฌ๊ฒ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ +/-(์ค ์ผ์ชฝ)์ ์ฃผ๋ชฉํ์ญ์์ค.
์ ์ฐ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ์ธ์ ํ๊ณ React Native ๋ฐฉ์์ ์ฑํํ ์ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ๊ฒ์ธ๊ฐ, ๋ง ๊ฒ์ธ๊ฐ?
@JonathanSum ์ฌ๊ธฐ๋ก ์๋ด๋์ด ์ฃ์กํ์ง๋ง ๋น์ ์ ๋๊ตฌ๋ผ๊ณ ์๊ฐํ์ญ๋๊น? ๋น์ ์ด ์ข์ํ์ง ์๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ์์ต๋๋ค.
Flutter๋ก ๋จ์ผ ์ฑ์ ์์ฑํด ๋ณด์
จ๋์?
Dart์ XML์ ํผํฉํ ์์ ์๋ Dart๋ณด๋ค ํจ์ฌ ๋๋น ๋ณด์
๋๋ค. ์ฌ๊ธฐ์ ์ป์ ์ ์๋ ๊ฒ์ ์์ต๋๋ค.
์ ๋ xaml์ ์ฌ์ฉํ๋ Xamarin Forms์์ ์์ผ๋ฉฐ ์ ๋ง ์ข์ํ์ต๋๋ค. ํ์ง๋ง Flutter๊ฐ Xaml์ ์ง์ํ์ง ์๋ ์ด์ ์ ๋ํด ๋ถํํ๋ ๋์ ๋ฐ๋ก ์ฌ์ฉํ์ฌ ์ ์ํ๊ณ ๋ฐฐ์ฐ๊ธฐ ์์ํ์ต๋๋ค.
React์์์ฒ๋ผ ์ผํ๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋์ ์ง์ฆ๋๊ฒ ํ๋ ๋์ Reactive๋ฅผ ์ฌ์ฉํ์ธ์.
๋ค์์ ์์ ๋์ผํ ์ฝ๋ ๋ธ๋ก์ด์ง๋ง ์์ํ Dart์์ ๊น์ ์ค์ฒฉ์ ํผํ๊ธฐ ์ํด ๋ฆฌํฉํ ๋ง๋์์ต๋๋ค.
์๋ ์ค๋ํซ์ ์ด๋ค ๋ถ๋ถ์ด ์ฝ๊ธฐ ๋ฐ/๋๋ ์ดํดํ๊ธฐ ์ด๋ ค์ด์ง ๊ถ๊ธํ์ญ๋๊น?
Widget build(BuildContext context) =>
AnimatedBuilder(animation: animation, builder: _buildChild);
_buildChild(BuildContext context, Widget child) {
return Stack(
children: _kBackgroundLayers.map((_BackgroundLayer layer) {
final image = Image.asset(layer.assetName,
package: layer.assetPackage,
fit: BoxFit.cover,
height: _kFlexibleSpaceMaxHeight);
return Positioned(
top: -layer.parallaxTween.evaluate(animation),
left: 0.0,
right: 0.0,
bottom: 0.0,
child: image);
}).toList(),
);
}
์ฌ์ค, ๊ฐ์ธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ด๊ฒ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
Widget build(BuildContext context) => AnimatedBuilder(
animation: animation,
builder: _buildChild,
);
_buildChild(BuildContext context, Widget child) {
return Stack(
children: _kBackgroundLayers.map(_imageForLayer).toList(),
);
}
_imageForLayer(_BackgroundLayer layer) {
final top = -layer.parallaxTween.evaluate(animation);
final image = Image.asset(
layer.assetName,
package: layer.assetPackage,
fit: BoxFit.cover,
height: _kFlexibleSpaceMaxHeight,
);
return PositionedImage(top: top, image: image);
}
class PositionedImage extends StatelessWidget {
PositionedImage({this.top, this.image});
final double top;
final Image image;
<strong i="10">@override</strong>
Widget build(BuildContext context) =>
Positioned(top: top, left: 0.0, right: 0.0, bottom: 0.0, child: image);
}
๋ค์ ๋งํ์ง๋ง ์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ํผํฉ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
JSX๋ฅผ ๊ตฌํํ๋ฉด ๊ฐ๋ ์ฑ์ด ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋ ์ฌ๋๋ค์ด ์์ต๋๊น? ์ฝ๋์ ๊น๊ฒ ์ค์ฒฉ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฌ์ ํ โโ๊ฐ๋ฅํ๋ฉฐ ๊ฐ๋ฐ์๋ ๋ด๊ฐ ๋ฐฉ๊ธ Dart ๋ฒ์ ์์ ์ํํ ๊ฒ๊ณผ ๋์ผํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ์ฝ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์คํ ์ถ๊ฐ๋๋ ๊ฒ์ ์์ค ๋งต๊ณผ ๊ณต๋์ผ๋ก ์ถ๊ฐ ๋น๋/ํธ๋์คํ์ผ ๋จ๊ณ์ IDE ๋ฐ Dart SDK(๋ถ์๊ธฐ, ๋๋ฒ๊ฑฐ ๋ฑ)์์ ์ด ์ธํ๋ผ๋ฅผ ์ง์ํ๊ธฐ ์ํ ๋ง์ ์์ ์ ๋๋ค.
@JonathanSum @escamoteur ์ฐ๋ฆฌ๋ ์ด ํ๋ก์ ํธ์ ๋ํด ๊ณต๊ฒฉ์ ์ผ๋ก ๋งํ์ง ์์ต๋๋ค. ํ๋ ฅ ๊ด๊ณ๋ฅผ ์ ์งํ์ญ์์ค. ๊ฐ์ฌ ํด์. ์ต๊ทผ ํ ๋ก ์ ์น์ ํ๊ณ ์์ฐ์ ์ด์์ต๋๋ค. ํ ๋ก ์ ์ฐธ์ฌํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ ๋ฐ์ ์ผ๋ก, DSX๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๊ธฐ ๋จ๊ณ์์ Flutter ์์ฝ์์คํ ์ ์กฐ๊ฐํํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๊ตฌ๋ฌธ ๋ชจ๋ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ์ ์งํ๊ธฐ ์ํด ๋ง์ ์์ ์ด ์ํ๋๊ณ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ ํฌ๊ฒ ๋์์ด ๋์ง ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ ๋๋ค. ์๋ก์ด ๊ฒ๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ ๋ฐ/๋๋ ํจ๋ฌ๋ค์์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์์ ํ ํ๋ก์ ํธ์ ๋๋ฆฝ๋๋ค.
@Hixie ํ๋ฅผ ๋ด์ ๋ฏธ์ํ์ง๋ง Flutter๋ ์๋ ๊ทธ๋๋ก ์ข์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์๊ณ Flutter ๊ฐ๋ฐ์๋ ์ด๋ฐ ์๊ตฌ ์์ด๋ ์ถฉ๋ถํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@escmoteur - ๊ทธ๊ฒ์ด ๋ด๊ฐ "์ปค๋ฎค๋ํฐ" ๋ ธ๋ ฅ์ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ธฐ๊บผ์ด ํจ์น๋ฅผ ์๋ฝํ๋ ๊ฒ ์ด์์ผ๋ก ํ๋ฌํฐ ์ฝ์ด ํ์ ํฌํจํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค... ์ด๋ Seth๊ฐ ์ฐ๋ฆฌ๊ฐ ๊ณ์ํ ์ ์๋ค๊ณ ๋งํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ์๋ค๋ฉด; ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉํ์ง ๋ง์ธ์... :์์ผ๋ฉด์:
@escamoteur , ๋ด๊ฐ ๋งํ ๋ฐฉ์์ ๋ํด ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํฉ๋๋ค.
ํํ ๋ฆฌ์ผ์์ ๋ช ๊ฐ์ง ํ๋ฌํฐ ์ฑ์ ๋ง๋ค์์ต๋๋ค. ๋ด๊ฐ flutter์ ๋ํด ๋๋ผ๋ ๊ฒ์ ๋ชจ๋ ๊ฒ์ด ์์ ฏ์ด ์๋๋ผ ๊ฐ์ฒด๋ผ๋ ๊ฒ๋ฟ์
๋๋ค. ๊ทธ๊ฒ์ ๋ง์น ๋ณต์กํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋์ ๊ฑฐ๋ํ ์กฐ๊ฐ์ด ๋ฌด์ง์ํ๊ฒ ๋ถ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฝ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ์ง์ฅ์ฒ๋ผ ๋ณต์กํ์ง ์์์ผํ๋ ํ๋ ์ ์ํฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ React-Native ๋น๋ ๋ฐฉ์์ด ์ธ๊ฐ์ด ์์ฐ์ค๋ฝ๊ฒ ๋น๋ํ๋ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ฉด์ flutter๋ stateful ์์ ฏ์ stateless์ ์ฐ๊ฒฐํด์ผ ํ๊ณ ... ๊ฒ๋ค๊ฐ ์ฐ๋ฆฌ๊ฐ ์์ฆ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ UI ํ๋ ์์ํฌ๋ ์ด React ๋ฐฉ์์ ํ์ค์ผ๋ก ํ๊ณ ์๊ณ , flutter๋ ์ด๊ฒ์ ๋ ์ง์คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํซ ๋ฆฌ๋ก๋ ๋์ (์ ํด๋์ค๋ฅผ ์๋ก ์ถ๊ฐํ๋ ค๊ณ ํ ๋ ์ฝ์์ ํซ ๋ฆฌ๋ก๋ ๋์ ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ํ๋ผ๊ณ ์๋ ค์ค๋๋ค). ๋๋ ์ด๊ฒ์ด ์๊ฒฌ์ด๋ ์๊ตฌ๊ฐ ์๋๋ผ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ด๋ฒ ๊ฐ์ด๊ฐ ๋งํ๋ค.
Flutter๋ฅผ "๋จ๊ฑฐ์ด ์ ๊ฒ"์ฒ๋ผ ๋ง๋ค๋ ค๋ ์๋๋ฅผ ์ค๋จํ์ญ์์ค. ๊ทธ๊ฒ์ ๊ทธ ์์ฒด๋ก ๋จ๊ฑฐ์ด ์๋ก์ด ๊ฒ์ ๋๋ค. ์๋ก์ด ํจ๋ฌ๋ค์์ ํ๊ตฌํ๊ฒ ํ์ญ์์ค.
๋น์ ์ ๊ทธ๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
https://facebook.github.io/react-native/
React์์ ์๊ฐํ๊ธฐ:
https://reactjs.org/docs/design-principles.html
์ค๋ฃฉ ๊ฑฐ๋ฆฌ๋ค:
https://flutter.io/tutorials/animation/
React-Native๋ฅผ ๋ณด๋ฉด ์์ ์ํ ๊ด๋ฆฌ์ ์๋์ UI ๋ถ๋ถ๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์์ ์ด๋ฉฐ ์ธ๊ฐ์ ์์ฐ์ค๋ฌ์ด ํ๋์ ๋๋ค. ์ด๊ฒ์ด ํ์ต ๊ณก์ ๊ณผ ๊ด๋ฆฌ ์๊ฐ์ด ์งง์ ์ด์ ์ ๋๋ค. ๋ฐ๋ผ์ XML์ด๋ Xamarin์ React Native์ ๋น๊ตํ์ง ๋ง์ญ์์ค. ๊ฒ๋ค๊ฐ ํผํฐ๋ ํผ๋๊ณผ ๋ฌด์ง์์๋ ๊ฐ๋ค. stateless๋ stateful์ ์ฐ๊ฒฐํ๊ณ create-state๋ stateless์ ๋ชจ๋ ๊ฒ์ ์ฐ๊ฒฐํฉ๋๋ค. React-Native๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐํ๋ก ์๋ฆ๋ค์ด ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ณ ์์ต๋๋ค. ํ๋ญ์ด๋ ๊ฒ์ ์ข ์ด์ ๋ฌผ์ ๋จ์ด๋จ๋ฆฌ๊ณ ๋ฌผ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์์ง ํ๋ฌํฐ์ ์ด๊ธฐ ๋จ๊ณ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. React-Native๋ ๋๋ฆ์ ์ฒ ํ๊ณผ ๋ชฉํ๊ฐ ์๊ณ , flutter๋ ๊ทธ๋ฅ ์ง์งํ ํ๋ก์ ํธ์ด๊ฑฐ๋, ์๋๋ฉด ๋ชจ๋๊ฐ ์ ์๊ฒ ๋์ํ์ง ์์ต๋๋ค.
@JonathanSum
ํํ ๋ฆฌ์ผ์์ ๋ช ๊ฐ์ง ํ๋ฌํฐ ์ฑ์ ๋ง๋ค์์ต๋๋ค. ๋ด๊ฐ flutter์ ๋ํด ๋๋ผ๋ ๊ฒ์ ๋ชจ๋ ๊ฒ์ด ์์ ฏ์ด ์๋๋ผ ๊ฐ์ฒด๋ผ๋ ๊ฒ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ง์น ๋ณต์กํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋์ ๊ฑฐ๋ํ ์กฐ๊ฐ์ด ๋ฌด์ง์ํ๊ฒ ๋ถ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋น์ ์ ์ด ๋ฌธ์ ์ ๋ํ ๋น์ ์ ์ฃผ๊ด์ ์ธ ๋๋์ด ํ์ฐ์ ์ผ๋ก ์ผ๊ธฐํ ์์ฒญ๋ ์์ ๋ถ์ด์ ์ ๋นํํ ์ด์ ๋ฅผ ์ ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ์ด ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ์ค ์ด๋ ๋๊ตฌ๋ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๊ฐ๊ด์ ์ผ๋ก ๋ ๋์ ์ฌ๋์ด ์์ ๋, ์ ๋ ๊ทธ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐ ํ์ง ์์ผ๋ฉฐ, Flutter๊ฐ ์ํ๊ณ๋ก์ ์ง๊ธ ํ์ฌ ๋จ๊ณ์ ์์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฝ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ์ง์ฅ์ฒ๋ผ ๋ณต์กํ์ง ์์์ผํ๋ ํ๋ ์ ์ํฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๋์ด๋ฐ๋ณต์ ๋๋ค. ๋ถ๋ช ํ ๋ชจ๋ ์ฌ๋์ด ์ด๊ฒ์ ์ํ์ง๋ง ์ฌ๋๋ค์ ๋ฌธ์ ์ ์ ๊ทผํ๋ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค. Flutter์ ํจ๋ฌ๋ค์์ด ๊ทธ ์ค ํ๋์ ๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ React-Native ๋น๋ ๋ฐฉ์์ด ์ธ๊ฐ์ด ์์ฐ์ค๋ฝ๊ฒ ๋น๋ํ๋ ๋ฐฉ์์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ๋๋ค.
UI ๊ตฌ์ถ์ ์ํ ๊ตฌ๋ฌธ๋งํผ ์ฌ์ํ ๊ฒ์ด ํ๋ ์์ํฌ๊ฐ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ ๋์ ์ํฅ์ ๋ฏธ์น๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ฐ๋ฉด์, Flutter๋ Stateful ์์ ฏ์ Stateless์ ์ฐ๊ฒฐํด์ผ ํ๊ณ ...
Flutter๊ฐ ์ฑ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋์ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ์ค์ ๋ก ์ ํจํ ์ง์ ์ด ์๋๋๋ค. ๋น์ ์ ๋น์ ์ด ์๋ชป๋์๋ค๊ณ ๋๋ผ๋ ๊ฒ์ ํํํ๋ ๊ฒ์ด ์๋๋ผ "์ํ ๋น์ ์ฅ ์์ ฏ๊ณผ ์ํ ์ ์ฅ ์์ ฏ ์ฌ์ด์ ์ฐ๊ฒฐ์ด ์๋ชป๋์๋ค๊ณ ์๊ฐํ๊ณ ๋ชจํธํ ๋ฐฉ์์ผ๋ก ๋ณต์กํ๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ค๋ช ์ ์งํํ์ง ์์ ๊ฒ์ ๋๋ค."๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค.
๊ฒ๋ค๊ฐ ์ฐ๋ฆฌ๊ฐ ์์ฆ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ UI ํ๋ ์์ํฌ๋ ์ด React ๋ฐฉ์์ ํ์ค์ผ๋ก ์ผ๊ณ ์์ต๋๋ค.
๋ ผ์ ๊ด๊ณ ๋์ค.
๊ทธ๋ฆฌ๊ณ flutter๋ hot reload๋ณด๋ค ์ด๊ฒ์ ๋ ์ง์คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(์ ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ ๋ ์ฝ์์ hot reload ๋์ ๋ชจ๋ ๊ฒ์ ๋ค์ ์์ํ๋ผ๊ณ ์๋ ค์ค๋๋ค)
์, ํซ ๋ฆฌ๋ก๋๋ Flutter๊ฐ ์ํํ ๋ฐฉ์์ผ๋ก ๋ฌ์ฑํ๊ธฐ๊ฐ ๊ทธ๋ฆฌ ์ฌ์ด ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๋ Flutter๊ฐ ์ฝ๋ ๋ณ๊ฒฝ์ 30-40%์์๋ ๋ฌ์ฑํ ์ ์์๋ ๊ฐ๋ฐ ์ฃผ๊ธฐ๊ฐ ์ ๋ง ์ธ์์ ์ด๋ฉฐ ํธ๋์คํ์ผ ๋ ์ด์ด์ ์ํด์๋ง ๋๋ ค์ง ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฌ๋ ํผํฐ๋ ํผ๋๊ณผ ๋ฌด์ง์์ ๊ฐ์ต๋๋ค.
์ฌ๊ธฐ์์ Flutter์ ์ ๊ทผ ๋ฐฉ์์ด ๋ง์์ ๋ค์ง ์๋๋ค๋ ์ ์ ๋ถ๋ช ํ ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ์ฒ๋ผ UI ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ๋ฉด Flutter๊ฐ "ํผ๋๊ณผ ๋ฌด์ง์"๊ฐ ๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ค๋ฉด Flutter๊ฐ ์์ ํ๋ ๊ฒ๊ณผ ๋์ผํ ์ข ๋ฅ์ ์ค์ ๋ฐ ์ ์ฝ ์กฐ๊ฑด์์ ์๋ํ๋ค๋ ๋ช ํํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์ต ๊ณก์ ๊ณผ ๊ด๋ฆฌ ์๊ฐ์ด ์งง์ต๋๋ค. XML์ด๋ Xamarin์ React Native์ ๋น๊ตํ์ง ๋ง์ญ์์ค.
์ถฉ๋ถํ ๊ณต์ ํฉ๋๋ค - ๊ทธ๋ฐ ๋ค์ React Native๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๊ณณ์ ๊ฐ๋ฐ์๋ค์ ์์ ์ ํจ๋ฌ๋ค์์ผ๋ก ํ๋ฅญํ ์ผ์ ํ๊ณ ์์ต๋๋ค.
stateless๋ stateless์ ์ฐ๊ฒฐํ๊ณ stateless์์ ์ํ๋ฅผ ์์ฑํฉ๋๋ค.
๋ญ๋ผ๊ณ ์? ์๋์. ์ด๊ฒ์ ๋ช ๋ฐฑํ ์๋ชป๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๋น์ ์ ์์ ์ ๋ฌด์์ ๋๊น?
React-Native๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐํ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ณ ์์ต๋๋ค. ํ๋ญ์ด๋ ๊ฒ์ ์ข ์ด์ ๋ฌผ๋ฐฉ์ธ์ด ๋จ์ด์ ธ ๋ฌผ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์์งํ ๋งํด์, ์ด ๋น์ ๋ ๋์๊ฒ ๊ฑฐ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋๋ ๋ฐ๋ ์๊ฒฌ์ ์ฝ๊ฒ ๋งํ ์ ์์๊ณ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์์ํ ๊ณณ์ผ๋ก ๋ฐ๋ก ๋์๊ฐ ๊ฒ์ ๋๋ค.
๋น์ ์ด ์ด๋ ๊ฒ ํ๋ํ๋ ๊ฒ์ ์๋ช ํ ์ผ์ด๋ฉฐ("์ง๋ฉดํด ๋ด ์๋ค") Flutter ํ์ด ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ๋ํด ์ฐ๋ฆฌ๋ ํ์ธ๋ฅผ ๋ถ๋ฆฌ๊ฑฐ๋ ์ฐธ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋น์ ์ ์ง์งํ๊ฒ ๋ฐ์๋ค์ด๊ธฐ๋ฅผ ๋ฐ๋๋ค๋ฉด ์ด๊ฒ์ ์ข์ ํ๋๊ฐ ์๋๋๋ค.
์ถ๊ฐ ์ฌํญ: ์ด๊ฒ์ด Flutter ํต์ฌ ํ์ ์ฐธ์ฌ๋ ์์ ์์ด ํ์ฌ ๊ฐ๋ฐ์๊ฐ ํ ์ ์๋ ์ผ์ด๋ผ๊ณ ๊ฐ์ฅํ์ง ๋ง์ญ์์ค. Flutter ํ์ ์ด๋ฌํ ๊ธฐ๋ฅ์ด Flutter์ ์กฐํ๋ก์ด ๋ถ๋ถ์ผ๋ก ๋ง์กฑ์ค๋ฝ๊ฒ ๊ตฌํ๋๋ ค๋ฉด IDE ๋ฐ ํธ์ง๊ธฐ ํ๋ฌ๊ทธ์ธ, ์ ๋, GitHub ๋ฌธ์ ์ฒ๋ฆฌ์ ๋ํด ๋ง์ ์ถ๊ฐ ์์ ์ ์ํํด์ผ ํฉ๋๋ค.
@naiveaiguy
์๊ฒ ์ต๋๋ค. ๋น์ ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๊ณผ React๋ฅผ ์ข์ํ๋ ์ฌ๋์ ๋น๊ตํ๋ ์์์ ์ฌ๋์ผ ๋ฟ์
๋๋ค. Flutter์๋ ๊ณ ์ ํ ๋ฐฉ์์ด ์๊ณ React์๋ ๊ณ ์ ํ ๋ฐฉ์์ด ์์ต๋๋ค. ๋ด ํ๋์ ๋ํด ๋ฏธ์ํ๊ณ , ๋๋ ์ฐฉํ์ง ์์๋ค.
@JonathanSum Flutter ์ฑ์ด ์ด๋ป๊ฒ ๊ตฌ์ถ๋์๋์ง ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ์๊ฐ์ด ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ณต์ ํ๊ฒ ๋งํ๋ฉด ์ํคํ ์ฒ, ์์๋ ์์ ฏ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๋ฐ ๋ทฐ ๋ชจ๋ธ์ ์์ ฏ์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๊ฐ ๋ง์ง ์์ต๋๋ค.
๋ด๊ฐ ์๊ณ ์ถ์ ๊ฒ์ ์ Flutter์ ์ ํ ๊ด์ฌ์ด ์์ต๋๊น? ๋์๊ฒ React๋ JS ๋๋ฌธ์ ๊ฐ ์ ์์ต๋๋ค.
๋๊ธ์ ๋๋ฌด ๋ง์ด, ๋๋ฌด ์ ์ ์๊ฐ, ์๋ง๋ ์ง์คํด์ผ ํ ๊ฒ์ ๋๋ค...
@escamoteur ์ ํํ ๋ฌด์์ ์๋ฏธํฉ๋๊น?
๋์๊ฒ React๋ JS ๋๋ฌธ์ ๊ฐ ์ ์์ต๋๋ค.
ES6/7 ๋๋ Typescript๋ Dart/Kotlin/Swift์ ๋งค์ฐ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ ์ด ์ฌ์ฑ๋ค๊ณผ ํจ๊ป ์ฆ๊ฒ๊ฒ ์ถค์ ์ถ ๊ฒ์ ๋๋ค :)
Flutter์ ๋งค๋ฃ๋ ๊ฒ์ ๊ทธ๋ํฝ ๋ฐ ์ ๋๋ฉ์ด์
์ง์์
๋๋ค. 60fps์ ์ด๊ณ ์ UX๋ฅผ ์ํด OpenGL ์์ ๊ตฌ์ถ๋ Direct Skia Vector ๊ทธ๋ํฝ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
https://uimovement.com/
์ ๋ ๋ง์ถคํ UX์ ๋น ์ ธ ์๊ณ Flutter๊ฐ ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ ๋ ์์ญ ๋
๋์ UX๋ฅผ ๊ตฌํํด ์์ผ๋ฉฐ ์ ์ธ์ /๋ฐ์์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๊ฒ์ ์ ๋ง ์ข์ํฉ๋๋ค. Flutter๋ ์ด๋ฅผ ์ง์ํฉ๋๋ค.
@pulyaevskiy
๋ค์ ๋งํ์ง๋ง ์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ํผํฉ๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
- Dart ๊ตฌ๋ฌธ์ ์ซ์ดํ๊ณ XML/JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ด ํ์ํจ
- Flutter ์ฝ๋์ ๊ฐ๋ ์ฑ.
๋ง์ต๋๋ค. ์ด ํฐ์ผ(๊ทธ๋ฆฌ๊ณ ์ด์ ํฐ์ผ)์ JSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํฉ๋๋ค. ํ์ฌ UI ๋น๋ ์ฝ๋์ ์ฅํฉํจ์ ์ค์ด๊ธฐ ์ํ Dart ์ธ์ด ๊ฐ์ ์ ์ํ ๋ค๋ฅธ ํฐ์ผ์ด ์์ต๋๋ค.
JSX๋ฅผ ๊ตฌํํ๋ฉด ๊ฐ๋ ์ฑ์ด ํด๊ฒฐ๋ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋ ์ฌ๋๋ค์ด ์์ต๋๊น?
๊ทธ๋ค์๊ฒ๋ ๊ฐ์์ ๊ฒ์ด ๋ ์ ์์ต๋๋ค.
์, ์ ๊ณตํ ์์ ๋ ๋๋ฌด๋ฅผ ๋ ์๊ฒ ๋ง๋ค์ง๋ง ์กฐ๊ฐ์ผ๋ก ๋๋๊ณ ์กฐ๊ฐ์ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ด๋ํ๋ฉด ์ฝ๋์์ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ๊ฐ ํจ์ฌ ๋ ์ด๋ ค์์ง๋๋ค. ์ฐจ๋ผ๋ฆฌ ์์ ํ ๊ตฌ์กฐ๋ฅผ ํ ๊ณณ์ ์ ์งํ๊ณ ํธ๋ฆฌ์์ ์ผ๋ถ ๊ด๋ จ ์์ฑ(๋งค๊ฐ๋ณ์๋ก ๋ช ๋ช ๋)์ ๊ฐ์ ธ์ค๊ณ DSX์ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฅ ๋ด ์ทจํฅ์ ๋๋ค.
๊ทธ๋ฌ๋ ํ์คํ ์ถ๊ฐ๋๋ ๊ฒ์ ์์ค ๋งต๊ณผ ๊ณต๋์ผ๋ก ์ถ๊ฐ ๋น๋/ํธ๋์คํ์ผ ๋จ๊ณ์ IDE ๋ฐ Dart SDK(๋ถ์๊ธฐ, ๋๋ฒ๊ฑฐ ๋ฑ)์์ ์ด ์ธํ๋ผ๋ฅผ ์ง์ํ๊ธฐ ์ํ ๋ง์ ์์ ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ฒ๋ฆฌํ๊ณ ์์ผ๋ฉฐ @sethladd ๋ I believe one of the goals of Dart 2 was to create an infrastructure for more experimentation with the language and let the community create experiments like DSX.
@naiveaiguy
์ ๋ Flutter๊ฐ ์ฝ๋ ๋ณ๊ฒฝ์ 30-40%์์๋ ๋ฌ์ฑํ ์ ์์๋ ๊ฐ๋ฐ ์ฃผ๊ธฐ๊ฐ ์ ๋ง ์ธ์์ ์ด๋ฉฐ ํธ๋์คํ์ผ ๋ ์ด์ด์ ์ํด์๋ง ๋๋ ค์ง ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅํ๊ณ ์ถ์ต๋๋ค.
์, ํญ์ ์๋ํ์ง๋ ์์ง๋ง ํซ ๋ก๋ฉ์ ์ ๋ง ์ฆ๊น๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ์คํ ๋ฐ์๋ค์ผ ๊ฒ์ด์ง๋ง ๊ทธ๊ฒ์ ๋ฆ์ถ๋ ํธ๋์คํ์ผ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๊ทผ๊ฑฐ๊ฐ ์์ต๋๋ค. DSX๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๊ฐ์ ์๋ฌด ๊ฒ๋ ์ถ๊ฐํ์ง ์์ต๋๋ค. DSX๋ฅผ ์ฌ์ฉํ๋ฉด ํธ๋์คํ์ผ๋ฌ๊ฐ ๋๋ฌด ๋นจ๋ผ์ ์์์ฐจ๋ฆฌ์ง ๋ชปํ ์๋ ์์ต๋๋ค.
์ถ๊ฐ ์ฌํญ: ์ด๊ฒ์ด Flutter ํต์ฌ ํ์ ์ฐธ์ฌ๋ ์์ ์์ด ํ์ฌ ๊ฐ๋ฐ์๊ฐ ํ ์ ์๋ ์ผ์ด๋ผ๊ณ ๊ฐ์ฅํ์ง ๋ง์ญ์์ค. Flutter ํ์ ์ด๋ฌํ ๊ธฐ๋ฅ์ด Flutter์ ์กฐํ๋ก์ด ๋ถ๋ถ์ผ๋ก ๋ง์กฑ์ค๋ฝ๊ฒ ๊ตฌํ๋๋ ค๋ฉด IDE ๋ฐ ํธ์ง๊ธฐ ํ๋ฌ๊ทธ์ธ, ์ ๋, GitHub ๋ฌธ์ ์ฒ๋ฆฌ์ ๋ํด ๋ง์ ์ถ๊ฐ ์์ ์ ์ํํด์ผ ํฉ๋๋ค.
์ค๋ง. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ๊ณ ์์ผ๋ฉฐ ์ฐจ๋จ๋์ง ์๊ธฐ๋ฅผ ์์ฒญํ ๋ฟ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ฐ๋ฆฌ๋ฅผ ๊ฐ๋ฅด์น ์ง์นจ์ ์์ฒญํฉ๋๋ค. ๋๋ ์ด ๋ชจ๋ ๊ฒ์ ํผ์ ํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ์ด์ ์ฐ๋ฆฌ ์ค 2๋ช ์ด ์๊ณ (@NathanaelA์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค) ๋์์ ์ํ์๋ฉด ๋ ๋ง์ ์ฌ๋๋ค(์ต์ 1๋ช ์ด์)์ ์ฐพ๊ณ ์์ต๋๋ค.
์๋ ํ์ธ์! ์ฐ์ , ์ด ๋ฌธ์ ์ ๋ํด ์๋ค๋ก ๋ ผ์๋ฅผ ๊ณ์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์ ํ ๊ตฌ์กฐ๋ก ์ธํด ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ๋ฐ๋ฅด๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ๊ทํ์ ์ฃผ์ฅ์ ์์ค๋๊ณ ๊ณ์ํด์ ๋ค์ ํด์๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์์ํ ์ซ์๋ก ์ค์ด์:
๋ค์์ผ๋ก, @sethladd ์ ์ง์ ์ ๋ช ํํ ํ๊ณ ์ถ์ต๋๋ค. _"Dart 2์ ๋ชฉํ ์ค ํ๋ ๋ Dart ํ์ ์ํ ์ธ์ด๋ก ๋ ๋ง์ ์คํ์ ์ํ ์ธํ๋ผ๋ฅผ ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค. "_.
Dart 2์์๋ Dart SDK(๋๋ Flutter ์์ง ์ํฐํฉํธ)๋ฅผ ๋ค์ ๋น๋ํ์ง ์๊ณ ๋ Dart ์ธ์ด์ ๊ตฌ๋ฌธ์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ API๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. Dart 2๊ฐ ์ ๊ณตํ๋ ๊ฒ์ _๊ณตํต ํ๋ฐํธ ์๋_(CFE) ์ธํ๋ผ(Dart SDK ์์ค์ pkg/front_end
์ ์์)์
๋๋ค. ์ด๊ฒ์ Dart๋ก ์์ฑ๋ Dart ์ธ์ด์ฉ ํ์์
๋๋ค. DSX์ ๊ฐ์ ์์ํ ๊ตฌ๋ฌธ ์คํ ์ธ์ด ๋ณ๊ฒฝ์ ๊ฒฝ์ฐ CFE ์ฝ๋๋ฅผ ํธ์งํ๊ณ Dart SDK(๋๋ Flutter ์์ง)๋ฅผ ๋น๋ํ๊ณ ๋ชจ๋ ๋๊ตฌ(๊ฐ IDE ํ๋ฌ๊ทธ์ธ์ ๋น๋๋ ๊ตฌ๋ฌธ ๊ฐ์กฐ ์ฝ๋ ์ ์ธ)๊ฐ ์ ๊ตฌ๋ฌธ ํ์ฅ์ ์ ํํ๋๋ก ํ ์ ์์ด์ผ ํฉ๋๋ค. ํ์ฌ VM๊ณผ dart2js๋ง ์ค์ ๋ก CFE๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ถ์๊ธฐ๋ ๋ค์์ ์ ํ๋ ์์ ์
๋๋ค. ๋ณด์๋ค์ํผ ์ฌ๊ธฐ์ ์ง์
์ฅ๋ฒฝ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์กฐํด์ผ ํ ์ค์ํ ์ ์ Dart ๊ตฌ๋ฌธ์ ํ์ฅํ๋ API๊ฐ ์๊ธฐ ๋๋ฌธ์ Dart ์ธ์ด ํ๊ณผ ํ๋ ฅํ์ฌ ์ธ์ด๋ฅผ ํ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ฌ ์ด์ ๋ํ ๊ณต์ํ๋ ํ๋ก์ธ์ค๋ ์์ง๋ง DSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ Dart์ ํฌํจ๋๊ธฐ ์ํด์๋ ๋ง์ ์ฆ๊ฑฐ์ ๋๊ธฐ๊ฐ ํ์ํฉ๋๋ค. (/fyi @leafpetersen @lrhn - ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด์ฃผ์ธ์)
๋ค์์ DSX์ ๊ฐ์ ์๋ฃจ์ ์ ์ง์งํ๋ ์ฌ๋๋ค์๊ฒ ๊ถ์ฅํ๋ ์ฌํญ์ ๋๋ค.
์ฐ์ ์ค์ ๋ก ์ ์์๋ฅผ ์๋ฉด์ผ๋ก ์์ฑํ๊ณ ๋น์ ํ ํ ๋ก ์ด ๊ฐ๋ฅํ ๊ณณ์ผ๋ก ํ ๋ก ์ ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ์ธ์ด ๋ณ๊ฒฝ์ ์ ์ํ ๋ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๊ฒ๊ณผ ์ ์๋ ๊ตฌ๋ฌธ ํ์ฅ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ _elaborate_ ์ค๋ช ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์๋ ๋ณ๊ฒฝ์ ๋น์ฉ๊ณผ ์ด์ ์ ํ๊ฐํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ๋น์ ํ ํ ๋ก ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ฐธ๊ณ ๋ก, ์์ ์์ค์์ Dart ์ธ์ด ์ฌ์๊ณผ ๋น๊ตํ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด _๊ณต์ ์ฌ์_์ ์ ์ํด์ผ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. ๋์ ์ ์๋ ๋ณ๊ฒฝ์ด ์ด๋ป๊ฒ ์๋ํ๊ณ ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง์ ๋ํ ๊ด๋ฒ์ํ ์๊ฐ ํ์ํฉ๋๋ค.
@mraleph Dart๋ก์ ํตํฉ์ ๋ํ ์ฃผ์ฅ์ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ ์ฝ๋ ์์ฑ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ ํธ์ถํ๊ธฐ ์ํ ํํฌ์ ๊ดํ ๊ฒ์ด์์ต๋๋ค.
๋๋ ๊ทธ๋ฐ ๊ฒ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ํ ๋ชจ๋ฅธ๋ค.
HTML ๋์ DSX๋ง ์ฌ์ฉํ๋ Analyzer ํ๋ฌ๊ทธ์ธ์ด ์๋ Angular์ฒ๋ผ ๋๋ถ๋ถ ๊ตฌํ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@mraleph
์ค๋ช
ํด์ฃผ์
์ ๋๋จํ ๊ฐ์ฌํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก Dart ์ธ์ด๋ฅผ ์์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ์คํ์ ์ธ DSX๋ฅผ Dart๋ก ๋ณํํ๊ธฐ ์ํ ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์
๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ ๋ค์์์ ์จ๋ผ์ธ์ผ๋ก ์๋ํ ์ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
๋ฌธ์ ๋ Dart๊ฐ ์ฒ์ ๋์์ ๋ Javascript๋ก ๋ณํํ ์ ์์๊ณ ์์ค ๋งต์ ์ฌ์ฉํ์ฌ Javascript ์ํ๊ณ์ ์ฐ๊ฒฐํ ์ ์์์ต๋๋ค(์ฌ๋ฌ ๋ค๋ฅธ ์ธ์ด๋ ๋ง์ฐฌ๊ฐ์ง์์ต๋๋ค: Coffeescript, Typescript ๋ฑ). ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์๋ ๊ฒ์ Dart/Flutter์ ๋ํด ์ด์ ์ ์ฌํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ชจ๋ ํธ๋์คํ์ผ ์ธ์ด๊ฐ Dart/Flutter ์์ ๊ตฌ์ถ๋ ์ ์๋๋ก ํ๋ ์ผ๋ฐ์ ์ธ ์ฌ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฐพ๊ณ ์์ต๋๋ค.
ํฌํ์ ๊ด๋ จํ์ฌ ์ด์ ํฐ์ผ์๋ ๋ค์๊ณผ ๊ฐ์ ์ซ์๊ฐ ์์ต๋๋ค.
https://github.com/flutter/flutter/issues/11609
@cbazza
์ฐ๋ฆฌ๋ ์ค์ ๋ก Dart ์ธ์ด๋ฅผ ์์ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ์คํ์ ์ธ DSX๋ฅผ Dart๋ก ๋ณํํ๊ธฐ ์ํ ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋๋ค.
*.dsx
ํ์ผ์ด ์ค์ ๋ก๋ ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๋ Dart ํ์ผ์ด๋ผ๋ ๊ด์ ์์ ์ด์ผ๊ธฐํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋งํ๋ฏ์ด ํ์ฌ ์ด๋ฌํ ๊ตฌ๋ฌธ ํ์ฅ์ด Dart ์ํ๊ณ์ ๋ชจ๋ ๋๊ตฌ์ ํฌ๋ช
ํ๊ฒ ์ํธ ์ด์ฉ๋๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ๊ตฌ๋ฌธ ํ์ฅ์ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ API ๋๋ ํ์ฅ ์ง์ ์ด ์์ต๋๋ค. ๋ํ ์ด๋ฌํ API ๋๋ ํ์ฅ ์ง์ ์ ์ค๊ณํ๊ณ ์ ๊ณตํ ์ฆ๊ฐ์ ์ธ ๊ณํ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ฌ๋ก์๋ Dart SDK๋ฅผ ํฌํฌํ๊ณ CFE์ DSX ์ง์์ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋ํ ๋จ์ํ ์ผ์ด์ค๋ณด๋ค๋ ๋ชจ์๋ฆฌ ์ผ์ด์ค์ ๋ํด ์๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฅผ ๋ค์ด DSX ํ์ผ์ ํธ์งํ๋ค๊ณ ์์ํด๋ณด์ญ์์ค. ์ด ๊ฒฝ์ฐ ์์ฑ์ ์ด๋ฆ ๋ฐ ์์ฑ ์ด๋ฆ๊ณผ ๊ฐ์ด ๋ฐ์ฏค ์์ฑ๋ ์ฝ๋์์ ์ค์๊ฐ ์์ฑ์ ๋ณด๊ณ ์ถ์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ์์ค ๋งคํ์์๋ ์ด๋ป๊ฒ ์๋ํ ๊น์? ๊ทธ๋ฐ ๊ฒ๋ค์ด ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ตฌ์ฑํฉ๋๋ค.
@mraleph ๋ค์ ํ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ฐ๋ฆฌ๋ ํ์คํ DSX ์ฌ์ฉ์์๊ฒ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ์ผ๊ณ ์์ต๋๋ค.
XML๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ข์ํ๋ ์ฌ๋๋ ์๊ณ ์ซ์ดํ๋ ์ฌ๋๋ ์์ต๋๋ค. jsx์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ฌด ๊ณผ๋ํฉ๋๋ค. Flutter์ ๋ํ ๋์ ์ฃผ์ ๊ด์ฌ์ฌ๋ ๊ฐ๋
์ฑ์
๋๋ค.IMHO, Dart ๋ฐ Flutter์ ํ์ฌ ๊ตฌ๋ฌธ์ ๊ฐ์ ํ ์ฌ์ง๊ฐ ์ฌ์ ํ ์์ต๋๋ค(์ ์๊ฒ๋ ์ฃผ๋ก ๊น์ ์ค์ฒฉ ๊ดํธ, child
, children
, ์ธ๋ฏธ์ฝ๋ก ๋
ธ์ด์ฆ ๋ฑ)
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์์ ์ฝ๋[1]๋ฅผ ๋ค์ ๊ฒ์ํฉ๋๋ค.
// Comparing Flutter to what it might look like in Kotlin
class TutorialHome : StatelessWidget {
override
fun build(context: BuildContext) = scaffold {
appBar = appBar {
leading = iconButton {
iconImage = Icon(Icons.menu)
tooltip = "Navigation menu"
onPressed = null
}
titleText = "Example title"
actions = [ // based on https://twitter.com/abreslav/status/867714627060322305
iconButton {
iconImage = Icon(Icons.search)
tooltip = "Search"
onPressed = null
}
]
}
body = center {
// Remember: This is a fully functional programming environment. You can execute any
// code you can think of.
child = Text("Hello ${MyApp.users.me.fullName.split(" ").first}!")
}
floatingActionButton = fab {
tooltip = "Add"
childImage = Icon(Icons.add)
onPressed = null
}
}
}
new
๋ฐ ์ธ๋ฏธ์ฝ๋ก ์ต์
์ด ์๋ Dart 2 ๋ฒ์ (@sethladd์ ์ฝ๋)[2],
class TutorialHome extends StatelessWidget {
<strong i="13">@override</strong>
Widget build(BuildContext context) => Scaffold(// implicit new!, also matching your Kotlin here
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.menu)
tooltip: 'Navigation menu'
onPressed: null
)
title: Text('Example title')
actions: [ // Dart + strong mode will infer the contents of the list
IconButton(
icon: Icon(Icons.search)
tooltip: 'Search'
onPressed: null
)
]
)
// body is the majority of the screen.
body: Center(
child: Text('Hello, world!')
)
floatingActionButton: FloatingActionButton(
tooltip: 'Add' // used by assistive technologies
child: Icon(Icons.add)
onPressed: null
)
)
}
IMO, kotlin ๋ฒ์ ์ ๊นจ๋ํ๊ณ ๋ ์ข์ ๋ณด์ ๋๋ค.Dart 2 ๋ฒ์ ์ ๋งค์ฐ ๊ฐ๊น๊ณ ์ฌ์ ํ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ต๋๋ค(Dart๊ฐ ํ์ฅ ๋ฐฉ๋ฒ์ ์ง์ํ๋ค๋ฉด?). ๋ฐ๋ผ์ ์์ธํ ๋ด์ฉ์ ์ค์ด๊ธฐ ์ํด Dart ๊ตฌ๋ฌธ์ ๊ฐ์ ํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
[1] https://gist.github.com/asarazan/b3c23bef49cf9a61f5a1a19de746f1b0
[2] https://gist.github.com/sethladd/7397a067deb43b6052032195fcb26d94
๋ค๋ฅธ ๊ฐ๋์์๋ JSX์ ์์ฑ ๊ธฐ๋ฅ์ด ๋ง์์ ๋ญ๋๋ค.
๊ตฌ์ฑ ์์(์์ ฏ)๋ก ์์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ๊ณ ์ก์ธ์ค ๊ฐ๋ฅํฉ๋๋ค. ํธ์ง๊ธฐ์์ ํธ๋ฆฌ๋ฅผ ์์๋๋ก ์ด๋ํ๋ ๊ฒ์ ํค๋ณด๋ ๋จ์ถํค(Alt+UP / Alt+DOWN)์ ๋ฌธ์ ์ ๋๋ค. ์ด๊ฒ์ ์ปจํ ์ด๋, ํ, ์ด ๋ฑ์ ์ํ์ผ๋ก ๋ฌผ๊ฑด์ ์ด๋ํ ๋ ํนํ ๊ทธ๋ ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ DSX๊ฐ ์์ฒด์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์์ ฏ ์์ฒด๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์๋ํ๋ ค๋ฉด ์์ฑ ์ด๋ฆ ์ง์ ์ด ๋ ์ ํ๋ฉ๋๋ค. React์์ ์ด๊ฒ์ children
๋ผ๋ ์์ฑ์ด๋ฉฐ JSX์ ์ฃผ์ ์ฃผ์ฒด์
๋๋ค. Flutter๋ ์์ ์ด๋ฆ ์ง์ ์ ์ ์ฐ์ฑ์ ํ์ฉํฉ๋๋ค(child, children, body ๋ฑ).
๋ค์์ ์ฐฌ๋ฐ ์๋ก ์ ๋ํ ํ๋ฅญํ ํ ๋ก ์ ๋๋ค. https://github.com/jsforum/jsforum/issues/1
๋คํธ | DSX |
---|---|
์ถ์ฒ: https://github.com/flutter/flutter/blob/master/examples/platform_view/lib/main.dart
DSX ์ํ์ด ๋งค๋ ฅ์ ์ผ๋ก ๋ณด์ธ๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ํ์ง๋ง Dart Code์ ํผํฉํ๋ ์ฆ์ ๋๋ ค์์ง๋๋ค. ์๋ฅผ ๋ค์ด ๋น๋ ์์ ฏ์ ์ฌ์ฉํ ๋ ์ ๋ง ๋ณด๊ธฐ ํํ๊ฒ ๋ณด์ผ ๊ฒ์ ๋๋ค.
@birkir DSX๋ ์ฌ๋ฌ/๋น children
์์ ์ฌ๋กฏ์ ๋ํ ๋ ๋๋ง ์ํ ํจํด๊ณผ ๊ฐ์ ๊ฒ์ ์ง์ํ ์ ์์ด์ผ ํฉ๋๋ค. ํจ์๋ ํด๋์ค ์ฐธ์กฐ๋ฅผ ์ํ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ฉด(์๋ง๋ ์๋์ผ๋ก) ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํฉ๋๋ค.
๋๊ตฌ ๊ตฌํ์ด ์งํ๋๋ ํ Javascript ๋๊ตฌ๋ ์ค๋ซ๋์ ๋นํ์ค ๊ตฌ๋ฌธ ๋ฐ ์ธ์ด ํ์ฅ(Flowtype/Typescript/Babel)์ ์ง์ํ๊ธฐ ๋๋ฌธ์ JSX์ฉ ๋๊ตฌ๋ ๊ธฐ์กด ๋ณํ๊ธฐ๋ฅผ ๋ง์ด ํ์ฉํ์ต๋๋ค. Afaik Dart๋ ๊ทธ๋ฌํ ์์ค์ ๋จํธํ๋ฅผ ๊ฒฝํํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๊ฐ ์์ง ์กด์ฌํ์ง ์์ต๋๋ค. ํ์ง๋ง ์ง๊ธ์ด ๊ตฌ์ถ์ ์์ํ๊ธฐ์ ์ข์ ์๊ธฐ์ ๋๋ค ๐
IMHO, json๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ~xml๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค!
container {
padding: EdgeInsets.symmetric { vertical: 16.0 }
}
@jaychang0917
JSX๋ XML๊ณผ ๋น๊ตํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ JSX์ XML์ด ์ด์์ ํญ๊ณต๊ธฐ ๋ ํ๋กํ ๋ฌ ํญ๊ณต๊ธฐ๋ผ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
JSX๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
<supersonicAircarft
aircarft={{"F-22"}}
speed={{"mach2"}}
style={{"you can style it whatever you want as simple as css"}}
/>
๋๋
<Image
source={{uri: 'https://i.chzbgr.com/full/7345954048/h7E2C65F9/'}}
style={{width: 320, height:180}}
/>
JSX๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ด ๋ชจ๋ ๊ฒ์ ์กฐ๊ฐ์ผ๋ก ๋๋ ์๋ ์๊ณ UI์ ๋ง์ ๋ถ๋ถ์ ํ๋์ <> ํ๊ทธ๋ก ๊ทธ๋ฃนํํ์ฌ ์ํ๋ ์์น์ ์ด ๋ง์ ๋ถ๋ถ์ ๋ฃ์ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ด React๊ฐ HTML๊ณผ XML์ ๋์ฒดํ๊ณ iPhone ์ฑ์ด๋ ์น ์ฑ์ ๊ตฌ์ถํ๊ธฐ ์ํด JSX๋ฅผ ์ฑํํ๋ ์ด์ ์ ๋๋ค. ๋๋ ์ฌ๋๋ค์ JSX๊ฐ HTML์ ๋ ๋ฉ์ง ๋ฒ์ ์ผ ๋ฟ์ด๋ผ๊ณ ๋งํฉ๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ iPhone ๋ ๋ฐ์คํฌํ์ ์ฑ๋ฅ์ ๊ดํ ๊ฒ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ค์ํ ๊ฒ์ iPhone ๋ ๋ฐ์คํฌํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด:
import React, { Component } from 'react';
import { Image, ScrollView, Text } from 'react-native';
class AwkwardScrollingImageWithText extends Component {
render() {
return (
<ScrollView>
<Image
source={{uri: 'https://i.chzbgr.com/full/7345954048/h7E2C65F9/'}}
style={{width: 320, height:180}}
/>
<Text>
JSX is the philosophy, everything is a component. Simple is Complicate because you can
form everything to your own perfect shape.
</Text>
</ScrollView>
);
}
}
๋๋ ์ฐ๊ธฐ
< AwkwardScrollingImage/>
๋ชจ๋ ๊ณณ์์ ํ ๋ฒ๋ง ์ฐ๊ธฐ ์ํด
import { AwkwardScrollingImage } from './your-native-code';
class SomethingFast extends Component {
render() {
return (
<View>
<AwkwardScrollingImage/>
<Text>
JSX is the philosophy, everything is a component. Simple is Complicate because you can form everything to your own perfect shape. Everything is a widget or component.
</Text>
</View>
);
}
}
~Flutter๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ~
์ฐธ์กฐ:
์ค๋ฃฉ ๊ฑฐ๋ฆฌ๋ค:
https://flutter.io/tutorials/layout/
Android, Iphone, ์ฌ์ง์ด ๋ฐ์คํฌํ๊น์ง ๋น๋ํ๋ React Native:
https://facebook.github.io/react-native/
@birkir
์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค์ค ๋ผ๋ ์๊ณ ๊ณ ๊ธฐ๋ง ์์ด์ :)
https://builderx.io/ ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค๊ณ ์์ํด ๋ณด์ธ์(๋ ๋ฒ์งธ ์ ๋๋ฉ์ด์
์ด๋ฏธ์ง๋ฅผ ์ดํด๋ณด์ธ์ - Flex์ ๊ฐ์ ์๋ฐฉํฅ UI ๊ตฌ์ถ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ).
@escamoteur
์ธ๋ผ์ธ ๋น๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋ฐฉ์์ฒ๋ผ ์ง์ ๋ถํด ๋ณด์ผ ๊ฒ์
๋๋ค. ์ํ์ ์์ ์ ๊ณต๋์์ต๋๋ค.
https://github.com/flutter/flutter/issues/15922#issuecomment -377780062
์ด์จ๋ ํ์ฌ์ ๋ฐฉ์์ ๋ช
ํํ๊ณ ์ผ๊ด์ฑ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. dart ํ์ผ ์ ์ผ๋ถ dart ์ฝ๋์ <
ํ๊ทธ๋ฅผ ํผํฉํ๋ฉด ์ฝ๋๊ฐ ์ด์ํ๊ณ ๋ช
ํํ์ง ์๋ค๋ ๋๋์ด ๋ญ๋๋ค. ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์
์ฅ์์๋ ๋ ์ด์์ xml ํ์ผ์ ์๋ฐ/์ฝํ๋ฆฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. :)
๊ทธ๋ฅ ๋ด 2 ์ผํธ
@JonathanSum ์...
๊ทธ๋ ๋ค๋ฉด ํ์ฌ์ ํ๋ฌํฐ ๋ฐฉ์์ผ๋ก๋ ํ ์ ์๋ JSX๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ด์ ์ด ์์ต๋๊น? ๋๋ ๋น์ ์ด ๋งํ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ ๋ณผ ์ ์์ต๋๋ค.
JSX๋ XML๊ณผ ๋ค๋ฆ ๋๋ค. JSX๋ XML๋ณด๋ค ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํฉ๋๋ค.
Btw, ํ์ด์ค ๋ถ ํ์ด ๋์๊ฒ ๊ฑฐ์ง๋ง์ํ์ง ์๋๋ค๋ฉด JSX๋ xml๊ณผ ๊ฐ์ต๋๋ค . :)
@jaychang0917
JSX๋ XML๋ณด๋ค ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ๊ธฐ ๋๋ฌธ์ JSX๋ XML์ด ์๋๋๋ค. (์ ๋ JSX๊ฐ XML๊ณผ ๊ฐ์ง ์๋ค๊ณ ๋งํฉ๋๋ค)
๊ฐ๋ ฅํ ์ฃผ์ฅ์ด ์๋ค๊ณ ํ์๋ฉด ์ ๊ฐ ์ง๋ฌธ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ์๊ธฐ๋ ์ฌ๊ธฐ์ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฌ๋๋ค์ด JSX๋ DSX๋ฅผ ์ํ๋ฉด ๋ฏธ๋์ ๋น์ทํ ๊ฒ์ด ์์ ๊ฒ์
๋๋ค.
This specification does not attempt to comply with any XML or HTML specification. JSX is designed as an ECMAScript feature and the similarity to XML is only for familiarity.
๋๋ XML์ ์ค์ ๋ซ๋ ํ๊ทธ๋ฅผ ๊ทธ๋ฆฌ์ํฉ๋๋ค. :)
์์ด๋์ด: ์๋ ์์ฑ๋ ๋ซ๋ ํ๊ทธ
Kotlin๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ ๊ฒ์ ๋๋ค. Kotlin-react ์ Anko ๊ฐ ์ผ๋ง๋ ๋ฉ์ง์ง ๋ณด์ธ์.
Kotlin-react๋ ๊ทธ๋ ๊ฒ ๊ต์ฅํ์ง ์์ต๋๋ค. KSX๊ฐ ๋ ์ข์์ ๊ฒ์ ๋๋ค :)
import React from 'react';
export function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
package hello
import react.*
import react.dom.*
fun RBuilder.hello(name: String) {
h1 {
+"Hello, $name"
}
}
package hello
import react.*
import react.dom.*
fun RBuilder.hello(name: String) {
<h1>Hello, {name}</h1>
}
ํ๊ทธ๋ ๊ฑฐ๊ธฐ์ ์ํ์ง ์์ต๋๋ค. :)
JSX/DSX/KSX ์บ ํ์ ์๊ธฐ ๋๋ฌธ์ ํ๊ทธ๊ฐ ์ฝ๋ ๋ด๋ถ์ ์ํ๋ค๊ณ ํ์ ํฉ๋๋ค. :)
@saied89
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ HTML์ฒ๋ผ ๋ค๋ฅธ ์์ ์์ ์์๋ฅผ ์ค์ฒฉํ์๊ฒ ์ต๋๊น? ์๋๋ฉด "children", "child", ๋๋ [ ]๋ผ๋ ๋จ์ด๋ฅผ ์
๋ ฅํ์๊ฒ ์ต๋๊น? ๋ํ JSX๋ ํ๊ทธ ํ๋๋ง ์
๋ ฅํ์ฌ ์๋ฐฑ ๊ฐ์ UI ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ง๋ ๋ค๋ฅธ ์ธก๋ฉด์ dart format
๊ฐ ์ํํ๋ ๊ธฐ๋ณธ ํ์์
๋๋ค. IMHO ํนํ ์ฃผ๋์ ์ธ ์์ด์ ํจ๊ป ์ฝ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค: /children.
๋ค์๊ณผ ๊ฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์กฐํ๋ ์์์ ์ ๋ง ์ ํธํฉ๋๋ค.
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text("WeatherDemo")),
resizeToAvoidBottomPadding: false,
body:
new Column(children: <Widget>
[
new Padding(
padding: const EdgeInsets.all(16.0),
child:
new TextField(
key: AppKeys.textField,
autocorrect: false,
controller: _controller,
decoration: new InputDecoration(hintText: "Filter cities",),
style: TextStyle(fontSize: 20.0,),
onChanged: ModelProvider.of(context).textChangedCommand,
),
),
new Expanded(
child:
new RxLoader<List<WeatherEntry>>(
key: AppKeys.loadingSpinner,
radius: 25.0,
commandResults: ModelProvider.of(context).updateWeatherCommand,
dataBuilder: (context, data) => new WeatherListView(data ,key: AppKeys.weatherList),
),
),
new Padding(
padding: const EdgeInsets.all(8.0),
child:
new Row(children: <Widget>
[
new Expanded(
child:
// This might be solved with a Streambuilder to but it should show `WidgetSelector`
new WidgetSelector(
buildEvents: ModelProvider.of(context).updateWeatherCommand.canExecute, //We access our ViewModel through the inherited Widget
onTrue: new RaisedButton(
key: AppKeys.updateButtonEnabled,
child: new Text("Update"),
onPressed: ModelProvider.of(context).updateWeatherCommand,
),
onFalse: new RaisedButton(
key: AppKeys.updateButtonDisabled,
child: new Text("Please Wait"),
onPressed: null,
),
),
),
new StateFullSwitch(
state: true,
onChanged: ModelProvider.of(context).switchChangedCommand,
)
],
),
),
],
),
);
}
์ด๊ฒ์ ์ด์์ ์ธ ์๋ฃจ์
์ ์๋์ง๋ง ๋ฐฉํฅ์ ์ ์ํด์ผ ํฉ๋๋ค.
@sethladd ๊ทธ ๋ฐฉํฅ์ผ๋ก ๋ญ๊ฐ๋ฅผ ํ ๊ธฐํ๊ฐ ์์ต๋๊น?
์ฐ์ , ๋๋ ์ด๊ฒ์ด ๊ทธ๊ฒ์ ์๋งค ๋ฌธ์ ์ธ ๋ฏธ์: ๋งํผ ๋จ๊ฑฐ์์ง๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๊ธฐ์๊ฒ ์๊ฐํฉ๋๋ค.
2๊ฐ์ง ๊ตฌ๋ฌธ ์ค ํ๋๋ฅผ ์ ํํ๋ผ๋ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ Dart ์ชฝ์ ํํ๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฌ์ค์ ๊ทผ๊ฑฐํฉ๋๋ค.
new/const
๋ณ๊ฒฝ ์ฌํญ์ ์ฐธ์กฐํ์ญ์์ค.๊ทธ ์ธ์๋ ์ฌ์ค Kotlin๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค. ํนํ ํด๋น ๊ตฌ๋ฌธ์ด ์ผ๋ถ Kotlin ๊ธฐ๋ฅ์ Dart: innocent: ๋ก ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ.
@์ ๋ง๋ผ๋ฉ๋ผ ,
์ด๊ฒ์ด ๋ฐ๋ก ๋น์ ์ด ๋ถ๋ฅด๋ ๋๋ก ์ปจํ ์คํธ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ ธ๋ จํ React ๊ฐ๋ฐ์์๊ฒ ๋ฌธ์ํ์ญ์์ค. ๋ํ ์ด ๊ตฌ๋ฌธ ๋ถ๋ฆฌ๋ ์ค์ ๋ก ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฌด์์ด ์ ์ธ์ ์ด๊ณ ๋ฌด์์ด ํ์์ธ์ง ์ฝ๊ฒ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ์ด ์๋ค๋ ๊ฒ์ด ํ์ฌ/๊ฐ๋ฐ์/๋ฌด์์ด๋ Flutter๋ฅผ ๋ฌด์ํ๋ ์ด์ ๊ฐ ๋์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ถํํ๋ ๊ทธ๊ฒ์ ๋ง์ React ๊ฐ๋ฐ์๋ค์๊ฒ ํด๋น๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ Dart ์ ๋ฐ์ดํธ๋ก๋ถํฐ ํํ์ ๋ฐ์ ๊ฒ์ ๋๋ค.
DSX๋ Dart์ ์์ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ Dart ์ ๋ฐ์ดํธ์ ์ด์ ๋ ์ป์ง ๋ชปํฉ๋๋ค.
๋๋ ์ ํ ์์ ์ฑ์ ๋งค์ฐ ์ค์ํ๊ฒ ์๊ฐํฉ๋๋ค. JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ด ์ ํ ์์ ํ ์ ์๋ค๋ ๋ง์ ์๋์ง๋ง ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๋ ธ๋ ฅ์ด ์์ต์ ๋ผ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
DSX๋ Dart ์์ ์๋ ์์ฃผ ์์ syntatic sugar layer์ด๊ธฐ ๋๋ฌธ์ DSX์์ ์ ํ ์์ ์ฑ์ ๋ฌ์ฑํ๋ ค๋ ๋
ธ๋ ฅ์ 0์
๋๋ค. ๋ฐ๋ผ์ Dart ์ ์ด๋ฌธ ๋ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ Dart ์ ํ ์์คํ
์ ์ฌ์ฉํฉ๋๋ค.
https://github.com/flutter/flutter/issues/15922#issuecomment -377780062
์ ๋ ฅํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค @cbazza !
์ด๊ฒ์ด ๋ฐ๋ก ๋น์ ์ด ๋ถ๋ฅด๋ ๋๋ก ์ปจํ ์คํธ ์ ํ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ ธ๋ จํ React ๊ฐ๋ฐ์์๊ฒ ๋ฌธ์ํ์ญ์์ค.
์ ๋ ๋ ธ๋ จํ React ๊ฐ๋ฐ์๊ฐ ์๋๋ฏ๋ก ์ ์๊ฒ๋ ์ปจํ ์คํธ ์ค์์น์ ๋๋ค. Android์์์ ๋ง์ฐฌ๊ฐ์ง๋ก Java/Kotlin์์ XML๋ก ์ด๋ํด์ผ ํ์ง๋ง ์ ํ๊ฐ ๋ ํฝ๋๋ค. ํ๋์ ์ธ์ด, ๋์ผํ ๋๊ตฌ, ์ ์ ์ค๋ฒํค๋.
๋ํ ์ด ๊ตฌ๋ฌธ ๋ถ๋ฆฌ๋ ์ค์ ๋ก ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฌด์์ด ์ ์ธ์ ์ด๊ณ ๋ฌด์์ด ํ์์ธ์ง ์ฝ๊ฒ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ง๊ธ์ ๋ฐฉ์์ ๋ด ์๊ฒฌ์ผ๋ก๋ ๋งค์ฐ ์ ์ธ์ ์ ๋๋ค.
DSX๋ Dart์ ์์ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ Dart ์ ๋ฐ์ดํธ์ ์ด์ ๋ ์ป์ง ๋ชปํฉ๋๋ค.
DSX๋ Dart ์์ ์๋ ์์ฃผ ์์ syntatic sugar layer์ด๊ธฐ ๋๋ฌธ์ DSX์์ ์ ํ ์์ ์ฑ์ ๋ฌ์ฑํ๋ ค๋ ๋ ธ๋ ฅ์ 0์ ๋๋ค. ๋ฐ๋ผ์ Dart ์ ์ด๋ฌธ ๋ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ Dart ์ ํ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค.
๊ณต์ ํ ํฌ์ธํธ. ๊ทธ๋ฌ๋ DSX๋ ์ฌ์ ํ ์ ์ง ๊ด๋ฆฌํ๊ณ ๊ฐ์ ํด์ผ ํ ์ฌํญ์ด๋ฉฐ, ์ด๋ ์ํ๊ณ์ ๋ค๋ฅธ ๋ ์ค์ํ๊ฑฐ๋ ๋ถ์กฑํ ์ธก๋ฉด์ ์ง์ค๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋ ธ๋ ฅ์ ์๋ฏธํฉ๋๋ค.
๋ด๊ฐ ๋์ํ์ง ์๋ ํ ๋ก ์ ๋ํ ๋ ๋ค๋ฅธ ์ธก๋ฉด์ React์์ ์ง์์ ์ธ ๋น๊ต์ ๋๋ค. ๋๋ ๊ทธ ๊ด๋ จ์ฑ์ ์ดํดํ์ง๋ง Flutter๊ฐ JS ๋ธ๋ฆฌ์ง ์์ด React์ ์ฌ๋ณธ์ด ๋๊ณ ๊ตฌ์ฑ ์์ ์ด๋ฆ์ ์์ ฏ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋๊ฐ๋ค๋ฉด ์ ๋ฐ๊พธ๋์? ๊ทธ๋ ๋ค๊ณ ํด์ Flutter๊ฐ React์์ ์ต๋ํ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์ผ ํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. Flutter๋ ๊ณ ์ ํ ์ ์ฒด์ฑ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ ๋ Flutter๊ฐ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๋ฌธํ๊ฐ ์ฌํ ๋์์ด ์๋๋ผ ์ฌ์ ์๋ฐฉ์ ์ธ ๊ฒ์ ์ ํธํฉ๋๋ค. React๋ ๊ฐ์ด๋๋ผ์ธ์ด ์๋ ๋์กฐ์ ์ผ๋ก๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์๋ ํ, DSX/JSX๊ฐ ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ Flutter์์ ๊ฐ๋ฐํ์ง ์๊ธฐ๋ก ํ ๊ฐ๋ฐ์๊ฐ ์๋ค๋ฉด ๊ทธ ์ฌ๋์ Flutter์ ์ ํ ์ฐธ์ฌํ๊ณ ์ถ์ง ์์์ต๋๋ค.
๋ด๊ฐ ๋์ํ์ง ์๋ ํ ๋ก ์ ๋ํ ๋ ๋ค๋ฅธ ์ธก๋ฉด์ React์์ ์ง์์ ์ธ ๋น๊ต์ ๋๋ค. ๋๋ ๊ทธ ๊ด๋ จ์ฑ์ ์ดํดํ์ง๋ง Flutter๊ฐ JS ๋ธ๋ฆฌ์ง ์์ด React์ ์ฌ๋ณธ์ด ๋๊ณ ๊ตฌ์ฑ ์์ ์ด๋ฆ์ ์์ ฏ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋๊ฐ๋ค๋ฉด ์ ๋ฐ๊พธ๋์?
React๋ Flutter๊ฐ ์ฑ์ธ ์ ์๋ ๊ณต๋ฐฑ์ด ์๊ณ React์ ๋จ์ ์ Dart ์ฑ๋ฅ ๋ฐ GPU ๊ฐ์ ๊ทธ๋ํฝ์ผ๋ก ์์ ํ๋ฉด์ ์น์ํจ๊ณผ ํจ๊ป React์ ๊ฐ์ฅ ์ข์ ๋ถ๋ถ์ ์ ์งํ๊ธฐ ๋๋ฌธ์ React๋ณด๋ค ๋ ๋์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด๊ฐ ์๋ ํ, DSX/JSX๊ฐ ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ Flutter์์ ๊ฐ๋ฐํ์ง ์๊ธฐ๋ก ํ ๊ฐ๋ฐ์๊ฐ ์๋ค๋ฉด ๊ทธ ์ฌ๋์ Flutter์ ์ ํ ์ฐธ์ฌํ๊ณ ์ถ์ง ์์์ต๋๋ค.
์ค์ํ์ง ์์ต๋๋ค. ์ต์ข ๊ฒฐ๊ณผ๋ ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์๊ฐ Flutter์ ํฉ๋ฅํ์ง ์์ผ๋ฉด ์์ฅ์์ ์คํจํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ Flutter๋ ์์กด์ ์ํด React Native ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ผ ํ์๊ฐ ์์ต๋๋ค.
์งํ๋ก ์ด๋ผ๊ณ ํ๋ฉด '์ ์์์กด'์ด ์๋๋ผ '์ ์์์กด'์ด๋ค. ์ ์ํ์ง ์์ผ๋ฉด ์ฃฝ๋๋ค.
@cbazza
์ค์ํ์ง ์์ต๋๋ค. ์ต์ข ๊ฒฐ๊ณผ๋ ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์๊ฐ Flutter์ ํฉ๋ฅํ์ง ์์ผ๋ฉด ์์ฅ์์ ์คํจํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ญ๋ผ๊ณ ์? ์ ํ์ํ ๊น์? Flutter๋ ๋ฒ ํ์ ์๋ ๋์ ์์ฒด ํ์ ์์ฅ์ ํ์ฑํ ์ ์์ผ๋ฉฐ(๋งค์ฐ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์๊ธฐ ๋๋ฌธ์), ํ๋ฉด์ ์ผ๋ก ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋๋ฐฉ์ ์ ์ธํ ํ์ ์์ด ์ ๊ธฐ์ ์ผ๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค. ๋ํ "์คํจ"๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? Flutter๊ฐ ์ฑ๊ณตํ๊ธฐ ์ํด ์ธ๊ธฐ๊ฐ ์์ ํ์๋ ์์ต๋๋ค.
@naiveaiguy
์ด๋ด, ๋๋ ๋น์ ์ด cbazza์ ๋ต์ฅ์ ๋ฐ๋ ํฌํ๋ฅผ ํ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
ํ์ง๋ง ๋ด ๋ต๋ณ์ ๋ฐ๋ ์๊ฒฌ์ ์ ์ํ๊ธฐ ์ ์ 15์ด ๋์ ์ด ๋ด์ฉ์ ์ดํด๋ณด์ค ์ ์์ต๋๊น?
DSX์ ๋ํด ์๊ฐํ๊ธฐ ์ ์.
์๋๋ฅผ ์ดํด๋ณด๋ฉด JSX์ผ ๋ฟ์
๋๋ค.
ํ์ ๋ชจ์๊ณผ ๋ณธ๋ฌธ์ ๋ง๋ ํ์๋ ํ์ ๋ฐ์ฝ๋์์ ํ์ ๋ฐ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import XXXXX, { Component } from 'XXXXX';
import { Text, View } from 'XXXXX-native';
import navbar from "your code1"
import body from "your code2"
class SomethingFast extends Component {
render() {
return (
<View>
<navbar
style={{width: 360, height:90}}
/>
<Image
source={{uri: 'https://google.com/dsx.jpg/'}}
style={{width: 320, height:180}}
/>
<body/>
<Text>
Look at <strong i="11">@escamoteur</strong> s code from above.
Can you export part of UI code to another place,
separate it into different modules, and read everything in few seconds or less?
</Text>
</View>
);
}
}
I think cbazza is right.
If flutter uses DSX or whatever that is JSX,
it is a perfect UI framework.
So, could we have something
similar or better in the future?
Or do you really think that the
current is fine?
๋๊ตฐ๊ฐ๋ JSX๊ฐ Facebook์์ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ์ซ์ดํ ์๋ ์์ง๋ง ์ค์ ๋ก๋ ์์ ์ผ๋ณธ ๊ฒ์ ํ์ฌ์์ ์ ๊ณตํฉ๋๋ค.
React Native์ Flutter๋ก ์ฑ์ ๋ง๋ ํ ํ์ฌ ์ํ์์ JSX๋ ์์ ์ค์ฒฉ Dart ํด๋์ค๋ณด๋ค ์ฝ๊ณ ์กฐ์ ํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ๋ฏ์ด Facebook์ JavaScript๊ฐ ์์ฑ๋๋ ๋ฐฉ์(์: ๋ช
๋ช
๋ ์์ฑ์ ๋งค๊ฐ๋ณ์ ์์)์ผ๋ก ์ธํด JSX๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๊ฐ ์์์ต๋๋ค. ์ด๋ Dart์ ๊ฒฝ์ฐ๊ฐ ์๋๋๋ค. ๋ํ ์ถ๊ฐ๋ Dart ์ ํ ์์ ์ฑ์ ์ ๋ง ์ข์ต๋๋ค!
๋ฐ๋ผ์ Flutter๊ฐ ๊ฒฐ๊ตญ ์์ํ Dart ๊ตฌ๋ฌธ์ ๊ณ ์ํ๋ ๊ฒฝ์ฐ ๊ตฌ๋ฌธ ํ๊ดํ๊ณผ ์๋ ํฌ๋งทํฐ๋ฅผ ํตํด ๊ฐ์ ์ฌํญ์ ๋ณผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์๋ก์ด ๋ซ๋ ํ๊ทธ ์ฃผ์์ ์ด๋ฏธ ํฌ๊ฒ ๊ฐ์ ๋์์ง๋ง JSX ์์ฐ์ฑ์ ๋๋ฌํ๊ธฐ์๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
@JonathanSum ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์์ ๋ํ ์์ด๋์ด๋ฅผ ์ค๋ช ํ๊ณ ์์ต๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ์ํํ๋ ๋ฐ JSX๊ฐ ํ์ํ์ง ์์ต๋๋ค. Dart์ ๊ตฌ๋ฌธ์ ์์ ํ์ฌ ๋ ๋์ ๊ฒ์ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง DSX๋ ์ ํ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
@hartmannj ์ฐ๋ฆฌ๋ ์์ฐ์ฑ์ ๋์์ด ๋ Dart ๊ตฌ๋ฌธ, ํ๊ดํ ๋ฐ ํฌ๋งทํฐ์ ๊ฐ์ ์ฌํญ์ ํญ์ ์ฐพ๊ณ ์์ต๋๋ค. ๊ทํ ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์๊ฐํ์ ์ ์๋ ๊ฐ์ ์ฌํญ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์์ด๋์ด๋ ์ ์์ ๋ํด ์์ธํ ์๊ณ ์ถ์ต๋๋ค.
new/const
๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ IMHO๋ ์ด๋ฏธ ๋ง์ ๋์์ด ๋์์ต๋๋ค. ๋คํธ ํ์์ด ๋๋ฌด๋ฅผ ํ์ํํ๋ ๋ฐฉ์์ ์ ๋ง ์ด๋ ค์์ด ์์ต๋๋ค. ๋ค์๊ณผ ๋น๊ตํ์ฌ ํธ๋ฆฌ ๊ตฌ์กฐ IMHO๋ฅผ ์ถฉ๋ถํ ๊ฐ์กฐํ์ง ์์ต๋๋ค.
return Scaffold(
appBar: AppBar(title: Text("WeatherDemo")),
resizeToAvoidBottomPadding: false,
body:
Column(children: <Widget>
[
Padding(
padding: const EdgeInsets.all(16.0),
child:
TextField(
key: AppKeys.textField,
autocorrect: false,
controller: _controller,
decoration: InputDecoration(hintText: "Filter cities",),
style: TextStyle(fontSize: 20.0,),
onChanged: ModelProvider.of(context).textChangedCommand,
),
),
https://reactjs.org/docs/introducing-jsx.html
React๋ JSX๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ง๋ง ๋๋ถ๋ถ์ ์ฌ๋๋ค์ JavaScript ์ฝ๋ ๋ด์์ UI๋ก ์์ ํ ๋ ์๊ฐ์ ๋ณด์กฐ ์ฅ์น๋ก ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ React๊ฐ ๋ ์ ์ฉํ ์ค๋ฅ ๋ฐ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋ง์ ๊ฐ๋ฐ์๋ค์ด JSX์ ์ ์ฌํ UI๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ๊ตฌ์ถํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ, ์ด๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฉฐ ๋ฌด์ํด์๋ ์ ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
@woodstream JSX ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค์ ์ด๋ฏธ React ํฌ๋ณด์ด ํฌ์
๋๋ค. ๊ทธ๋ค์ ์ด๋ฏธ React Native๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. Flutter๋ ๋งค์ฐ ๋ค๋ฅธ ์ ํ์ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
ํธ์ง : ๋๋ fanboy์ ์ฌ์ฉ์ด ์ฌ๊ธฐ์ ์๋ชป๋์์์ ์ธ์ ํฉ๋๋ค.
@naiveaiguy , @Hixie
JSX๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค์ ์ด๋ฏธ React ํฌ์ ๋๋ค. ๊ทธ๋ค์ ์ด๋ฏธ React Native๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. Flutter๋ ๋งค์ฐ ๋ค๋ฅธ ์ ํ์ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
๋น์ ์ ํ๋ ธ๊ณ ๋ถ์ด์ ์ธ ๋๊ธ('React fanboys' & '๋ค๋ฅธ ์ ํ์ ๊ฐ๋ฐ์')์ ๋ถ๋ฅด๋ ์ด๋ฆ์ ํ์๋ฐ์ง ๋ชปํฉ๋๋ค. JSX/DSX๋ ๊ธฐ์ ์ ์ฅ์ ์ด ์๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ์ ํธํฉ๋๋ค. ์ด ์ค๋ ๋๋ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ๊ตฌ๋ ์ ์ทจ์ํ๋ ๊ฒ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ๋ํ ๋ด ์๊ฒฌ ํ๋ํ๋์ ๋ํด ๋ฐ๋ ํฌํ๋ฅผ ์ค์งํ์ญ์์ค. ๊ทธ๊ฒ์ ๋น์ ์๊ฒ ์ข์ ์ง์กฐ๊ฐ ์๋๋๋ค.
๊ฐ๋ฐ์๊ฐ ์์ ์ด ์ข์ํ๋ ๊ฒ์ ์ ํํ ์ ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ๋๊ตฐ๊ฐ ๋ค๋ฅธ ์๊ฒฌ ์์์ ์์ง์๊ฐ๋ฝ์ ํฌ๊ธฐํ๋ ๊ฒ์ ์ข์ํฉ๋๊น? ๊ธฐ์ ์ ํ์๋ ์ปค๋ฎค๋ํฐ์์ ํ๋ ์ดํ๊ธฐ๋ณด๋ค ๊ฐ๋ฐฉ์ ์ด๊ณ ํฌ๊ด์ ์ด์ด์ผ ํฉ๋๋ค.
@anders-sandholm ์์ ฏ ํธ๋ฆฌ์ ๊ฐ์์ฑ์ ํฅ์์์ผ์ผ ํ ํ์์ฑ์ ๋ํด @escamoteur ์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ์ ์๋ฅผ ๋ค์์ ๊ฒ์ ๋๋ค.
return
Scaffold(
appBar: AppBar(title: Text("WeatherDemo")),
resizeToAvoidBottomPadding: false,
body:
Column(children: <Widget> [
Padding(
padding: const EdgeInsets.all(16.0),
child:
TextField(
key: AppKeys.textField,
autocorrect: false,
controller: _controller,
decoration: InputDecoration(hintText: "Filter cities",),
style: TextStyle(fontSize: 20.0,),
onChanged: ModelProvider.of(context).textChangedCommand,
),
),
])
);
๋ํ ์์ ฏ ํด๋์ค ์ด๋ฆ์ ๋ค๋ฅธ ์์, ๊ธ๊ผด ์คํ์ผ ๋๋ ๋๊ป๋ก ๊ฐ์กฐ ํ์ํ์ฌ ์ฆ์ ๋ ์ ์์๋ณผ ์ ์๋๋ก ํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
@cbazza
์ด๋ฆ ๋ถ๋ฅด๊ธฐ? ๋๋ ์ด ์ฌ๋๋ค์ด ๋ถ์ ์ ์ด๋ผ๋ ๊ฒ์ ์์ํ ๊ฒ์ด ์๋๋ผ ๋จ์ง ๊ทธ๋ค์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์์ํ์ต๋๋ค. ๋๋ ์ด ์ค๋ ๋๋ฅผ ์ข์ํ์ง๋ง ์ ์๋ก ๋ ผ์ํ๋ค๊ณ ๋๋ฅผ ๋น๋ํ๋ ๊ฒ์ ์ฝ๊ฐ ์์ด๋ฌ๋ํฉ๋๋ค.
"fanboy"๋ผ๋ ๋จ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒฝ๋ฉธ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ ์ด๋ฌํ ๋งฅ๋ฝ์์๋ ๊ทธ๋ ๊ฒ ๋ฐ์๋ค์ฌ์ก์ต๋๋ค. ์ฌ๊ธฐ ํ ๋ก ์์ ๊ทธ๋ฐ ๋จ์ด๋ฅผ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ฏผ ์ฌ๋ฌ๋ถ, ๊ฑด์ค์ ์ด์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์คํ์ผ ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ๋งค์ฐ ์ฃผ๊ด์ ์ธ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ์ฌ๋์ด ์์ ์ ์ ํธ๋๋ฅผ ์๋ฌด๋ฆฌ ์ข์ํ๋๋ผ๋ ๋ณธ์ง์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ณด๋ค ์ฐ์ํ์ง๋ ์์ต๋๋ค. ๊ธฐ์กด ๋ฐ ์ ์๋ ๊ตฌ๋ฌธ์์ ๋ณผ ์ ์๋ ์ฅ์ ๊ณผ ๋จ์ ์ ๋์ดํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ณด๋ ๊ฒ์ ์๋๋ฉฐ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค.
@hartmannj
์ฝ๊ฐ์ ์ค๋ช ๋ง...
๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ๋ฏ์ด Facebook์ JavaScript๊ฐ ์์ฑ๋๋ ๋ฐฉ์(์: ๋ช ๋ช ๋ ์์ฑ์ ๋งค๊ฐ๋ณ์ ์์)์ผ๋ก ์ธํด JSX๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๊ฐ ์์์ต๋๋ค. ์ด๋ Dart์ ๊ฒฝ์ฐ๊ฐ ์๋๋๋ค.
์ค์ ๋ก ES2015/ES6๋ถํฐ JS๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ง์ ํ์ต๋๋ค. '๊ตฌ์กฐํ ํด์ '๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. :)
๋ค์์ ์์
๋๋ค.
// function declaration
function findUsersByRole ({
role,
withContactInfo,
includeInactive
}) {
if (role === 'admin' && withContactInfo) {
...
}
...
}
// usage
findUsersByRole({
role: 'admin',
withContactInfo: true,
includeInactive: true
})
https://medium.freecodecamp.org/elegant-patterns-in-modern-javascript-roro-be01e7669cbd
๋ํ ์ถ๊ฐ๋ Dart ์ ํ ์์ ์ฑ์ ์ ๋ง ์ข์ต๋๋ค!
DSX์์๋ ๋์ผํ ์ ํ ์์ ์ฑ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ ์ ๋ง ์ข์ ์ผ์ ๋๋ค.
์ด๊ฒ์ ์ด์ ์ ๋ณด๊ณ ๋ https://github.com/flutter/flutter/issues/11609 ์ ๋ณต์ ๋ณธ์ด๊ธฐ ๋๋ฌธ์ ์ด ํญ๋ชฉ์ ์ํด ๋ซ์ ๊ฒ์ ๋๋ค.
๋๋ ์ฌ๋๋ค์ด ์ธํฐ๋ท ์๋์ ์ ์ธ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ ๋งค์ฐ ๋ ๋ฒ์งธ ์ฒ์ฑ์ธ ์ด๊ฒ์ ๋ฐ๋ํ๋ ํฌํ๋ฅผ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
<like><this /></like>
ํ๋ฌํฐ๊ฐ ๋ ์ ์๋๋ก ์ ์ฐํ๊ฒ ๋์ฒํด์ฃผ์ธ์!
์ฌํ๊ฒ๋ ์ด๊ฒ์ ํฌ๋ง์ด ์์ด ๋ณด์ ๋๋ค. ๊ณผ๊ฑฐ์ ํ์ฌ์๋ ๋ชจ๋ ๊ธฐ์ ์ด ๋งํฌ์ ์ ์ฌ์ฉํ์ฌ UI๋ฅผ ์์ฑํ์ผ๋ฉฐ ๊ทธ ๋ชจ๋ ๊ฐ๋ฐ์ ๊ฒฝํ์ด ์ด์ ํ๋ฌํฐ์ ์ํด ๋ญ๋น๋๊ณ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋๋ html์ ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ๋จํ xml ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋... ๋คํธ์ ํฌํจ๋ xml! ;ํผ
2018๋ 8์ 28์ผ ํ์์ผ 21:29์ Touseef [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ค์ดํฐ๋ธ ๋๋ html์ ๋ฐ์ํ๋ ๊ฒ์ฒ๋ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ๋จํ xml ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/flutter/flutter/issues/15922#issuecomment-416550338 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AC8aNdVb_NV8c8JH4t36OS1OOvX6kY58ks5uVSmjgaJpZM4S6HPa
.
--
ํ ๋ ํด๋ฆฌ๋ฌ๋ฆฌ
๋์๊ฒ JSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฏธ๋์ด๋ฉฐ React, Vue ๋ฐ Flutter์ ๊ฐ์ ์ ์ธ์ ํ๋ ์์ํฌ์ ํ์ค ๊ตฌ์กฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
UI์ ๋ก์ง์ ์ํ 2๊ฐ์ ๊ฐ๋ณ ํ์ผ๋ง ์์ผ๋ฉด dart์ xml์ ํฌํจํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด mvvm, mvc ๋๋ ๊ธฐํ ์ํ๋ ํจํด์ ์ฝ๊ฒ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
๋๋ ๋ค๋ฅธ ์ค๋ ๋์์ ๊ทธ๊ฒ์ ๋งํ์ง๋ง :
JSX๋ฅผ ์ ๋ง๋ก ์ํ์ ๋ค๋ฉด ์ข์ ์์ ๋๊ตฌ๋ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. .html
๋๋ .xml
ํ์ผ๋ก ์ด๋ํ์ฌ ์ด๋ค๋ก๋ถํฐ ์์ ฏ์ ์์ฑํ์ญ์์ค.
๋ถ๋ช
ํ ์ด๊ฒ์ ๋ณธ๊ฒฉ์ ์ธ JSX๋ ์๋์ง๋ง ์์์
๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ์ด์ ๋ํด ์ด๋ป๊ฒ ๋ฐ์ํ ์ง ์ถฉ๋ถํ ์ ์ ์์ต๋๋ค.
ํด๋น ๊ตฌ๋ฌธ์ด ๊ด์ฌ์ ๋๋ฉด Flutter ํ์ด ํด๋น ์ฃผ์ ๋ฅผ ์ฌ๊ณ ํ ๊ฒ์
๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ์๊ฐ ๋ญ๋น๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ฌํ๊ฒ ํ ๋ก ๋ ์ฃผ์ ์์ ๋ถ๋ช ํ ์ ์ ์์ต๋๋ค.
Flutter๊ฐ ์๊ฐํ๊ณ xml / jsx / UI๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ํ๋ ๋๋ก ํธ์ถํ๋ฉด ์ฌ์ฅ ๋ฐ๋์ ํ๋ก๋์ ์์ค ์ฑ์ ์ฌ์ฉํ๊ธฐ ์์ํ ๊ฒ์ ๋๋ค!
@leossmith ๋ ํ๋ก๋์ ์์ค ์ฑ์ ์ ์ผํ ์ฅ์ ๋ฌผ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก JSX๋ ์ธ๋ถ ๋งํฌ์ ์ธ์ด๋ฅผ ์ถ๊ฐ _ํ์ง_ ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๋๋ ๋ชจ๋ ๊ฒ์ ๋จ์ผ ์ ํ ๊ฒ์ฌ ์ธ์ด๋ก ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ๊น์ด ์ค์ฒฉ๋ ์ ์ธ์ UI ํธ๋ฆฌ๋ฅผ ์ฝ๋ฉํ ๋ชฉ์ ์ผ๋ก Dart ์ธ์ด๋ฅผ ๊ณ์ ๊ฐ์ ํ๋ ๊ฒ์ด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ์ด๋ฏธ ์ด ์์ญ์ ๋ช ๊ฐ์ง ๋ฉ์ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค.
new
๋ฐ const
ํค์๋๋ฅผ ์ ํ ์ฌํญ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค.๋ชจ๋ ๊ฒ์ ๋จ์ผ ์ ํ ๊ฒ์ฌ ์ธ์ด๋ก ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก DSX/JSX๊ฐ ํ๋ ์ผ์ ๋๋ค. ์ธ์ด๋ DSX์ฉ Dart, JSX์ฉ Javascript์ ๋๋ค!!!
๊น์ด ์ค์ฒฉ๋ ์ ์ธ์ UI ํธ๋ฆฌ๋ฅผ ์ฝ๋ฉํ ๋ชฉ์ ์ผ๋ก Dart ์ธ์ด๋ฅผ ๊ณ์ ๊ฐ์ ํ๋ ๊ฒ์ด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
DSX๋ ๊น์ด ์ค์ฒฉ๋ ์ ์ธ์ ํธ๋ฆฌ๋ฅผ ๋ ์ ์ง์ํ๊ธฐ ์ํด Dart ์ธ์ด๋ฅผ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. JSX๊ฐ Javascript์ฉ์ธ ๊ฒ์ฒ๋ผ.
https://facebook.github.io/jsx/
์ด ์ฌ์์ ๋ชฉ์ ์ ์์ฑ์ด ์๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํ ๊ฐ๊ฒฐํ๊ณ ์น์ํ ๊ตฌ๋ฌธ์ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
@cbazza ์ข์ ์ง์ ์ ํ์ จ์ต๋๋ค. JSX๋ JavaScript์ ๋ํ ๊ฐ์ ์ฌํญ์ ๋๋ค.
๋ฐ๋ผ์ ๋จผ์ ๋ ๊ฐ์ง๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์์ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค. JSX๊ฐ React์ ๋ ์ ํฉํ ๋ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
๋ค์์ XML์ UI ํธ๋ฆฌ ๊ตฌ์ฑ์ ์ ํฉํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ ๊ฐ์ง ์์์ ๋๋ค. ๋ฌธ์ ๋ ์ธ์ด์ XML์ ๋์ ํ์ง ์๊ณ ๋ ์ด๋ฌํ ์์ ์ ์ํํ ์ ์๋๋๋ ๊ฒ์ ๋๋ค.
MyWidgetA(children: [ w1, w2 ])
MyWidgetB(child: w1)
MyWidgetC(top: w1, bottom: w2)
ButtonsView(
onDeal: onDeal,
onHit: onHit,
onStay: onStay,
)ButtonsView
์ด๊ฒ์ ์ธ๊ฐ์ด ์ฝ๊ธฐ ์ฌ์ธ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์๋ )ButtonsView
๋ฅผ )
๋ก ๋์ฒดํฉ๋๋ค. ๋ํ IDE๋ ์ด ์ฒด๊ณ์ ๋ํด ๋ ๋์ ํ์ธ ๋ฐ ์ง์์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฆฐ ๊ดํธ์ ๋ซ๋ ๊ดํธ๊ฐ ๊ฐ์ ์ค์ ์์ง ์์ ๋๋ง๋ค ํ์ํฉ๋๋ค.
์ผ๋ถ ์ธ์ด(์: kotlin)์์๋ ๋๋ค ์ ํ์ ์ธ์์ ๋ํ ํน์ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๋ฉด ๋๋ค ์ธ์๋ฅผ ๊ดํธ ์ธ๋ถ์ ๋ฃ์ ์ ์์ต๋๋ค. ๋ง์ง๋ง ๋งค๊ฐ๋ณ์์ ๋๋ค ์ ๋ฌ์ ์ฐธ์กฐํ์ญ์์ค.
๋๋ Dart์ ๋ํด ๋น์ทํ ๊ฒ์ ์ ์ํ์ง๋ง ๋๋ค๊ฐ ์๋ List ์ ํ์ arg๋ก ์ ์ํฉ๋๋ค. "children"์ด๋ผ๋ ์ด๋ฆ์ ๋ชฉ๋ก ์ ํ์ ์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ํน์ ๊ตฌ๋ฌธ์ ์ ์ํฉ๋๋ค.
```
//์ด ๋์ :
ํธ(a: 1, b:10, c:44, ์ด๋ฆฐ์ด:[...])
// ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ๋ค:
ํธ(a: 1, b:10, c:44)[
]
ํ๋์ ์์ ๋๋ 2๊ฐ์ ์์(์๋จ ๋ฐ ํ๋จ๊ณผ ๊ฐ์)์ ์ทจํ๋ ์์ฑ์/ํจ์์ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋์ญ์์ค. ๋ณ๊ฒฝ ์ฌํญ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ๋จ์ผ ์ ํ ๊ฒ์ฌ ์ธ์ด๋ก ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก DSX/JSX๊ฐ ํ๋ ์ผ์ ๋๋ค. ์ธ์ด๋ DSX์ฉ Dart, JSX์ฉ Javascript์ ๋๋ค!!!
๊น์ด ์ค์ฒฉ๋ ์ ์ธ์ UI ํธ๋ฆฌ๋ฅผ ์ฝ๋ฉํ ๋ชฉ์ ์ผ๋ก Dart ์ธ์ด๋ฅผ ๊ณ์ ๊ฐ์ ํ๋ ๊ฒ์ด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
DSX๋ ๊น์ด ์ค์ฒฉ๋ ์ ์ธ์ ํธ๋ฆฌ๋ฅผ ๋ ์ ์ง์ํ๊ธฐ ์ํด Dart ์ธ์ด๋ฅผ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. JSX๊ฐ Javascript์ฉ์ธ ๊ฒ์ฒ๋ผ.
https://facebook.github.io/jsx/
์ด ์ฌ์์ ๋ชฉ์ ์ ์์ฑ์ด ์๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํ ๊ฐ๊ฒฐํ๊ณ ์น์ํ ๊ตฌ๋ฌธ์ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
@StokeMasterJack - ๋ ํ๊ทธ ๋ฌธ์ ์ ๋ํ ๊ทํ์ ์ ์์ ์ผ๋ง ์ ์ ์ ์๊ณผ ๋์ผํ๊ฒ ๋ค๋ฆฝ๋๋ค.
์์ด๋์ด: ์๋ ์์ฑ๋ ๋ซ๋ ํ๊ทธ
ํ๋ฌํฐ์๋ ์ด๋ฐ ๊ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋๋ถ๋ถ์ ๋ ๊น์ ๋ฅ์ง ์์ ์ ์์ ฏ์ ์ฝ์ ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ๋๋ ๋ ํ๊ทธ ํ๊ธฐ๋ฒ์ ์ป๊ธฐ ์ํด JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๋ซ๋ ํ๊ทธ๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค. JSX/html/xml์ ๊ณ ํต์
๋๋ค. ํนํ ๋ด๊ฐ ๋ฆฌํฉํ ๋งํ๊ณ ์ถ์ ๋.
๊ฐ์ ๋ซ๋ ํ๊ทธ๊ฐ ๊ฝค ๊น๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ์ธ๊ณ ์ฌ์ด์ ์ข์ ํํ์ฒ๋ผ ๋ณด์
๋๋ค.
์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ๊ฐ์ ์ฌํญ์ด ์ ๋ง๋ก ํ์ํ ๊ฒฝ์ฐ IDE ์ธก๋ฉด์์ ๊ณ์ ํ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด vscode๋ ๋ค์ ํจ๋์ ์ ๊ณตํฉ๋๋ค.
(Android Studio๋ ๋์ผํ๋ค๊ณ ํ์ ํฉ๋๋ค)
์ง์ค๋ ๋ฉ์๋์์ ๋ฉ์ถ๋ ๋์ ์์ฑ์ ์ค์ฒฉ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํน์ ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํค๋ฉด ๋ค์ UI๊ฐ ํ์๋ฉ๋๋ค.
lib > main.dart > Foo > build > Container > Center > Text
์๊ฐ์ ์์ ฏ์ ๋ค๋ฅธ ์ข ๋ฅ์ ์ฝํ ์ธ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ผ๋ฉด IDE์์๋ ๋ค์ ํ ์ ์์ต๋๋ค.
์์ ฏ์ ๋ํด ๋ค๋ฅธ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋์ค์ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ์์ ๋์ ์์ ฏ ํ์ ํด๋์ค์ ๋ํ ํน์ ์์์ ๊ฐ์ง ์ ์์ต๋๋ค.
ํธ์ง ๊ฐ๋ฅ์ฑ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด Flutter๋ ์ด๋ฏธ ํ์ํ ๋ชจ๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค์์ ํฌํจํ์ฌ ๋ช ๊ฐ์ง ๋ฆฌํฉํ ๋ง ์ต์ ์ด ์์ต๋๋ค.
์ด๋ฅผ ์ผ๋์ ๋๊ณ ๋ ์ด์ ๊ดํธ๋ฅผ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
์์งํ ๋งํด์, ๋๋ ๋ช ๋ฌ ๋์ Flutter์์ ๋งค์ผ ๋ช ์๊ฐ์ ๋ณด๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ฑฐ๋ ์ค์ฒฉ๋ ์์ ฏ์ ์์ฑํ๋ ๋ฐ ๋ถํธํจ์ ๋๋ผ์ง ์์์ต๋๋ค.
๊ทธ์ ๋นํด ๋๋ React๋ฅผ ๊ทธ๋งํผ ๋ง์ด ์ฌ์ฉํด ์๊ณ ๋๋ฅผ ์ค๋ง์ํค๋ ๊ฒ๋ค์ด _์์ต๋๋ค.
@rrousselGit - ์ ์ฉํ ๋ฆฌํฉํ ๋ง ์ต์
์
๋๋ค. Android Studio 3.2์์๋ ๋ณด์ด์ง ์์ต๋๋ค.
Android Studio๊ฐ Flutter ๊ฐ๋ฐ์ ๊ฐ์ฅ ์ ํฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@๋ก๋ณผ
๋ค์์ Android Studio์ ์คํฌ๋ฆฐ์ท์ ๋๋ค.
๋น ๋ฅธ ์์ Option+Enter
(macOS)์ผ๋ก ํ์ฑํ๋์์ต๋๋ค.
๋๋ ์ด๊ฒ๋ค์ ํญ์ ์ฌ์ฉํฉ๋๋ค. ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ฃผ์ : Flutter ํ์ด "์ฝ๋๋ก์์ UI" ์ต์ ์ ํ์ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์กฐ๋ง๊ฐ ์ด ๋ถ๋ถ์์ ๋ ๋ง์ ๊ฐ์ ์ฌํญ์ ์ป์ ์ ์์ต๋๋ค. @StokeMasterJack ์ ์์ด๋์ด๋ ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฌ์ง๋ง.
@Rockvole ์๋ํ ๋ง์์ ๋น์ทํ๊ฒ ์๊ฐํฉ๋๋ค!
@StokeMasterJack
์ข์ ๋ต๋ณ !!!
JSX๊ฐ React์ ๋ ์ ํฉํ ๋ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์น์์ JSX๋ ์์ฑ๋๋ ๊ฒ๊ณผ ์ ํํ ์ผ์นํฉ๋๋ค(HTML DOM ๋ ธ๋). Flutter์์๋ ์์ ฏ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค.
JSX์ ํ์ HTML/DOM ๋ ธ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์์ต๋๋ค. React Native์๋ HTML/DOM ๋ ธ๋๊ฐ ์์ต๋๊น?
- ์ต์ํจ: ์ฌ๋๋ค์ html ์ฝ๋๋ฅผ ๋ณด๋ ๋ฐ ์ต์ํฉ๋๋ค. ๊ทธ๋ฌ๋ DSX ์ ์์ ์ด ์ ์ ๋ฌดํจํํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋๋ก JSX/XML์์ ๋ฒ์ด๋ฉ๋๋ค.
์์ ๊ฐ์ด HTML ์ฝ๋ ์ ๋ํ ๊ฒ์ด ์๋๋ผ ํธ์คํธ ์ธ์ด์ ๋ช ๋ น์ ๊ตฌ์ฑ์์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋๊ณ ํธ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ ์ธ์ ๋งํฌ์ ์ ์ธ์น๋ ๊ตฌ๋ฌธ์ ๋ํ ๊ฒ์ ๋๋ค .
๋๋ ๋น์ ์ ์ ์์ด๋ Kotlin์ ํฌ์ด ์๋๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ ์ ์ ํ ๋์์ธ์ ํ์ง ์๊ธฐ ์ํด ํํด์ง ํดํน์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ ทํ๊ฒ ๋ณด์ด๋ DSL์ ์ค๊ณํ๋ ๋์ ์ด์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ๊ทธ๊ฒ์ด ํ๋ ์ผ์ ํ์ ํ๋ ค๊ณ ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ๊ตฌ๋ฌธ์ด ๋ชจํธํด ๋ณด์ ๋๋ค. ๋ช ๋ น ๊ตฌ๋ฌธ๊ณผ ์ ์ธ ๊ตฌ๋ฌธ์ ๋ถ๋ฆฌํ๋ฉด ์ด์ ์ด ์์ต๋๋ค. ํ์ฌ ๋๊ตฌ๋ ์๋ฅผ ๋ค์ด ์ฝ๋ ๋ด์์ XML ๋งํฌ์ ์ ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
@๋ก๋ณผ
์ข ๋ฃ ํ๊ทธ ํ๊ธฐ๋ฒ์ ์ป๊ธฐ ์ํด JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
์์ ๋๋ง ํ ;)
@rrousselGit
๋ซ๋ ํ๊ทธ๋ฅผ ์์ฑํ๊ณ ์ถ์ง ์์ต๋๋ค.
๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด WebStorm์ ๋ซ๋ ํ๊ทธ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ๋ค๋ฅธ ํ๊ทธ๋ฅผ ํธ์งํ ๋ ์ด๊ฑฐ๋ ๋ซ๋ ํ๊ทธ์ ์ด๋ฆ๋ ๋ณ๊ฒฝํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฐ๋ผ์ผ ํ๋ ์ ๋ง ํ๋ฅญํ ํธ์ง๊ธฐ ๊ธฐ๋ฅ์ ๋๋ค('VS ์ฝ๋' ์ฐธ์กฐ).
์์งํ ๋งํด์, ๋๋ ๋ช ๋ฌ ๋์ Flutter์์ ๋งค์ผ ๋ช ์๊ฐ์ ๋ณด๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฑฐ๋ ์ค์ฒฉ๋ ์์ ฏ์ ์์ฑํ๋ ๋ฐ ๋ถํธํจ์ ๋๋ผ์ง ์์์ต๋๋ค.
๊ทํ์ ๊ฒฝํ์ด ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋์ ๊ฒฝํ์ ๋ฐ์ํ์ง ์๋๋ค๋ ์ ์ ์ดํดํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์ด ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ๋งํผ ๊ณ ํต์ค๋ฝ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ ค๋ฉด github์ผ๋ก ์ด๋ํ์ธ์. ๊ทธ๋ฌ๋ฉด ์ฝ๊ธฐ๊ฐ ํ๋ค๊ณ ์ฝ๋๊ฐ ์ค์ฒฉ ๊ตฌ์กฐ๋ก ์ธํด ๋๋ฌด ์ฅํฉํ๊ณ ๊ธธ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. async/await๊ฐ ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์ promise-chains๊ฐ ์ฌ์ฉ๋์์ ๋์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ํ ์ ์ธ์ ๊ธฐ์ ์ด ๋ช ๋ น์ ๊ธฐ์ ๋ณด๋ค ๋ ์ค์ํ๋ค๊ณ ๋๊ปด์ง๋๋ค. ์ ์ธ์ ๋ฒกํฐ ๊ทธ๋ํฝ ๊ตฌ์กฐ๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋์ ์๋ฅผ ๋ค์ด ๋ฒกํฐ ๊ทธ๋ํฝ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ์ํด Skia์ ๋ํ ๋ช ๋ นํ ํธ์ถ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด WebStorm์ ์๋ ์์ฑ
Vscode๋ ๊ทธ๋ ๊ฒ ํฉ๋๋ค. ํ์ง๋ง ์์ง ์๋ฒฝํ์ง ์๋ค๋ ๊ฒ. ํนํ ๋ฌผ๊ฑด์ ์ด๋ํ ๋ ๋ฆฌํฉํ ๋ง ๋จ๊ณ์์.
์ฌ๊ธฐ์์ ๊ฐ์ ํ๊ทธ๊ฐ ํจ์ฌ ๋ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทํ์ ๊ฒฝํ์ด ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋์ ๊ฒฝํ์ ๋ฐ์ํ์ง ์๋๋ค๋ ์ ์ ์ดํดํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
ํ์คํ! ํด๋ง์ ๋ํ ๊ฒฝํ ๋ถ์กฑ์ด๋ผ๊ธฐ๋ณด๋ค๋ ์ค์ ๋ถ์กฑ์ผ ์ ์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์์ต๋๋ค ๐
github์ผ๋ก ์ด๋ํ์ฌ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด ์ฝ๊ธฐ๊ฐ ๊ณ ํต์ค๋ฝ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. [...]
๋๋ ๋น์ ์ ์ฃผ์ฅ์ด ์ฃผ์ ์ ์ด๋ค ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทํ๊ฐ ๋์ดํ ๋ฌธ์ ๋ ์๋ชป๋ ๊ตฌ๋ฌธ์ด ์๋๋ผ ์๋ชป๋ ๊ดํ์์ ๋น๋กฏ๋ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ด 500๊ฐ์ ๊ธด ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ถ์ดํ๋ ๊ฒ์ Flutter์ ์๋ชป์ด ์๋๋๋ค.
@pulyaevskiy - ์ ์ฉํ ํ ๊ฐ์ฌํฉ๋๋ค. Linux์์ ๋น ๋ฅธ ์์ ์ Alt-Enter์ ๋๋ค. ๋ฐ๊ฒฌํ๊ธฐ๊ฐ ์ฝ์ง ์์ ๊ธฐ๋ฅ์ ๋๋ค. ์ต์์ ๋ฉ๋ด ์ต์ ์ ์ ์ ์ด ๋ค์ก์ง๋ง ๋ง๋ฒ์ ํค๋ฅผ ๋๋ฅด๋ ๊ฒ ์ธ์๋ ์ด๋์๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. :)
์ฌ๊ธฐ์์ ๊ฐ์ ํ๊ทธ๊ฐ ํจ์ฌ ๋ ๋ถ๋๋ฌ์ด ๊ฒฝํ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฌํ ๊ฐ์ ํ๊ทธ๊ฐ github์ ์์ค ํ์ผ์ ํ์๋ฉ๋๊น?
๋๋ ๋น์ ์ ์ฃผ์ฅ์ด ์ฃผ์ ์ ์ด๋ค ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ด๋ ๋ด๊ฐ promise ๋ async/await ์์ ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๋ ์ฅํฉํ๊ฒ ๋ง๋๋ ๊ตฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. Flutter Widget์์ ์์ฑ์๋ ๊ฑฐ๋ํ๊ณ ๋ง์ ๊ฒฝ์ฐ ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. DSX๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฅผ ๋ค์ด ํ์ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ 10์ค ์์ฑ์๋ฅผ 1์ค ์์ฑ์๋ก ์์ถํ ์ ์์ผ๋ฏ๋ก ์ฃผ๋ณ ์์์ด ์ ์ ์์ ํ ํธ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๊ณ ์๋ฅผ ๋ค์ด ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์คํ์ผ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด Dart ์ฝ๋๋ฅผ ์ฌ๊ตฌ์ฑํ์ฌ ์ํํ ์ ์๋ค๋ ๋ง์ ์๋์ง๋ง ๋ง์ ๋ ธ๋ ฅ์ด๋ ์ฃผ๋ณ์ ๊ฒ์ ์ฌ๊ตฌ์ฑํ์ง ์๊ณ ๋ ์ํํ ์ ์์ต๋๋ค. ๋น์ ์ ์ธ์ด์ ํ๊ณ์ ๋ง์ถ ํ์๊ฐ ์์ต๋๋ค, ์ธ์ด๋ ๋น์ ์๊ฒ ๋ง์ต๋๋ค.
๊ทํ๊ฐ ๋์ดํ ๋ฌธ์ ๋ ์๋ชป๋ ๊ตฌ๋ฌธ์ด ์๋๋ผ ์๋ชป๋ ๊ดํ์์ ๋น๋กฏ๋ ๊ฒ์ ๋๋ค.
async/await ์ด์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ชจ๋ ๊ณณ์์ ๋ฏธ์น ์ด๋ฒคํธ ์ฝ๋ฐฑ ๋์ ์ฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ์ฝ์์ ์ฌ์ฉํ๋ฉด async/await๋ก ํด๊ฒฐ๋ ๊ฐ๋ ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ๋ฌธ ์คํ๊ณผ ๋์ผํ์ง๋ง ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ์ฝ์ ๋ async/await๊ฐ ๋ ๋ช ํํฉ๋๋ค.
์ด๊ฒ์ ๋์ฐํ ์ ์ ๋๋ค @woodstream
์ ๋ฐ์ดํธ : ๋ด ์์ ์ ๋ฐํ๊ณ ๋ ผ์์์ด ๋จ์ด๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ด ์๋๋๋ค. DSX์ ๋๋ฑํ ๊ธธ์ด๋ ... ์ด๊ฒ์ ์ค ์ ๋๋ HTML๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
class MusicImage extends StatelessWidget {
TextStyle titleTextStyle = TextStyle(
fontWeight: FontWeight.w800,
letterSpacing: 0.5,
fontSize: 20.0
);
Container titleText = (
<Container height={116.0} padding={EdgeInsets.all(10.0)}>
<Text style={titleTextStyle}>title</Text>
</Container>
);
TextStyle authorTextStyle = TextStyle(
fontWeight: FontWeight.w800,
letterSpacing: 0.5,
fontSize: 10.0,
);
Container music = (
<Container
height={40.0}
decoration={BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(8.0))
)}
padding={EdgeInsets.fromLTRB(0.0, 5.0, 5.0, 0.0)}
margin={EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 0.0)}
>
<Stack>
<Row>
<Container
height={30.0}
width={30.0}
decoration={BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8.0))
)}
margin={EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0)}
>
{Image.asset('images/bg2.jpg')}
</Container>
<Column>
<Text>music</Text>
<Text style={authorTextStyle}>author</Text>
</Column>
</Row>
<Align alignment={FractionalOffset.centerRight}>
<Icon icon={Icons.play_arrow} />
</Align>
</Stack>
</Container>
)
<strong i="9">@override</strong>
Widget build(BuildContext context) {
return (
<Container
height={168.0}
margin={EdgeInsets.fromLTRB(16.0, 8.0, 16.0, 8.0)}
decoration={BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8.0)),
image: DecorationImage(
image: new AssetImage('images/bg.jpg'),
fit: BoxFit.cover,
),
)}
>
{titleText}
{music}
</Container>
);
}
}
React ๊ฐ๋ฐ์๋ก์ ์ด ์ปค๋ฎค๋ํฐ๊ฐ ํด์ผ ํ ์ผ์ ์ด ๊ธฐ๋ฅ์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๊ณ ๊ฐ๋ฐ์๊ฐ ์ด๋ฅผ ์ ์ฉํ๊ณ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ ์์ํ ๋ ์ ๊ณตํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฃผ์ ๊ธฐ์ฌ์๋ค๋ ์ด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉํด์ผ ํฉ๋๋ค. ์ ๋ React ๊ฐ๋ฐ์์ด๊ณ UI๊ฐ ํ๋ฌํฐ๋ก ์์ฑ๋๋ ๋ฐฉ์์ ๋ค๋ฃจ๋ ๋ฐ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ๋ฌํฐ๋ก ์ด๋ํ๊ณ ์ถ์ง๋ง ๊ตฌ๋ฌธ์ด ๋์์ด ๋์ง ์์ต๋๋ค. JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ฐ๊ตฌํ ๊ฒ์ ๋๋ค. ๋ ์์ , "์ ํ๊ถ์ด ์์ด์ ์ข๋ค" ์ ์ ๋งํ๋ฏ์ด.
์ฌ๋๋ค์ด ์ด๊ฒ์ ๋ฐ๋ํ๋ ์ฃผ๋ ์ด์ ์ค ํ๋๋ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ง์ค์ ์ฌ๋๋ค์ด <Component />
#$์ ๋ฌ๋ฆฌ React.createElement(Component, {}, null)
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ (๋ฐ์๊ณผ ๋น๊ตํ์ฌ) ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ๊ตฌํ๋๋ฉด ์ฌ๋๋ค์ด ์ฒ์์ Flutter๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ฅ์, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ์ํ๋ ๊ฒ์
๋๋ค. ์๋ก์ ์ง์์ ๋ฐ์ Flutter์ ์ ๋
ํ๋ ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ์
๋๋ค. ์ฌ์ฉํ๋ ๊ตฌ๋ฌธ ์ ํ์ด ์๋๋ผ๋ฉด ์ค ๊ธ์์. ๊ทธ๋ฌ๋ ํค์ ํ์ฌ ๋ฐฉ๋ฒ๊ณผ ๋ฐ๋๋ก JSX์ ๊ฐ์ ํ๊ธฐ๋ฒ์ ์ ํธํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ SGML๊ณผ ๊ทธ ํ์๋ฌผ์ด ๊ทธ์ ๋ณด๊ธฐ ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. DSL์ ์ํํ๋ ๊ฒฝ์ฐ QML๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ๋ํ DSX๋ฅผ ์ง์งํ๋ ํฌ์ธํธ ์ค ์ผ๋ถ๊ฐ ์ธ์ด๋ก์์ Javascript์ ๊ธฐ๋ฅ(์ธ์ด๋ก์์ Dart์๋ ์๋)๊ณผ DSL๋ก์์ JSX์ ๊ธฐ๋ฅ์ ํผ๋ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ด๋ ๋ด๊ฐ promise ๋ async/await ์์ ์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ๋ ์ฅํฉํ๊ฒ ๋ง๋๋ ๊ตฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. Flutter Widget์์ ์์ฑ์๋ ๊ฑฐ๋ํ๊ณ ๋ง์ ๊ฒฝ์ฐ ๋ง์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. DSX๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฅผ ๋ค์ด ํ์ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ 10์ค ์์ฑ์๋ฅผ 1์ค ์์ฑ์๋ก ์์ถํ ์ ์์ผ๋ฏ๋ก ์ฃผ๋ณ ์์์ด ์ ์ ์์ ํ ํธ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ DSX๊ฐ ๋ง๋ฒ์ฒ๋ผ ๋ถ์ฌํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ Javascript์ ์๊ธฐ ๋๋ฌธ์ JSX๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ธ์ด๋ก์์ Dart๋ ํ์ฐ ์ฐ์ฐ์๋ฅผ ์ป์ ์ ์์ต๋๋ค(IMO๋ ๊ฑฐ์ ์์). ์ด ๊ฒฝ์ฐ ํน๋ณํ DSL ์์ด๋ ์์ฑ์ ๋ฐ ๊ธฐํ ํจ์ ํธ์ถ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ Javascript์ ๊ฐ์ฒด, ํด์๋งต ๋ฐ ๋ฐฐ์ด์ด ๋ชจ๋ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ์๋ํ๋ ๊ธฐ๋ฅ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๋ Dart์ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ํ์คํ๊ณ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์๊ฐ์๋ ์ ์์ ๋ฐ๋ํ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ชฉ์๋ฆฌ๋ฅผ ๋ด์ง ์๋๋ผ๋ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก Dart๊ฐ Javascript์ฒ๋ผ ํ๋ํ๋๋ก(๋๋ ํ๋ํ๋ ์ฒ) ์์ฒญํ๋ ๊ฒ์ ๋๋ค. ์ผ๋ถ ์ฐฌ์ฑ์ด ์์ง๋ง ์ฌ์ค์ ๊ทธ๋ค์ ๋จ์ํ Dart 1์ ์ด๊ธฐ๋ถํฐ ์ ์ ๋ ๋ค์ํด์ง ๋ค๋ฅธ ์ธ์ด์ ๋๋ค.
ํธ์ง: UI์ฉ ๋งํฌ์ /๋ชจ๋ธ๋ง DSL์ด ์์ ํ ๋์ ์๊ฐ์ด๋ผ๋ ๊ฒ์ ์๋๋๋ค. ์์งํ ๊ทธ๋ ์ง๋ ์์ง๋ง Javascript๋ณด๋ค Dart/Flutter(ํ์ดํ ํจ๋ฌ๋ค์ ๋ฐ ๊ธฐํ ์๋ฏธ๋ก ์ ์ธ๋ถ ์ฌํญ์์ - ๋๋ ์ผ๋ฐ ๊ตฌ๋ฌธ์ ๋ํด ๋งํ๋ ๊ฒ์ด ์๋)์ ์กฐ๊ธ ๋ ์ ์ฌํ ์ธ์ด/ํ๋ ์์ํฌ์์ ์๊ฐ์ ์ป์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ค.
์ธ์ด๋ก์์ Dart๋ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ป์ ์ ์์ต๋๋ค(IMO๋ ๊ฑฐ์ ๋ถ๊ฐ๋ฅ)
์ฌ์ค ์ปฌ๋ ์ ์ ๋ํ ์คํ๋ ๋๋ ์ด๋ฏธ ์ง์ ๋์ด ์๊ณ ๊ตฌํํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค. ํฅํ Dart ์ธ์ด ๊ธฐ๋ฅ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์คํ๋ ๋ ์ปฌ๋ ์ ๋ฐ ์ ์ฒด "์ธ์ด ํผ๋" ์ ์ฐธ์กฐํ์ธ์.
@mraleph ๋ชฉ๋ก์ด๋ ๋งต๋ฟ๋ง ์๋๋ผ ํจ์/์์ฑ์ ํธ์ถ ๋ฐ ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋๋ ์คํ๋ ๋ ์ฐ์ฐ์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ ๊ฑฐ์ ์์ต๋๋ค. ๋ช ํํ์ง ์์ ๊ฒฝ์ฐ ์ฃ์กํฉ๋๋ค!
(๋๋ ๊ทธ ์ ์์ ๋ง์ฐํ๊ฒ ์๊ณ ์์ง๋ง ๋ง์ง๋ง์ผ๋ก ํ์ธํ ๊ฒ์ Javascript Size { width: 10, height: 10 }
๋ฅผ ํผ๋จ๋ฆฌ๊ฑฐ๋ ํ๊ดดํ ์ ์๋ ๋ฐฉ์์ผ๋ก Dart Size(10, 10)
๋ฅผ ํผ๋จ๋ฆฌ๊ฑฐ๋ ๋ชฉ๋ก์ ํผ๋จ๋ฆด ์ ์๋ค๋ ๊ฒ์
๋๋ค. /์ผ๋ฐ ํจ์ ํธ์ถ์ ๋ํ ์ธ์ ๋งคํ(์ ํ ์์ ์ฑ์ ํฌ์์ํค๋ Function.apply
์ฌ์ฉํ์ง ์์)
@filleduchaos
๊ฐ์ธ์ ์ผ๋ก ๋๋ SGML๊ณผ ๊ทธ ํ์๋ฌผ์ด ๊ทธ์ ๋ณด๊ธฐ ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. DSL์ ์ํํ๋ ๊ฒฝ์ฐ QML๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ง์ ์ฌ๋๋ค์ด ๋น์ ๊ณผ ๋ฌ๋ฆฌ ๋ชป์๊ฒผ๋ค๊ณ ์๊ฐํ์ง ์๊ณ ์ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ ์ ์ธ React ๊ฐ๋ฐ์๋ฅผ ๋ชจ๋ ๋ณด๊ธฐ ์ํด ๋ง์ ๋น์ ์ ๊ฐ์ง ํ์๋ ์์ต๋๋ค.
JSX/DSX๋ ํธ์คํธ ์ธ์ด๋ฅผ ํฅ์์ํค๊ณ ๋งํฌ์ ์ ๋ํ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ตฌ์ฑ์ ํ์ฑํํ๋ ๋ฐฉ์์ผ๋ก ํธ์คํธ ์ธ์ด Javascript/Dart์ ๋งํฌ์ ์ ๊ฐ์ ธ์ต๋๋ค. ๋งค์ฐ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ DSX๊ฐ ๋ง๋ฒ์ฒ๋ผ ๋ถ์ฌํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ Javascript์ ์๊ธฐ ๋๋ฌธ์ JSX๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
์ ํ ์ฌ์ค์ด ์๋๋๋ค. DSX๋ ์์ฒด์ ์ผ๋ก ํ์ฐ ์ ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ง์ํ๊ธฐ ์ํด Dart๊ฐ ํ์ํ์ง ์์ต๋๋ค. ํ์ ์กฐ๊ฑด์ ์๋์ง๋ง ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๊ณ ๊ธ ์ธ์ด์์ Dart๋ก ํธ๋์คํ์ผํ๋ ๊ฒ์ ์๋ฆ๋ค์์ ๋๋ค. ๊ณ ๊ธ ์ธ์ด๋ Dart์ ์ํด ์ ํ๋ ํ์๊ฐ ์์ต๋๋ค.
๋ด ํ๋กํ ํ์
์จ๋ผ์ธ DSX ํธ๋์คํ์ผ๋ฌ ํ๋ก์ธ์ค ํ์ฐ ์ฐ์ฐ์, ํ์ธ:
https://spark-heroku-dsx.herokuapp.com/index.html
๊ทธ๋ฆฌ๊ณ ์ ์๊ฐ์๋ ์ ์์ ๋ฐ๋ํ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ชฉ์๋ฆฌ๋ฅผ ๋ด์ง ์๋๋ผ๋ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ณธ์ง์ ์ผ๋ก Dart๊ฐ Javascript์ฒ๋ผ ํ๋ํ๋๋ก(๋๋ ํ๋ํ๋ ์ฒ) ์์ฒญํ๋ ๊ฒ์ ๋๋ค. ์ผ๋ถ ์ฐฌ์ฑ์ด ์์ง๋ง ์ฌ์ค์ ๊ทธ๋ค์ ๋จ์ํ Dart 1์ ์ด๊ธฐ๋ถํฐ ์ ์ ๋ ๋ค์ํด์ง ๋ค๋ฅธ ์ธ์ด์ ๋๋ค.
ํ์ฌ Dart๊ฐ ๋ฌด์์ธ์ง ์๊ฐํ์ง ๋ง๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด์์ ์ต๊ณ ์ ์์ด๋์ด๋ฅผ ์ทจํ์ฌ ๊ทธ๊ฒ์ด ๋ฌด์์ผ ์ ์๋์ง์ ์ง์คํ์ญ์์ค.
๋๋ ๊ทธ๊ฒ์ ๋ํ ์๊ฐ์ด Javascript๋ณด๋ค Dart/Flutter์ ์กฐ๊ธ ๋ ์ ์ฌํ ์ธ์ด/ํ๋ ์์ํฌ(ํ์ดํ ํจ๋ฌ๋ค์ ๋ฐ ๊ธฐํ ์๋ฏธ๋ก ์ ์ธ๋ถ ์ฌํญ์์ - ๋๋ ์ผ๋ฐ ๊ตฌ๋ฌธ์ ๋ํด ๋งํ๋ ๊ฒ์ด ์๋๋๋ค)์์ ์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Typescript๊ฐ ์ ๋ ฅ๋๊ณ JSX๋ฅผ ์ง์ํฉ๋๋ค. Flutter์ ๊ฐ์ฅ ๊ฐ๊น์ด UI ํ๋ ์์ํฌ๋ React์ด๋ฉฐ, JSX๋ก ์ธํด React๊ฐ ๋ฌด์์ ์์ํ๋์ง ์ถ์ธกํด ๋ณด์ธ์. JSX/DSX๋ณด๋ค ๋ ๋์ ๊ฒ์ ์๊ฐํด ๋ด์ญ์์ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ์ฌ๋๋ค์ด JSX/DSX์ ๋ํด ๋ ์ด์ ์๊ตฌํ์ง ์์ ๊ฒ์ ๋๋ค. .
Dart ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด Python(๋ชฉ๋ก ๋ฐ ์ฌ์ ์ดํด)๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์์ ์ต๊ณ ์ ์์ด๋์ด๋ฅผ ์ทจํ๋ ๊ฒ์ ๋ณด๋ ๋ฐ๊ฐ์ต๋๋ค.
@cbazza
๋ง์ ์ฌ๋๋ค์ด ๋น์ ๊ณผ ๋ฌ๋ฆฌ ๋ชป์๊ฒผ๋ค๊ณ ์๊ฐํ์ง ์๊ณ ์ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ ๋ฐ๋. ํนํ ์ธ์ด์ ๊ฐ๋ ฅํ ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ๊ตฌ๋ฌธ์ ํ๋๋ง ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? (Android SDK์ ํจ๊ป Java์ XML์ ์๋ ๊ฐ ๊ด๊ณ๋ฅผ ์ ์งํด ์์ต๋๋ค. JSX๊ฐ ๋งค์ฐ ์ ์ฌํ Javascript ๋ฐ HTML๊ณผ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ์๋ DSX๋ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ SGML ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์ธ์ด์ ๋ํด ์๋ฏธ๊ฐ ์์ง๋ง ๋ฐ๋์ _Dart_์ ๋ํด์๋ ์๋ฏธ๊ฐ ์๋ ๊ฒ์ ์๋๋๋ค.)
JSX/DSX๋ ํธ์คํธ ์ธ์ด๋ฅผ ํฅ์์ํค๊ณ ๋งํฌ์ ์ ๋ํ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ตฌ์ฑ์ ํ์ฑํํ๋ ๋ฐฉ์์ผ๋ก ํธ์คํธ ์ธ์ด Javascript/Dart์ ๋งํฌ์ ์ ๊ฐ์ ธ์ต๋๋ค. ๋งค์ฐ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๊ฒ์ ๋๋ค.
์ ํ ์ฌ์ค์ด ์๋๋๋ค. DSX๋ ์์ฒด์ ์ผ๋ก ํ์ฐ ์ ๊ตฌํํ ์ ์์ผ๋ฉฐ ์ง์ํ๊ธฐ ์ํด Dart๊ฐ ํ์ํ์ง ์์ต๋๋ค. ํ์ ์กฐ๊ฑด์ ์๋์ง๋ง ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ๊ณ ๊ธ ์ธ์ด์์ Dart๋ก ํธ๋์คํ์ผํ๋ ๊ฒ์ ์๋ฆ๋ค์์ ๋๋ค. ๊ณ ๊ธ ์ธ์ด๋ Dart์ ์ํด ์ ํ๋ ํ์๊ฐ ์์ต๋๋ค.
์ด ๋ ์ง์ ์ ๋ณ์น๋ก ๋ณด๋ ๊ฒ์ ๋ค์ ํฅ๋ฏธ๋กญ์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ๋ค์ ๋จ์ง ์ ์์ ์ ์ฆ๋ช ํ๊ธฐ ์ํด์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. JSX๋ ํนํ ๋จ์์ฑ ๋๋ฌธ์ (Javascript์ ๊ฒฝ์ฐ) ํ๋ฅญํฉ๋๋ค. ์ด๋ฏธ JS ์ธ์ด ๊ตฌ์ฑ์ ๋ํ ๋จ์ํ ์คํ์ผ ๋ฟ์ด๋ฉฐ ์ค์ ๋ก ํน๋ณํ ์๋ฏธ ์์ฒด๋ฅผ ๊ตฌํํ์ง๋ ์์ต๋๋ค. ๋น์ ์ ๊ทธ ๋จ์ํจ์ ์ณ๊ฒ ์นญ์ฐฌํ ๋ค์ DSX๊ฐ 1) ์ผ๋ง๋ ๋ ๋ง์ ์์ ์ ์๊ตฌํด์ผ ํ๋์ง, 2) DSX๊ฐ ๋ชฉํ ์ธ์ด์ ๋ฌด๊ดํ๊ฒ ์๋ฏธ๋ก ์ ์์ฒด์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ฐ๋จํ์ง๋ง ๊ฐ๋ ฅํ DSL.
๋ด ํ๋กํ ํ์ ์จ๋ผ์ธ DSX ํธ๋์คํ์ผ๋ฌ ํ๋ก์ธ์ค ํ์ฐ ์ฐ์ฐ์, ํ์ธ:
https://spark-heroku-dsx.herokuapp.com/index.html
์ด์ ์ ๊ทํ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ๋ณธ ์ ์ด ์์ผ๋ฉฐ ์ธ์์ ์ธ ์์ ์ด์ง๋ง Javascript๋ฅผ ์ธ์ด๋ก(๋ฐ๋ผ์ JSX) ๊ธฐ๋ณธ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ผ๋ก ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํ ๊ทผ์ ํ์ง ์์ต๋๋ค. ์ธ๊ธํ๋ฏ์ด ์ปฌ๋ ์ ์ ํ์ฐ(๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ์๋ ๊ตฌ์กฐํ)ํ๋ ๊ฒ์ Dart์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ผ๋ฉฐ ์ค์ ๋ก ๊ตฌํ๋ ํ์ดํ๋ผ์ธ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฐ์ฒด(JS์ ๋ฌ๋ฆฌ Maps์ ๊ฑฐ์ ๋์ผํ์ง ์์)๋ฅผ ํ์ฐ ๋ฐ ๊ตฌ์กฐ ํด์ ํ๋ ๊ฒ์ ํด๋น๋๋ฉฐ ํธ๋์คํ์ผ๋ฌ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ฐ ์ฌ์ฉํ ์ ์๋ Dart(์๋ฅผ ๋ค์ด ์ ์ ํ ์ ํ ์์ ๋ฐฉ์์ผ๋ก ์ํธ ์์ฉํ ์ ์์).
ํ์ฌ Dart๊ฐ ๋ฌด์์ธ์ง ์๊ฐํ์ง ๋ง๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด์์ ์ต๊ณ ์ ์์ด๋์ด๋ฅผ ์ทจํ์ฌ ๊ทธ๊ฒ์ด ๋ฌด์์ผ ์ ์๋์ง์ ์ง์คํ์ญ์์ค.
ํ์ ํ๋. ๊ทธ๋ฌ๋ Dart๊ฐ ์ ๊ฑฐํ ์ ์๋ ์ธ์ด ์ค์์ ๊ฐ์ธ์ ์ผ๋ก JS๋ ๋ชฉ๋ก์์ ๊ทธ๋ค์ง ๋์ ์์๊ฐ ์๋๋๋ค. ์์งํ ๋งํด์ JS(์ํธ ์ด์ฉ์ฑ์ ์ํด)๋ฅผ ๋๋ฌด ๋ง์ด ํ๋ ค๊ณ ํ๋ฉด ์ด๊ธฐ์ Dart๊ฐ ๋ถ๊ตฌ๊ฐ ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก UI DSL์ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ DSL์ _Dart_์๊ฒ ๊ด์ฉ์ ์ด์ด์ผ ํ๋ฉฐ, ์ธ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๋ก ์ ์ผ๋ก ๋ค๋ฅธ ์ธ์ด์์ ์์ ํ ์ ๊ฑฐ๋์ด์๋ ์ ๋ฉ๋๋ค.
๋ํ ์ธ๊ธ๋ ์ด์ ์ค ์ผ๋ถ๋ ์ค์ ๋ก ์์ฅ๋ ์ธ์ด ์์ค ๊ธฐ๋ฅ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด Javascript์ JSX DSL์ ํผ๋ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ฐ ์ฐ์ฐ์๋ฅผ ๊ณ์ํ๋ ค๋ฉด Dart๊ฐ ์ค์ ๋ก JS์์์ ๊ฐ์ด ์ ์ฒด ์ฐ์ฐ์ ๋ฒ์๋ฅผ ์ง์ํ๋ค๋ฉด return SomeWidget(...someArgs, arg: newValue);
return <SomeWidget {...someArgs, arg: newValue } />;
๋ฅผ ์ฝ๋ ๊ฒ์ด ๋ ๋์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋๋ SGML์ ๋ํ ์ฒจ๋ถ ํ์ผ์ด ์๋ ํ QML๊ณผ ์ ์ฌํ return SomeWidget { ...someArgs, arg: newValue };
์
๋๋ค.
@filleduchaos
ํนํ ์ธ์ด์ ๊ฐ๋ ฅํ ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ๊ตฌ๋ฌธ์ ํ๋๋ง ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? (Android SDK์ ํจ๊ป Java์ XML์ ์๋ ๊ฐ ๊ด๊ณ๋ฅผ ์ ์งํด ์์ต๋๋ค. JSX์ ๋งค์ฐ ์ ์ฌํ Javascript ๋ฐ HTML๊ณผ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ ์๋ DSX๋ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ SGML ๊ตฌ๋ฌธ์ ๋ค๋ฅธ ์ธ์ด์ ๋ํด ์๋ฏธ๊ฐ ์์ง๋ง ๋ฐ๋์ Dart์ ๋ํด์๋ ๊ทธ๋ ์ง๋ ์์ ๊ฒ์ ๋๋ค).
์๋ก ์ด์ธ๋ฆฐ๋ค๊ณ ์๊ฐํ๋ ๊ฒ๋ค์ ์ง์ง๊ธฐํ์ง ๋ง๊ณ (๊ทธ๋ฆฌ๊ณ ๊ด๊ณ๋ฅผ ์ ์งํ์ญ์์ค) ์ด๋์์ ์๋์ง์ ๊ด๊ณ์์ด ์ต๊ณ ์ ์์ด๋์ด๋ฅผ ์ ํํ๋ ๋ฐ ์ง์คํ์ญ์์ค. ๋น์ ์ ํ์ํ์ง ์์ ๋ ์ธ์์ ์ผ๋ก ๋ฌผ๊ฑด์ ๋ถ๋ฆฌํฉ๋๋ค.
JSX ๊ตฌ๋ฌธ์ ์ ํํ๋ ์ด์ ๋ React์์ ์ ์ธ์๋๊ณ React ์ฌ๋๋ค์ด ๊ธฐ๋ํ๊ณ ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ํฐ์ผ์ ๊ทธ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
์ด ๋ ์ง์ ์ ๋ณ์น๋ก ๋ณด๋ ๊ฒ์ ๋ค์ ํฅ๋ฏธ๋กญ์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ๋ค์ ๋จ์ง ์ ์์ ์ ์ฆ๋ช ํ๊ธฐ ์ํด์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. JSX๋ ํนํ ๋จ์์ฑ ๋๋ฌธ์ (Javascript์ ๊ฒฝ์ฐ) ํ๋ฅญํฉ๋๋ค. ์ด๋ฏธ JS ์ธ์ด ๊ตฌ์ฑ์ ๋ํ ๋จ์ํ ์คํ์ผ ๋ฟ์ด๋ฉฐ ์ค์ ๋ก ํน๋ณํ ์๋ฏธ ์์ฒด๋ฅผ ๊ตฌํํ์ง๋ ์์ต๋๋ค. ๋น์ ์ ๊ทธ ๋จ์ํจ์ ์ณ๊ฒ ์นญ์ฐฌํ ๋ค์ DSX๊ฐ 1) ์ผ๋ง๋ ๋ ๋ง์ ์์ ์ ์๊ตฌํด์ผ ํ๋์ง, 2) DSX๊ฐ ๋ชฉํ ์ธ์ด์ ๋ฌด๊ดํ๊ฒ ์๋ฏธ๋ก ์ ์์ฒด์ ์ผ๋ก ๊ตฌํํด์ผ ํ๋ค๊ณ ๋งํฉ๋๋ค. ๊ฐ๋จํ์ง๋ง ๊ฐ๋ ฅํ DSL.
์๋ก์ด ์๋ฏธ๋ฅผ ๊ตฌํํ๋์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ๋จ์ํจ์ ์ฌ์ฉ๋ฒ์์ ๋น๋กฏ๋ฉ๋๋ค. ์ฌ์ฉ์/๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๋ฉด ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์/๊ฐ๋ฐ์๋ ๋ด๋ถ์ ์ผ๋ก ์ผ๋ง๋ ๋ณต์กํ์ง(๋๋ ์ผ๋ง๋ ๋ง์ ์์ ์ ์ํํด์ผ ํ๋์ง)์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ , ์ถ์ ์ผ๋ง๋ ๋จ์ํ๊ฒ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋์ง์๋ง ๊ด์ฌ์ ๊ฐ์ต๋๋ค.
์ด์ ์ ๊ทํ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ๋ณธ ์ ์ด ์์ผ๋ฉฐ ์ธ์์ ์ธ ์์ ์ด์ง๋ง Javascript๋ฅผ ์ธ์ด๋ก(๋ฐ๋ผ์ JSX) ๊ธฐ๋ณธ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ์์ผ๋ก ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํ ๊ทผ์ ํ์ง ์์ต๋๋ค.
DSX์ ๋ํ ํ์ฐ ์ ๋ํ ๋์ ์๋๋ ํ์ฐ์ ์์ ํ JS ๊ตฌํ์ด ์๋๋ผ ์์ฑ์ ํ์ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ทธ๋๋ก ์ ์๋ํ๋ฉฐ ์ ํ ์์ ๋ฌธ์ ๊ฐ ์ ํ ์์ต๋๋ค. ์ ํ ๊ฒ์ฌ/์ ํ์ฑ์ Dart๊ฐ DSX๊ฐ ์์ฑํ๋ ๊ฒ์ ์ปดํ์ผํ ๋ ๋ฐ์ํฉ๋๋ค.
์ด๊ธฐ์ ๋คํธ๋ฅผ ๋ถ๊ตฌ๋ก ๋ง๋ค์์ต๋๋ค.
์ด๊ธฐ์ Dart๋ฅผ ๋ฐฉํดํ ๊ฒ์ ๊ฐ๋จํ JS ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ์ฌ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Dart ์ฝ๋์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค(๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง). ๋ํ ์ด๊ฒ์ Dart๊ฐ ์คํจํ ๊ณณ์์ Typescript๊ฐ ์ฑ๊ณตํ ๊ฒ๊ณผ ๋๊ฐ์ ์ด์ ์ ๋๋ค.
๋ฌผ๋ก UI DSL์ ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ DSL์ ์ธ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๋ก ์ ์ผ๋ก ๋ค๋ฅธ ์ธ์ด์์ ์์ ํ ์ ๊ฑฐ๋์ด์๋ ์๋๋ฉฐ Dart์๊ฒ ๊ด์ฉ์ ์ด์ด์ผ ํฉ๋๋ค.
์ธ๊ธฐ๊ฐ ๋ชจ๋ ๊ฒ์ ๊ฒฐ์ ํฉ๋๋ค. ์ต๊ณ ์ ์์ด๋์ด๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ ์ด์ ์ ๋์ด ํ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋์คํ๋๊ธฐ ๋๋ฌธ์ ์ต๊ณ ์ ์์ด๋์ด์ ๋๋ค.
๋ํ ์ธ๊ธ๋ ์ด์ ์ค ์ผ๋ถ๋ ์ค์ ๋ก ์์ฅ๋ ์ธ์ด ์์ค ๊ธฐ๋ฅ ์์ฒญ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด Javascript์ JSX DSL์ ํผ๋ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ค์ ๋งํ์ง๋ง ์ด๊ฒ์ ๊ด๋ จ์ด ์์ต๋๋ค.
Google(Dart/Flutter) ์ง์์๊ฒ ์ ๋ง ํ์ํ ๊ฒ์ ์์ค ๋งต์ ํตํ ์ผ๋ฐ์ ์ธ ํธ๋์คํ์ผ๋ง ์ง์์ผ๋ก, Dart/Flutter๋ฅผ ๋์์ผ๋ก ํ๋ ๋ ๋์ ์์ค์ ์ธ์ด๋ฅผ ๊ฐ๋ฐํ ์ ์๊ณ ํ์ฌ ๋๊ตฌ(IDE, ๋๋ฒ๊ฑฐ ๋ฑ)์์ ์ ์๋ํฉ๋๋ค. . ๊ฒฝ์์ ์ฅ์ ํ์ ํ๋ฉด ์ต๊ณ ์ ์์ด๋์ด๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค๋ก๋ถํฐ ํ๋ซํผ์ผ๋ก ๋์ฌ ๊ฒ์์ ๋ณด์ฅํฉ๋๋ค.
@cbazza
JSX ๊ตฌ๋ฌธ์ ์ ํํ๋ ์ด์ ๋ React์์ ์ ์ธ์๋๊ณ React ์ฌ๋๋ค์ด ๊ธฐ๋ํ๊ณ ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ํฐ์ผ์ ๊ทธ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
๊ทธ๊ฒ์ ์คํ๋ ค ๋ถ์ด์ ์ด๋ฉฐ ๋์๊ฒ ์๋นํ ์๊ฒฉ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Flutter๊ฐ ํน์ React ๊ตฌ๋ฌธ์ ๋ํด ์ผ๋ฅ ์ง์์ ์ ๊ณตํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? Vue ๊ตฌ์ฑ ์์ ํ์ผ ๋๋ Xamarin.Forms ๊ตฌ๋ฌธ์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? Flutter์ฉ (์๋ง๋ ๊ณต์) UI DSL์ด ๋ค๋ฅธ ์ธ์ด๋ก ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ํน์ ์ฌ๋๋ค์ด ๊ธฐ๋ํ๊ณ ์ํ๋ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? React/JS ๊ฐ๋ฐ์๋ฅผ ์ํ ์ปค๋ฎค๋ํฐ ๋๊ตฌ๋ฅผ ์ํ์ ๋ค๋ฉด ๊ทธ ์ค ํ๋๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์์ํฌ ์์ฒด์ ์ค๋ก์ง ์ฌ๋ฌ๋ถ ๋ชจ๋๋ฅผ ์์ฉํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ํฌํจํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ์ฝ๊ฐ ๋ง์ IMO์ ๋๋ค.
์๋ก์ด ์๋ฏธ๋ฅผ ๊ตฌํํ๋์ง ์ฌ๋ถ๋ ์ค์ํ์ง ์์ต๋๋ค. ๋จ์ํจ์ ์ฌ์ฉ๋ฒ์์ ๋น๋กฏ๋ฉ๋๋ค. ์ฌ์ฉ์/๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๋ฉด ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์/๊ฐ๋ฐ์๋ ๋ด๋ถ์ ์ผ๋ก ์ผ๋ง๋ ๋ณต์กํ์ง(๋๋ ์ผ๋ง๋ ๋ง์ ์์ ์ ์ํํด์ผ ํ๋์ง)์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ , ์ถ์ ์ผ๋ง๋ ๋จ์ํ๊ฒ ๋ง๋ค๊ณ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋์ง์๋ง ๊ด์ฌ์ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ์ ์๊ฐ์ ์ด์ํ ํํ์ ์๊ฒฉ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์, ๊ฐ๋ฐ์ ๋ ์ถ์ํ์ ๋ณต์ก์ฑ์ด ๊ทธ๋ฌํ๋ฏ์ด ๋ฌธ์ ์ ๊ธฐ๋ฅ ๋๋ฆฌํํธ๋ฅผ ์ผ์ผํค๊ธฐ ์์ํ ๋ ๊ตฌํ์ด ์ผ๋ง๋ ๋ณต์กํ์ง์ ๋ํด ๊ด์ฌ์ ๊ฐ์ง ๊ฒ์ ๋๋ค. DSL์ ์ฌ์ฉํ๋ ๊ฒ ์ด์์ ์์ ์ ์ํํ๋ ค๋ ๊ฐ๋ฐ์(์: ํ์ฅ)๋ ๊ตฌํ์ด ์ผ๋ง๋ ๋ณต์กํ์ง์ ๋ํด ๊ฐ์ฅ ํ์คํ ๊ด์ฌ์ ๊ฐ์ง ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๊ตฌ์ถํ๊ณ ์ ์ง ๊ด๋ฆฌํด์ผ ํ๋ ๊ฐ๋ฐ์๋ ์ด์ ๋ํด ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์๋ ์ฌ๋๋ค์ ๋๋ค.
DSX์ ๋ํ ํ์ฐ ์ ๋ํ ๋์ ์๋๋ ํ์ฐ์ ์์ ํ JS ๊ตฌํ์ด ์๋๋ผ ์์ฑ์ ํ์ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ทธ๋๋ก ์ ์๋ํ๋ฉฐ ์ ํ ์์ ๋ฌธ์ ๊ฐ ์ ํ ์์ต๋๋ค. ์ ํ ๊ฒ์ฌ/์ ํ์ฑ์ Dart๊ฐ DSX๊ฐ ์์ฑํ๋ ๊ฒ์ ์ปดํ์ผํ ๋ ๋ฐ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ํด ์ ํ ์๊ฐํ์ง ์๋ ๊ฒฝ์ฐ์๋ง "์ ํ ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค". ๋ด๊ฐ ๋งํ ๊ฒ์ ์ธ์ ๋งต์ด Dart ์ฝ๋๋ฒ ์ด์ค์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์์ ํ ์์ ํ ๋ฐฉ์์ผ๋ก _์ฌ์ฉํ ์ ์์_์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์์ ์๋ง๋ JavaScript์์ ์ํ ๋ฑ์ผ๋ก ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ด๋ฌํ ์ธ์์ ์ํธ ์์ฉํ๊ธฐ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์์ ฏ, ๋ค๋ฅธ ๋ชจ๋์์ ๊ฐ์ ธ์ค๊ธฐ ๋ฑ - ํ ๊ณณ์์ ์ ์ธํ๋ ๊ฒ์ด ์๋๋ผ ์ผ๋ฐ์ ์ธ ์์ฑ์ ํธ์ถ์ ๋ํ ์์ ์ด ๋ฌด์์ ๋๊น?
๋ด ๋ง์ ์ค๋ช ํ๊ธฐ ์ํด JS์์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
class MyCustomSize {
constructor(length, width, height) {
this.length = length;
this.width = width;
this.height = height;
this.calculateVolume.bind(this);
}
calculateVolume() {
return this.length * this.width * this.height;
}
}
const Cuboid = ({ length, width, height }) => { // blah blah }
const literalSize = { 'length': 30, 'width': 20, 'height': 10 };
const size = new MyCustomSize(30, 20, 10);
size.length = 100; // Can interact with the object as normal, no compromises
console.log(size.getVolume()); // and even call methods
size.foo = 50 // If you're using TypeScript, you get a nice error
literalSize.height = 15 // can interact with the hashmap as though it were an object
const SomeComponent = () => (
<div>
<Cuboid {...literalSize} />{/* valid */}
<Cuboid {...size} />{/* also valid even though size is an object */}
</div>
)
๊ทธ๋ฌ๋ Dart์ ์ธ์์ ํด์๋งต์ด ํ์ํ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
class MyCustomSize {
int length, width, height;
MyCustomSize(this.length, this.width, this.height);
calculateVolume() {
return length * width * height;
}
}
class Cuboid extends StatelessWidget {
final int length, width, height;
Cuboid(this.length, this.width, this.height);
<strong i="9">@override</strong>
Widget build(BuildContext context) { // blah }
}
Map literalSize = { 'length': 30, 'width': 20, 'height': 10 };
Map invalidSize = { 'length': 300, 'width': 200, 'height': 100 };
final size = MyCustomSize(30, 20, 10);
literalSize.height = 15; // Invalid, you must use square bracket notation which is honestly ugly to do a lot of the time
invalidSize['foo'] = 50; // No indication of anything wrong here
class SomeWidget extends StatelessWidget {
<strong i="10">@override</strong>
Widget build(BuildContext context) {
return (
<Column>
<Cuboid {...literalSize} />{/* Yes, works */}
<Cuboid {...invalidSize} />{/* Sure the transpiled code errors as there is no parameter named foo. But this is now a completely opaque error. What if the `foo:50` key-value pair was added in some other section of your codebase? In a third party library even? How do you debug that*/}
<Cuboid {...size} />{/* How do you plan on handling this as a plain transpilation step? */}
</Column>
)
}
}
์ด๊ธฐ์ Dart๋ฅผ ๋ฐฉํดํ ๊ฒ์ ๊ฐ๋จํ JS ์ํธ ์ด์ฉ์ฑ์ ์ ๊ณตํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ์ฌ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Dart ์ฝ๋์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค(๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง). ๋ํ ์ด๊ฒ์ Dart๊ฐ ์คํจํ ๊ณณ์์ Typescript๊ฐ ์ฑ๊ณตํ ๊ฒ๊ณผ ๋๊ฐ์ ์ด์ ์ ๋๋ค.
Dart์ JS์ ์ํธ ์ด์ฉ์ ๊ฒฐ์ฝ ๋ณต์กํ์ง ์์ต๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ ๊ฐ ๊ณ์ ๊ฐ์กฐํ๋ ์ ์ ๋๋ค) ๋จ์ํ Javascript๋ฅผ ์์ฑ ํ๊ณ ๋ค๋ฅธ ๊ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ์ซ์ดํ์ง ์๋ ํ. Typescript๊ฐ ์์ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ JS์ ํจ๊ป ์๋ํ๋ ๊ฒ์ ๊ทธ๋ค์ง ๋ง์ง ์์ต๋๋ค. JS์ ๋ง์ถ๊ธฐ ์ํด ์๋์ ์ผ๋ก ๋ถ๊ฑด์ ํ ์ ํ ์์คํ ์ ๊ฐ์ถ ์ ๋์ ๋๋ค. ๋น์ด๋จน์ ๋ถ๋๋ฌ์ด ์ด ๋ช ๋ ๋์). ํ์ง๋ง ์ ์์ ์ผ๋ก ๋์๊ฐ์ ๊ฐ์ธ์ ์ผ๋ก Dart๋ JS๋ฅผ ์ํด ์๋นํ ์๋ชป๋ ๋์์ธ ๊ฒฐ์ ์ ๋ด๋ ธ๊ณ Dart 2๋ ์ค์ ๋ก ์ธ์ด์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ธ๊ธฐ๊ฐ ๋ชจ๋ ๊ฒ์ ๊ฒฐ์ ํฉ๋๋ค. ์ต๊ณ ์ ์์ด๋์ด๋ ๋ง์ ์ฌ๋๋ค์ด ๊ทธ ์ด์ ์ ๋์ด ํ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋์คํ๋๊ธฐ ๋๋ฌธ์ ์ต๊ณ ์ ์์ด๋์ด์ ๋๋ค.
"Best" ๋๋ ์คํ๋ ค ์ข์ ์์ด๋์ด๋ ์ฅ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ข์ ์์ด๋์ด์ ๋๋ค. ์ธ๊ธฐ๊ฐ ์์ ๋๋ ์๊ณ ๊ทธ๋ ์ง ์์ ๋๋ ์์ต๋๋ค. ๋์ ์์ด๋์ด๊ฐ ์ธ๊ธฐ๋ฅผ ๋ ๋๋ ์์ง๋ง ๊ทธ๋ ์ง ์์ ๋๋ ์์ต๋๋ค. ์ธ๊ธฐ๊ฐ ์ฅ์ ์ ์ง์ ์ ์ธ ์งํ๋ผ๊ณ ์ ์ํ๋ ๊ฒ์ ์์งํ ํฐ๋ฌด๋์์ผ๋ฉฐ ๊ฐ์ธ์ ์ผ๋ก ์์ ๊ท๋ชจ์ Dart ์ปค๋ฎค๋ํฐ์ ํผ์ง์ง ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ํ๋์ ๋๋ค.
Google(Dart/Flutter) ์ง์์๊ฒ ์ ๋ง ํ์ํ ๊ฒ์ ์์ค ๋งต์ ํตํ ์ผ๋ฐ์ ์ธ ํธ๋์คํ์ผ๋ง ์ง์์ผ๋ก, Dart/Flutter๋ฅผ ๋์์ผ๋ก ํ๋ ๋ ๋์ ์์ค์ ์ธ์ด๋ฅผ ๊ฐ๋ฐํ ์ ์๊ณ ํ์ฌ ๋๊ตฌ(IDE, ๋๋ฒ๊ฑฐ ๋ฑ)์์ ์ ์๋ํฉ๋๋ค. . ๊ฒฝ์์ ์ฅ์ ํ์ ํ๋ฉด ์ต๊ณ ์ ์์ด๋์ด๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค๋ก๋ถํฐ ํ๋ซํผ์ผ๋ก ๋์ฌ ๊ฒ์์ ๋ณด์ฅํฉ๋๋ค.
...๋น์ ์ด ์ ๋ณด๋ค ๋ ๋ง์ ์๊ฒฉ์ ๊ฐ๊ฒ ๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ง ์์์ง๋ง, ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ ์์ต๋๋ค. ์ ์ด ํ๋์ UI SDK๊ฐ ์ ์ธ๊ณ์ ๋ชจ๋ ๊ณ ๊ธ ์ธ์ด์์ ํ๊ฒํ ํ ์ ์์ด์ผ ํฉ๋๊น? ๋ค์ ํ ๋ฒ ๊ฐ๋ ฅํ๊ฒ ์ ์์ "Dart/Flutter๋ฅผ ๋ด ์ธ์ด/ํ๋ ์์ํฌ๋ก ๋ง๋ค๊ธฐ"๋ก ๊ฐ๋ ฅํ๊ฒ ๋์ต๋๋ค. ๋ฐ๋ก ๋์์ Javascript๋ก Flutter ์ฑ์ ๋น๋ํ๊ณ ์ถ๋ค๊ณ ๋งํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค, ๋น์ ์ ํ๊ฟ์น์ ๋ ๋ง์ ๊ธฐ๋ฆ์ ๋ฐ๋ฅด๊ณ ์ ๋ ๊ทธ๋ฐ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๋ฐ ๋ชจ๋ ๊ธฐ์ฌํ๊ฒ ์ง๋ง, ๊ณต์์ ์ธ ์ง์์ ์์ฒญํ์ ๋ ๊ธ์ ์ ์ธ ๋๋ต์ ๊ธฐ๋ํ๋ ๊ฒ์ ์์งํ ๋ง๋ ์๋ฉ๋๋ค.
๋ค์ ํ ๋ฒ ๋ฐ๋ณตํฉ๋๋ค. ์ ๋ UI DSL์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ข์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ์ ๊ตฌ์๋ฌ๋ผ๊ณ ์์ฒญํ๋ค๋ฉด Dart์ ๊ด์ฉ์ ์ธ DSL์ด์ด์ผ ํฉ๋๋ค. ์, ์ค์ ๋ก Dart๋ฅผ ์ธ์ด๋ก ์ข์ํ๋ ์์ญ ๋ช ์ ์ฌ๋๋ค์ด ์์ต๋๋ค.
๋ ๋ค๋ฅธ ํธ์ง: DSL์ ์์ฒญํ๊ณ , JSX๋ฅผ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ/๊ตฌ๋ฌธ ์๊ฐ์ผ๋ก ์ ์ํ๊ณ , ๋ค๋ฅธ ์ ์์ ์ด๋ ค ์๋ ๊ฒ์ด ํ ๊ฐ์ง์ ๋๋ค. ๋๋ฅผ ๋ฌธ์ง๋ฅด๋ ๊ฒ์ DSX ์ ๋ํ ์ฃผ์ฅ์ ๋๋ค.
@filleduchaos
๋น์ ์ ์ฐ์ค๊ฝ์ค๋ฝ๊ฒ ํผ๋์ค๋ฌ์ํ๊ณ ๋๋ ์์ง ๋ญ๋นํ ์๊ฐ์ด ๋ง์ง ์์ต๋๋ค.
๋ด๊ฐ Dart/Flutter ํ์๊ฒ ๋ฌป๊ณ ์ถ์ ๊ฒ์ ๋ด๊ฐ ์ ์ ๋งํ ๊ฒ๋ฟ์ ๋๋ค.
What we really need from Google (Dart/Flutter) people is generic transpiling support via source maps so that any higher level language can be developed that targets Dart/Flutter and it would work just fine with the current tools (IDE, debugger, etc). Level the playing field and you guarantee the best ideas will come to the platform from others.
์ด๋ DSX, Vue ๊ตฌ์ฑ ์์ ํ์ผ, Xamarin.Forms, NativeScript, QML ๋ฑ์ ๊ตฌํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํ๋ฏ๋ก ์ปค๋ฎค๋ํฐ๊ฐ ์ํ๋ ๋ชจ๋ ๊ฒ์ ์ ์ํ ์ ์์ผ๋ฉฐ ์๋ฌด๋ ๋ด DSX๋ฅผ '์ทจ๊ธ'ํ ํ์๊ฐ ์์ต๋๋ค. DSX๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ผ๋ฐ Dart๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฝ๊ฒ ์์ ๋ง์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
https://github.com/dart-lang/build ๋ฐ dartanalyzer์ ๊ฐ์ ๊ฒ์ ์ฐพ๊ณ ์๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ pub ์ข
์์ฑ์ผ๋ก ๋ง๋๋ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ํ๋ ๋ถ๋ถ์ ๋์น ์ ์์ง๋ง Dart ํ์ด ์ด๋ฅผ ์ ๋์์ค ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์ด์จ๋ ๊ณ์ํด์ ์๋ก์๊ฒ ๊ฐํนํ ํ๋์ ํ๋ ๊ฒ์ด ์ด๋ค ์์ผ๋ก๋ ํ๋ ์์ํฌ์ ๋ฐ์ ์ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ์์ ์ป์ ์ ์๋ ๋๋ถ๋ถ์ "๋๋ฌด ๋จ๊ฑฐ์์ก๊ธฐ" ๋๋ฌธ์ ์๊ตฌ์ ์ผ๋ก ๋ซํ ๋ ๋ค๋ฅธ ๋ฌธ์ ์
๋๋ค.
@filleduchaos
'foo' ์์ ๊ด๋ จํ์ฌ DSX ์คํ๋ ๋ ๋ ์ปดํ์ผ ์๊ฐ์ด๋ฏ๋ก ๋งต์ const
๋ก ์ ์ํด์ผ ํฉ๋๋ค. ์ DSX ํค์๋ ๋๋ ์ด์ ๋ํ ์ฃผ์ ๋ค์ const ๋งต). Dart๋ ๋ฐํ์์ ๋์ ์์ฑ์ ๋งค๊ฐ๋ณ์ ์ฝ์
์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ด ์๋ ์ปดํ์ผ ์๊ฐ์ ์์ด์ผ ํฉ๋๋ค. ๋ด๊ฐ ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ , ์ฆ ์์ฑ์์ ์์ฑ์ ํผ๋จ๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
@cbazza ์์ ์ JS/JSX์์ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ๋ง๋๋ ๋ถ๋ถ์ "ํด์๋งต๋ง ์ฌ์ฉํ ์ ์์" ๋๋ "์ปดํ์ผ ์ ๋ชจ๋ ์ธ์๋ฅผ ์์์ผ ํฉ๋๋ค"์ ๊ฐ์ ์ ํ์ ๋ถ๊ณผํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ "๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ์ํธ ์์ฉํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์ ฏ์ ์ ๋ฌํ๋ ค๋ ์ธ์/์ํ๊ณผ ์ํธ ์์ฉํ ์ ์์ต๋๋ค"(์์ฑ์ด ์๋ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฌด ๊ฒ๋ ์ ์ํ์ง ์์์ต๋๋ค. need๋ ์ค์ ๋ก ๋งต ๋ฆฌํฐ๋ด์ด ์๋๋ผ ๊ฐ์ฒด์ ๋๋ค.) -0 ๊ฐ๋จํ ์์ผ ๋๋ ๋ชจ๋ ํ๋ฅญํ์ง๋ง, ์ค๊ฐ ๊ท๋ชจ ํ๋ก์ ํธ์์ ๊ทธ๋ฐ ์ข ๋ฅ์ ์ผ์ ๋งค์ฐ ์ค๋ง์ค๋ฌ์ด _๋น ๋ฅธ_ ์ผ์ด ๋ ๊ฒ์ ๋๋ค. ์ ๋ง์, ์ด๋ ์์ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ, ํํ ๋ฐ ์ฃผ์์ ๋ํ ์์ด๋ ๊ฒ์ ๋ฉ์ถ๊ณ ํ ๊ฑธ์ ๋ฌผ๋ฌ๋์ ํ์ฅ ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์กด์ฌํ๋ ์ธ์ด์ ์ ํฉํ์ง ๊ถ๊ธํดํฉ๋๊น?
JSX๋ (๋๋ถ๋ถ์ ํ
ํ๋ฆฟ๊ณผ ๋น๊ตํ์ฌ) ๋งค์ฐ ์ฑ๊ณต์ ์ด์์ต๋๋ค. ํน์ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋๋ก ๊ฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. _any_ JavaScript์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒ์ ๊ฑฐ์ ์์ ํ ๊ณ ํต์ค๋ฝ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก ์ธ์ด์ ๋ง๋ DSL์ ์์ฑํ๋ค๋ ์๋ฏธ์
๋๋ค. Redux๋ ๋น์ทํฉ๋๋ค. JS ์ฝ๋๋ฒ ์ด์ค์ Redux๋ ์๋ฆ๋ค์ด ๊ฒ์
๋๋ค(์ ์ ํ๊ฒ ์ฌ์ฉ๋ ๋). ๋ฐ๋ฉด์ Redux๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ฌ ๋ณธ ๋ชจ๋ Flutter ์์ ๋ Streams/BLoC ํจํด์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ ๋ ์์งํ ๊ณ ํต์ค๋ฌ์ ๋ณด์
๋๋ค. ๊ทธ๋ ๋ค๊ณ ํด์ ํฐ ์ฑ๊ณต๊ณผ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋ค๋ ๋ง์ ์๋๋๋ค. React์ Context
์ Flutter์ InheritedWidget
๋ ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ์์ฉํ ์ ์๋ ๊ณตํต ๊ฐ๋
์ ๊ตฌํํฉ๋๋ค. JSX๊ฐ ํ์ฌ ๊ทธ๋ฌํ ๊ฒ๋ค ์ค ํ๋๋ผ๊ณ ํ์ ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ธ์ด ์์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ธํ๊ณ ์์งํ DSX๋ ๊ฐ๋ฐํ๊ธฐ ํ๋ _๊ทธ๋ฆฌ๊ณ _ ์ฌ์ํ ์์ ์ด์์ ์ฌ์ฉํ๋ ๊ณ ํต์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค. JS์ ๋งคํํ๋ ๊ฒ์ด ์ผ๋ง๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๊ฒ์ผ๋ฅธ ์ฃผ๋ง์ ์ฒ์๋ถํฐ ๊ธฐ๋ฅ์ด ์๋ฒฝํ JSX ๋ณํ๊ธฐ.
๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ข ๋ ์ผ์ฐ ๊ณต๊ฒฉ์ ์ด์๊ณ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
@filleduchaos
๋๋ ๋ชจ๋ ๊ณณ์์ ์๋ํ๋ ์์ ํ ์ผ๋ฐ์ ์ธ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ๋ง๋ค๋ ค๊ณ ํ์ง ์์ต๋๋ค. ๋ฏธ๋์ Dart์ ๋ํด ๊ณํ๋ ๊ฒ์กฐ์ฐจ๋ JS์ ๊ฒ๋งํผ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. DSX์ ๋งฅ๋ฝ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์คํ๋ ๋ ๊ฐ ์ํ๋ ๊ฒ์ ์ ์ํ๋ฉ๋๋ค. DSX๋ ์๋ฅผ ๋ค์ด ๊ฐ์ฒด๋ฅผ ํ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
์คํ๋ ๋ ์ปฌ๋ ์
https://github.com/dart-lang/language/issues/47
JSX๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ํ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ์ผ๋ฉฐ ํ๊ทธ ์์ฑ์ ๋ํด ์คํ๋ ๋ ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์ ํ ์์์ต๋๋ค. JSX๋ ๊ทธ๊ฒ ์์ด๋ ์ ์๋ํฉ๋๋ค. ๋ด๊ฐ DSX์ ์ถ๊ฐํ ์ด์ ๋ Flutter ์์ ฏ์ ๋ํ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์๋ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํนํ ์์ ฏ์ด ์์ฑ์์์ 20๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ ฏ์ ๋ง๋๋ 20๊ฐ ๋ฏธ๋ง์ ์ฐ์ ๋ผ์ธ์ ์ด๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ์ ์์ต๋๊น? ๋๋ฌด๋ ์ด๋ช ์ ํผ๋ผ๋ฏธ๋. DSX ์คํ๋ ๋์ ์ ์ผํ ๊ธฐ๋ฅ์ ์ด๋ฌํ ๋ผ์ธ ์ค ์ผ๋ถ๋ฅผ ํธ๋ฆฌ์์ ๊ฐ์ ธ์ ๋ค๋ฅธ ๊ณณ์ ๋ฐฐ์นํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
@cbazaa React Native๋ฅผ ์ฌ์ฉํ ์ง Flutter๋ฅผ ์ฌ์ฉํ ์ง ํ๊ฐ ์ค์ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ด UI ์คํ๋ฅผ ํ์ธํ ์ ์๋๋ก ๋ชจ๋ ๊ฒ์ด Dart์ด๊ธฐ ๋๋ฌธ์ Flutter์ ๊ธฐ๋๊ณ ์์ต๋๋ค. ์ฐธ์กฐ: https://medium.com/flutter-io/out-of-depth-with-flutter-f683c29305a8
JSX๋ ๋ด ์คํ๋ ๊ฐ์งํฉ๋๊น? ์ ๋ TypeScript๋ฅผ ์ฌ์ฉํฉ๋๋ค.
HTML/๋ณ๋์ ๋งํฌ์ ์ ์ซ์ดํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Angular์์ HTML์์ ๋ฌด์ธ๊ฐ/๋ณ์๋ฅผ ์๋ชป ์ ๋ ฅํ๋ฉด ํ์ด์ง๋ฅผ ๋ ๋๋งํ ํ์๋ง ์ค๋ฅ๋ฅผ ์ฐพ์ต๋๋ค.
@sivabudh
JSX๋ ๋ด ์คํ๋ ๊ฐ์งํฉ๋๊น? ์ ๋ TypeScript๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์, ์ผ๋ถ JSX ์คํ๋ ์ปดํ์ผ ์๊ฐ(์: ๊ตฌ์ฑ ์์ ์ด๋ฆ)์ ํฌ์ฐฉ๋์ง๋ง JS/ES6์ ์ฌ์ฉํ ๋ ์ํ ์ด๋ฆ(๋ฐํ์์ ํฌ์ฐฉ๋จ)์ ํฌ์ฐฉ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ TypeScript๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ํ ์์คํ
์ ์ปดํ์ผ ํ์์ ๋ชจ๋ JSX ์คํ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
https://www.typescriptlang.org/docs/handbook/jsx.html
@cbazza ๋ dsx
์คํ ์์ค์
๋๊น?
@pushqrdx
์์ง ์์ค ์ฝ๋๋ฅผ ๊ณต๊ฐํ์ง ์์์ต๋๋ค.
React + TypeScript ๋ฐ Flutter์ ์๋น์๋ก์ ์ ๋ ์ค์ค๋ก๋ฅผ ํ ์คํฐ๋ก ์ ์ํ ์ ์์ต๋๋ค. ๊ฑด๋ฐฐ
dsx ์์ค๊ฐ ์์ต๋๊น? ์์ฃผ ์ข์ ๊ฒ์ ๋๋ค!
cbazza์ ๋ ธ๋ ฅ์ ๋ฐ์๋ฅผ ๋ณด๋ด์ง๋ง Flutter์์ DSX๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋๋ ํ ์คํธํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
๋ฌธ์ #27141์ ๋น๋ ์์คํ
์ ๋ํ ์ฝ๋ ์์ฑ ์ง์ ์ถ๊ฐ๋ฅผ ์ถ์ ํฉ๋๋ค. ์ด๊ฒ์ https://github.com/dart-lang/build with Builder
๋ฅผ ํตํด ์ํ๋ฉ๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ด ๊ธฐ๋ฅ์ด ์ค๋น๋๋ฉด dsx ์ปดํ์ผ๋ฌ/ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๋นํ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
2ํ๋ง์ ์ด๋ ๊ฒ ๋์ง๊ธด ํ์ ์ฒ์ ๋ง๋ฌ์ต๋๋ค.
์ด๊ฒ์ JSX์ ๋ํ ํ ๋ก ์ด ์๋๋ผ ์ค์ฒฉ ์ง์ฅ์ ๋ํ ํ ๋ก ์ ๋๋ค.
JSX ์๋ฃจ์ ์ ์ ๊ณตํ ์ ์๋๋ผ๋ ์ค์ฒฉ์ ์ค์ด๊ณ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ฌ์ผ ํฉ๋๋ค.
JSX์ ์ฅ์ ์ ๋น์ฐํ๋ค๊ณ ์๊ฐํ๋๋ฐ ํ๋ฌํฐํ์ ์ด๋ฅผ ๊ฐ๊ณผํ๋ ค ํฉ๋๋ค.
JSX๋ ์ค์ฒฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์์ต๋๋ค. ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ ๋ฐ์
๊ทธ ๋ค์คํ ์ด ์ซ๋ค๋ฉด ๋ค์คํ ์ง์ฅ์ ํด๊ฒฐํ๋ ค๋ ์๋์ธ React hooks์ ํฌํธ์ธ hooks ๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
JSX๊ฐ ๋ฑ์ฅํ ์ด์ ๋ฅผ ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. h/createElement
ํจ์๊ฐ ์ ๋๋ก ์์ฑ๋์ง ์์๊ณ ์ฝ๋ ๊ฐ๋
์ฑ์ด ์ข์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ป๋ฐ์๋ ์ด์ flutter๋ ๋์ผ๋ก ๋ณผ ์ ์๋ h/createElement
ํจ์๋ณด๋ค 10,000๋ฐฐ ๋ ๋์๊ฒ ์์ฑ๋ฉ๋๋ค.
JSX๋ React๊ฐ ํต์ฌ์ ์ผ๋ก Javascript์ HTML์ ํผํฉ์ด๊ธฐ ๋๋ฌธ์ ์๊ฒจ๋ฌ์ต๋๋ค. Javascript ๋ณด๊ฐ/์ฝ์ ์ด ํฌํจ๋ XML ๊ตฌ๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ JSX๋ฅผ ์์ฑํฉ๋๋ค.
Flutter๋ Javascript ๋ฐ HTML๊ณผ ์์ ํ ๋ณ๊ฐ์ด๋ฏ๋ก JSX๋ก ์ ๋ณํ๋์ง ์์ต๋๋ค. Flutter ํ๋ก์ ํธ๋ ์ข
์ข
๋งค์ฐ ์ค์ฒฉ๋์ด ์์ผ๋ฉฐ ํนํ dartfmt
๊ฐ ์ค์ฒฉ์ด ๋ง์ด ๋ ๋ผ์ธ์ ๋ถ์๋ ๊ฒฝ์ฐ ์ ๋ง ๊ณ ํต์ค๋ฌ์ธ ์ ์๋ค๋ ์ ์ ๋์ํฉ๋๋ค. ๋์ฐํ๋ค.
๋ํ React์์ ์ฒ์ ์ ํ์ ๋ Flutter๊ฐ ๋์ฐํ๊ฒ ๊ตฌ์กฐํ๋์๋ค๊ณ ๋๊ผ์ง๋ง ์ด๊ธฐ ํ์ต ๊ณก์ ์ ์ง๋๋ฉด Flutter๊ฐ ๊ฐ๊ด์ ์ผ๋ก ํจ์ฌ ๋ ์ฝ๊ฒ ์์ ํ ์ ์์ต๋๋ค. ํ์ต ๊ณก์ ์ Flutter์๋ง ์๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ํ๋ ์์ํฌ๋ฅผ ํ์ตํ ๋ ์ผ๋ฐ์ ์ ๋๋ค. Flutter๋ ๋ง์ ์ฌ๋๋ค์๊ฒ ์ต์ํ HTML ๊ตฌ๋ฌธ์ฒ๋ผ ์๋ํ ์ด์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํนํ ์ด๋ ต์ต๋๋ค.
์ค์ฒฉ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ JSX๊ฐ ๋ต์ด ์๋๋๋ค.
๋ช ๊ฐ์ง ์์ด๋์ด:
์ฌ๋๋ค์ด ๊ฑฐ๋ํ ํ๋ฌํฐ ํธ๋ฆฌ๋ฅผ ๋ ์์ ๊ตฌ์ฑ ์์๋ก ๋ถํดํ๋๋ก ์๊ตฌํ๋ ๋ด๋ถ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๊ฐ๋ฐํ์ญ์์ค.
dartfmt
๋ฅผ ์ป์ผ๋ฉด Flutter๊ฐ Dart ํจํค์ง์ ๋น๊ตํ ๋ ๊ณ ์ ํ ํ์ํ ์๊ตฌ ์ฌํญ์ด ์์์ ๊ณต์์ ์ผ๋ก ์ธ์ํ๊ณ Flutter/Dart ํ๊ณผ ํ๋ ฅํ์ฌ ํฉ๋ฆฌ์ ์ธ ์๋ฃจ์
์ ๋ด๋์ต๋๋ค. @munificent
@rrousselGit ์ @stateless
ํจํค์ง์ ๊ฐ์ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ 1๋ฒ์ ๋ ์ฝ๊ฒ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
๊ณตํํ๊ฒ, ์ค์ฒฉ ๋ฌธ์ ๋ ์ฃผ๋ก ์ฝ๋ ๊ตด์ ์ ์ํ์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค.
์์ ฏ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์กฐ๊ฐ์ผ๋ก ๋๋ฉ๋๋ค.
extract widget
๋ฆฌํฉํ ๋ง ๋๊ตฌ์ ์ฌ์ฉ ๋ฐ ๋จ์ฉ.
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ค๋ณต์ฑ์ ์ค์ด๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ฑฐ๋ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
๋๋ถ๋ถ ๋์ํ์ง๋ง Flutter ์์ ฏ์ ๋๋ฌด ๋์ ์์ค์ด์ด์ ๋ง์ ์ฌ๋๋ค์ด ๋จ์ผ ์์ ฏ์์ ์ ์ฒด ๋ณด๊ธฐ๋ฅผ ์ํํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์๋ํ๋ฉด... ์ค์ ๋ก ์ ์๋ํ๊ณ 4-5๋ฅผ ํตํด ์ํ์ ์ ๋ฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์์ ฏ์ ์์ค. ์ด ๊ณผ์ ์์ ์๋ ๊ฒ์ dartfmt
๊ฐ ์ธ์ํ ์ ์๋ ๋ฌด์ธ๊ฐ์ ๋ถ์ด์ง๋ ์ด ๋์ฐํ ์ค์ฒฉ ์ฝ๋๋ฅผ ์ป๋๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ ๋ ์ฌ๋๋ค์ด ์ ๊ทธ๊ฒ์ ํ๋์ง, ํด๊ฒฐ์ฑ
์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ง๋ง ์ฌ๋๋ค์ด ๊ทธ ํด๊ฒฐ์ฑ
์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์๊ฒ ๋ฉ๋๋ค.
JSX๋ React๊ฐ ํต์ฌ์ ์ผ๋ก Javascript์ HTML์ ํผํฉ์ด๊ธฐ ๋๋ฌธ์ ์๊ฒจ๋ฌ์ต๋๋ค. Javascript ๋ณด๊ฐ/์ฝ์ ์ด ํฌํจ๋ XML ๊ตฌ๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ JSX๋ฅผ ์์ฑํฉ๋๋ค.
React Native๊ฐ JSX๋ฅผ ์ฌ์ฉํ๊ณ HTML๊ณผ ๊ด๋ จ์ด ์๋ค๋ ์ฌ์ค์ ์ด๋ป๊ฒ ์ค๋ช ํฉ๋๊น?
React Native๊ฐ JSX๋ฅผ ์ฌ์ฉํ๊ณ HTML๊ณผ ๊ด๋ จ์ด ์๋ค๋ ์ฌ์ค์ ์ด๋ป๊ฒ ์ค๋ช ํฉ๋๊น?
React๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ค์ ์๋ง๋ ๊ตฌ๋ฌธ์ ์ฌ๋ฐ๋ช ํ๊ณ ์ถ์ง ์์์ ๊ฒ์ ๋๋ค.
React๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ค์ ์๋ง๋ ๊ตฌ๋ฌธ์ ์ฌ๋ฐ๋ช ํ๊ณ ์ถ์ง ์์์ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ JSX๋ @lukepighetti ๊ฐ ๋งํ ๊ฒ์ฒ๋ผ ์ค์ ๋ก Javascript์ HTML์ ํผํฉ์ด ์๋๋ผ XML-like syntax extension to ECMAScript without any defined semantics... who's purpose is to define a concise and familiar syntax for defining tree structures with attributes.
์
๋๋ค.
์ฌ์์ ๋ชจ๋ ๋์ ์์ต๋๋ค. https://facebook.github.io/jsx/
๋ด๊ฐ ์๊ธฐ๋ก๋ React๋ jsx
์ปดํ์ผ๋ฌ์ ํจ๊ป react
+ react-dom
๋ก ์ฒ์ ์ถ์๋์์ผ๋ฏ๋ก HTML + JavaScript ํผํฉ์ด ์์ฐ์ค๋ฝ์ต๋๋ค. ๊ทธ ํ react
๋ react-native
, react-vr
, react-pdf
๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ ๋๋ฌ๋ฅผ ๊ตฌ๋ํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค. React์ ์ญ์ฌ์ ํํต์ ํฉ๋ฆฌ์ ์ด๊ณ ๋ฏผ๊ฐํฉ๋๋ค. 2019๋
์ฌ์์ 2019๋
ํ์ฌ ์ฌ์์ด๋ฉฐ React์ ์ญ์ฌ๋ฅผ ๋ค๋ฃจ์ง ์์ต๋๋ค.
๋์ํ๋ค
๊ทธ๋ฌ๋ ๋์๊ฒ๋ ๋ ํฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Vue์ React๋ ๊ทธ ์ธก๋ฉด์์ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค.
React์๋ createElement
๊ฐ ์๊ณ Vue์๋ h
๊ธฐ๋ฅ์ด ์์ต๋๋ค.
React์ Vue ๋ชจ๋์์ ๊ตฌ์ฑ ์์๋ฅผ ์๋์ผ๋ก ์ธ์คํด์คํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ํ๋ ์ ์ํฌ์ ๋๋ค.
Flutter๋ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. ์์ ฏ์ ์ธ์คํด์ค๋ฅผ ์ง์ ์กฐ์ํ๊ณ ์์ต๋๋ค.
Flutter ์ธ๊ณ์์ <Foo />
๋ new Foo()
๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด ๊ฒฝ์ฐ JSX๋ ์์ ฏ๊ณผ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง dart์์ ํด๋์ค๋ฅผ ์ธ์คํด์คํํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ๊ณ ์์ ๋ฟ์ ๋๋ค.
๋์๊ฒ ์ด๊ฒ์ ์์ ฏ ์์ฑ์ ์๋ฏธ๋ฅผ ์์ด๋ฒ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
@lukepighetti
react-pdf
๋ ๋ ๋ค๋ฅธ ๋ฐ์ ๋ ๋๋ฌ๊ฐ ์๋๋๋ค. react-canvas
๋ฅผ ์๊ฐํ๊ณ ์์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ react
!= react-dom
!= react-native
. react
ํจํค์ง๋ JSX
์ ๋์์ผ๋ก ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก react
๋ react-dom
, react-native
์์ฑ ์ฌ๋ถ๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. react-canvas
, ๋ฐ๋ผ์ react
๋ HTML์ ๊ดํ ๊ฒ์ด ์๋๋๋ค.
2019๋ ์ฌ์์ 2019๋ ํ์ฌ ์ฌ์์ด๋ฉฐ React์ ์ญ์ฌ๋ฅผ ๋ค๋ฃจ์ง ์์ต๋๋ค.
JSX์ 2019 ์ฌ์๊ณผ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค. JSX์ ๋ฒ์ ์ ๋จ ํ๋์ด๋ฉฐ ์ ๊ฐ ์ ๊ณตํ ๋งํฌ(https://facebook.github.io/jsx/)์์ 2014๋ ์ ๊ฒ์๋ ์๋ณธ ๋ฒ์ ์ ๋๋ค.
@rrousselGit
์ฐ๋ฆฌ๋ ๋จ์ง dart์์ ํด๋์ค๋ฅผ ์ธ์คํด์คํํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ๊ณ ์์ ๋ฟ์ ๋๋ค.
Flutter๊ฐ ์๋ DSX์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ๋ฐ๋ก ํธ๋์คํ์ผ๋ฌ๊ฐ ํ๋ ์ผ์ ๋๋ค.
๋์๊ฒ ์ด๊ฒ์ ์์ ฏ ์์ฑ์ ์๋ฏธ๋ฅผ ์์ด๋ฒ๋ฆฐ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
์๋ฌด๊ฒ๋ ์ ๊ฑฐํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์์ ์ ์์ต๋๊น? (์ฅ์ ๊ณผ ๋จ์ ์ด ์๋) ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ป๊ณ ์๊ณ ์ด์ ์ ํ์ ์์ ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ์ญ์์ค.
์๋
ํ์ธ์, ์ ๊ธ์ ์๋ชป ์ดํดํ์ ๊ฒ ๊ฐ์ต๋๋ค. react
๋ react-dom
, react-native
, react-pdf
, react-vr
๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ ๋ ๋๋ฌ๋ฅผ ๊ตฌ๋ํฉ๋๋ค. Afaik, react
๋ฐ react-dom
๊ฐ ๋์์ ์ถ์๋์์ผ๋ฏ๋ก jsx
์ ์ ์ฐ์ ์ ์๊ฐ์ ๋งค์ฐ ๋ถ๋ช
ํฉ๋๋ค. Flutter์ ๋งฅ๋ฝ์์ JSX์ ๊ฐ์น์ ๋ํด ์๋ก ๋ค๋ฅธ ์๊ฒฌ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ฉ์์ง๋ฅผ ๊น์ด ํ๊ณ ๋ค์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์๋ง๋ ์ฃผ์ ์ ๊ทธ๊ฒ์ ์ ์งํ๊ณ ๋จธ๋ฆฌ์นด๋ฝ์ ๋๋์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๊ฒ์
๋๋ค.
์๋
ํ์ธ์ lukepighetti๋, JSX์ ํจ๊ป ๋ค์ดํฐ๋ธ ๋ฐ์์ ํ ๋ฌ์์ ๋ ๋ฌ ๋์ ์ฌ์ฉํด ๋ณด์
จ์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด JSX๋ก ์ฑ์ ๋น๋ํ๊ณ ๋ค์ดํฐ๋ธ๋ก ๋ฐ์(๋๋ ๋ฐ์, ๋๋ ๊ทธ๋ค์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ณ ์์) ํ๋ ์์ํฌ ์คํ์ผ์ด ๊ฐ๋จํ๊ณ ์ ๊ตฌ์กฐํ๋ ์ด์ ๋ฅผ ์ดํดํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ผ์ ๊ธฐ๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด JSX๊ฐ ์ ๊ทธ๋ ๊ฒ ์ ์ฉํ๊ณ ์ค์ํ์ง ์ ๋ ์ดํดํ ์ ์์ต๋๋ค.
๋๋ ์ฌ์ ํ Google์ด JSX์ ์๋ฆ๋ค์์ ์ดํดํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ด๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Google ํ์ ์ธ์ ๊ฐ React์์ ์๊ฐ์ ๋ฐ์ ํ๋ ์์ํฌ์ธ flutter๋ฅผ ์ํด DSX ๋๋ JSX์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์ lukepighetti๋, JSX์ ํจ๊ป ๋ค์ดํฐ๋ธ ๋ฐ์์ ํ ๋ฌ์์ ๋ ๋ฌ ๋์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด JSX ๋ฐ React ๋ค์ดํฐ๋ธ(๋๋ React, ๋๋ ๊ทธ๊ฒ๋ค์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ ์๊ณ ์์) ํ๋ ์์ํฌ ์คํ์ผ๋ก ์ฑ์ ๋น๋ํ๋ ๊ฒ์ด ์ ๊ฐ๋จํ๊ณ ์ ๊ตฌ์กฐํ๋์ด ์๋์ง ์ดํดํด์ผ ํฉ๋๋ค.
lukepighetti์ ๋ํด ๋งํ ์๋ ์์ง๋ง 2๋ ๋์ React์ ์ ๋ฌธ์ ์ผ๋ก ์ผํด ์์ผ๋ฉฐ ์ง๊ธ์ Vue๋ฅผ ์ผ๋ถ ์ํํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ ์ ๋ JSX์ ๋ํด ์์ฃผ ์ ์๊ณ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ Flutter๋ฅผ ์ฝ 2๋
๋์ ์ฌ์ฉํด ์์ต๋๋ค. ์ฒ์์๋ Flutter์๋ ์ผ์ข
์ JSX๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ์ง๋ง ๊ทธ ๊ธฐ๊ฐ ๋์ Flutter๊ฐ ์๋นํ ๊ฐ์ ๋์๊ณ ์๊ฐ์ด ๋ฐ๋์์ต๋๋ค.
์๋ฅผ ๋ค์ด Foo()
๋ฅผ Foo(child: Bar())
๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ์ฝ์ต๋๋ค.
๊ทธ๋ฌ๋ <Foo />
๋ฅผ <Foo><Bar /></Foo>
๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ์๋๋๋ค.
Flutter๋ ๊ดํธ๋ฅผ ๋ ์ฝ๊ฒ ์กฐ์ํ ์ ์๋๋ก ํ๋ ๋ง์ ๋ฆฌํฉํ ๋ง ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
Flutter๊ฐ ์ ๊ณตํ๋ ๊ฐ์ ๋ซ๋ ํ๊ทธ๋ ๋ ํ๊ทธ์ ๋ถ์กฑ์ ๋ณด์ํฉ๋๋ค.
_ํ์ง๋ง ์ฝ๋ ๋ฆฌ๋ทฐ์๋ ํ์๋์ง ์์ต๋๋ค!_
๊ทธ๋ค์ ์ค์ ๋กํฉ๋๋ค! IDE์์ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ ์ ์์ต๋๋ค. https://code.visualstudio.com/blogs/2018/09/10/introducing-github-pullrequests ์ฐธ์กฐ
์์ ฏ์ด child
์ children
๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ฐ๋ฆฌ๋ ๋ค์์ ์ป์ต๋๊น?
<Foo
child={<Bar />}
>
<Bar />
</Foo>
?
์ด ๊ฒฝ์ฐ ์ผ๊ด์ฑ์ ์ํด $ children
์ฌ๋กฏ์ ์ฌ์ฉํ๋ ๋์ child
๋ฅผ ํญ์ ๋ช
๋ช
๋ ์ธ์๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ฌธ์ ๋ children
๋ฅผ ์ฌ์ฉํ๋ ์์ ฏ์ด ๊ฑฐ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋๋ค์๋ ๋จ์ผ child
๋๋ Scaffold
์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ๋งค๊ฐ๋ณ์์ ์กฐํฉ์
๋๋ค.
์ฆ, JSX๋ฅผ ์ฌ์ฉํ๋ ๋๋ถ๋ถ์ ์์ ฏ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Container
child={<Bar />}
/>
๋ค์์ _๋์_ ๊ฒ์ ๋๋ค.
Container(
child: Bar(),
)
์์ฝํ๋ฉด Flutter๊ฐ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JSX๋ฅผ ์ฌ์ฉํ ์ ์๋ค ํ๋๋ผ๋ ์ค์ ๋ก ์ํฉ์ ๊ฐ์ ํ ์ ์์์ง๋ ์๋ฌธ์ ๋๋ค.
๋ด๊ฐ ๋งํ๋ฏ์ด upthread๋ ์ค์ ๋ก JS/ECMAScript/์ผ๋ฐ ์น ๊ธฐ๋ฅ(๊ฐ์ฒด ํ์ฐ, ๊ตฌ์กฐํ, ๊ฐ์ฒด/ํด์๋งต์ ํธํ์ฑ, ๋งค์ฐ ์ ์ฌํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ ๋ชจ๋ DOM* ๋ ธ๋, HTML์ ์ ์ฐ์ฑ ์ผ๋ฐ ๋ฑ) JSX ๊ธฐ๋ฅ์ด๋ ๋ฌด์์ ๋๊น? ์ด์ IMO๋ JSX๋ฅผ ์ฐ๊ธฐ ์ข๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ๋ค์ด ์์ผ๋ฉด XML์ ์์ฑํ๋ ๊ฒ๋ฟ์ด๋ฉฐ ์ค์ ๋ก ์ ํ๊ถ์ด ์๋ ๋ด๊ฐ ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ XML ์์ฑ์ ์ข์ํ์ง ์์ต๋๋ค.
*์ด ๋ชจ๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ด Flutter๋ฅผ XML๋ก ๊ฐ์กฐํ๋ ค๋ ์๋์ ๋ํ ๋์ ์ฃผ์ ๋ฐ๋์์ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. JSX/React๊ฐ ์น์ ๊น์ ๋ฟ๋ฆฌ๋ฅผ ๋๊ณ ์๊ณ DOM ์์๊ฐ _attributes_ ๋ฐ _children_์ ๊ฐ๋ ๋ชจ๋ ๋
ธ๋์ ๋ํ ์ค๋ ํ์ค์ ๊ฐ๊ณ ์๋ค๋ ์ฌ์ค์ ๋ถ์ ํ๋ ค๋ ์ง์ ํ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ฉด์ Flutter๋ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ์์ ฏ์ ๋ํ ์ฌ์ฉ์ ์ ์ ์์ ฏ์ ์ฌ๋กฏ ์ด๋ฆ์ children
๋๋ child
๋ก ์ง์ ํ๋๋ก ๋ฐ์ธ๋ฉํ์ง ์์ผ๋ฉฐ ๊ทธ๋ ๊ฒ ์์ํด์ผ ํ ์ด์ ๊ฐ ์ ํ ์์ต๋๋ค.
๋ค๋ฅธ JSX ์ค๋ ๋๊ฐ ์ ๊ธด ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค. JSX๊ฐ Flutter์ ๋์์ด ๋์ง ์๋๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด GitHub ์ฃผ์์์ ๋ด ๊ธฐ์ /๊ฒฝํ์ ๋ณํธํ ํ์๊ฐ ์์ต๋๋ค. "Flutter์ ๋ํ ์๊ฒฌ์ ๊ฐ์ง ๋งํผ Flutter์ ๋ํ ๊ฒฝํ์ด ์ถฉ๋ถํ์ง ์์ต๋๋ค."๋ผ๊ณ ์ฝ๊ฒ ๋งํ ์ ์์ต๋๋ค. ๊ธฐ๋ถ์ด ์ข์ง ์์ต๋๋ค. ํค๋ณด๋ ์๋ฆฌ์ด ๋ถ์กฑ์ ์ฆ๊ฒจ๋ณด์ธ์.
์์ ฏ์ด
child
์children
๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์ฐ๋ฆฌ๋ ๋ค์์ ์ป์ต๋๊น?
์์ ฏ์ child
์ children
๊ฐ ๋ชจ๋ ์์ด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์ด๊ฑฐ๋ ์ ๊ฒ์
๋๋คใ
๋ ๋ค๋ฅธ ์ฃผ์ ๏ผFlutter์ ์ผ๋ถ ์์ ฏ์ children
๋ฅผ ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ์์ ฏ์ $ child
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฌด๋ ์ด๊ฒ์ด ๋ณต์กํ๊ณ ํผ๋ํ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๊น? children
์๋ child
$๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. child
๊ฐ ์ผ๋ง๋ ์๋ ์๊ด์์ด, ํ๋ ๋๋ ๊ทธ ์ด์, children
๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ ์๋ฃํ์ญ์์ค.
@rrousselGit
JSX๋ ์์ผ๋ก ์ฐ๊ธฐ์ ๋์ฐํฉ๋๋ค. ๊ฒฌ๋ ์ ์๊ฒ ํ๋ ค๋ฉด ๋ง์ ๋๊ตฌ๊ฐ ํ์ํ๊ณ ,
์ ์ฒด React ์ธ๊ณ๋ฟ๋ง ์๋๋ผ ์ ์ฒด HTML ์ธ๊ณ์ XML ์ธ๊ณ๋ ๋์ํ์ง ์์ต๋๋ค.
Flutter๋ ๊ดํธ๋ฅผ ๋ ์ฝ๊ฒ ์กฐ์ํ ์ ์๋๋ก ํ๋ ๋ง์ ๋ฆฌํฉํ ๋ง ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋์ Flutter๋ '๋ง์ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค'๋ผ๊ณ ๋งํ์ง๋ง ํธํฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ชฝ์ ํ๊ธฐํด์ผ ํ ํ์์ฑ์ ๋๋๋๋ค. ์ฐธ๊ณ : ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ผ์ ํ๋ ๋ฐฉ๋ฒ์ด ํ ๊ฐ์ง ์ด์์ด๊ณ ์ด๋ค ์ฌ๋๋ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํธํ ๊ฒ์ด๋ผ๋ ์ ์ ๋ฐ์๋ค์ด๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ค์ ์ค์ ๋กํฉ๋๋ค! IDE์์ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
ํ์์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ชจ๋ ์จ๋ผ์ธ ์ฝ๋ ๊ฒํ ๋๊ตฌ์ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์์ค ์ฝ๋๋ฅผ ์กฐ์ํ๋ฉฐ ์์ค ์ฝ๋์ ์์ผ๋ฉด ์กด์ฌํ์ง ์์ต๋๋ค.
JSX๋ Flutter ๋ชจ๋ธ์ ๋ํด ์ ๋ฒ์ญ๋์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋จ์ง ๋น์ ์ ๋์ ์๊ฐ์ผ ๋ฟ์
๋๋ค. ๋๊ตฌ๋ DSX๊ฐ Flutter์ ์๋ฒฝํ๊ฒ ๋ง๋ JSX์ ํฅ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
๊ทธ๋์ Flutter๋ '๋ง์ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค'๋ผ๊ณ ๋งํ๊ณ ์์ต๋๋ค.
์๋, '์ฐธ์ ์ ์๋ค'๊ฐ ์๋๋ผ '๋ ์ฝ๊ฒ'๋ผ๊ณ ๋งํ๋ค.
๋๋ ์ฐ์ฐํ StackOverflow/Slack์ ์์ฃผ, ๋๋ก๋ ์ฌ์ง์ด ๋ด ์ ํ๋ก ๋๋ตํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ html ๊ด๋ จ ์ง๋ฌธ์ ๋ตํ ๋ ๋ถ๋ช
ํ ์ข์ง ์์ ์๊ฐ์ ๋ณด๋์ง๋ง Flutter๋ ๊ด์ฐฎ์ต๋๋ค.
๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ผ์ ํ๋ ๋ฐฉ๋ฒ์ด ํ ๊ฐ์ง ์ด์์ด๊ณ ์ด๋ค ์ฌ๋๋ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํธํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ๋ฐ์๋ค์ด๋ ๊ฒ์ ๋๋ค.
๊ทธ ๋ฐ๋์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ JSX์ 100% ํฌ์ด ์๋๋ผ๋ ๊ฒ์ ๋ถ๋ช ํ ์์์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ์ ์ด์ ๋ฌธ์ ์ ๋ํ ๋ฐ๋ ํฌํ ์๊ฐ ์ด๋ฅผ ์ฆ๋ช ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋จ์ง ๋น์ ์ ๋์ ์๊ฐ์ผ ๋ฟ์ ๋๋ค. ๋๊ตฌ๋ DSX๊ฐ Flutter์ ์๋ฒฝํ๊ฒ ๋ง๋ JSX์ ํฅ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋๋ ๋์ํ์ง ์๋๋ค. ๊ตฌ๋ฌธ์๋ ๋ง์ ํค๋ณด๋ ๋ ์ด์์์์ ์ก์ธ์คํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ๋ฌธ์๊ฐ ๋ง์ด ํฌํจ๋์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋๋ฌด ๋ง์ ๋ฐ๋ณต์ ํฌํจํฉ๋๋ค.
์ด์จ๋ , ๋๋ ๋น์ ์ด ์๊ตฌ์ ์ผ๋ก ๊ณต๊ฒฉ์ ์ธ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ Flutter๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
๊ฑฐ์น ๊ณ ์ด ํ ๋ก ์ ๋ค์ ๋ซ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
JSX๊ฐ Flutter์์ ์ ์๋ํ์ง ์๋๋ค๋ฉด JSX์ ๊ฐ์ ํ์ง ์๋ ๊ฒ์ ํ์ฉํ ์ ์์ง๋ง ์ค์ฒฉ ์ง์ฅ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ ๋คํธ ์ธ์ด์ ์ธ๋ฏธ์ฝ๋ก ์ ๋๋ค. ์ ๋ง ์ง์ฆ๋๋ค์.
๋ ๋ค๋ฅธ ์ด์ผ๊ธฐ๋ ๋คํธ ์ธ์ด์ ์ธ๋ฏธ์ฝ๋ก ์ ๋๋ค. ์ ๋ง ์ง์ฆ๋๋ค์.
dart-lang/language์ ๋ํ ์์ฒญ์ด ์์ต๋๋ค: https://github.com/dart-lang/language/issues/69
๊ฐ์ธ์ ๐
์ด ๊ธด ํ ๋ก ์ ์ด๊ฒ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค:
<A property="a">
<B/>
<C/>
</A>
๋์ :
A(property: a, children: [
B(),
C()
])
์ด์ ๊ตฌ๋ฌธ์ ๋์ํ๋๋ผ๋ ๊ฐ์ธ์ ์ผ๋ก ํ์ง ์๋ ๊ฒ์ ์ธ์ด/ํ๋ ์์ํฌ๋ฟ๋ง ์๋๋ผ IDE์ ๊ฐ์ ์ฃผ๋ณ ๋๊ตฌ์์๋ ์ง์์ ์ธ ์ ์ง ๊ด๋ฆฌ ๋น์ฉ, ๋ ๋์ ๋ณต์ก์ฑ ๋ฐ ๊ฐ๋ฅํ ์๋ก์ด ์ค๋ฅ ์์ค์ ํจ๊ป ๋ฐ์ํฉ๋๋ค. ๋๋ฒ๊ฑฐ, ๋ฆฐํฐ ๋ฑ. ๋ํ ๋น๋ ์๊ฐ์ด ๋์ด๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๋ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ์๊ธฐ์ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ํด ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ฐฐ์ฐ๊ณ ํธ๋์คํ์ผ๋ฌ์ ๋ด๋ถ์ ์ง์คํด์ผ ํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ด ๊ฑฐ์ React & co์ ์ ์ผํ ๋ชฉํ์ ๋๋ค. ์ง์์ ๋๋ผ๋ ๊ฐ๋ฐ์.
์๋ก์ด ์ธ์ด๋ฅผ ์์ํ๊ธฐ ์ ์, ์ ๋ ์คํ๋ ค ์ด์์ ์ด์ง ์๊ณ ํจํด ์ผ์น , ๋ฐ์ดํฐ ํด๋์ค , ADT , ๊ตฌ์กฐํ , ์ ์ ํ ์ ํ ์ฌํญ ๋ฑ๊ณผ ๊ฐ์ ์ค์ํ ๊ธฐ๋ฅ์ด ๋๋ฝ๋ Dart ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ง์คํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฌํ PR ์ค ์ผ๋ถ๋ ์ด๋ฏธ 5+ ์ด๋ ค ์์ต๋๋ค. ์ฐ๋ น. ์ด๊ฒ์ ์์ ฏ์ ์์ฑํ๊ธฐ ์ํด ์ธ๊ด์ ๋ถํ์ํ ๋งํฌ์ ๋ ์ด์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ์ํคํ ์ฒ, ์์ ๋ฐ ์ ์ฒด ์ฝ๋ ํ์ง์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด๊ฒ์ด "์ปค๋ฎค๋ํฐ ์ฃผ๋"๋ผ๊ณ ํ ์ง๋ผ๋ ์ปค๋ฎค๋ํฐ๊ฐ ์๋ฏธ ์๋ ์ผ์ ํ๋ ๋ฐ ๋ณด๋ผ ์ ์๋ ์๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌผ๋ก ๋ชจ๋ ์ฌ๋์ ์์ ์ด ์ํ๋ ์๊ฐ์ ํ ์ ์์ต๋๋ค. Flutter ํ์ ์ด ๋ถ๊ท ํ์ ์ธ ์๋ ฅ์ ๊ฐํ๋ ๊ฒ์ ์ค๋จํ์ญ์์ค.
์ด๋ด, i-Schuetz.
๋ต๋ณ ์น์
์ด ์์ต๋๋ค.
์ด๊ฒ์ด ๋ด๊ฐ ์ด ๊ธด ํฌ์คํธ์์ ๋งํ ๊ฒ์ ๋๋ค. JSX๋ "HTML๊ณผ XML์ ์คํ๊ฒํฐ ๋ฌธ์ "(์ฝ์ ์ ์๊ณ ๋ณต์กํ UI ์ฝ๋)๋ฅผ ์์ ํ์ต๋๋ค. ํ๋ฌํฐ๋ฅผ ์ฌ์ฉํ ํ ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก๋ JSX๋ณด๋ค ๋ ๋ณต์กํ๊ฑฐ๋ ์ต์ ์ ๋๋ค.
๋ช ๋ ๋์ ๋๋ Flutter๊ฐ React์ ์ฅ์ ์ค ์ผ๋ถ๋ฅผ ํฌ์ฐฉํ ์ ์๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค์ ๋ณด์์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ๊ฒ์ ์ง์ ํ ๊ฐ๋ ์ ๊ตฌ์ฑ ์์์ ๋๋ค.
๋ด๊ฐ ํ๋ก์ฐํ๊ณ ์๋์ง ํ์คํ์ง ์์ต๋๋ค. ๊ฐ์กฐ ํ์๋ ํ ์คํธ์์ ์ฌ์ฉ์๋ HTML์ ์ต์ํ๊ณ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ JSX๋ฅผ ๋ ์ฝ๊ฒ ๋ฐฐ์ธ ์ ์๋ค๊ณ ๋งํ์ต๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ JSX์ ์กด์ฌ๋ฅผ ์ ๋นํํ๊ณ Flutter์ ๋ํ ๋ชจ๋ฐฉ์ ์ด๋ค ์์ผ๋ก๋ ์ ๋นํํ์ง ๋ชปํฉ๋๋ค.
์ด๋ฏธ์ง๊ฐ ๋๋ฌด ๋ง์ ๊ณต๊ฐ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฐ์ท์ ๋ต๊ธ์ ์ถ๊ฐํ์ง ์์์ต๋๋ค. ๊ทธ๋ค์ ๋ด๊ฐ ๊ฒ์ํ ๊ฒ์ ์คํ๋ ค ์ง์งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์๊ณ ๋ํ ์ค๋ณต๋์์ต๋๋ค. ๋งํฌ๋ฅผ ๊ฒ์ํ์ต๋๋ค.
@JonathanSum ์ JSX๋ณด๋ค Flutter๊ฐ ๋ ๋ณต์กํฉ๋๊น, ์๋๋ฉด Flutter๊ฐ _React_์ ๋ฌ๋ผ์ ๋ง์ฐฐ์ด ๋ฐ์ํฉ๋๊น? ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ ์ฅํฉํฉ๋๋ค. ์, IDE์์ ๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ ์์ด๋ ๊ฑฐ์ ํ๋ฆผ์์ด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง์ง๋ง ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด XML๊ณผ ์ ์ฌํ DSL์ ์์ฑํ๋ ๊ฒ๋ณด๋ค _๋ณต์กํ_ ๋ฐฉ๋ฒ์ด ํ์คํ์ง ์์ผ๋ฉฐ ์ฌ์ ํ ํ์คํ์ง ์์ต๋๋ค. ์ ๊ทธ๋ ๊ฒ ๋ง์ ์ฌ๋๋ค์ด XML๊ณผ ๊ฐ์ DSL์ด Flutter ์ฌ์ฉ์ _์ดํดํ๊ธฐ ์ฝ๊ฒ_ ๋ง๋ค์ด์ค ์์ด์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ Flutter๊ฐ React/JSX๊ฐ ํด๊ฒฐํ๊ธฐ ์ํด ์์ฑ๋ ๋ฌธ์ ์ ๋ํ ์ด์ ์ด๋ ฅ์ด ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด - React๋ DOM ์กฐ์์ ๋ ์ฝ๊ณ ๊น๋ํ๊ฒ ๋ง๋ค์ด์ค๋๋ค. ๊ทธ๊ฒ๋ ์ข์ง๋ง Flutter์ ์ ํํ ๋ฌด์จ ๊ด๋ จ์ด ์์ต๋๊น?
๋ช ๋ ๋์ ๋๋ Flutter๊ฐ React์ ์ฅ์ ์ค ์ผ๋ถ๋ฅผ ํฌ์ฐฉํ ์ ์๋ค๊ณ ๋งํ๋ ์ฌ๋๋ค์ ๋ณด์์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ๊ฒ์ ์ง์ ํ ๊ฐ๋ ์ ๊ตฌ์ฑ ์์์ ๋๋ค.
React๋ Flutter์ ์๋ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ํ "์ง์ ํ" ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฐ๋ ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ Flutter/Dart ๋์์ธ์๋ React/JS๊ฐ ์บก์ฒํ ์ ์๋ ๋ช ๊ฐ์ง ์ฅ์ ๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ๊ด์ฐฎ์ UI SDK/ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๋์ผํ๊ฒ(๋๋ ๊ทธ ๋ฐ๋๋ก) ๋งํ ์ ์์ต๋๋ค. ๋๋๊ฒ๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ ์ค์ ๋ก ๋ค๋ฆ ๋๋ค. ์๋ง๋ ํ ํ๋ก์ ํธ์ ์ค๋ ์ฌ๋๋ค์ด [๊ณผ๊ฑฐ์ ์ฌ์ฉํ ํ๋ก์ ํธ ์ฝ์ ]์ด ๋ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์๊ณ ์์ํ์ง ์๋๋ค๋ฉด ๋ ๋์ ์๋น์ค๋ฅผ ๋ฐ์ ์ ์์ ๊ฒ์ ๋๋ค. ๐
๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๊ฐ ์์ต๋๋ค. https://github.com/munificent/ui-as-code
์๋ง๋ ์๋นํ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋งค๊ฐ๋ณ์ ์์ ์ ์์ Dart์ ์๋ฅผ ๋ค์ด Crystal์ ๋ฉ์๋ ์ธ์ spec ์ด ์๋ค๋ฉด ๋น๋ ๋ฉ์๋๊ฐ ์ผ๋ง๋ ๋ ๊ฐ๊ฒฐํ ์ ์๋์ง ์๊ฐํ๊ฒ ๋์์ต๋๋ค.
๋ฌผ๋ก Crystal์ ์ปดํ์ผ๋ฌ๋ ๋ฏผ๋ฌํฝ์ด์ ๊ฑฐ๋ถ์ด์์ ๊ฒฝ์์์ ๊ผด์ฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์ด์ JSX๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ํ๋ฌํฐ์ ์ถ๊ฐ ์๋ ฅ์ ๊ฐํ์ง ์๊ธฐ๋ก ๋์ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋คํธ์ ๊ดํ ํ JS ๋๋ TS๋ณด๋ค ํจ์ฌ ๋ ์ฐ์ํฉ๋๋ค. ๋ฌด๋ ฅ๊ฐ์ ๋๋๋ค
์๋ฅผ ๋ค์ด, Microsoft UI ๊ธฐ์ ์ ๊ฐ๋ฐ ๊ฒฝ๋ก๋ WinForm์์ WPF๋ก๏ผํ์ฌ Flutter์์๋๏ผWPF๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋์ WinForm์ ์ฌ์ฉํฉ๋๋คใ๊ฐ๋ฐ์์ ๋ถ๋ง์ ์๋ตํ์ฌ Flutter ํ์ WinForm์ ์๊ฐ์ ์ฐฝ ๋ฐ ์์ฑ ํธ์ง๊ธฐ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํ์ต๋๋ค.ใ
Flutter์ ์ด๋ณด์๋ก์ ์ ๋ ์ด๊ฒ์ด ๋ก๋๋งต์ ์์ด์ผ ํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค. jsx๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ฏ์ ๋ฐฐ์นํ๋ ๋ ์ฌ๋์ด ์ฝ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
๋๋ ์๊ฐ์ ๋ฐ์ ํด๋์ค์ ๋ ๋๋ง ๊ธฐ๋ฅ๊ณผ ๋ ๋๋ง๋ ํด๋์ค์ ์ฐ๊ด์ ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋คํธ ํ์ผ๊ณผ ๋ ๋๋ง๋ ์ฝํ ์ธ ๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ ์๋ ๋ฐฉ์์ ํ์ ํ๋ ๋ฐ 5-6๋ถ์ด ๊ฑธ๋ฆฝ๋๋ค...
์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ํ ์คํธ ํธ์ง๊ธฐ์์ ๋ฐ๋ณต์กํ ๋ฐ์ ํด๋์ค๋ฅผ 5๋ถ ๋ง์ ๋ง๋ค ์ ์์ต๋๋ค.
๋๋ ํ๋ฌํฐ์์ ๊ทธ๊ฒ์ ํ ์ ์์ต๋๋ค. ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ๊ฐ๋ฐ์ ์๊ฒฉ์ด ์์ต๋๋ค. ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํด ํ์ฅ์ ์์กดํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค -.-
ํ์ง๋ง. ๋คํธ ๊ฐ๋ฐ์๊ฐ ์ด "๋ฌธ์ "๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค. dart 2์์๋ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์์ต๋๋ค. dart 3 -4 -5 ์ ๊ฐ๋ ์ฑ์ ์ด๋ป๊ฒ ํฅ์์ํฌ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์ฑ ์์ ๋น๋ ๊ธฐ๋ฅ์ ๋ฆฌํฉํ ๋ง์ด ์กฐ๋ง๊ฐ ํ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํธ์งํ๋ค:
์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์. ๋ฐฉ๊ธ React Native๋ฅผ ๋ค์ ์๋ํ๋๋ฐ jsx, props ์์คํ
์ด ์ซ์ด์ ๋ชจ๋ ๊ฒ์ด ๋์ ์ด๋ผ๋ ์ฌ์ค์ด ๋ค์ ํ ๋ฒ ์ ๋ง ๋ฌด์์ด ๊ฐ๋
์ด์์ต๋๋ค. ๊ทธ๋ ๊ทธ๊ฒ์ ๋จ์ง ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ผ ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ๋ญ์ด๋๋๋ก ๋๋์ธ์....
๊ทธ๋ค์ JSX๋ฅผ ์ฌ๋ํ๊ธฐ ๋๋ฌธ์ ๋ฟ๋ง ์๋๋ผ DSX๋ฅผ ์์ฒญํ์ต๋๋ค. ๊ทธ๋ค์ Flutter๋ฅผ ์ํฉ๋๋ค.
๋ ๋์ ์ฝ๋ ๊ฐ๋
์ฑ๊ณผ ์ง์์ ์ํด UI ์ ์ธ์ ์ฝ๋์์ ์๊ฐ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ํนํ ํ๋ฐฐ/๋ฏธ๋ค์ด ๋ง์ ๋๊ท๋ชจ ํ์์. Adobe Flex์์ ๋์จ Flutter์ UI ์ ์ธ์ ์ฝ์ผ๋ฉด ์์ฐ์ฑ์ด ํฌ๊ฒ ์ ํ๋๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
DSX(๊ต์ฅํ IMO๊ฐ ๋ ์ ์์)๊ฐ ์๋์ง๋ง ์ ์ด๋ IDE ์์ค์์๋ ํ์ฌ ์ํฉ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
์ด์ ์ ๋ชจ๋ UI ๊ฐ๋ฐ ํ๋ ์์ํฌ์๋ ์ด ๊ธฐ๋ฅ์ด ์์๊ณ ์ฐ๋ฆฌ๋ ์์ด์ผ ํฉ๋๋ค.
๋ ๋์ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ง์์ ์ํด UI ์ ์ธ์ ์ฝ๋์์ ์๊ฐ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด 'gui builder'์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ์์ ๋ ๋์ ํตํฉ์ ์ํด.
Adobe Flex์์ ๋์จ Flutter์ UI ์ ์ธ์ ์ฝ์ผ๋ฉด ์์ฐ์ฑ์ด ํฌ๊ฒ ์ ํ๋๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
Flutters ๊ธฐ๋ฅ์ด ์๋ MXML๊ณผ ๊ฐ์ UI ์ ์ธ์ ์์ํด ๋ณด์ธ์! ๊ฟ๋ง ๊ฟ ์ ์์ด!
์ด์ ์ฐ๋ฆฌ๋ codegen ์ง์์ ๋ฐ์๊ณ , ์ด์ ๊ฐ์ ๊ฒ์ ์ ํ์ ๋ฃ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ด ์์ฒญ๋๊ฒ ์ธ๊ธฐ๊ฐ ์์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค.
@Hixie codegen์ ๋ํ ๋ฌธ์์ ๋ํ ํฌ์ธํฐ๊ฐ ์์ต๋๊น?
์ด์ ์ฐ๋ฆฌ๋ codegen ์ง์์ ๋ฐ์๊ณ , ์ด์ ๊ฐ์ ๊ฒ์ ์ ํ์ ๋ฃ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ด ์์ฒญ๋๊ฒ ์ธ๊ธฐ๊ฐ ์์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ๋ณด๊ธฐ์ codegen์ .dart -> .dart๋ฅผ ์ํ ๊ฒ์ด๋ฏ๋ก ์ ๋ ฅ ํ์ผ์ ์ ํจํ .dart ํ์ผ์ด์ด์ผ ํฉ๋๋ค. ๋คํธ์ ์์ ์งํฉ์ด๊ธฐ ๋๋ฌธ์ .dsx ํ์ผ์๋ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ต๋๋ค. ๋๋ฒ๊น ๋ฑ์ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์์ค ๋งต์ ์ฌ์ฉํ์ฌ .dart๋ก ํฌ๋ก์ค ์ปดํ์ผํ๋ ๋ฐ ๋ํ ์ง์์ด ์ฌ์ ํ ํ์ํฉ๋๋ค.
์ด์ ๊ณต๊ฐ๋ SwiftUI๋ฅผ ํ๋ฒ ๋ด์ฃผ์ธ์. ์ด๊ฒ์ React์ ๊ฐ์ ๋งํฌ์ ๋์ Flutter๊ฐ ๋ชฉํ๋ก ์ผ์์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Swift์ ์์์ ๋ฉค๋ฒ ํํ๋ง์ผ๋ก๋ ๋๋ฌด ํ๋ฅญํ ๊ฒ์ ๋๋ค.
๋๋ SwiftUI ๊ตฌ๋ฌธ์ ๋ํด ํผ๋์ค๋ฝ์ต๋๋ค. ํ์คํ ๊ฐ๋ณ์ง๋ง ์ผ๋ถ ์ธก๋ฉด์ ๋ง๋ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ธฐ์ ์ ์ผ๋ก ์ด๋ฏธ ๋น๊ต์ ์ ์ฌํ ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค.
Column(mainAxisSize: MainAxisSize.min)([
if (foo) Text('foo'),
Text('bar'),
]);
Column
๊ฐ _still_ ํด๋์ค์ธ ์ ํจํ ๋คํธ ์ฝ๋์
๋๋ค.
๋ค์์ ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ํ ๋น์ ์ฅ ์์ ฏ์ ๋๋ค.
class Foo extends StatelessWidget {
const Foo({Key key}) : this._(key: key);
const Foo._({Key key, this.children}) : super(key: key);
final List<Widget> children;
<strong i="12">@override</strong>
Widget build(BuildContext context) {
return Column(children: children);
}
Foo call(List<Widget> children) {
return Foo._(key: key, children: children);
}
}
๊ทธ๊ฒ์ ์์ฉ๊ตฌ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฝ๋ ์์ฑ๊ธฐ๋ ํนํ ๋ค๊ฐ์ค๋ ํ์ฅ ๋ฉค๋ฒ์ ํจ๊ป ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์ผํ ๋ฌธ์ ๋ const ์์ฑ์๋ฅผ ์๊ณ (์์์ ์ง์ ํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์) ์์ ฏ ํด๋์ค _twice_๋ฅผ ์ธ์คํด์คํํ๋ค๋ ๊ฒ์ ๋๋ค.
ํด๋น ๊ตฌ๋ฌธ์ด ํ์ํ ๊ฒฝ์ฐ call
๋ฉ์๋ ๋์ ์ด์์ ์ผ๋ก๋ ์์ฑ์ ์ปค๋ง์ ์ฌ์ฉํ์ฌ ๊ตฌํํด์ผ ํฉ๋๋ค.
@rrousselGit ๋๋ SwiftUI์ ์ด๋ค ์ธก๋ฉด์ด ๋น์ ์๊ฒ ๋ง๋ฒ์ฒ๋ผ ๋ณด์ด๋์ง ๊ถ๊ธํฉ๋๋ค. ์ด๊ฒ์ ๋์๊ฒ Swift ๊ตฌ๋ฌธ์ ๋งค์ฐ ๊ฐ๋จํ ํ์ฅ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ฌ๊ธฐ ์ ์ฝ๋ ์์ ์์ :
Content
๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๊น? Mobx/Vue ์คํ ์ด๊ฐ ๋ด์ฅ๋์ด ์๋ค๋ ๋ป์ธ๊ฐ์?@State
๋ ๋ฌด์์
๋๊น?body
๊ฐ ๋ณ์์ธ ์ด์ ๋ ๋ฌด์์
๋๊น? ๊ฒํฐ์ธ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด getter๋ ์ธ์ ๋ค์ ํธ์ถ๋ฉ๋๊น?body
๋ ์ธํฐํ์ด์ค์ ์ผ๋ถ์
๋๊น, ์๋๋ฉด Content
๋ด๋ถ์ ๋ง์ ์ ์ฌํ ๋ณ์์
๋๊น?item in
_์ ํํ_ ํ๋ ์ผ์ ๋ฌด์์
๋๊น? in
์ ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์๊ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋ผ "๊ฒฐ๊ณผ"์ธ ์ด์ ๋ ๋ฌด์์
๋๊น?HStack
๊ฐ ์๋๋ฐ ์ Image
๊ฐ ์ ๋ชฉ/๋ถ์ ๋ชฉ ์ผ์ชฝ์ ๋ง์ถฐ์ ธ ์์ต๋๊น?ํ์คํ ๊ธฐ์ต์ ์๋์ง๋ง Flutter๋ฅผ ์ ํํ ๋ ๊ทธ๋ฐ ์ง๋ฌธ์ ์์์ต๋๋ค.
@rrousselGit ๊ทธ๊ฒ์ Flutter ๊ตฌ๋ฌธ์ด๋ ์๋ฏธ๊ฐ ๋ณธ์ง์ ์ผ๋ก ๋ถ๋ช ํ๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ๊ทํ์ ๋ฐฐ๊ฒฝ ๋๋ฌธ์ผ ์ ์์ต๋๋ค(๋๋ ๊ทธ๊ฒ์ ๋ํด ์๋นํ ๋์ฒํ ์ฌ๋๋ค์ ๋ง์ด ๋ง๋ฌ์ต๋๋ค). ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ ๊ธฐํ ์์ ์ 14์ค ์ฝ๋ ์กฐ๊ฐ์ ์ค๋ฅ์ ๋ํด ๊ณผ๋ํ๊ฒ ๋ถ์ํ๋ฉด์ ์ค์ ๋ก ์์ฑ๋ ์ธ์ด๋ฅผ ์์ง ๋ชปํ๋ ์ด์ํ ์ ํฉ์ ์ผ๋ก ๋ณด์ ๋๋ค.
๊ทธ๋ฌ๋ (Dart ๋๋ JS ์๋ฏธ์์) ์ค์ ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง ์์ต๋๊น? ๊ตฌ์กฐ์ฒด์ ๋๋ค. ๋ํ MobX/Vue ์คํ์ผ ์คํ ์ด(์: ์๋นํ ์ ํ๋ ์ธ์ด ์ง์์ ๋ํ ํ์ดํผ๋ง)๊ฐ ๋ณ๊ฒฝ์ฑ์ ์ฒ๋ฆฌํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
@State
๋ ์์ฑ์ผ๋ก, ์ผ๋ถ ์ธ์ด(์: Dart)์์๋ ์ฃผ์์ผ๋ก ์๋ ค์ ธ ์๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด Swift ์ฝ๋์์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ๊ทธ๊ฒ์ดํ๋ ์ผ์ ์๋ฏธํ๋ค๋ฉด ๋ฌธ์๋ฅผ ๋ณด์ง ์์๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ ๋ ์ํ๋ก ์์ฑ์ ํ์ ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
body
๋ ๊ณ์ฐ๋ ์์ฑ์ผ๋ก Swift ๊ฐ๋ฐ์์๊ฒ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ๋ค์ ๊ณ์ฐ๋ ๋ Widget build(BuildContext context)
๋ ๋ณธ์ง์ ์ผ๋ก ์ธ์ ๋ค์ ํธ์ถ๋๋์ง ์๋ ค์ค๋๊น?
Content
(Swift ๊ฐ๋ฐ์์๊ฒ ๋ค์ ํ ๋ฒ ๋งค์ฐ ๋ช
ํํ๊ฒ) ํ์ฅ/๊ตฌํ View
, ์ฌ๊ธฐ์์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ์ฐพ์ ์ ์์ต๋๋ค(์ค์ ๋ก ๋งค์ฐ ์ข์ API ์ฐธ์กฐ ํ์ด์ง๊ฐ ์์ต๋๋ค).
์ด๊ฒ์ "์ ์ด ์ธ์ด์ ํค์๋๊ฐ ๋ด๊ฐ ์ฌ์ฉํ๋ ์ธ์ด์ ํค์๋์ ๊ฐ์ง ์์๊ฐ"์ด๋ฉฐ, ํน๋ณํ "๋ง๋ฒ ๊ฐ์" ๊ฒ์ ์๋๋๋ค. ์ฌ๊ธฐ์ in
ํค์๋๋ for...in
๊ตฌ์กฐ์ ๋์ผํ์ง ์์ต๋๋ค. ์ด๋ ํด๋ก์ ์ ๋ณธ๋ฌธ์ด ์์๋ ๊ฒ์์ ๋ํ๋
๋๋ค. { item in ... }
๋ List
์์ฑ์์ ์ ๋ฌ๋ ํจ์ ๋ธ๋ก์
๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ListView
์ itemBuilder
์
๋๋ค.
๋ณด๊ธฐ์ ์์ฒด ์บก์ํ๋ ๋ ์ด์์ ๊ท์น์ด ์๋ ์ด์ ๋ฅผ ์ ๋นํ๊ฒ ๋ฌป๊ณ ์์ต๋๊น?
SwiftUI์์:
1-์ธก๋ฉด ๋ถ์๋ฌผ์ด ์๋ View์์ ์ ์ธ๋ ์ํ๋ฅผ ๋ณด๋ ๋ฐ๊ฐ์ต๋๋ค.
2-์์ฑ์์ ๋ชจ๋ ๊ฒ์ ์ ๋ฌํ๋ ๋์ ํญ๋ชฉ์ ์ค์ ํ๋ ์ข์ ๊ฐ๋ณ ๋ฉ์๋(๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ง ์ ๋ฌํ๋ ๋์ ์์ ์ ์ ์ฉํ ์ ์์ต๋๋ค).
3-(๊ณผ๊ฑฐ์ ์์ ฏ๊ณผ ๊ฐ์ ์ ์ธ์ SVG๋ก ์ ์ํ ๊ฒ์ฒ๋ผ) ์ ์ธ์ ๋ฒกํฐ ๊ทธ๋ํฝ์ด ์ ์ธ์ ์ธ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ํผํฉ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ๋งค์ฐ ์ข์ต๋๋ค. !!!
https://developer.apple.com/tutorials/swiftui/drawing-paths-and-shapes
4-๋งค์ฐ ๊ฐ๋จํ ์ ๋๋ฉ์ด์
๋ฐ ์ ํ ๊ตฌ์ฑ
https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions
์๋ฐฉํฅ์ผ๋ก ์ฝ๋ ํธ์ง๊ธฐ์ ๋๊ธฐํ๋๋ 5-Drag&Drop ๋์์ธ ๋๊ตฌ.
๋ค๋ฅธ ๋ชจ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ง๊ท๊ฐ ์์ง๋ง ๋๋ ์คํ๋ ค ๊ทธ๋ค์ด ์์ฃผ ๋ฉ์ง๊ฒ ํ ์ผ์ ์ง์คํฉ๋๋ค.
์ด๋ฌํ "์ง๋ฌธ"์ ์ ์ฌ์ ์ผ๋ก ํผ๋์ค๋ฌ์ด ์ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์กด์ฌํฉ๋๋ค. ์ด๊ฒ์ _์ค์ ์ง๋ฌธ_์ด ์๋๋๋ค.
๊ทธ๊ฒ์ ๋น์ ์ ๋ฐฐ๊ฒฝ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
ํ ๊ฒ ๊ฐ์. ๊ทธ๋ค์ ์ ๊ทผ ๋ฐฉ์์ด ๋์๋ค๊ฑฐ๋ ๊ทธ๋ฐ ๊ฒ์ด ์๋๋๋ค. Flutter๋ฅผ ์ฌ์ฉํ์ ๋์ฒ๋ผ ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง์ง ์์์ต๋๋ค.
Flutter ์์ ฏ์ "๋ฉ์ง ์ธ์ด ๊ธฐ๋ฅ"์ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ๊ฑฐ์ โโ๋ชจ๋ ์ธ์ด์์ ๊ตฌํ๋ ์ ์์ต๋๋ค(์ต๊ทผ if/for for ์ปฌ๋ ์
์ด ๋ณ๊ฒฝ๋์์ง๋ง).
SwiftUI์ ์ผ์ผ์ด์ค๋ Swift ํน์ ๊ธฐ๋ฅ์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
๋ค์ ๊ณ์ฐ๋ ๋ ์์ ฏ ๋น๋(BuildContext ์ปจํ ์คํธ)๋ ๋ณธ์ง์ ์ผ๋ก ์ธ์ ๋ค์ ํธ์ถ๋๋์ง ์๋ ค์ค๋๊น?
์ฌ๊ธฐ์ ๋ด ์์ ์ State
์ body
๋ฅผ ๋ค์ ๊ณ์ฐํ๋ ํ์ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค.
React์ Flutter๋ setState๋ผ๋ ๋ฌธ์ ์ ๋ํด ๋งค์ฐ ๋ช
์์ ์
๋๋ค.
Vue/Mobx๋ ๋์ผํ @State
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ "๋ง๋ฒ"์
๋๋ค.
๋ค ์ข์๋ฐ ํจํด์ด ๋ค๋ฅด๋ค์.
๋ณด๊ธฐ์ ์์ฒด ์บก์ํ๋ ๋ ์ด์์ ๊ท์น์ด ์๋ ์ด์ ๋ฅผ ์ ๋นํ๊ฒ ๋ฌป๊ณ ์์ต๋๊น?
์๋์, "๋ช
์์ " ๋ "์์์ "์ ๊ฐ๊น์ต๋๋ค.
๋ก์ง์ ์ผ๋ถ๋ฅผ ์จ๊ธฐ๋๋ผ๋(์ด ๊ฒฝ์ฐ ltr
vs rtl
๋ก์ง) "๊ฐ๋ฅํ ํ ์ ์ ์ฝ๋๋ก ์ต๋ํ ๋ง์ด ํ๋ ๊ฒ"์ ์ ๋ง๋ก ์ง์คํ ๊ฒ ๊ฐ์ต๋๋ค.
Flutter๋ Row
๋ฅผ ์ฌ์ฉํ๋๋ก ์์ฒญํ ๊ฒ์
๋๋ค.
Flutter๋ ๋ง์ "๋ฉ์ง ์ธ์ด ๊ธฐ๋ฅ"์ ์ฌ์ฉํ๊ณ ์์กดํฉ๋๋ค(์ฝ๋ ์ฌ๋์ด ๋๊ตฌ์๊ฒ๋ ์ต์ํ์ง ์๊ฑฐ๋ ๋์ํ์ง ์๋ ์ธ์ด ๊ธฐ๋ฅ). ๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์์ ์์ ์์ฑ์(์ผ๋ฐ์ ์ผ๋ก Dart์ ๋ช
๋ช
์์ฑ์ ์คํ์ผ), ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ, ์์์ ์ธํฐํ์ด์ค์ธ ํด๋์ค, @covariant
๋ฐ ๋ฏน์ค์ธ์ ํผ๋์์ ์์ ํ ๋ ์ด๋ธ ์ง์ ์ ๋ํ ๋ฐ์์ ์ด๋์ด๋ด๋ ๊ธฐ๋ฅ์
๋๋ค. ๊ฐ๋ฐ์์ ๋ฐฐ๊ฒฝ์ ๋ฐ๋ผ ์ฝ๋ ๋์. ํ ์๊ฐ ์ ๋ ์๊ฐํ๋ฉด ๋ ๊ธด ๋ชฉ๋ก์ ๋ง๋ค ์ ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฑด ๋ ์ด์ Flutter๋ฅผ ๊ณ ๋ฐํ๋ ๊ฒ์ด ์๋๋ผ SwiftUI๋ฅผ ๊ณ ๋ฐํ๋ ๊ฒ์
๋๋ค. ํน์ ์ธ์ด๋ก ์ํํธ์จ์ด๋ฅผ ์์ฑํ์ฌ ๋ชจ๋ ์ธ์ด์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ ๋ฏธ๋์ด๋ผ๊ณ ์๊ฐํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ธ์ด์ ์ฐจ์ด์ ์ด ์กด์ฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ด์ ์์ ์ ๋ฌด์์
๋๊น?
๊ฒ๋ค๊ฐ, ๋๋ setState
๋๋ @State
์ค ํ๋๊ฐ ๋ทฐ๋ฅผ ๋ค์ ์์ฑํ๋ ํ์์์ ๊ด๊ณ์ ๋ํด ๋ช
์์ ์ด๋ผ๋ ๋ฐ ์์ ํ ๋์ํ์ง ์์ต๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ํ๋ก ํ์๋ ํญ๋ชฉ์ ๋ณ๊ฒฝํ๋ฉด ํ๋ ์์ํฌ์์ ๋น๋ํ ํญ๋ชฉ์ ์ ๋ ฌํ๋ค๋ ๋ง๋ง ๋ฃ๊ฒ ๋ฉ๋๋ค. ๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ๋ฐ์๋ ์ ํํ ์ธ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ๋ช
์์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค. ํจ์ ํธ์ถ ์ด ๋ ์ต์ํ๊ณ ๋ค๋ฅธ ์ธ์ด๋ก ์์
ํ๋ ์ฌ๋๋ค์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ๋ ์ต์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํจ์๋ฅผ ํธ์ถํ๋ค๊ณ ํด์ ๋ชจ๋ ๊ฒ์ด ๋ง๋ฒ์ด ๋๋ ๊ฒ์ ์๋๋๋ค.
Flutter๋
Row
๋ฅผ ์ฌ์ฉํ๋๋ก ์์ฒญํ ๊ฒ์ ๋๋ค.
ListTile
๋ฅผ ์ฌ์ฉํ ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๊ธฐ์ ํ์๋ ๊ฒ๊ณผ ๋์ผํ ๋์์ด ์์ง๋ง ๋ช
๋ช
๋ ๋งค๊ฐ๋ณ์๊ฐ ์์ต๋๊น? ๋ํ ์์ฒญํ์ง ์์๋๋ฐ Scaffold
๊ฐ "๋ง๋ฒ์ฒ๋ผ" ์ฑ๋ฐ ์ผ์ชฝ์ ๋ฉ๋ด ๋ฒํผ์ ๋๋ ์ด์ ๋ ๋ฌผ์ด๋ด์ผ ํ ๊น์?
์ฐจ์ด์ ์ Dart์ ํ์ฌ ์ํ์์ ๋๋ถ๋ถ์ ์ฃผ๋ฅ ์ธ์ด์ ๋งค์ฐ ์ ์ฌํ๋ค๋ ๊ฒ์ ๋๋ค.
์ค์ํฉ๋๋ค.
"Dart๋ฅผ ๋ฐฐ์์ผ ํ๋์, ์๋๋ฉด Flutter๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํด์ผ ํ๋์?"๋ผ๋ ์ง๋ฌธ์ด ์์ต๋๋ค. ๊ฝค ์์ฃผ ๋์ต๋๋ค.
ํ์ฌ ์ ๋ต์ "Flutter๋ฅผ ๋ฐฐ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ํ๋ฃจ ๋ง์ ํจ๊ณผ์ ์ธ ๋คํธ๋ฅผ ์ธ ์ ์๋ค"์ด๋ค.
์ด๊ฒ์ด ์์ํ ์ ์ง๋๋ค๋ ๋ณด์ฅ์ ์์ง๋ง ์ด๊ฒ์ด Flutter์ ๊ฐ์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋จธ์ง ํ ๋ก ์ ์ฃผ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋ ๊ฒ์ ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ๋ฉ์ผ๋ก ํด๋น ๋ถ๋ถ์ ๊ณ์ํ ์ ์์ต๋๋ค(๋ด github ๋ฉ์ผ์ด ์๋ํจ).
์ด๊ฒ ์ ์ ์ ๊ฒจ์? ์ด๊ฒ์ ์ด๋ฏธ ์ฌํ๊ฒ ๊ท์๋๊ณ ์์ผ๋ฉฐ ์ด์ ์ ์ ๊ธด ๋ฌธ์ ์ ์ ํํ ๋์ผํฉ๋๋ค.
๋๋ ์ฌ๊ธฐ์ ๊ฐ๋จํ ๊ฒ์ ๋ง๋ค์์ต๋๋ค.
https://github.com/danialdezfouli/flutterjsx
https://www.npmjs.com/package/flutterjsx
https://www.youtube.com/watch?v=Oj1JMSurphA
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๋น์ทํ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํ๋ฉด flutter doctor -v
์ ์ถ๋ ฅ๊ณผ ๋ฌธ์ ์ ์ต์ํ์ ์ฌํ์ ํฌํจํ์ฌ ์ ๋ฒ๊ทธ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ค ์ฌ๋๋ค์ jsx๋ฅผ ์ข์ํ๊ณ ์ด๋ค ์ฌ๋๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค. UI๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? jsx์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์์ฑํ ์ ์์ผ๋ฉฐ ๋ง์นจ๋ด ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ํ๋ฌํฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ง์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?