์์ ฏ์ ๊ตฌ์ถํ๋ ํ์ฌ ๋ฐฉ๋ฒ ์ธ์ JSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋คํธ ์ฝ๋ ๋ด์์ XML๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ํ์ฑํํ๊ธฐ ์ํด ์์ ๊ตฌ๋ฌธ ์คํ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฝ๊ฒ ์ฝ๊ณ /๊ฐ๋ฐ/๋๋ฒ๊ทธ/์ ์งํ ์ ์์ผ๋ฉฐ ๊ฐ๋ ฅํ GUI ๋น๋๊ฐ ํธ์ง ๊ฐ๋ฅํ ์ฝ๋์ ํตํฉํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
DSX์ ๊ฐ์ ๊ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
์นด๋ฅผ๋ก์ค.
DSX์ ํ์ฌ ๋ฌธ์ ๋ .dsx ํ์ผ์์ ์์ ํ๋ ๋๋ฒ๊ฑฐ, ์๋ ์์ฑ ๋ฑ์ ํ๋ฅญํ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด Flutter ๋๊ตฌ์์ ์ ์ ํ ํตํฉ์ ๊ดํ ๊ฒ์ ๋๋ค.
์ฌ์ฉ์์๊ฒ DSX๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ ์๊ฒ๋ ์์ํ๊ธฐ ์ด๋ ค์ด ์ผ์ ๋๋ค. ๋๊ตฐ๊ฐ ๋์์ฃผ๊ณ ์ถ๋ค๋ฉด ๋ด๊ฐ ํ์ํ ๊ฒ์ Dart Tools ๋ฐ VS Code Dart ํ๋ฌ๊ทธ์ธ์ ์์ ํ ์ ์ฒ๋ฆฌ ์ง์(์์ค ๋งต ํฌํจ)์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ผ๋จ ๋๊ตฌ๊ฐ ํด๋น DSX ๋๋ ๋ค๋ฅธ ํธ๋์คํ์ผ๋ง ์ธ์ด(๋ชจ๋ ์ธ์ด Dart์ ์์ ์งํฉ์ด์ง๋ง ๋ชจ๋ ๊ฒ์ Dart๊น์ง ์ปดํ์ผํจ)์ด ์๋ํฉ๋๋ค.
๋น์ ์ด ๋์ธ ์ ์๊ณ ๋๊ณ ์ถ๋ค๋ฉด ์ ์๊ฒ ์๋ ค์ฃผ์ญ์์ค.
cc @lukechurch
@cbazza ์ ์ด๊ฒ์ ์ํ๋์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ค๋๋ ๊ณผ ๋น๊ตํ์ ๋ ์ด๋ค ๋ชจ์ต์ผ์ง ์๋ฅผ ๋ค์ด ๋ณด์ฌ ์ฃผ์๊ฒ ์ต๋๊น?
์ข์ต๋๋ค. ' https://flutter.io/widgets-intro/#basic -widgets'์ "๊ธฐ๋ณธ ์์ ฏ" ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import 'package:flutter/material.dart';
class MyAppBar extends StatelessWidget {
MyAppBar({this.title});
// Fields in a Widget subclass are always marked "final".
final Widget title;
<strong i="7">@override</strong>
Widget build(BuildContext context) {
let style = {
height: 56.0, // in logical pixels
padding: const EdgeInsets.symmetric(horizontal: 8.0),
decoration: <BoxDecoration color={Colors.blue[500]}/>,
};
return <Container style={style}>
<Row>
<IconButton
icon={<Icon name={Icons.menu}/>}
tooltip='Navigation menu'
onPressed={null}
/>
<Expanded>
{title}
</Expanded>
<IconButton
icon={<Icon name={Icons.search}/>}
tooltip='Search'
onPressed={null}
/>
</Row>
</Container>;
}
}
class MyScaffold extends StatelessWidget {
<strong i="8">@override</strong>
Widget build(BuildContext context) {
// Material is a conceptual piece of paper on which the UI appears.
return <Material>
<Column>
<MyAppBar
title={<Text
text='Example title'
style={Theme.of(context).primaryTextTheme.title},
/>}
/>
<Expanded>
<Center>
<Text text='Hello, world!'/>
</Center>
</Expanded>
</Column>
</Material>;
}
}
void main() {
runApp(<MaterialApp
title='My app'
home={<MyScaffold/>}
/>);
}
์ด ๊ตฌ๋ฌธ์ ์ด๋ป์ต๋๊น?:
import 'package:flutter/material.dart';
class MyAppBar extends StatelessWidget {
MyAppBar({this.title});
// Fields in a Widget subclass are always marked "final".
final Widget title;
<strong i="6">@override</strong>
Widget build(BuildContext context) {
return Container(
height: 56.0, // in logical pixels
padding: EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(color: Colors.blue[500]),
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null,
),
Expanded(
child: title,
),
IconButton(
icon: Icon(Icons.search),
tooltip: 'Search',
onPressed: null,
),
],
),
);
}
}
class MyScaffold extends StatelessWidget {
<strong i="7">@override</strong>
Widget build(BuildContext context) {
// Material is a conceptual piece of paper on which the UI appears.
return Material(
child: Column(
children: <Widget>[
MyAppBar(
title: Text(
'Example title',
style: Theme.of(context).primaryTextTheme.title,
),
),
Expanded(
child: Center(
child: Text('Hello, world!'),
),
),
],
),
);
}
}
void main() {
runApp(MaterialApp(
title: 'My app',
home: MyScaffold(),
));
}
ํ , ์กฐ๊ธ ๊ฐ์ ๋์์ง๋ง ๊ทธ๋ค์ง ์ข์ง๋ ์์ต๋๋ค ...
๋ค์์ XML์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์๋ ์ฌํญ์
๋๋ค.
(1) ๋ ์ด์ '์๋' ๋ฐ '์๋' ๋ฌผ๊ฑด ์์
(2) ์ 3์ ๋๊ตฌ๊ฐ ์กฐ์ํ๊ธฐ ์ฝ์ต๋๋ค(๋ถ์, ๋ถ์ ๋ฐ ์ฌ์์ฑ).
(3) ๋งํฌ์
๊ณผ ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ ์ ํ์ด ์ฝ๊ฒ ๊ฐ์ง๋ฉ๋๋ค. ๋ด ๋ง์ XML ๋ด๋ถ์๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ๋ '{}'๊ฐ ์๊ณ ์ฝ๋์๋ '
๋๋ ์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก React์ ๋ฐฉ์์ ์์ ํ ์ง์งํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด์จ๋ ์ ๋ฐ์ ์์ต๋๋ค ;)
cc @kasperl
(1) ๋ ์ด์ '์๋' ๋ฐ '์๋' ๋ฌผ๊ฑด์ด ์๋๋๋ค.
๊ทธ๊ฒ ์ ๋ฐ๋์งํ์ง ์ ์ดํด๊ฐ ์๋ฉ๋๋ค. "์ด๋ฆฐ์ด"์ "์ด๋ฆฐ์ด"๋ ํน๋ณํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ListTile์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ป๊ฒ ํ์๊ฒ ์ต๋๊น? IconButton์ "์์ด์ฝ" ๋๋ MaterialApp์ "ํ"์ด ์ด๋ฆ์ ์ง์ ํ๊ณ ์ถ์ง๋ง Expanded์ "์์"์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ธ ๊ฐ์ง ๋ชจ๋ ์์ ฏ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ์์์ ์ธ์์ผ ๋ฟ์ ๋๋ค. "์์ด" ๋ "์ง"์ ๋ํด ๋ง๋ฒ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.
(2) ์ 3์ ๋๊ตฌ๊ฐ ์กฐ์ํ๊ธฐ ์ฝ์ต๋๋ค(๋ถ์, ๋ถ์ ๋ฐ ์ฌ์์ฑ).
Dart ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์, ๋ถ์ ๋ฐ ์ฌ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ฐ๋ผ๊ฑด๋ ์์ผ๋ก Dart ํ์ ์ด๋ฅผ ์ํด ๋ ๋์ API๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
(3) ๋งํฌ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ ์ ํ์ด ์ฝ๊ฒ ๊ฐ์ง๋ฉ๋๋ค.
๊ทธ๊ฒ์ด ์ ๋ฐ๋์งํ๊ฐ? ๋ด ๋ง์, ์ด ์ค ํ๋๊ฐ "ํ๋ก๊ทธ๋๋ฐ"์ผ๋ก ๊ฐ์ฃผ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ชจ๋ ํํ์ผ ๋ฟ์ ๋๋ค.
๋ด ๋ง์ XML ๋ด๋ถ์๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ๋ '{}'๊ฐ ์๊ณ ์ฝ๋์๋ '
๊ตฌ๋ถ์ด ์ ์๋๋ค์.
๋ํ ๋ชจ๋ '์คํ์ผ'์ ์ฃผ์ ๊ตฌ์กฐ์์ ๋ถ๋ฆฌํ์ญ์์ค.
์ ๋ง ์ํ์ ๋ค๋ฉด ์ค๋ Flutter์์ ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค. XML์ ๊ฒฝ์ฐ์ฒ๋ผ ๋ณ์์ ์คํ์ผ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
๊ทธ๊ฒ ์ ๋ฐ๋์งํ์ง ์ ์ดํด๊ฐ ์๋ฉ๋๋ค. "์ด๋ฆฐ์ด"์ "์ด๋ฆฐ์ด"๋ ํน๋ณํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ListTile์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ป๊ฒ ํ์๊ฒ ์ต๋๊น? IconButton์ "์์ด์ฝ" ๋๋ MaterialApp์ "ํ"์ด ์ด๋ฆ์ ์ง์ ํ๊ณ ์ถ์ง๋ง Expanded์ "์์"์ด ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ธ ๊ฐ์ง ๋ชจ๋ ์์ ฏ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ์์์ ์ธ์์ผ ๋ฟ์ ๋๋ค. "์์ด" ๋ "์ง"์ ๋ํด ๋ง๋ฒ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค.
๋ ์์ฉ๊ตฌ, ๊ตฌ์กฐ์์ ์์๋๊ธฐ ๋๋ฌธ์ ๋งํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ์ด ์ ๋ฐ๋์งํ๊ฐ? ๋ด ๋ง์, ์ ์ด๊ฒ์ด "ํ๋ก๊ทธ๋๋ฐ"์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๊น? ๋ชจ๋ ํํ์ผ ๋ฟ์ ๋๋ค.
๋๊ตฌ ์ ์์, ํนํ GUI ์ ์์๊ฐ Dart๋ฅผ ์์ ํ ๊ตฌ๋ฌธ ๋ถ์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ์ฝ๊ฒ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ (2)์ ๊ด๋ จ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ํ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.
๊ตฌ๋ถ์ด ์ ์ดํด๊ฐ ์๊ฐ๋ค์.
XML ํ์์ ๋งค์ฐ ๊ฐ๋จํ๋ฏ๋ก '{}'๊ฐ ํ์๋๋ฉด ๋คํธ์์ ํํ์์ ๊ณ์ฐํ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋คํธ ์ฝ๋๋ฅผ ์ฝ์ ๋ '
๋ํ ์ต์ข XML ํ๋ก์ธ์์์ ๋ถ๋ชจ์ ์์ฑ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ํผํ๊ณ ๋์ ์๋์ ๊ฐ์ด ์์ ํ๊ทธ๋ฅผ ๋ง๋ญ๋๋ค.
this...
<MyAppBar>
<Title style={Theme.of(context).primaryTextTheme.title}>
Example title
</Title>
</MyAppBar>
instead of this...
<MyAppBar
title={<Text
text='Example title'
style={Theme.of(context).primaryTextTheme.title},
/>}
/>
๋ ์์ฉ๊ตฌ, ๊ตฌ์กฐ์์ ์์๋๊ธฐ ๋๋ฌธ์ ๋งํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ์ผ๋ถ ์์ฑ์๋ง ํด๋นํฉ๋๊น? ListItem๊ณผ ๊ฐ์ด ์์ ์ฌ๋กฏ์ด ๋ ๊ฐ์ธ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? XML-ish ๊ตฌ๋ฌธ์ ์ด๊ฒ์ ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ๋๋ ๊ทธ๊ฒ์ด ๋ ์์ฉ๊ตฌ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
๋น๊ตํ๋ค:
<Container style={style}>
<Row>
<IconButton
icon={<Icon name={Icons.menu}/>}
tooltip='Navigation menu'
onPressed={null}
/>
<Expanded> {title} </Expanded>
</Row>
</Container>
Container(style: style,
child: Row(
children: [
IconButton(
icon: Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null,
),
Expanded(child: title),
],
),
)
XML ํ์์ ๊ตฌ๋ฌธ์ด ๋ ๊น๋ํ๊ฑฐ๋ ๋ ์์ฉ์ ์ธ์ง๋ ๋์๊ฒ ์ ํ ๋ช ํํ์ง ์์ต๋๋ค. ๋ ๋ง์ ๊ตฌ๋์ ๊ณผ ๋ด์ฉ์ ์ผ๋ถ ์ค๋ณต์ด ์์ต๋๋ค(์: ๋ซ๊ธฐ ํ๊ทธ). ๊ทธ๋ฆฌ๊ณ ์ด๋ฆ์ ์ถ๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ "์์"์ ์๊ฒ ๋์ง๋ง Icon์์ "์ด๋ฆ"์ ์ป์ต๋๋ค.
๋ํ XML์ ์ฌ์ฉํ์ฌ Row๋ 0, 1 ๋๋ 2๊ฐ ์ด์์ ์์์ ๊ฐ์ง ์ ์์ง๋ง Center๋ ์ ํํ ํ๋์ ์์์ ๊ฐ์ ธ์ผ ํจ์ ์ด๋ป๊ฒ ๋ถ๋ช ํ ํฉ๋๊น? ๋๊ตฐ๊ฐ ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?:
<Center> <Test/> <Test/> </Center>
๋๊ตฌ ์ ์์, ํนํ GUI ์ ์์๊ฐ Dart๋ฅผ ์์ ํ ๊ตฌ๋ฌธ ๋ถ์ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํจ์ฌ ์ฝ๊ฒ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ (2)์ ๊ด๋ จ์ด ์์ต๋๋ค.
ํ์ง๋ง Dart ๊ตฌ๋ฌธ ๋ถ์ API๊ฐ ์๋ค๋ฉด Dart๋ฅผ ์์ ํ ๊ตฌ๋ฌธ ๋ถ์ํ ํ์๊ฐ ์๊ฒ ์ฃ ? ๋ด ๋ง์, ๋น์ ์ ๋น์ ์ด ํ์ฑํ๊ณ ์ถ์ ๊ฒ์ ํ์ฑํ๊ณ ๋๋จธ์ง๋ ๋จ๊ฒจ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ค์ ๋ก XML์ด ์๋๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๊ตฌ๋ฌธ ๋ถ์์ด ๋ ์ฌ์ด์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๊ทธ๋ฌ๋ ๋ํ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค.
๋๋ ์ฌ๊ธฐ์ ์๋ XMLy ๋ฒ์ ์ด ๋ ์ฝ๊ธฐ ์ฝ๋ค๊ณ ํ์ ํ์ง ์์ต๋๋ค. ๋ช ๊ฐ์ง ๋น๋ ํจ์๋ฅผ ์ฝ๊ณ ๋๋ฉด ์ค์ฒฉ ์์ฑ์ ๊ตฌ๋ฌธ์ ๋น ๋ฅด๊ฒ ์ต์ํด์ง๋๋ค.
XML์ ํ์์ ๋งค์ฐ ๊ฐ๋จํ๋ฏ๋ก '{}'๊ฐ ํ์๋๋ฉด ๋คํธ์์ ํํ์์ ๊ณ์ฐํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ XML์ด ์๋๋๋ค. ๊ทธ๋ ์ฃ ? XML์ ์ผ๋ถ ๋ณํ์ ๋๋ค. ์ ์ ์๋ ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น์ด ์์ต๋๊น? ์๋ฅผ ๋ค์ด ์ด๊ฒ์ด ์ ํจํ๊ฐ์?
<Test name={describe("}")}>
Dart๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๊ณ ์ฒซ ๋ฒ์งธ "}"๊ฐ ์์ฑ ํํ์์ ๋์ด ์๋๋ผ๋ ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋คํธ ์ฝ๋๋ฅผ ์ฝ์ ๋ '
) ๊ฐ์ฒด ๊ณ์ธต์ด XML ๋งํฌ์ ์์ ์์ฑ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ค๋ new
ํค์๋๋ ๋ณด๋ฉด ์๊ฒ ์ฃ ? ๋๋ ์ค์ ๋ก ๋๋ฌธ์๋ก ๋ ๋จ์ด๊ฐ ํ์๋ ๋ ์์ ์๋ก์ด ๋งํฌ์
์ ์์์. ์ด๊ฒ์ด ์ ๋ง XML์ ์ด์ ์
๋๊น, ์๋๋ฉด Dart๋ณด๋ค XML์ ๋ ์ต์ํฉ๋๊น?
๋ํ ์ต์ข XML ํ๋ก์ธ์์์ ๋ถ๋ชจ์ ์์ฑ์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ํผํ๊ณ ๋์ ์๋์ ๊ฐ์ด ์์ ํ๊ทธ๋ฅผ ๋ง๋ญ๋๋ค.
๋๋ ๋น์ ์ด ์ฌ๊ธฐ์ ์ ์ํ๋ ๊ฒ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ ์ด๊ฒ์ ์ ๊ตฌ์ฑ๋ XML์ด ์๋๋๋ค. ์ ์ํ๋ ๊ตฌ๋ฌธ์ด ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ํํ ์ค๋ช ํ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด "ํ ์คํธ" ์์ฑ์๊ฐ ์ฌ๋ผ์ง ๊ฒ ๊ฐ์ต๋๋ค. ํ๋ก์ธ์๊ฐ ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น?
๋ณด์ธ์, ๋น์ ์ ๋ด๊ฐ ๋งํ๋ ๋ชจ๋ ๊ฒ์ ์๊ณ ์๊ณ ์ด ๋ํ๋ ์๋ฌด๋ฐ๋ ๊ฐ์ง ์๊ณ ์์ต๋๋ค. ๋ฒ์ ์ฉ์ด๋ก ๋น์ ์ "์ฆ์ธ์๊ฒ ๋ค๋ฒผ๋๋" ๊ฒ์ ๋๋ค.
JSX๊ฐ ์ธ๊ธฐ ์๋ ์ด์ ๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐ ์ ๋ง๋ก ๊ด์ฌ์ด ์๋ค๋ฉด "react tutorial"์ ๊ฒ์ํ์ฌ ์ง๋ 2๋ ๋์ React์ ๋ํ ๋ชจ๋ ๊ธฐ์ฌ์์ JSX๋ฅผ ์ฌ์ฉํ์ต๋๋ค. React์์ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ์๋ ๋ฐฉ๋ฒ(Flutter์ ํ์ฌ ๋ฐฉ๋ฒ๊ณผ ๋์ผ)์ JSX๊ฐ ์ ํธ๋๋ ๋ฐฉ๋ฒ(๋ชจ๋ฒ ์ฌ๋ก)์ด ๋์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ธ๊ธ๋์ง ์์ต๋๋ค.
https://facebook.github.io/react/tutorial/tutorial.html
https://facebook.github.io/react-native/docs/flatlist.html
๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์ ์ Typescript๊ฐ JSX๋ ์ฑํํ๋ค๋ ๊ฒ์
๋๋ค.
https://www.typescriptlang.org/docs/handbook/jsx.html
XML ๊ตฌ๋ฌธ ๋ถ์('{}'์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฑด๋๋ฐ๋ ์ถ๊ฐ ์ฝ๋ ํฌํจ)์ด Dart์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์์ ํ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๋ค๋ ์ฌ์ค์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ค์ ๋๋ค. ๋๊ตฌ ๋น๋๊ฐ ๊ฐ๋ฐ์ Dart๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. Intellij๋ Dart๋ฅผ ์ง์ํ๋ IDE์์ Kotlin๊ณผ Java๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค(๊ทธ๋ค์ ์ธ์ด ๊ตฌ๋ฌธ ๋ถ์์ ์ ๋ฌธ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ํน๋ณํ ๊ฒฝ์ฐ์ ๋๋ค. ๋ค๋ฅธ ์ธ์ด์์ Dart ๊ตฌ๋ฌธ ๋ถ์).
XML์ ๋ค๋ฅธ ์ธ์ด์ ๋ฃ๋ ๊ฒ์ ๋ํด ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ XML์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋งค์ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ ์ฌ์ด์ ์ธ์ง์ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ค ํ์ผ์ ์คํฌ๋กคํ๊ธฐ๋ง ํ๋ฉด ์ฝ๋์ ์ ์ธ์ ๋งํฌ์ ์ด ๋ฌด์์ธ์ง ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ๋งํฌ์ ์ธ ์ฒํ๋ ๋คํธ ์ฝ๋๋ก๋ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์์ ํ ์ง์ ๋์ง ์์ ํญ๋ชฉ์ ๋ฐ์ง๋ ๊ฒ์ ์ค์งํ์ญ์์ค. JSX์์ ์ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด์ญ์์ค. ์ฌ๊ธฐ ํ ์๊ฐ์ด ์์ด์.
๋ด๊ฐ ๋ฐฉ์ด์ ์ด๊ฑฐ๋ ๊ณต๊ฒฉ์ ์ผ๋ก ๋ค๋ฆฐ๋ค๋ฉด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ ๋ฒ ๋์๋ ์ฃผ์ ์ด์ง๋ง ์ ์๋ ์ค์ ๋ก ์ด ์ฌ๊ฑด์ ๋ํด ๋ ผ์์ ๋ฒ์ด๋ ค๋ ์ฌ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์ด ๋ํ๊ฐ ์์ฒญ์ ๊ทผ๊ฑฐ๊ฐ ๋ฌด์์ธ์ง ๊ฐ๋ฅด์น๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๋ด ๋ ผ์์ ์ธ ์ด์กฐ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค. ์ฌ๊ธฐ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ๋งค์ฐ ๊ด์ฌ์ด ์์ต๋๋ค.
๋ต์ฅ์ ๋ณด๋ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ๋ง์๊ธฐ ๋ฐ๋๋๋ค. ์ด๋ค ์์ผ๋ก๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฑฐ๋ ๋์์ธํ๊ธฐ ์ ์ ํด๊ฒฐํด์ผ ํ๋ ๋ฌธ์ ์ ๋ํ ํฌ๋ช ์ฑ์ด ์๊ธฐ ์ํด ์ฌ๊ธฐ์ ์ธ๊ธํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฅ ์ํฌ๋ผํ ์ค์ ๋ํ์ ๋๋ค. ๊ทํ์ ์ฐธ์ฌ๋ฅผ ํ์ํ์ง๋ง ํ์คํ ๊ทํ์ ์ ์์ ์นํธํ๋ ๊ฒ์ด ๊ทํ์ ์ฑ ์์ด๋ผ๊ณ ์๊ฐํด์๋ ์ ๋ฉ๋๋ค.
JSX๊ฐ "ํซ"ํ๋ค๋ ๋ฐ๋ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. React์์ JSX๊ฐ ์๋ ๊ตฌ๋ฌธ์ ์ด ๋ฌธ์ ์์ ์ ์๋ ๋์ฒด ๊ตฌ๋ฌธ(ํ์ฌ ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง๋ง "new" ๋ฐ "const" ํค์๋๊ฐ ์๋ ๊ตฌ๋ฌธ)๋ณด๋ค ํจ์ฌ ๋์ฉ๋๋ค. ๋ด๊ฐ ์ดํดํ๋ ค๊ณ ํ๋ ๊ฒ์ JSX๊ฐ React์์ "ํซ"ํ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๊ฐ Flutter์๋ ์ ์ฉ๋๋์ง ์ฌ๋ถ์ ๋๋ค.
TypeScript๊ฐ JSX๋ฅผ ์ํํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ 2012๋ ์ E4H ๋ฅผ ์ง์ ํ๋ ์์ ์ ์ฐธ์ฌํ์ผ๋ฉฐ ๊ทธ ์ด์ ์๋ E4X ๊ฐ ์์์ต๋๋ค. ๋ ๊ฐ์ง ๋ ธ๋ ฅ ๋ชจ๋ ์ฃฝ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๋๋ค์ด JSX์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋ํด ์ ํํ ์ด๋ค ๊ด๊ณ์ธ์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
XML์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋๋ฉฐ ์ผ์ข ์ XML์ด์ง๋ง ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ๋ ์ฝ์ง ์์ต๋๋ค. ์ผ์ข ์ XML์ด์ง๋ง ์ค๊ดํธ๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ๋ ๋ค๋ฅธ ์ธ์ด์ ํฌํจ๋ ๊ตฌ๋ฌธ ๋ถ์์ ํจ์ฌ ๋ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌํํ๊ธฐ๊ฐ ์ผ๋ง๋ ์ฌ์ด์ง๋ ํ ๋ ๋ฒ ๊ตฌํํ ๋ค์ ์ด๋ฅผ ์ํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์๋ง๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ ๋๋ค. (์ ๋ HTML ๊ตฌ๋ฌธ ๋ถ์์ ์ํ ์ฌ์ ์์ฑ์ ๋ง์ด ๊ด์ฌํ๊ณ XML์ ๋ํ ์ ์ฌํ ์์ ์ ์ฐธ์ฌํ์ผ๋ฉฐ Dart์ฉ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋งํฌ์ ์ธ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ค์ ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ์ ์๊ณ ์์ต๋๋ค. ์ด๋ค.)
XML์ ๋ค๋ฅธ ์ธ์ด์ ๋ฃ๋ ๊ฒ์ ๋ํด ๋ด๊ฐ ์ข์ํ๋ ๊ฒ์ XML์ด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋งค์ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ ์ฌ์ด์ ์ธ์ง์ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ค ํ์ผ์ ์คํฌ๋กคํ๊ธฐ๋ง ํ๋ฉด ์ฝ๋์ ์ ์ธ์ ๋งํฌ์ ์ด ๋ฌด์์ธ์ง ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ๋งํฌ์ ์ธ ์ฒํ๋ ๋คํธ ์ฝ๋๋ก๋ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๊ฒ์ด ์ ์ตํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋น๋ ๊ธฐ๋ฅ์ด ์๋ Flutter ์ฑ์ ์คํฌ๋กคํ ๋ ๋งค์ฐ ๋ถ๋ช ํฉ๋๋ค(๊ฑฐ๋ํ ์ค์ฒฉ ํํ์). "์ฝ๋"์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ "์ ์ธ์ ๋งํฌ์ "์ ๋ฌด์์ ๋๊น?
์์ ํ ์ง์ ๋์ง ์์ ํญ๋ชฉ์ ๋ฐ์ง๋ ๊ฒ์ ์ค์งํ์ญ์์ค. JSX์์ ์ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ธํ ์์๋ณด์ญ์์ค. ์ฌ๊ธฐ ํ ์๊ฐ์ด ์์ด์.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, JSX๋ ๋ด๊ฐ ์์ฒญํ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด React์๋ ์์ ์ฌ๋กฏ์ด๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค. ๋ด๊ฐ ์ฐพ์ ์์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์ JS๋ก ๋ค์ ์ ํ ํ ๋ค์ ๊ทธ ๋ด๋ถ์์ JSX๋ก ๋ค์ ์ ํํ์ฌ ์ํํ๋ ์์ ์ด๋ฏ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋งํฌ์ ์ธ์ด๋ฅผ ๋ชจ๋ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์ดํดํ๋ ค๊ณ ํ๋ ๊ฒ์ JSX๊ฐ React์์ "ํซ"ํ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๊ฐ Flutter์๋ ์ ์ฉ๋๋์ง ์ฌ๋ถ์ ๋๋ค.
์, ์ ํํ ๋์ผํ ๋ด์ฉ์ด ์ฌ๊ธฐ์ ์ ์ฉ๋ฉ๋๋ค. ํ์ฌ ๋ฐฉ๋ฒ์ด ๋น์ ์๊ฒ ์๋ ์ ์ผํ ์ต์ ์ด๊ธฐ ๋๋ฌธ์ ๋น์ ์๊ฒ ์ข์ ๋ณด์ ๋๋ค. ์ฌ๋๋ค์๊ฒ ๋ ๋ฒ์งธ ์ต์ ์ ์ ๊ณตํ๋ฉด ๋์ผํ ์ผ์ด ๋ฐ์ํ ๊ฒ์ ๋๋ค.
์์ํ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ E4X๊ฐ ์ฃฝ์๋์ง ์๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ์ ๋ E4X์ ํจ๊ป ActionScript๋ฅผ ๋ง์ด ์ฌ์ฉํ์ผ๋ฉฐ Adobe๊ฐ ๊ฑฐ๊ธฐ์์ ํ๋ฅญํ ์ผ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ด๋ค ๋ฉด์์ Flutter๋ Flex ์ฑ์ด ํฌํจ๋ Adobe Flash์ ์ต์ ๋ฒ์ ์ผ ๋ฟ์ ๋๋ค.
(์ ๋ HTML ๊ตฌ๋ฌธ ๋ถ์์ ์ํ ์ฌ์ ์์ฑ์ ๋ง์ด ๊ด์ฌํ๊ณ XML์ ๋ํ ์ ์ฌํ ์์ ์ ์ฐธ์ฌํ์ผ๋ฉฐ Dart์ฉ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋งํฌ์ ์ธ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ค์ ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ์ ์๊ณ ์์ต๋๋ค. ์ด๋ค.)
๋งํฌ์ ์ธ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ๊ฐ๋จํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๊ฒ์ด ์ ์ตํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ๋จ์์ฑ์ ๋ค๋ฅธ ๋ง์ ์ด์ ์ ๊ฐ์ ธ๋ค์ค๋๋ค.
๋น๋ ๊ธฐ๋ฅ์ด ์๋ Flutter ์ฑ์ ์คํฌ๋กคํ ๋ ๋งค์ฐ ๋ถ๋ช ํฉ๋๋ค(๊ฑฐ๋ํ ์ค์ฒฉ ํํ์). "์ฝ๋"์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ "์ ์ธ์ ๋งํฌ์ "์ ๋ฌด์์ ๋๊น?
๊ฑฐ๋ํ ์ค์ฒฉ ํํ์์์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๊น? ์ด ๊ตฌ์กฐ๋ GUI ๋น๋์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ก ์ฝ๊ฒ ์กฐ์ํ ์ ์์ต๋๊น? Adobe Flex Builder๊ฐ ์์ ฏ์ ๋๋๊ทธ ์ค ๋๋กญํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ UI์ ์ฐ๊ฒฐํ ๋ค์ ์ฝ๋ ๋ณด๊ธฐ๋ก ์ ํํ๊ณ ์ํ๋ ๋ชจ๋ ๊ฒ์ ํธ์งํ ๋ค์ GUI ๋ชจ๋๋ก ๋ค์ ์ ํํ๊ณ ์์ ฏ์ ๊ณ์ ์กฐ์ํฉ๋๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ "๊ฑฐ๋ํ ์ค์ฒฉ ํํ์" ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ GUI ํธ์ง๊ธฐ๊ฐ ๊ธฐ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด์ง ์๋ ์ ํจํ ๋คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋์ง ์๋ ๊ณ ์ ๋ XML ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ํ, JSX๋ ๋ด๊ฐ ์์ฒญํ ๊ฒ์ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด React์๋ ์์ ์ฌ๋กฏ์ด๋ผ๋ ๊ฐ๋ ์ด ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ๋ฐ๋ผ์ ์์ผ๋ก ์ฌ๊ธฐ์ ๋ฌธ์ ์ ์๋ฅผ ๋ฃ์ผ๋ฉด JSX ๋ฒ์ ์ด ์ด๋ ํด์ผ ํ๋ค๊ณ ์๊ฐํ๋์ง ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค.
new ListTile(
title: new Text('CineArts at the Empire',
style: new TextStyle(fontWeight: FontWeight.w500, fontSize: 20.0)),
subtitle: new Text('85 W Portal Ave'),
leading: new Icon(
Icons.theaters,
color: Colors.blue[500],
),
),
<ListTile>
<title>
<Text style={{fontWeight: FontWeight.w500, fontSize: 20.0}}>
CineArts at the Empire
</Text>
</title>
<subtitle>
<Text>85 W Portal Ave</Text>
</subtitle>
<leading>
<Icon data={Icons.theaters} color={Colors.blue[500]}/>
</leading>
</ListTile>,
๋คํธ ๋ฒ์ ๋ณด๋ค ๋ ๊ธธ์ด ๋ณด์ด์ง๋ง ๊ฐ์ ์ค ์์ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์นํ ์ ์์์ต๋๋ค. ๋ฌธ์ ๋ IDE/ํธ์ง๊ธฐ๊ฐ '+' ๋ฐ '-'๋ฅผ ์ ๊ณตํ์ฌ ์ด๋ฌํ XML ๋ ธ๋๋ฅผ ์ด์จ๋ ํ์ฅ ๋ฐ ์ถ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
Flutter๋ฅผ React ๊ฐ๋ฐ์์๊ฒ ์น์ํ๊ฒ ๋ณด์ด๊ฒ ํ๋ฉด ๋ง์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ Flutter๋ก ๋์ด๋ค์ผ ์ ์์ต๋๋ค.
์์ํ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ E4X๊ฐ ์ฃฝ์๋์ง ์๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค.
์ฃฝ์๋๋๊ฐ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ ์ฃฝ๋๋๊ฐ ๋ฌธ์ ๋ค. ์ฌ๋๋ค์ด ์ํ๋ ์๋ฃจ์ ์ ์ ๊ณตํ์ง ์์์ ์ฃฝ์ ๊ฑด๊ฐ์? ๊ตฌํ ๋ฌธ์ ๋๋ฌธ์ ์ฃฝ์์ต๋๊น? ํนํ ๋ฌธ์ ๋ก ์ฃฝ์์๊น? ๋๋ฌด ์ด๋ฅธ ์๊ฐ์ด์๋์? ๋๋ฌด ๋ฆ์์ด? ๊ณผ๊ฑฐ ๊ฒฝํ์์ ๊ตํ์ ์ป๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. JSX๊ฐ ์ฑ๊ณตํ ๊ณณ์์ E4X ๋ฐ E4H๊ฐ ์คํจํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
ํฅ๋ฏธ๋กญ๊ฒ๋ Flutter๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋งํฌ์ ์ธ์ด์ ์ ๋๋ฉ์ด์ GIF๋ผ๋ ๋ ๊ฐ์ง๋ฅผ ์์ฃผ ์๊ตฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ 3๊ฐ์์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์ ๋๋ฉ์ด์ GIF๋ฅผ ์๊ตฌํ์ง๋ง ๋งํฌ์ ์ธ์ด๋ ์๊ตฌํ์ง ์์ต๋๋ค. Dart์์ ๋น๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ต์ํด์ง๋ฉด ๋งํฌ์ ์ธ์ด๊ฐ ์ค์ ๋ก ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ฌ์ ํ โโ๋งํฌ์ ์ธ์ด๋ฅผ ์ํ์ง๋ง ๋๋ฝ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๋ฌป์ง ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ชป๋ ์ ํ(์ด๋ ์ชฝ์ด๋ )์ ๋ ธ๋ ฅ์ ๋ค์ผ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ชฝ์ ์์๋ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ฑฐ๋ํ ์ค์ฒฉ ํํ์์์ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๊น?
๋ค, ์ต์ํ XML๋งํผ์ ์ฝ์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก XML์ ๋งค์ฐ ์ฅํฉํ๊ณ ๊ตฌ์กฐ๋ฅผ ๋๋ ํํฉ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ๋น์ ์ด ์ต์ํด์ง ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค.
(๋ํ ์ค์ ๋ก ์์ฑํ์ง ์๊ณ ๋ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์๋๋ก ๊ฐ์ "๋ซ๋ ํ๊ทธ" ์ฃผ์ ์ ์ ๋ ฅํ๋ IDE๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.)
๋งํฌ์ ์ธ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ๊ณผ ๋น๊ตํ๋ฉด ๊ฐ๋จํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ์ ์ธ์ ๋ ๋ช ๋ นํ์ ์ธ์ด๊ฐ ์ผ๋ง๋ ์ฝ๊ฒ ๊ตฌ๋ฌธ ๋ถ์๋๋์ง ๊ฒฐ์ ํ ๋ ์ค์ํ ๊ตฌ๋ถ์ด ์๋๋๋ค. (์๋ฅผ ๋ค์ด HTML์ "์ ์ธ์ "์ด์ง๋ง ๋ด๊ฐ ๋ค๋ฃจ์๋ ๊ฒ ์ค ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ๊ฐ์ฅ ๋ณต์กํ ์ธ์ด ์ค ํ๋์ผ ์ ์์ต๋๋ค.)
์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ๋จ์์ฑ์ ๋ค๋ฅธ ๋ง์ ์ด์ ์ ๊ฐ์ ธ๋ค์ค๋๋ค.
์ด๊ฒ์ด ์ฃผ์ ์ด์ ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ ์ ์๋ ๊ฒ์ ๋๋ค. HTML, React, iOS ์ฝ๋, Android ์ฝ๋, Flutter, ๋ช ๋ น์ค ์ฑ ๋ฑ์ ์์ฑํ๋ ๋ฐ ์ต์ํ ์์ง๋์ด๋ค์ ํผํฉํ์ฌ ๋ค์ํ ๊ตฌ๋ฌธ์ผ๋ก ์ ์ํ๊ณ ๊ทธ๋ค์ด ์๊ฐํ๋ ๋ฐ๋ฅผ ์ค๋ช ํ๋๋ก ์์ฒญํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ UI๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ตฌ๋ฌธ์ ์ธก์ ํ ์ ์์ต๋๋ค. @InMatrix ๋ ์ ๋๋ฉ์ด์ ์์ ์ด ๋๋ ํ ๋ณผ ์ ์๋ ๊ฒ์ ๋๊น?
์ด ๊ตฌ์กฐ๋ GUI ๋น๋์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ก ์ฝ๊ฒ ์กฐ์ํ ์ ์์ต๋๊น?
์, ์ ์ด๋ ์์น์ ์ผ๋ก. ๊ธฐ๊ณ์ ์ผ๋ก Dart ํํ์์ XML์ด๋ JSON ๋๋ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ๊ตฌ์กฐํ๋ ์ธ์ด๋ก ๋ณํํ๋ ๊ฒ์ ๋น๊ต์ ๊ฐ๋จํด์ผ ํฉ๋๋ค. ๊ตฌ๋ฌธ์ ๋ณํํ๋ ๋ฌธ์ ์ผ ๋ฟ์ด๋ฉฐ ์ค์ ์ ๋ณด๋ ๋์ผํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก GUI ํธ์ง๊ธฐ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ผ๋ก ๋ณํํ์ง ์๊ณ Dart์์ ์ง์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ "๊ฑฐ๋ํ ์ค์ฒฉ ํํ์" ๋ด๋ถ๋ก ๋ค์ด๊ฐ์ GUI ํธ์ง๊ธฐ๊ฐ ๊ธฐ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด์ง ์๋ ์ ํจํ ๋คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋์ง ์๋ ๊ณ ์ ๋ XML ๊ตฌ์กฐ๋ก.
๋ฌธ์ ๋ Dart ํํ์์์์ ๊ฐ์ด XML ๊ตฌ์กฐ์ ์ ํํ ๋์ผํ "๋ชจ๋ ์ ํจํ dart ์ฝ๋"๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ๋ง ๊ทธ๋๋ก ๊ธฐ๊ณ์ ์ผ๋ก ๊ตํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ XML์ ์ฌ์ฉํ๋ ๊ฒ์ด ํนํ ๋์์ด ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๊ฒ์ XML๋ก ์ด๋ป๊ฒ ๋ฐ๊พธ๊ฒ ์ต๋๊น?
new ListView.builder(
padding: new EdgeInsets.all(8.0),
itemExtent: 20.0,
itemBuilder: (BuildContext context, int index) {
return new Text('entry $index');
},
)
๊ทธ๊ฒ์ ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค.
๋๋ ํนํ JSX๋ฅผ ์๋ฏธํ์ต๋๋ค. ๊ทํ๊ฐ ์ ์ํ ๊ตฌ๋ฌธ์ด ๋ฌธ์ ์ ์ ๊ทผํ๋ ๋ฐ ์๋ฒฝํ๊ฒ ์ ํจํ ๋ฐฉ๋ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค.
๋๋ ์ง๋ ๋ช ๋ ๋์ Adobe์ ์ ํ์ด ์กด์ฌํ๋ XML ๋งํฌ์ ๊ณผ ActionScript๋ฅผ ๊ฒฐํฉํ Adobe์ Flex SDK๋ฅผ ์์ ํ์ต๋๋ค. UI ์ ์๋ฅผ ์ํ ๋งํฌ์ ์ ๋งค๋ ฅ์ ์ดํดํ์ง๋ง ๋ช ๊ฐ์ง ๋จ์ ๋ ๊ธฐ์ตํ ์ ์์ต๋๋ค.
๋ช ๋ ์ด ์ง๋ฌ๊ณ ๋ ์ด์ ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ๊ธฐ์ตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ฐ์ ์ธ ์ธ์์ ๋งํฌ์ ๊ณผ ์ฝ๋์ ์กฐํฉ์ผ๋ก UI๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ธฐ๊ปํด์ผ ํผํฉ ๋ฐฑ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์ฃฝ์๋๋๊ฐ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ ์ฃฝ๋๋๊ฐ ๋ฌธ์ ๋ค. ์ฌ๋๋ค์ด ์ํ๋ ์๋ฃจ์ ์ ์ ๊ณตํ์ง ์์์ ์ฃฝ์ ๊ฑด๊ฐ์? ๊ตฌํ ๋ฌธ์ ๋๋ฌธ์ ์ฃฝ์์ต๋๊น? ํนํ ๋ฌธ์ ๋ก ์ฃฝ์์๊น? ๋๋ฌด ์ด๋ฅธ ์๊ฐ์ด์๋์? ๋๋ฌด ๋ฆ์์ด? ๊ณผ๊ฑฐ ๊ฒฝํ์์ ๊ตํ์ ์ป๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. JSX๊ฐ ์ฑ๊ณตํ ๊ณณ์์ E4X ๋ฐ E4H๊ฐ ์คํจํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
E4X๋ Adobe Flash/Flex ๋ด์์๋ง ์ฌ์ฉ๋๋ ActionScript์์๋ง ๊ตฌํ๋์๊ณ Adobe๋ ํ๋ก์ ํธ๋ฅผ ์ข ๋ฃํ๊ธฐ ๋๋ฌธ์ ์ข ๋ฃ๋์์ต๋๋ค. ๋์ Adobe๋ ์ข ์ ๋ฐ ์ํ๊ณ ๋ถ๊ดด์ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋จ์ผ ์์ค ๊ณต๊ธ์๊ฐ ์๋ ๊ฐ๋ฐฉํ ํ์ค์ผ๋ก ๋ฐฉํฅ์ ๋ณ๊ฒฝํ์ต๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ Flutter๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๋งํฌ์ ์ธ์ด์ ์ ๋๋ฉ์ด์ GIF๋ผ๋ ๋ ๊ฐ์ง๋ฅผ ์์ฃผ ์๊ตฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ 3๊ฐ์์ด ์ง๋ ํ์๋ ์ฌ์ ํ ์ ๋๋ฉ์ด์ GIF๋ฅผ ์๊ตฌํ์ง๋ง ๋งํฌ์ ์ธ์ด๋ ์๊ตฌํ์ง ์์ต๋๋ค. Dart์์ ๋น๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ต์ํด์ง๋ฉด ๋งํฌ์ ์ธ์ด๊ฐ ์ค์ ๋ก ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ฌ์ ํ โโ๋งํฌ์ ์ธ์ด๋ฅผ ์ํ์ง๋ง ๋๋ฝ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ๋ฌป์ง ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ชป๋ ์ ํ(์ด๋ ์ชฝ์ด๋ )์ ๋ ธ๋ ฅ์ ๋ค์ผ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ชฝ์ ์์๋ผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ธ์, ๋ด๊ฐ ๋น์ ์๊ฒ ๋ ๊ฐ์ง๋ฅผ ์์ฒญํ๋๋ฐ ๋น์ ์ด 3๊ฐ์ ๋์ ์๋ฌด๊ฒ๋ ํ์ง ์์๊ณ ์ฒซ ๋ฒ์งธ์ ๋ํ ๋์์ด ์๋ค๋ฉด, ๋๋ ๋ํ ๋น์ ์ ์๋ต์ฑ๊ณผ ์ด์ ์ ๋ฌ ์ค์ ์ ๊ฐ์ํ ๋ ์์ ํ ๋ถ๊ฐ๋ฅํ ์ผ์ ๋ํด์๋ง ์์ฒญํ ๊ฒ์ ๋๋ค.
(๋ํ ์ค์ ๋ก ์์ฑํ์ง ์๊ณ ๋ ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ ์๋๋ก ๊ฐ์ "๋ซ๋ ํ๊ทธ" ์ฃผ์์ ์ ๋ ฅํ๋ IDE๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.)
์ข ์๊ธฐ๊ธด ํ์ง๋ง ์์์ ์ธ๊ธํ XML ๋ซ๋ ํ๊ทธ๋ฅผ ๋ฃ๋ ๊ฒ์ด ๋๋ฌด ์ฅํฉํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ด ์ฃผ์ ์ด์ ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ ์ ์๋ ๊ฒ์ ๋๋ค. HTML, React, iOS ์ฝ๋, Android ์ฝ๋, Flutter, ๋ช ๋ น์ค ์ฑ ๋ฑ์ ์์ฑํ๋ ๋ฐ ์ต์ํ ์์ง๋์ด๋ค์ ํผํฉํ์ฌ ๋ค์ํ ๊ตฌ๋ฌธ์ผ๋ก ์ ์ํ๊ณ ๊ทธ๋ค์ด ์๊ฐํ๋ ๋ฐ๋ฅผ ์ค๋ช ํ๋๋ก ์์ฒญํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ UI๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ตฌ๋ฌธ์ ์ธก์ ํ ์ ์์ต๋๋ค. @InMatrix ๋ ์ ๋๋ฉ์ด์ ์์ ์ด ๋๋ ํ ๋ณผ ์ ์๋ ๊ฒ์ ๋๊น?
๋ฌผ๋ก ๊ณ์ ์งํํ ์ ์์ต๋๋ค. "ํ ๋ฒ React(JSX ์ฌ์ฉ)๋ฅผ ์ํํ๋ฉด ๋ค์ ๋์๊ฐ์ง ์์ต๋๋ค."๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๊ฒฝํ ๋ง์ React ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํ๊ณ JSX๊ฐ ๋์๊ณ ์ ๋ ํ์ง ๋ง์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋์ง ๋ฌผ์ด๋ณด์ญ์์ค. ๋น์ ์ ๊ธธ์ ๋ณด์ฌ์ฃผ๊ณ ๊ทธ๋ค์ด JSX๋ฅผ ๋น์ ์ด ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ๊ต์ฒดํ๊ณ ์ถ์์ง ๋ฌผ์ด๋ณด์ญ์์ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ ์ ๋ฌธ์ ๋ซ๊ณ ์ฅ์๋ฅผ ์ ๊ทธ์ญ์์ค. ์ด ๊ฐ๋ฐ์๋ค์ ๋ฌผ๊ฑด์ ๋ค๊ณ ๊ฐ์ฅ ๊ฐ๊น์ด ์ถ๊ตฌ๋ฅผ ํฅํด ์ง์ฃผํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌธ์ ๋ Dart ํํ์์์์ ๊ฐ์ด XML ๊ตฌ์กฐ์ ์ ํํ ๋์ผํ "๋ชจ๋ ์ ํจํ dart ์ฝ๋"๋ฅผ ๋ฃ์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ฌผ๋ก , ํ์ง๋ง GUI ๋น๋์๊ฒ๋ ๊ฑด๋๋ฆด ํ์๊ฐ ์๊ณ ์ฝ๊ฒ ๊ฑด๋๋ธ ์ ์๋ ๋ฐ์ดํธ ๋ธ๋ก์ผ ๋ฟ์ ๋๋ค. ์ค๊ณ/์ฝ๋ ํธํ์ฑ์ ์์น ๋์ ์ ์ค์ง์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
new ListView.builder(
padding: new EdgeInsets.all(8.0),
itemExtent: 20.0,
itemBuilder: (BuildContext context, int index) {
return new Text('entry $index');
},
)
let style = {
padding: new EdgeInsets.all(8.0),
itemExtent: 20.0
};
<ListView.builder style={style}>
{(context, index) => <Text> entry {index} </Text>}
</ListView.builder>
Adobe Flex Builder๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๋๋ฐ...
๊ฐ๋ฐ์๋ค์ ์ด๊ฒ์ ActionScript ๋๊ตฌ๋ก ๋ณด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์, ํ์ง๋ง ์ข
์ข
๋์์ธ ๋ณด๊ธฐ์์ ์ฝ๋ ๋ณด๊ธฐ๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ์ ํํ์ต๋๋ค.
ํ๋ฉด์ ์์ํ๋ฉด ๋์์ธ ๋ณด๊ธฐ๋ก ์ด๋ํ๊ณ ๋๋๊ทธ/๋๋กญ์ ์ฌ์ฉํ์ฌ ์์ ฏ์ ๋ ์ด์์ํ๊ณ ์ฒซ ๋ฒ์งธ ์ ์ ํ๋ฉด์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฝ๋์ ์ผ๋ถ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ ํ๋ฉด์ ์ฑ์ฐ๊ณ ํ๋ก๋์
์ค๋น๊ฐ ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์คํ ์ค์ธ ๊ฒ์ ์ฌ๋๋ค์๊ฒ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์์ฐ์ฑ์ ๋๋ผ์ ์ต๋๋ค. ๊ฐ๋ฐ์ด ์งํ๋๋ฉด์ ํ๋ก ํธ ์๋๋ฅผ ๋ฐฑ์๋์ ์ฐ๊ฒฐํ๊ณ ActionScript ์ฝ๋์ ์์ด ์ฆ๊ฐํ๊ณ ์, ์ฝ๋ ์ ์ฒด๋ฅผ ์ง๋ฐฐํ์ง๋ง ๋ฆด๋ฆฌ์ค ์๊ฐ์ด ๊ฐ๊น์์ก์์๋ ๋ถ๊ตฌํ๊ณ ๋์์ธ ๋ณด๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ธํ ์์๋ณด์ง ์๊ณ ๋ UI๋ฅผ ์กฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ํธ.
๊ทธ๋ฌ๋ ์ ๋ฐ์ ์ธ ์ธ์์ ๋งํฌ์ ๊ณผ ์ฝ๋์ ์กฐํฉ์ผ๋ก UI๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ธฐ๊ปํด์ผ ํผํฉ ๋ฐฑ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์์ฆ ์ธ์์ ์์ต๋๋ค. ๋ช ๋ นํ ์ธ์ด๋ Python ์ฒ ํ์์ ๋ฐ์ ํ์ผ๋ฉฐ ๊ฐ๋ฐ์ ์ ํฉํฉ๋๋ค. ์๋ฒ ๋๋ ๋งํฌ์ (XML)์ ์ฌ์ฉํ ์ ์ธ์ ๊ธฐ์ ์ React์ ์ถํ์ผ๋ก ์ฃผ๋ฅ๊ฐ ๋์์ต๋๋ค. JSON์ ์ ํธํ๋ ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํ์์ด ๋์์ต๋๋ค.
E4X๋ ActionScript์์๋ง ๊ตฌํ๋์์ต๋๋ค.
E4X๋ ECMA ํ์ค์ด์์ต๋๋ค. Mozilla๋ ์ ์ ๋์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง ์ ๊ฑฐํ์ต๋๋ค(๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ก์๋ ๋งค์ฐ ์ด๋ก์ ์ธ ์์ง์). ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ ์ด๋ฅผ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ์ง ์์์ต๋๋ค. (ํ์ง๋ง ๊ทธ๋ค์ ๋ค๋ฅธ ์๋ก์ด ECMA ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.) E4H๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ ๊ตฌํ์ ์ ํ ๊ด์ฌ์ด ์์์ต๋๋ค.
๊ธ์, ๋ด๊ฐ ๋น์ ์๊ฒ ๋ ๊ฐ์ง๋ฅผ ์์ฒญํ๋๋ฐ ๋น์ ์ด 3๊ฐ์ ๋์ ์๋ฌด๊ฒ๋ ํ์ง ์์๊ณ ์ฒซ ๋ฒ์งธ์ ๋ํ ๋์์ด ์๋ค๋ฉด, ๋๋ ๋ํ ๋น์ ์ ์๋ต์ฑ๊ณผ ์ด์ ์ ๋ฌ ์ค์ ์ ๊ฐ์ํ ๋ ์์ ํ ๋ถ๊ฐ๋ฅํ ์ผ์ ๋ํด์๋ง ์์ฒญํ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ํ๋์ ๊ฐ๋ฅํ ์ด๋ก ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ๊ทธ ์ธ์๋ ๋ง์ ๊ฒ์ ์๊ตฌํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฉฐ, ๊ทธ๋ค์ด ์๊ตฌํ๋ ๋ง์ ๊ฒ๋ค์ด ๊ตฌํ๋๊ณ ์ ๋๋ฉ์ด์ GIF์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์ํฉ์ ์์ ํ ์ค๋ช ํ๋์ง ํ์ ํ ์ ์์ต๋๋ค.
์ข ์๊ธฐ๊ธด ํ์ง๋ง ์์์ ์ธ๊ธํ XML ๋ซ๋ ํ๊ทธ๋ฅผ ๋ฃ๋ ๊ฒ์ด ๋๋ฌด ์ฅํฉํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋ฌผ๋ก . ์ด๊ฒ์ ์ ํ์ IDE ๊ธฐ๋ฅ์ด๋ฉฐ ์ฝ๋์ ์์ฑํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์์ธํ ์ ๋ณด๊ฐ ๋ฌธ์ ์ธ์ง ์ฌ๋ถ์ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
...
ListView
...
GUI ํธ์ง๊ธฐ๋ ์ด ๋งํฌ์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์? ๋๋ ์ด๊ฒ์ ์ํด UI๋ฅผ ์๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ด๊ฒ์ ์ด ์์ฒญ์ ๋ํ ๋ฐ๋ก ์ผ ์ ์์ผ๋ฉฐ/๋๋ ๋งํฌ์ ์ ์ํ๋ ๊ฒฝ์ฐ ์ผ๋์ ๋์ด์ผ ํ ํต์ฐฐ๋ ฅ์ด ์์ ์ ์์ต๋๋ค. ๋๋ ๋ค๋ฅธ API๊ฐ ํต๊ณผํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง ์์ GWT์ ํจ๊ป ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ง๋๋ ๋งํฌ์ ์ ์ถ๊ฐํ๋ค๋ ๊ฐํ ๋๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
UI ๊ตฌ์ถ๊ณผ ๊ด๋ จํ์ฌ ๋ช ๊ฐ์ง ๋ค๋ฅธ ํ๋ ์์ํฌ๊ฐ ์ด๋ฌํ ์ ํ์ ๊ฑฐ์น๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์ด์ ๊ฐ์ ๋งํฌ์ ์ ๋๊ตฌ์ ๋งค์ฐ ์ ํฉํ๋ฉฐ ์ง๊ธ๊น์ง IDE ๊ฐ๋ฐ์์๊ฒ๋ ์ฒ๊ตญ๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค. ๋๊ฐ ๋ฌด์์ ํ๋์ง์ ๋ํ ์ฑ ์์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค. ๋ ์ํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง.
GWT๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ํ์ฌ Java๋ก UI๋ฅผ ๊ตฌ์ถํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์๊ณผ ํจ๊ป xml ๋งํฌ์ ์์ UI๋ฅผ ๋น๋ํ ์ ์๋ UiBinder๊ฐ ์ ๊ณต๋์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋๊ตฌ์ธ Eclipse ํ๋ฌ๊ทธ์ธ์ xml ๋งํฌ์ ์์ UI๋ฅผ ์์ฑํ ์ ์์์ต๋๋ค. Android๋ ๊ทธ๋ ๊ฒ ํ๊ณ ์์ผ๋ฏ๋ก ์์ ์ ์ค๋ช ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ๋ด๊ฐ ๋ณธ ๊ฒฐ๊ณผ, ๋งํฌ์ ์ UI IDE ๊ฐ๋ฐ์๋ค์๊ฒ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ๋งํฌ์ ์ ์์ฒญ๋ ์๊ฐ ํฌ์์ด๋ฉฐ ์ค์ ํ๋ก๊ทธ๋จ์ผ๋ก ์ ํํ๊ธฐ ์ํด ๋ณต์กํ ๋๊ตฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ตฌ๋ ํญ์ ๋ง์ง๋ง์ ๋์ต๋๋ค. ๊ทธ๋์ ๊ทธ ๋์ ๋ชจ๋ ๊ฒ์ด ํ์ค๋ก ๋ํ๋๋ ๋์ ๋ ๊ฐ์ ์ธ๊ณ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ผ์ ํ๋ ๋ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ. ํ๋๋ ๊ธฐ๋ณธ ์ธ์ด์ด๊ณ ํ๋๋ ๋งํฌ์ ์ ๋๋ค. ๊ทธ๋์ ์ ๋ ์ค๋ GWT๋ฅผ ์ง์งํฉ๋๋ค. ๋ฌธ์๋ฅผ ์์ฑํ ๋ Java์ฉ์ผ๋ก ํ ๋ฒ, UiBinder XML ๋งํฌ์ ์ฉ์ผ๋ก ํ ๋ฒ, ๋ ๋ฒ ์์ฑํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ ์ง๋ฌธ์ ๋งํฌ์ ๊ธธ์ ๊ฐ๊ณ ์ถ๋ค๋ฉด ์ง๋ฌธ์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ถ๊ฐ๋ ๋ณต์ก์ฑ์ ์ฌํ์ ๊ฐ์น๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค!
JSX๋ HTML๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํ๋ ์ผ์ ํจ๊ป ํผํฉํ๋ ค๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋งํฌ์ ์ฌ์์ ์ถ๊ฐ๋ ๋ณต์ก์ฑ์ด ๋งํฌ์ ์ผ๋ก UI๋ฅผ ์์ฑํ๋ ์๊ตฌ ์ฌํญ์ ์ ํฉํ๋ค๊ณ ๋๊ปด์ง์ง ์์ต๋๋ค. ํนํ ๋ฌธ์ ๋งํฌ์ ์ธ์ด๋ฅผ ๋์์ผ๋ก ํ์ง ์๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ ์ด๋ ์ผ์์ ์ธ ์ฌ์ฉ์์๊ฒ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ธ์ ์ ์ธ ๋ฉ๋ชจ์. ๋๋ ๋๊ตฌ๋ก ์ผํ๋ ๊ฒ์ ์ข์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋งํฌ์ ์ธ์ด๊ฐ ์๋นํ ์ ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋งํฌ์ ์ ์ฌ์ฉํ ๋ AST๋ฅผ ์์ฑํ๊ณ ์์ ํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
ํ์ง๋ง ๋ค์ ๋งํ์ง๋ง, ๋น์ ์ด ์ผ์ ๋ํด ์ถฉ๋ถํ ๋ง์์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋น์ ์ด ๋ฌด์์ ํ๋ ๋ณ๋ก ์ค์ํ์ง ์์ต๋๋ค. ๊ฒฐ๊ตญ ๊ฐ๋ฐ์๊ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๋ค๋ฉด ๊ด์ฌ์ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ง๋์ด๋ง ํ์ ๋น์ฉ์ ์ผ๋ง์ ๋๊น?
์ง์ง ์ง๋ฌธ์ UI๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฌ๋ก ๋คํธ๋ฅผ ์์ฑํ๊ณ ์ค๊ฐ ๋งํฌ์ ์ ๊ฑด๋๋ธ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ชฉํ๋ ๊ทธ๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ ๊ธธ์ ํํ๋ค๋ฉด ๋ชจ๋ ๋ฉด์์ ๋น์ฉ์ ์ค์ ๋ก ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค!
E4X๋ ECMA ํ์ค์ด์์ต๋๋ค. Mozilla๋ ์ ์ ๋์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง ์ ๊ฑฐํ์ต๋๋ค(๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ก์๋ ๋งค์ฐ ์ด๋ก์ ์ธ ์์ง์). ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ ์ด๋ฅผ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ์ง ์์์ต๋๋ค.
Adobe๋ง์ด E4X๋ฅผ ์๋ฒฝํ๊ฒ ์นํธํ์ผ๋ฉฐ ๊ฐ๋ฐ์๋ค์๊ฒ ์ข์ ํํ์ ์ป์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด๋ ํญ์ ๋ธ๋ผ์ฐ์ ์์ ํญ๋ชฉ์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํฉ๋๋ค. Google์ด MathML ์ง์์ ์ ๊ฑฐํ์ง ์์์ต๋๊น?
๊ทธ๊ฒ์ ํ๋์ ๊ฐ๋ฅํ ์ด๋ก ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ ๊ทธ ์ธ์๋ ๋ง์ ๊ฒ์ ์๊ตฌํ๋ ๊ฒฝํฅ์ด ์์ผ๋ฉฐ, ๊ทธ๋ค์ด ์๊ตฌํ๋ ๋ง์ ๊ฒ๋ค์ด ๊ตฌํ๋๊ณ ์ ๋๋ฉ์ด์ GIF์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์ํฉ์ ์์ ํ ์ค๋ช ํ๋์ง ํ์ ํ ์ ์์ต๋๋ค.
๋ค์์ React์ JSX์ ๊ดํ ๊ฒ์ ๋๋ค. ๋ณด์๊ณ ์ ์ ๋์ ๊ฐ๋ฐํ ๋๊น์ง React๊ฐ ํ ์ด๋ธ์ ์ ๊ณตํ๋ ๊ฒ์ ์์ ํ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ํ๋ ์์ํฌ์ ๋ํด ํ๋ฃจ.
GUI ํธ์ง๊ธฐ๋ ์ด ๋งํฌ์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์? ๋๋ ์ด๊ฒ์ ์ํด UI๋ฅผ ์๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
let style = {
padding: new EdgeInsets.all(8.0),
itemExtent: 20.0
};
<ListView.builder style={style}>
{(context, index) => <Text> entry {index} </Text>}
</ListView.builder>
๋๋ \
์ด ๊ฒฝ์ฐ ์์์ ํจ์์ด๋ฏ๋ก 'ํธ์ง ๋ถ๊ฐ/์ฝ๋'๋ผ๋ ์ฌ๊ฐํ์ ๋ฃ์ด ์ฌ์ฉ์์๊ฒ ์ด ์์ ฏ์ด ์ฝ๋์์ ์์ฑ๋์์์ ์๋ฆฌ๊ฑฐ๋ ์ด ๊ฒฝ์ฐ ํจ์๊ฐ
๊ทธ๋ฌ๋ ์ค์ ๋ก ๋งํฌ์ ์ ์์ฒญ๋ ์๊ฐ ํฌ์์ด๋ฉฐ ์ค์ ํ๋ก๊ทธ๋จ์ผ๋ก ์ ํํ๊ธฐ ์ํด ๋ณต์กํ ๋๊ตฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ด๊ฐ ์๊ตฌํ๋ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ํ ๊ฒฝ์ฐ ์ด XML ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์๋๋ก Dart ์ปดํ์ผ๋ฌ์ ์ด๋ฌํ ๊ฐ๋จํ ํ์ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ธฐ์กด ๋ฐฉ์์ ๊ณ์ ์๋ํ ๊ฒ์ด๋ฉฐ ์ด๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ์์ ๋์ ๊ทธ๋ค์ง ํฌ์ง ์์ต๋๋ค. ์ค์ ๋ก babel.js ์ปดํ์ผ๋ฌ๊ฐ JSX๋ฅผ ์ํํ๋ ๋ฐ ๋ช ์ค์ ์ฝ๋๊ฐ ํ์ํ์ง ์ ์ ์์ต๋๋ค. ์ ๋ ์์ฒ ์ค์ด ์๋๋ผ ์๋ฐฑ ์ค์ ๋งํ๊ณ ์์ต๋๋ค(๋ฐฉ๊ธ ํ์ธํ์ต๋๋ค).
๊ทธ๋ฆฌ๊ณ ๋๊ตฌ๋ ํญ์ ๋ง์ง๋ง์ ๋์ต๋๋ค. ๊ทธ๋์ ๊ทธ ๋์ ๋ชจ๋ ๊ฒ์ด ํ์ค๋ก ๋ํ๋๋ ๋์ ๋ ๊ฐ์ ์ธ๊ณ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ผ์ ํ๋ ๋ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ. ํ๋๋ ๊ธฐ๋ณธ ์ธ์ด๋ก, ํ๋๋ ๋งํฌ์ ์ผ๋ก
๋ฌผ๋ก ์ ๋๋ค. ํ์ง๋ง React๋ ์ด์ ๊ฐ์์ผ๋ฉฐ ์ ํ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ฌธ์๋ฅผ ์์ฑํ ๋ Java์ฉ์ผ๋ก ํ ๋ฒ, UiBinder XML ๋งํฌ์ ์ฉ์ผ๋ก ํ ๋ฒ, ๋ ๋ฒ ์์ฑํด์ผ ํฉ๋๋ค.
๋งํฌ์ ์ด ์ฝ๋ ๋ด๋ถ์ ์๊ธฐ ๋๋ฌธ์ React์๋ ์์ต๋๋ค.
์ถ๊ฐ๋ ๋ณต์ก์ฑ์ ์ฌํ์ ๊ฐ์น๊ฐ ์์ต๋๋ค!
๋ฌผ๋ก ๊ฐ๋ฐ์์๊ฒ ์ต์ ๊ธฐ์ ์ ๊ต์กํ๊ณ ํ์ฌ๋ฅผ ๋ ๋ ์ํ์ ๊ฐ์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํ ๋ ผ์๊ณผ ๊ฐ์ต๋๋ค. ๋ ํฐ ์ํ์ ํ๋ จ๋์ง ์์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ต์ ๊ธฐ์ ์ ์ฑํํ์ง ์์ผ๋ฉด ๋ค์ฒ์ง ์ํ์ด ์์ต๋๋ค.
React๋ UI/UX ๊ฐ๋ฐ์ ์ํ ์ต์ ๊ธฐ์ ๋ก ์ฌ์ ์ ์ฃผ๋ํ๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์๊ฒ ์์ฒญ๋ ๊ด์ฌ์ ๋ฐ๊ณ ์์ต๋๋ค. ๊ฐ์ฅ ํฐ ์ํ์ React bar๋ฅผ ๋ง๋์ง ์๋ ๊ฒ์ ๋๋ค.
JSX ๋ด ์๊ฐ์๋ HTML๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํ๋ ์ผ์ ํจ๊ป ํผํฉํ๋ ค๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ชฉํ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
JSX๋ HTML์ฉ์ด ์๋๋๋ค. React Native๋ XML ๋งํฌ์ ์์ ๋ณด๊ธฐ(์: Flutter ์์ ฏ)๋ฅผ ์์ฑํฉ๋๋ค.
์ง์ง ์ง๋ฌธ์ UI๋ฅผ ๋ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
UI/UX๋ฅผ ๋ ์ ๊ตฌ์ถํ ์ ์๋ ๋ฐฉ๋ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๋ ๋์ ์๋ฏธ: ๋ ๋น ๋ฅด๊ณ ๋ ๋์ ํ์ง(์ฝ๋ ๋ฐ UI/UX), ๋ถ๋๋ฌ์ด ๋์์ด๋-๊ฐ๋ฐ์ ์ํธ ์์ฉ ๋ฑ
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ ๋ง ๋ฉ์ง ์ผ์ ํ์ต๋๋ค. 'ํ๋ฌํฐ๋ฅํฐ' ๊ต์ฅํ์ด!!!
๋๋ ์ง๊ธ ๊ฐ์ค๋ก ์๋ฆฌํ๊ณ ์๊ณ ์ํํ ์ ๋๋ก ์ฐฝ์์ ์ผ ์ ์์ต๋๋ค ;)
๋๋ ๊ฐ๋ ์ฑ์ด ์ฐ๋ฆฌ๊ฐ ๊ณ ๋ คํด์ผ ํ ๋ง์ ์์ ์ค ํ๋์ผ ๋ฟ์ด๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง ์ฌ๊ธฐ์์ ์ ๊ธฐ๋ ๊ฐ๋ ์ฑ ์ง๋ฌธ์ ๋ตํ๊ณ ์ถ์์ต๋๋ค.
์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ๋จ์์ฑ์ ๋ค๋ฅธ ๋ง์ ์ด์ ์ ๊ฐ์ ธ๋ค์ค๋๋ค.
์ด๊ฒ์ด ์ฃผ์ ์ด์ ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ ์ ์๋ ๊ฒ์ ๋๋ค. HTML, React, iOS ์ฝ๋, Android ์ฝ๋, Flutter, ๋ช ๋ น์ค ์ฑ ๋ฑ์ ์์ฑํ๋ ๋ฐ ์ต์ํ ์์ง๋์ด๋ค์ ํผํฉํ์ฌ ๋ค์ํ ๊ตฌ๋ฌธ์ผ๋ก ์ ์ํ๊ณ ๊ทธ๋ค์ด ์๊ฐํ๋ ๋ฐ๋ฅผ ์ค๋ช ํ๋๋ก ์์ฒญํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ UI๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ตฌ๋ฌธ์ ์ธก์ ํ ์ ์์ต๋๋ค. @InMatrix ๋ ์ ๋๋ฉ์ด์ ์์ ์ด ๋๋ ํ ๋ณผ ์ ์๋ ๊ฒ์ ๋๊น?
ํ์คํ ์ฝ๋ ๊ฐ๋ ์ฑ์ ์คํ์ ์ผ๋ก ์ฐ๊ตฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ, 4๋ถ๊ธฐ ๊ณํ์ด ํ์ํ ๋ ๋ ์ง์งํ๊ฒ ๋ ผ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌํ ์ฐ๊ตฌ๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋ค๋ ค๋ฉด Flutter ํ๋ก๊ทธ๋๋ฐ์ ๋งฅ๋ฝ์์ ๊ฐ๋ฐ์์๊ฒ ์ด๋ค ์ข ๋ฅ์ ์ฝ๊ธฐ ์์ ์ด ์ค์ํ์ง ์ ์ํด์ผ ํฉ๋๋ค. ์ ์ฒด ๋น๋ ๋ฐฉ๋ฒ์ ์ฝ๊ณ ๊ฒฐ๊ณผ UI๊ฐ ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๋ ๊ฒ ์ธ์๋ ๊ฐ๋ ์ฑ์ ๋คํธ ํ์ผ์์ ๋น๋ ๋ฐฉ๋ฒ ์๋ณ, ์ค๊ดํธ ์ผ์น, ์ธ๋ผ์ธ ์ฃผ์ ์ฝ๊ธฐ ๋ฑ๊ณผ ๊ฐ์ ์์ ์์ ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ณด๋ค ์ข์ ๋ฒ์์ ์์ ์ค ์ผ๋ถ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋จผ์ ํธ์ง๊ธฐ์์ UI ํฅ์์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋งํฌ์ ์ธ์ด๋ฅผ ๋์ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค ์ ๋ ดํฉ๋๋ค. VS ์ฝ๋์ ๋ซ๋ ๋ ์ด๋ธ ๊ธฐ๋ฅ์ UI ๊ฐ์ ์ฌํญ ์ค ํ๋์ด๋ฉฐ ํด๊ฒฐํ๋ ค๋ ์ค๊ดํธ ์ผ์น ๋ฌธ์ ๋ฅผ ์ผ๋ง๋ ์ ํด๊ฒฐํ๋์ง ์ดํดํด์ผ ํฉ๋๋ค. ์ด ๊ณต๊ฐ์๋ ์์ง ์๋ํ์ง ์์ ๋ค๋ฅธ ์ต์ ์ด ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค๋ฅธ ๊ธ๊ผด์ด๋ ๋ฐฐ๊ฒฝ์์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ ์ ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋น๋ ๋ฉ์๋๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
๋๋ฅผ ์ค์ํ๊ฒ ์๊ฐํ๋ ๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ๋๋ค์ด ๊ฑฐ๋ํ ๋น๋ ๋ฐฉ๋ฒ์ ์์ฑํ์ง ์๊ณ ํ๋ ์์ํฌ์ ๊ตฌ์ฑ ํน์ฑ์ ํ์ฉํ๋๋ก ๊ถ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋น๋ ๋ฐฉ๋ฒ์ด ํ๋ฉด ๋์ด๋ณด๋ค ๋์ผ๋ฉด Dart๋ XML์ด๋ ์ฝ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
๋๋ฅผ ์ค์ํ๊ฒ ์๊ฐํ๋ ๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ๋๋ค์ด ๊ฑฐ๋ํ ๋น๋ ๋ฐฉ๋ฒ์ ์์ฑํ์ง ์๊ณ ํ๋ ์์ํฌ์ ๊ตฌ์ฑ ํน์ฑ์ ํ์ฉํ๋๋ก ๊ถ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋น๋ ๋ฐฉ๋ฒ์ด ํ๋ฉด ๋์ด๋ณด๋ค ๋์ผ๋ฉด Dart๋ XML์ด๋ ์ฝ๊ธฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
๋น๋ ๋ฐฉ๋ฒ๋ฟ๋ง์ด ์๋๋๋ค. ๋น๋ ๋ฉ์๋๊ฐ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋น๋ํ๊ธฐ ์ํด ํธ์ถํ๋ ๊ฒ์ ๋ค๋ฅธ ๋ชจ๋ ๋ฉ์๋์ ๋๋ค. ํ์ ํธ๋ฆฌ ์กฐ๊ฐ์ ๋น๋ํ๊ณ ๋ ํฐ ํธ๋ฆฌ๋ก ํธ์ถํ๊ธฐ ์ํด ๋ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ React์์ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.
๋ํ WebStorm with JSX์์ ๊ฐ XML ๋ ธ๋์๋ ๋ ธ๋๋ฅผ ํ์ฅ/์ถ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ +/-๊ฐ ์๊ณ ํ๋ฉด ๋์ด๋ณด๋ค ํฐ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ๋ ธ๋์ ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Flutter์์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ํ ๊ฐ์ง๋ ํฐ ๋น๋ ๋ฐฉ๋ฒ์ด ์ฑ๋ฅ์ ์ข์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋น๋ ๋ฐฉ๋ฒ์ ๋ ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ฏ์ผ๋ก ๋ถํดํ๋๋ก ๊ถ์ฅํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ํนํ Flutter์์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ฒฐ๊ณผ๋ก ๋น๋๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ๋ณด๋ค๋ ์คํ๋ ค ๊ถ์ฅํ์ง ์๋ ์ผ์ข ์ ๋ฐํจํด์ ๋๋ค. (์ด๊ฒ์ ์ต๊ทผ์ ๊นจ๋ฌ์ ๊ฒ์ด๋ฏ๋ก ๋ง์ ์์ ์ ์์ ฏ์ด ์์ง ์ ๋๋ก ํ์ง ๋ชปํ๊ณ ์์ต๋๋ค.)
์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๋น๋ ๋ฐฉ๋ฒ์ ๋ ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ฏ์ผ๋ก ๋ถํดํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
์ค์ ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ฏ์ด ๋ฉ๋๊น? ์๋๋ฉด ๋จ์ํ ๋ํผ/๋ณตํฉ ์์ ฏ์ด ๋ฉ๋๊น? ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ ค๋ฉด ์ต์ 2๊ฐ์ ์ฌ์ฉ ์ธ์คํด์ค๊ฐ ์์ด์ผ ํฉ๋๋ค.
https://flutter.io/catalog/samples/basic-app-bar/ ์ AppBar๋ ๋๋ฌด ๋ ํนํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค. ๋ํผ/๋ณตํฉ ๊ตฌ์ฑ ์์์ด๋ฉฐ ์ด๋ฌํ ๊ฒฝ์ฐ ๋ก์ปฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ UI์ ํด๋น ๋ถ๋ถ์ ๋น๋ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๋ ๋ง์ ์์ ์ ์ํํ๋ค๋ฉด ๋ํผ/๋ณตํฉ ๊ตฌ์ฑ ์์์ ๋ฐฐ์นํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒ์ ๋๋ค.
Flutter์์ ๋ฐ๊ฒฌํ ํ ๊ฐ์ง๋ ํฐ ๋น๋ ๋ฐฉ๋ฒ์ด ์ฑ๋ฅ์ ์ข์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฑ๋ฅ์ ๋ํด ์ธ๊ธํ์ผ๋ฏ๋ก ์ ๋๋ฉ์ด์ ๋ฃจํ๊ฐ ๋น๋ ๋ฉ์๋๋ฅผ ๊ตฌ๋ํ๋๋ก ํ๋ฉด ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ๋ํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ํนํ ๋น๋ ๋ฉ์๋๊ฐ ์ฌ์ฉ์ ์ฝ๋๋ผ๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋น๋ ๋ฉ์๋๊ฐ ์ด๋น 60๋ฒ ์ด์ ํธ์ถ๋๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค(์๋ฅผ ๋ค์ด, ๋ฌดํํ ๊ฑธ๋ฆฌ๋ ๋งค์ฐ ๊ธด ๋ฃจํ๊ฐ ์์ ์ ์์ผ๋ฉฐ ์ ๋๋ฉ์ด์ ์ ๊ฑด๋๋ธ ์ ์์). Flutter ์ด๋ณด์์ด๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ํ๋ ธ์ ์๋ ์์ต๋๋ค.
https://flutter.io/catalog/samples/basic-app-bar/ ์ AppBar๋ ๋๋ฌด ๋ ํนํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
ํฌ๊ธฐ๋ ๋น๊ต์ ์์ผ๋ ๊ด์ฐฎ์ต๋๋ค.
์ฑ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ์ด๊ฒ์ ์ด ๋ฌธ์ ์ ๋ํด ๋ค์ ์ฃผ์ ๊ฐ ์๋๋ฏ๋ก ๋ ผ์ํ๋ ค๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ญ์์ค(๋๋ ์ด๋ฉ์ผ flutter-dev ๋๋ ์คํ ์ค๋ฒํ๋ก ๊ฒ์, ์ํ๋ ๋๋ก).
์ด ๋ฌธ์ ๊ฐ ๋ฌปํ๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ ๋ฏธ์น ์ง์ ๋๋ค. ์ ์๊ฐ์๋ Flutter๊ฐ ์์ ฏ์ ๊ตฌ์ฑํ๊ธฐ ์ํด JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ๊ตฌํํ๋ ๊ฒ์ ์ฑ๊ณตํ๊ฑฐ๋ ์ค๋จ๋ ๊ฒ์ ๋๋ค.
๋๋ ๋จ์ํ ํ๊ฒ ์ฒญ์ค์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ง์ ios์ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ค์ ๋ค์ดํฐ๋ธ ๋ฐ์์ผ๋ก ์์ง์ด๊ณ ์์ต๋๋ค. ์์ฅ ์ ์ ์จ์ ์ํํ ์๋ฒฝํ ๊ธฐํ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๊ด๋ จ๋ ์ฌ๋๋ค์ด ๋ค์ดํฐ๋ธ ๋ฐ์์ ํด๋ณด๊ณ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ๋ํด ์ด์ผ๊ธฐํ๋์ง ๋ณด๋๋ก ๊ถ์ฅํฉ๋๋ค.
๋๋ Flutter์์ JSX๋ฅผ ์กฐ๊ธ๋ ๊ทธ๋ฆฌ์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ๊ธฐ์ ๊ธฐ์ ์ฝ๊ฐ์ ์ด์ต์ ์ป๊ธฐ ์ํด ํ๋ ์์ํฌ์ ๋๊ตฌ๋ฅผ ๋ถํ๋ฆด ๋ฟ์ ๋๋ค.
@birkir ์ด ๋ฌธ์ ์ ๋ํด 100% ๋์ํฉ๋๋ค. Flutter์ ์๋ฒฝํ๊ฒ ๋ง๋ JSX๊ฐ ์๊ธฐ ๋๋ฌธ์ Flutter๋ ๋ก๊ณ ๋ น์จ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ 1990๋ ๋ ๊ธฐ์ ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ค์ ๋ก ๋ชจ๋ ์ฌ๋์ด ์ด๋ค ๋ฐฉ์์ผ๋ก๋ JSX๋ฅผ ์ฑํํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ต์ ๋ฒ์ ์ ์ธ๊ธฐ ์๋ Vue.js ํ๋ ์์ํฌ์ ๋๋ค.
+1
@zoechi JSX ์ ๋ํ ์ด์ ๊ฒฝํ์ ๋ฌด์์ ๋๊น? ์ค์ ๋ก ์ฌ์ฉํ๊ฑฐ๋ ๋ฐฉ๊ธ ๋ณธ ์ ์ด ์์ต๋๊น? ๋๋ ๋ํฌ๋ค์ด JSX๊ฐ ์ฌ๊ธฐ์ ๊ธฐ์ ์์ ์ด๋์ ์ค ๊ฒ์ด๋ผ๊ณ ๋งํจ์ผ๋ก์จ JSX๋ฅผ ๊ณผ์ํ๊ฐํ๊ณ ์๋ค๊ณ ์๊ฐํ๋ค. ์ฌ์ฉ์๊ฐ ์์ผ๋ฉด ์ ํ์ด ์๋ ๊ฒ์ ๋๋ค.
@birkir ์ฌ๊ธฐ์์ JSX์ ๋ํ ๋ง์ ํฅ๋ถ์ ๋ณด์์ง๋ง ๋๋ถ๋ถ ์ฃผ๊ด์ ์ธ ๋ ๋์ ๊ฐ๋ ์ฑ์ ์ ์ธํ๊ณ Flutter๊ฐ ๊ทธ๋ฌํ DSL์ ์ฌ์ฉํจ์ผ๋ก์จ ์ ํํ ๋ฌด์์ ์ป์ ์ ์๋์ง ์ค๋ช ํ๋ ๋ฐ ์ ๊ฒฝ์ ์ฐ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๋ง์ ๊ธฐ๋ฅ์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ํ๋ ๋์ ํ๋ ์์ํฌ๋ฅผ ์ฝํ์ํต๋๋ค.
๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์ค์ ๋ก ์ฌ๋๋ค์ด ํน์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ ๊ธฐ๋ฅ์ด ์๋ ๋ค๋ฅธ ์์ญ์์ ๋๋ฝ๋ ๋ฆฌ์์ค๋ ๋ง์ด ์๋นํฉ๋๋ค.
๋ฐ๋ผ์ Flutter๊ฐ JSX์ ๊ฐ์ ๊ฒ์ ์ป๋ ๊ฒ์ ๋ํด ํฅ๋ถํ๋ค๋ฉด ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ์์ฑํ๋ ๋ฐ ์๊ฐ๊ณผ ์๋์ง๋ฅผ ํฌ์ํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค๋ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ์ฝํ ์ฃผ์ฅ์ผ ๊ฒ์
๋๋ค.
๋ํ JSX์ ๊ฒฝ์ฐ๋ฅผ ๋์ฑ ์ฝํ์ํค๋ Flutter UI ์ฝ๋ ์์ฑ์ ๋ ์ฅํฉํ๊ฒ ๋ง๋ค๊ธฐ ์ํด Dart๋ฅผ ๊ฐ์ ํ ๊ณํ๋ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ๋ฌด์์ ๋๊น?
์ ๋ง๋ก !!! "์๋ฌด๋ Flutter๊ฐ ์ ํํ ๋ฌด์์ ์ป์ ์ ์๋์ง ์ค๋ช
ํ๋ ค๊ณ ์ ์ฐ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค... ใ
ใ
ใ
".
์ด ์ค๋ ๋๋ฅผ ์์ ํ ์ฝ์ง ์์์ต๋๊น? ์ฃผ์ ์ง์ค ์๊ฐ์ด JSX ์ง์๋ณด๋ค ํฝ๋๊น?
์ฌ๋ฌ๋ถ์ NIH ์ฆํ๊ตฐ(์ฌ๊ธฐ์๋ ๋ฐ๋ช ๋์ง ์์)์ ์๊ณ ์์ต๋๋ค. "ํ๋ฅญํ ์์ ๊ฐ๋ ๋ฒ ๋ผ๊ณ ์๋ํ ์์ ๊ฐ๋ ํ์น๋ค" ํ๋ฒํ ์์ ๊ฐ๋ ๊ธ์, ๋น์ ์ฒ๋ผ ํ๋ํฉ๋๋ค.
JSX๋ฅผ ์ง์ํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ๊ฐ๋จํ๊ณ ์๋ก์ด ๊ณ ๊ฐ(React Native ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์)์ ํ๋ซํผ์ผ๋ก ๋์ด๋ค์ด๋ ๋ฐ ์์ฒญ๋ ๋์์ด ๋ ๊ฒ์ด๋ผ๋ ์ฌ์ค๋ง์ผ๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋ณด์ง ๋ชปํ๋ ๊ฐ๋จํ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ํ๋ซํผ์์๋ ๊ตต๊ฒ ํ์๋์ง ์์ต๋๋ค.
ํ ๋ก ํ ๋ ๊ฑด์ค์ ์ธ ์ด์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๊น?
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฃผ์ฅ์ด ์ฝํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. ๊ด์ฐฎ์.
ํ๋ฌํฐ์ ํซ ๋ฆฌ๋ก๋ฉ์ด ์๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์? ์ด๋์์ ์์ต๋๊น? ์ ์ฅ.
์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์ฌ๋ฌ๋ถ์๊ฒ ํ๊ณ ํ ์ฃผ์ฅ์ ํ์ง ๋ชปํ์ต๋๊น? ํ๋ก์ ํธ ๊ฒฌ์ธ๋ ฅ๊ณผ ๊ฐ๋ฐ์ ์ ์น ๊ฐ ์ฐ๋ฆฌ์ ๊ฐ์ฅ ํฐ ์ด์ ์ ๋๋ค.
๋ ๋ฒ์งธ ์ด์ , ๊ฐ๋ ์ฑ :
https://github.com/flutter/flutter/blob/master/examples/flutter_gallery/lib/demo/cupertino/cupertino_buttons_demo.dart ๋ https://gist.github.com/birkir/e921158239c324ab95bb0b174383a562
์ธ ๋ฒ์งธ ์ด์ ๋ GUI ๋น๋ ์ ๋๋ค. README์ ์ฒซ ๋ฒ์งธ ์ค์ ์ธ์ฉํ๊ฒ ์ต๋๋ค.
๊ฐ๋ฐ์์ ๋์์ด๋ ๊ฐ iOS ๋ฐ Android์ฉ ์ต์ ๋ชจ๋ฐ์ผ ์ฑ์ ๋น๋ํ๋ ๋ฐ ๋์์ด ๋๋ ์๋ก์ด ๋ชจ๋ฐ์ผ ์ฑ SDK์ ๋๋ค.
๋๋ Flutter๊ฐ ๋ฒ ํ์ ๋๋ฌํ๊ธฐ ์ ์ Polymer์ ๊ฐ์ ํ ๋ผ๊ตด๋ก ๋ด๋ ค๊ฐ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ง ์์ต๋๋ค.
ํ๋ก์ ํธ ๊ฒฌ์ธ ๋ฐ ๊ฐ๋ฐ์ ์ ์น
๊ทธ ๊ด๊ณ๋ ์์ง ๋ถ๋ถ๋ช ํ๋ค.
๋ ๋ฒ์งธ ์ด์ , ๊ฐ๋ ์ฑ:
Dart ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ ๋์ ๋ชฉํ๋ก ๋ณด์ ๋๋ค.
์ธ ๋ฒ์งธ ์ด์ ๋ GUI ๋น๋์ ๋๋ค. README์ ์ฒซ ๋ฒ์งธ ์ค์ ์ธ์ฉํ๊ฒ ์ต๋๋ค.
๋ด๊ฐ ๊ธฐ์ตํ๋ ํ ์์์ ์ด๋ฏธ ์ธ๊ธํ ๊ฒ์ฒ๋ผ Dart ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๋ฐฉ์งํ ์ด์ ๊ฐ ์์ต๋๋ค.
๋น์ ์ ๋ฐ๋ ์ฃผ์ฅ์ ์ ๋ง ๊ทธ ์์ด๋์ด๋ฅผ ๊ธฐ๊ฐํ ์ ์์ต๋๊น?
Flutter UI ์ฝ๋๋ฅผ ๋ ์ฅํฉํ๊ฒ ์์ฑํ๊ธฐ ์ํด Dart๋ฅผ ๊ฐ์ ํ ๊ณํ๋ ์์ต๋๋ค.
ํ์ฌ์ ๋ฐฉ์์ด ๋ช ๊ฐ์ง ๊ฐ์ ์ฌํญ์ ์ฌ์ฉํ ์ ์๋ค๋ ์ธ์ ์ ๋ณด๋ ๋ฐ๊ฐ์ต๋๋ค.
๊ทธ๋ฌํ ์ ์์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ญ์์ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํผ๋๋ฐฑ์ ์ํด React Native ์ปค๋ฎค๋ํฐ์ ์ํธ ์์ฉํ๋ ๊ฒ์
๋๋ค.
์ฌ๋ฌ Dart ์ธ์ด ๊ธฐ๋ฅ ์์ฒญ์ ์ฝ๋๋ฅผ ๋ ์งง๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
new
๋ฐ const
์ต์
child
์ธ์๊ฐ ์๋ ์์ ฏ์ด ๋ช
๋ช
๋ ์ธ์๋ฅผ ๊ฑด๋๋ฐ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.children
์ธ์๊ฐ ์๋ ์์ ฏ(์: ํ ๋ฐ ์ด)์ด ์ด ๋ช
๋ช
๋ ์ธ์ ๋ฐ ํด๋น ๋ชฉ๋ก ์ ์ธ์ ๊ฑด๋๋ธ ์ ์์ต๋๋ค.์ด๋ฌํ ๋ณ๊ฒฝ์ผ๋ก ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Cupertino Buttons')),
body: Column(
Padding(padding: EdgeInsets.all(16.0),
Text(
'iOS themed buttons are flat. They can have borders or backgrounds but '
'only when necessary.'
),
),
Expanded(
Column(mainAxisAlignment: MainAxisAlignment.center,
Text(_pressedCount > 0
? 'Button pressed $_pressedCount time${_pressedCount == 1 ? "" : "s"}'
: ' '),
Padding(padding: EdgeInsets.all(12.0)),
Align(alignment: Alignment(0.0, -0.2),
Row(mainAxisSize: MainAxisSize.min,
CupertinoButton(onPressed: () { setState(() { _pressedCount += 1; }); },
Text('Cupertino Button'),
),
CupertinoButton(onPressed: null,
Text('Disabled'),
),
),
),
Padding(padding: EdgeInsets.all(12.0)),
CupertinoButton(
color: CupertinoColors.activeBlue,
onPressed: () { setState(() { _pressedCount += 1; }); },
Text('With Background'),
),
Padding(padding: EdgeInsets.all(12.0)),
CupertinoButton(
color: CupertinoColors.activeBlue,
onPressed: null,
Text('Disabled'),
)
),
),
)
);
}
๋ํ IDE์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ๊ดํธ ๋์ ํฉ์ฑ ์ฃผ์์ ํฌํจํ ์ ์์ผ๋ฉฐ IDE์์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Cupertino Buttons')),
body: Column(
Padding(padding: EdgeInsets.all(16.0),
Text(
'iOS themed buttons are flat. They can have borders or backgrounds but '
'only when necessary.'
),
),
Expanded(
Column(mainAxisAlignment: MainAxisAlignment.center,
Text(_pressedCount > 0
? 'Button pressed $_pressedCount time${_pressedCount == 1 ? "" : "s"}'
: ' '), // Text
Padding(padding: EdgeInsets.all(12.0)),
Align(alignment: Alignment(0.0, -0.2),
Row(mainAxisSize: MainAxisSize.min,
CupertinoButton(onPressed: () { setState(() { _pressedCount += 1; }); },
Text('Cupertino Button'),
), // CupertinoButton
CupertinoButton(onPressed: null,
Text('Disabled'),
), // CupertinoButton
), // Row
), // Align
Padding(padding: EdgeInsets.all(12.0)),
CupertinoButton(
color: CupertinoColors.activeBlue,
onPressed: () { setState(() { _pressedCount += 1; }); },
Text('With Background'),
), // CupertinoButton
Padding(padding: EdgeInsets.all(12.0)),
CupertinoButton(
color: CupertinoColors.activeBlue,
onPressed: null,
Text('Disabled'),
), // CupertinoButton
), // Column
), // Expanded
), // Column
); // Scafold
}
์ด ๋ํ๊ฐ ๋จ๊ฑฐ์์ง๊ณ ์์ต๋๋ค. ์ ๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ์ ํ๋ ๊ฐ๋ น์ ์ฝ์ ๊ฒ์ ๊ถ์ฅํ๊ณ ์ถ์ต๋๋ค.
https://flutter.io/design-principles/#conflict - resolution
๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ์ ์คํ๊ณ ์์ฐ์ ์ผ๋ก ๊ธฐ์ฌํ ์ ์๋์ง ๊ณ ๋ คํ๋ ๋์ ์ ๋ ์ด ๋ํ๋ฅผ ๋ฉฐ์น ๋์ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
UI ๊ตฌ์ถ์ ์ํ ๊ตฌ๋ฌธ์ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ ๊ฒฝํ์์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ด๋ผ๋ ๊ฒ์ ์ฐ๋ฆฌ ๋ชจ๋ ์๊ณ ์์ต๋๋ค. ์ง๊ธ์ ๊ตฌ๋ฌธ์ด ์ฝ๊ฐ ์ฅํฉํฉ๋๋ค. ์ฌ๋ฐฑ์ ์ถ๊ฐํ๊ธฐ ์ํด new
๋ญ๊ฐ๋ฅผ ํด์ผ ํฉ๋๋ค. margin: new EdgeInsets.symmetric(horizontal: 4.0)
, ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Kotlin ํ์ด Android ๊ฐ๋ฐ์๋ฅผ ์ํด ํ๋ ๊ฒ์ฒ๋ผ DSL์ ๊ตฌ์ถํ ์ ์์๊น์? Android UI๋ฅผ ๋น๋ํ๊ธฐ ์ํ DSL์ธ Anko ๋ผ๊ณ ํฉ๋๋ค.
verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
button("Login") {
textSize = 26f
}
}
๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๋๋ก ํ๊ณ ๋น๋ ์์ ์ ์ฆ๊ฒ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ค์ํฉ๋๋ค. ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ ์ Flutter ํ์์ ์ฌ๊ฐํ๊ฒ ํ๊ฐํด ์ฃผ์ธ์. ์ฐ๋ฆฌ ๋ชจ๋๋ Flutter๊ฐ ์์ผ๋ก ๋ ํฐ ์ฑ๊ณต์ ๊ฑฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Flutter์ XML๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ๋์ ํ์ง ๋ง์ธ์.
1๋
์ด์ Android Java๋ก ํ๋ก๊ทธ๋๋ฐํ ๋ค์ ์๋ํ ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ ๋ชจ์์ ์ฐพ๊ธฐ ์์ํ์ต๋๋ค.
React Native๋ก ์์ํ ๋ค์ React๋ฅผ ์๋ํ์ต๋๋ค. JSX ๋ฌธ๋ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์๋๊ณ html๋ ์๋๊ธฐ ๋๋ฌธ์ ์ ๋ง ๋ง์์ ๋ค์ง ์์์ต๋๋ค.
Flutter๋ฅผ ์๋ํ์ ๋ ์์ํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ฝ๋ค๋ ๊ฒ์ ์์์ต๋๋ค(์ฃผ๋ก Java ๋ฐฐ๊ฒฝ ์ง์ ๋๋ฌธ์ผ ๊ฒ์
๋๋ค).
Flutter์ ์ถ๊ฐ๋ XML ๊ตฌ๋ฌธ์ ๋ณด๊ณ ์ถ์ง ์์ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ ๋จ๊ณ ๋ ๋์๊ฐ pubspec.yaml์ ์ ๊ฑฐํ๊ณ pubspec.dart๋ก ๋ฐ๊พธ๊ณ dart ์ฝ๋๋ก ๊ตฌ์ฑํ๊ฒ ์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ ํ์ด์ง๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ ์ด์์ํ๋ ๊ฒ์ด ์ด๋ ต๋ค๊ณ ๋ถํํ๋ ๊ฒฝ์ฐ - ํ ๋ง๋ฅผ ์ค์ ํ๊ณ ํ์ด์ง๋ฅผ ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ์๊ฐ์ ์ผ๋ก ๋์์ธํ ์ ์๋ ๋ ์ด์์ ๋์์ด๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํธ์งํ ์๋๊ฐ ์๋ Flutter ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ์ฑ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
Android XML๊ณผ ๊ฐ์ ์๋ฐฉํฅ ํธ์ง(XML/๋ ์ด์์)์ผ ํ์๋ ์์ง๋ง ๋์ค์ ์ฌ์ฉํ ์ ์๋๋ก ๋ ์ด์์์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค. ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ ์ ์๊ณ (๋ฐ๋ผ๊ฑด๋) ์ผ๋ถ ์ธ์๋ง ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋๋ ์ด ๋ํ๊ฐ ์ค๋๋์๋ค๋ ๊ฒ์ ์๊ณ ์๊ณ ๊ฝค ๋จ๊ฑฐ์์ง๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ผ์ด๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ๋ํด ๋ช ์ค์ ๋จ์ด๋จ๋ฆฌ๊ณ ์ถ์ต๋๋ค.
ํ๋ฌํฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋๋ค. ์์ ํ ์๋ก์ด ๋ฐฉ์์ผ๋ก ์์ ์ ์ํํฉ๋๋ค. ์, ๋ฐ์ ํจ๋ฌ๋ค์์์ ์ฐจ์ฉํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. Flutter์ ํ ๋ชฉํ๋ ๊ฐ๋ฐ์๋ฅผ ๋ฐ์ ๋ค์ดํฐ๋ธ์์ Flutter๋ก ๋์ด๋ค์ด๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๋ฐ์๊ฐ ๊ด์ฌ์ ๊ฐ์ง ์ ์๋ ์๋ก์ด ๊ฒ์ ๊ตฌ์ถํ๋ ๊ฒ๋ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Google์ ์ด๋ฅผ ์ธ๊ณ์ ๊ณต์ ํ๊ธฐ ์ ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ์์ฐ์ฑ์ ๋์์ต๋๋ค. ๊ทธ๊ฒ. @Hixie ์ ์๊ฒฌ์ ๊ณต์ ํ์ฌ UI๋ฅผ ๋น๋ํ๋ ๋ฐ JSX์ ๋ค๋ฅด์ง ์์ต๋๋ค. ์, ์ค๋ฅธ์ชฝ ์์ ๋คํธ์ ๋ํด ์กฐ๊ธ ๋ ์ฅํฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์ฝ๋ ๋๋ฒ๊น ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๋งํฌ์ ์ธ์ด๋ JSX ๋๋ ๊ธฐ์ ์์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์ด์ ๋ ํ๋ซํผ์์ ํจ์ฌ ๋ ๋ง์ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. UI์ฉ ๋งํฌ์ ์ธ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ ํ๋ณตํ ์ ์์ง๋ง ํ๋ซํผ์์ ์์ ํ๋ ๋ง์ ๊ฐ๋ฐ์๊ฐ ๋น์ ์ ์ํด ์ธ๊ณ ๋จธ๋ฆฌ์นด๋ฝ์ ๋ฝ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋ ๋ค๋ฅธ ๊ด์ ์ JSX๊ฐ Javascript ์ปค๋ฎค๋ํฐ์ ์ ํฉํ๋ค๋ ๊ฒ์ ๋๋ค. JSX์ ์ฃผ์ ๋ชฉํ๋ ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ฐ๋ฐ์๋ฅผ ์ํด ์ผ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ์ ์ถฉ์ ์ ๋ํด ๊ฑฑ์ ํ์ง ์๋ ๊ฒ์ ๋๋ค. ์คํดํ์ง ๋ง์ธ์. HTML์ ์ด์จ๋ ๋งํฌ์ ์ด๊ธฐ ๋๋ฌธ์ ์น์ฉ React(JSX)๋ ์ฒ๊ตญ๊ณผ๋ ์ผ์นํฉ๋๋ค. ๊ทธ๋ฌ๋ React Native์ ๊ฒฝ์ฐ ์ ์ฅ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ณ ์ ๋๋ก ์๋ํ๋๋ก ํด์ผ ํ์ต๋๋ค. Flutter์ JSX๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ง์ ์์ ์ด ํ์ํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ 2๊ฐ์ง๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์์ ๋งค๊ฐ๋ณ์์ const ๋ฐ ์ ํค์๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๊น? ๋๋ ์ฝ๋์์ ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ์๋ ๊ฒ์ ์ ํธํ๊ณ ๋ชจ๋ ์ผ์ด ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๋ ๋ง๋ฒ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ์ดํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ ์ ์๊ฒฌ์ ๋๋ค. ์๋ก์ด ๊ฑฐ๋ํ ํ ๋ก ์ ์์ํ๊ณ ์ถ์ง ์์ต๋๋ค. JSX๊ฐ ๋ฐ์/์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ์์ ํจ๊ณผ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ํ๋ฅญํ๋ค๋ ์ฌ์ค์ ์ธ๊ธํ์๋ฉด, Dart/flutter์ ๊ฒฝ์ฐ React Native์์ ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ด๊ธฐ ์ํด JSX๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฝ๊ฐ ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ฐ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ฑํ ์ ์์์ต๋๋ค xD
@๋ก๋ณผ
๋ฐฐ์์ผ ํ ๋ ๋ค๋ฅธ ์ฌํญ - ๋์ Futures๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐ ์ธ ์ ์์ต๋๋ค.
๋ฐฐ์ธ ์ ์ ํ์ฌ์ ์ฌ๊ท ๊ฐ์ฒด ์์ฑ ๊ดด๋ฌผ์ ์ผ์์ ์ธ React Native ๊ฐ๋ฐ์์๊ฒ ๋ ๊ฐ๋จํ๊ณ ์น์ํ๊ฒ ๋ง๋ค์ด ์ฃผ๋ฏ๋ก ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ์ ํธํ ๊ฒ์ ๋๋ค.
์ปจํ ์คํธ ์ค์์นญ - XML๊ณผ ์ฝ๋ ๊ฐ์ ์ปจํ ์คํธ ์ค์์นญ์ ๋ถํ์ํ ์ธ์ง ๋ถํ์ ๋๋ค.
๋ฌธ์ ๊ฐ ์๋๋ผ ์ปจํ ์คํธ ์ค์์น๊ฐ ์์ผ๋ฉฐ ํ๋ก๊ทธ๋๋ฐ UI/UX๋ฅผ ๋ ๊น๋ํ๊ฒ ๋ง๋๋ ํ๊ฒฝ์ ์ผ๋ถ์ผ ๋ฟ์ ๋๋ค.
๊ทธ๋ฐ ๋ค์ ํธ์งํ ์๋๊ฐ ์๋ Flutter ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
์ ์ ๋ผ? ๋ณ๋ก ์ ์ฉํ์ง ์์ต๋๋ค.
@franzsilva
๋๋ ๊ฐ๋ฐ์๋ฅผ ๋ฐ์ ๋ค์ดํฐ๋ธ์์ ํ๋ฌํฐ๋ก ๋์ด๋ค์ด๋ ๊ฒ์ด ํ๋ฌํฐ์ ํ ๋ชฉํ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ ๋ง๋ก !!! React Native๊ฐ ์ง๋ฐฐ์ ์ด๋ฉฐ ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์์ ์ด ์๊ฐ ์ ํ๋์ด ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ Flutter๊ฐ React Native ์ฌ๋๋ค์ ๋์ด๋ค์ด์ง ์๊ณ ๋ ํ๋ฐ ํํธ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
์, ์ค๋ฅธ์ชฝ ์์ ๋คํธ์ ๋ํด ์กฐ๊ธ ๋ ์ฅํฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์ฝ๋ ๋๋ฒ๊น ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ง์ ์ด ์๋๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ผ ๋ฟ์ธ JSX ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ๋ ์ฝ๊ฑฐ๋ ์ด๋ ค์ด ๊ฒ์ด ์๋๋ผ ๋์ผํฉ๋๋ค.
๋งํฌ์ ์ธ์ด๋ JSX ๋๋ ๊ธฐ์ ์์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์ด์ ๋ ํ๋ซํผ์์ ํจ์ฌ ๋ ๋ง์ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋ซํผ์ ์ผ๋ง๋ ๋ง์ ์์ ์ด ๋ฐฐ์น๋์๋์ง ๋๊ฐ ์ ๊ฒฝ ์ฐ๋์? ๊ฐ๋ฐ์๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์์ฐ์ฑ์ ํฅ์์ํค๋ ์ต์ ๊ธฐ์ ์ ์ํฉ๋๋ค. ์๋ก์ด ๊ฒ์ด ๋ ๋์ ๋์์ ์ ๊ณตํ ๋ ์ค๋๋ ๊ธฐ์ ์ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ๊ฐ๋ฐ์๋ ์์ต๋๋ค.
๋๋ ์ฝ๋์์ ์ค์ ๋ก ์ผ์ด๋๋ ์ผ์ ์๋ ๊ฒ์ ์ ํธํ๊ณ ๋ชจ๋ ์ผ์ด ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๋ ๋ง๋ฒ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ์ดํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ง๋ ์๋๋ ์๋ฆฌ์ ๋๋ค. JSX์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ์ ํํ ์๊ณ ์์ต๋๋ค. ๊ฑฐ์ 1:1๋ก ๋ณํํ์ง๋ง ๋ง์ ์ด์ ์ ์ ๊ณตํ๋ ์์ฃผ ์์ ๋ ์ด์ด์ ๋๋ค. ๋์๊ฒ ๋ฌป๋๋ค๋ฉด ๋ฌด์ํ ์ ์๋ ์ปดํ์ผ ์๊ฐ ์ค๋ฒํค๋.
JSX๊ฐ ๋ฐ์/์๋ฐ์คํฌ๋ฆฝํธ ์ปค๋ฎค๋ํฐ์์ ํจ๊ณผ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ํ๋ฅญํ๋ค๋ ์ฌ์ค์ ์ธ๊ธํ์๋ฉด, Dart/flutter์ ๊ฒฝ์ฐ React Native์์ ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ด๊ธฐ ์ํด JSX๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ฝ๊ฐ ๊ณผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
JSX๋ Dart/Flutter์์๋ ์ ์๋ํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ด๋ค ์๋ฏธ์์ ๊ณผ์์ด ์๋๋๋ค. JSX๊ฐ Dart/Flutter์์ ์๋ํ์ง ์๋ ์ด์ ๊ฐ ์์ต๋๊น? ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฝ๋ฉํ๊ณ ์ถ์ํ๋ค๋ฉด ์ Dart/Flutter ๊ฐ๋ฐ์ ์ ํฉํ์ง ์์๊น์?
@xinthink ์ ๊ตฌ์ฒด์ ์ธ ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ง๊ธ์ ๊ตฌ๋ฌธ์ด ์ฝ๊ฐ ์ฅํฉํฉ๋๋ค. ์ฌ๋ฐฑ์ ์ถ๊ฐํ๊ธฐ ์ํด
new
๋ญ๊ฐ๋ฅผ ํด์ผ ํฉ๋๋ค.margin: new EdgeInsets.symmetric(horizontal: 4.0)
, ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์ฌ๋ฐฑ์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํํํ์๊ฒ ์ต๋๊น? ํนํ ๊ฐ๋จํ ์๋ฅผ ๋ค์ด ๋ค์ํ ๊ตฌ๋ฌธ์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// Flutter as written today
return new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),
decoration: new ShapeDecoration(shape: new CircleBorder(), color: Colors.blue[100]),
child: new AnimatedCrossFade(
duration: const Duration(seconds: 3),
firstChild: const FlutterLogo(style: FlutterLogoStyle.horizontal, size: 100.0),
secondChild: const FlutterLogo(style: FlutterLogoStyle.stacked, size: 100.0),
crossFadeState: _showHorizontal ? CrossFadeState.showFirst : CrossFadeState.showSecond,
),
);
// Flutter as written later this year once we remove "new" and "const" keywords
return Container(
margin: EdgeInsets.symmetric(horizontal: 4.0),
decoration: ShapeDecoration(shape: CircleBorder(), color: Colors.blue[100]),
child: AnimatedCrossFade(
duration: Duration(seconds: 3),
firstChild: FlutterLogo(style: FlutterLogoStyle.horizontal, size: 100.0),
secondChild: FlutterLogo(style: FlutterLogoStyle.stacked, size: 100.0),
crossFadeState: _showHorizontal ? CrossFadeState.showFirst : CrossFadeState.showSecond,
),
);
์ด๋ฌํ _์ ํํ_ ์๋ฏธ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒํ์๊ฒ ์ต๋๊น?
// Remove "new" and "const", infer the class for enum values, allow int literals for doubles
return Container(
margin: EdgeInsets.symmetric(horizontal: 4),
decoration: ShapeDecoration(shape: CircleBorder(), color: Colors.blue[100]),
child: AnimatedCrossFade(
duration: Duration(seconds: 3),
firstChild: FlutterLogo(style: horizontal, size: 100),
secondChild: FlutterLogo(style: stacked, size: 100),
crossFadeState: _showHorizontal ? showFirst : showSecond,
),
);
Babel.js์๋ JSX๋ฅผ ์
๋ ฅํ๊ณ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํ ์ ์๋ ๊น๋ํ ์์ ์น์ฌ์ดํธ๊ฐ ์์ต๋๋ค.
https://babeljs.io/repl/# ?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-0&code=function%20hello()%20%7B%0A%20%20return%20%3Cdiv%3EHello% 20์ธ๊ณ!%3C%2Fdiv%3E%3B%0A%7D
DSX to Dart์ ๋ํด ๋๋ฑํ ์์ ์ ์ํํ๊ฒ ์ต๋๋ค. ๊ฐ๋ ์ฆ๋ช ์ผ ๋ฟ์ด๋ ์๊ฐ์ด ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋์ง ๋ด ์๋ค...
๋ค์์ Airbnb์ ์คํ์ผ ๊ฐ์ด๋ ๋ฅผ ์ฌ์ฉํ๊ณ ๋ชจ๋ ํ์ ์์๊ฐ child
์์ฑ์ ์๋์ผ๋ก ๋งคํ๋ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ "DSX"์์ @Hixie์ ์ต์ ์์
๋๋ค.
return (
<Container
margin={EdgeInsets.symmetric(horizontal: 4)}
decoration={ShapeDecoration(shape: CircleBorder(), color: Colors.blue[100])}
>
<AnimatedCrossFade
duration={Duration(seconds: 3)}
crossFadeState={_showHorizontal ? showFirst : showSecond}
>
<FlutterLogo style={horizontal} size={100} />
<FlutterLogo style={stacked} size={100} />
</AnimatedCrossFade>
</Container>
);
๊ฐ๋ ์ฑ์ ๋์ด๋ ค๋ ์๋๋ผ๋ฉด ๋ฏธ๋์ Dart๊ฐ ์ฝ์๊ฐ์ ์น๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌด์์ด ํ๊ทธ๋ก ๋ฐ๋ ์ ์๋์ง(์๋ง๋ Widget
๋ง) ๋๋ ์ผ๋ง๋ ๋ง์ ํ์ ์์๊ฐ ํ์/ํ์ฉ๋๋์ง ๋ฌธ์๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค.
๋ชฉํ๊ฐ JavaScript์์ HTML์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ผ๋ฉด JSX๋ ์ค๊ฐ ์ง์ ์ผ๋ก ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํ๋ฃจ๊ฐ ๋๋ ๋ ํ๊ทธ๋ฅผ ์ํ ๋ React.createElement('div', null, 'foo')
๋ <div>foo</div>
๋ณด๋ค ํจ์ฌ ๋์ฉ๋๋ค.
๋ชฉํ๊ฐ Dart์์ Dart ๊ฐ์ฒด ํธ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๊ณ ๋ฉ์ง๊ฒ ํ์์ด ์ง์ ๋ Dart ์์ฑ์ ํธ๋ฆฌ๋ฅผ ์๋ฒฝํ๊ฒ(์๋ง๋ ๋ ๋ง์ด) ์ฝ์ ์ ์๋ค๋ฉด XML์ ํตํด ์ฐํํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Android์์ ๊ฐ์ ธ์จ XML์ด ๋๋ฝ๋์ง ์์์ต๋๋ค.
๊ทธ๊ฒ์ XML์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ ๋๋ค... ๋ณด์ธ์. ๋ง๋ง ํ๊ณ 5๊ฐ์์ด ์ง๋ฌ์ต๋๋ค. ์ด์ ๊ทธ๊ฒ์ ๋ํด ๋ญ๊ฐ๋ฅผ ํ๊ณ ์์ผ๋ฏ๋ก ์๊ฐ์ ์ฃผ์ญ์์ค.
์ด ์ค๋ ๋๋ฅผ ์ฐพ์์ต๋๋ค. ์์ชฝ์์ ๋ชจ๋ ํฅ๋ฏธ๋กญ์ต๋๋ค. Flutter์ ๊ด์ฌ์ด ์๋ React ๊ฐ๋ฐ์๋ก์ ์ธ๊ธํ์ง ์์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฃผ์ฅ์ด ์์ต๋๋ค.
ํ๊ทธ ์ ์ธ์ ๋ซ์ผ๋ฉด ์์ ๋ ์์ฑ์ ๋ํ ์ดํด๊ฐ ๋์์ง๋๋ค. UI๋ ๋ถํํ๋ ๊น์ด ์ค์ฒฉ๋ ์ ์์ผ๋ฉฐ ๋ช ํํ ํ๊ทธ ๋ ์ ์ ์์ )์ด ์์ผ๋ฉด ํ์ ํญ๋ชฉ์ ๋ช ํํ๊ฒ ํ๊ณ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ ๊ตฌ์ฑ ์์ ์ฌ์ด์์ ์ฝ๋๋ฅผ ์ด๋ํ ์ ์๊ณ ๋ฌด์ธ๊ฐ๊ฐ ์ ์๋ฆฌ์ ์์ ๋ ๋งค์ฐ ์ ์ธ์ ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค(์๋ฅผ ๋ค์ด ํ๊ทธ ์์ ๋ซ๋ ํ๊ทธ). ์ด๊ฒ์ ์ฌ๋ฌ ์ค์ฒฉ๋ ๊ฒฝ์ฐ ๋ ๊น๋ค๋กญ์ต๋๋ค.
์์ฑ์ ๋ด๋ถ์ ์ฌ๋ฌ ์ค์ฒฉ ๊ตฌ์ฑ ์์๋ฅผ ๋ณด๋ ๊ฒ์ ๋ํ ๋์ ์ด๊ธฐ ์ง๊ฐ ๋ฐ์์ "์ฝ๋ฐฑ ์ง์ฅ" ์ ๋ํ ํ๋์๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ์ ์ ๋์์ง๊ธฐ ์์ํ๋ JS์ ๋งค์ฐ ๊ณ ํต์ค๋ฌ์ด ์๋์์ต๋๋ค. ๋ค์ ๋์๊ฐ๋ฉด ํ ๊ฑธ์ ๋ค๋ก ๋ฌผ๋ฌ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค.
#2์ ๊ด๋ จํ์ฌ ๋ถํํ ์ฌ์ค์ ์ฌ๋๋ค์ด ์ ํํ๋๋ก(๋๋ ์ ์ด๋ ์๋ํ๋๋ก) ์ค๋ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด React/React Native๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ HTML/JS๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค. React์ ๋ฌธ์ ์ ์ค ์ผ๋ถ๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋์์ผ๋ก ํ๋ ๊ฐ๋จํ๊ณ ๋๋ถ๋ถ ๊ตฌ๋ฌธ์ ์ผ๋ก ์น์ํ ํํ ๋ฆฌ์ผ/๊ฐ์ด๋๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฝ๊ฐ ํผ๊ณคํ ์ฌ๋๋ค์๊ฒ ๋งค์ฐ ๋งค๋ ฅ์ ์ผ ์ ์์ต๋๋ค.
์น ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ React๊ฐ ์ธ๊ธฐ๋ฅผ ์ป์ ์ฃผ๋ ์ด์ ์ค ํ๋๋ JSX์ ์ง์์ด์์ต๋๋ค.
๊ทธ๋ฐ ๋ฉ์ง ๊ธฐ๋ฅ ์์ฒญ์ ๋ํด "ํํฅ ํฌํ"๋ฅผ ๋ณด๋ ๊ฒ์ ์ ๋ง ์ค๋ง์ค๋ฝ์ต๋๋ค. ๊ฐ๋ ์ฑ์ด ํฅ์๋๊ณ ์ฑํ์ด ๋นจ๋ผ์ง๋๋ค.
์ด๊ฒ์ด Open JavaScript์ Dart์ ์ฃผ์ ์ฐจ์ด์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. JavaScript๋ ์ง์ ํ ์คํ ์์ค์ธ ๋ฐ๋ฉด Dart์ ๋ํ ์์ฒญ์ ์ด์ ๊ฐ์ ๋ํ์ ๋ค์ด๊ฐ ๊ถ๊ทน์ ์ผ๋ก ๋ฐ๋ ํฌํ๋ก ์์์ ์๊ฒ ๋ฉ๋๋ค.
์๋ก์ด ์์ด๋์ด๋ฅผ ์ํ ๋ ๋ง์ ๊ณต๊ฐ์ ๋ง๋์ญ์์ค!
@jayjun ๋ฉ์ง๋ค์ ! ์ด๋๊ฐ์์ ์๋ ํ ์ ์์ต๋๊น?
@sanketsahusoft ๊ณง ๋ด ๋ฒ์ ์ ์ฌ์ฉํด ๋ณผ ์ ์์ ํ ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์. @jayjun๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
๋น ๋ฅธ ์ ๋ฐ์ดํธ: 2์ฃผ ์ UI๊ฐ ํ๋ฅญํ๊ฒ ์๋ํ์ต๋๋ค. ์ง๋ ์ฃผ๋ง์๋ ํ์๊ฐ ์์ ํ ์๋ํ๊ณ ํธ๋์คํ์ผ๋ฌ์ ์ ๋ฐ์ด ์๋ํ์ต๋๋ค. ์ด๋ฒ ์ฃผ๋ง์ ์ํผ๋ณผ๋ง ํผํ๋ฉด ๋๋ด๊ณ ์ถ์ด์ ;)
๋๋ ํผ๋ถ๊ฐ ๋๊ป๊ณ ๊ณ ์ง์ด ์ผ ๋ ธ์๋ผ ์ด๋ฐ ๋ฐ๋ํ์กฐ์ฐจ ๋์น์ฑ์ง ๋ชปํ๋๋ฐ ์ง์ ํด์ค์ ๊ณ ๋ง๋ค.
์นด๋ฅผ๋ก์ค.
๋ซ๋ ํ๊ทธ๋ฅผ ์ถ์ ํ์ง ๋ชปํ๋ ๋ฌธ์ ์ ๋์์ด ๋ ๊น์?
์์ด๋์ด: ์๋ ์์ฑ๋ ๋ซ๋ ํ๊ทธ
๋ค์์ @Hixie ์ ์์ ๋ํด ์ ์๋ ๋ช ๊ฐ์ง ๋งํฌ์ ๊ตฌ๋ฌธ์ ๋๋ค.
<Container margin=<EdgeInsets.symmetric horizontal=4 />
decoration=<ShapeDecoration shape=<CircleBorder> color={{ Colors.blue[100] }} />>
<AnimatedCrossFade duration=<Duration seconds=3 />
crossFadeState={{ _showHorizontal ? showFirst : showSecond }}>
<FlutterLogo style=horizontal size=100 />
<FlutterLogo style=stacked size=100 />
</AnimatedCrossFade>
</Container>
@abarth , ๋น์ ์ด ํ ํฅ๋ฏธ๋ก์ด ์ผ์ ํํ์์ด ๋ค๋ฅธ ํ๊ทธ์ผ ๋ ํํ์์ ๋ชจ์์ ๋จ์ํํ๋ ์ธ ๋ฒ์งธ ์์ฑ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํ ๊ฒ์
๋๋ค.
JSX์๋ ๋ค์์ด ์์ต๋๋ค.
1 - <tag attrib=""/>
๋๋ <tag attrib=''/>
2 - <tag attrib={}/>
๋น์ ์ ๋ค๋ฅธ ํ๋๋ฅผ ์ ์ํ์ต๋๋ค:
3 - <tag attrib=<anotherTag.../>/>
JSX์์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผ ํฉ๋๋ค.
<tag attrib={<anotherTag.../>}/>
@cbazza ์, ์ธ ๋ฒ์งธ ๊ฒฝ์ฐ๋ Flutter์์ ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ฏ๋ก ์ถ๊ฐ {
์ค์ฒฉ์ ๊ฑด๋๋ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@abarth ์ ๊ทผ๋ฐ css๊ฐ์ ์คํ์ผ์ ์ฌ์ฉํด์ ๊ทธ๋ฐ๊ฑฐ ๋๋ถ๋ถ ๋ถํ์ํ๊ฒ ๋ง๋ค๊ณ ์์ด์!!! ํธ๋์คํ์ผ๋ฌ๋ ์ด๋ฌํ CSS์ ์ ์ฌํ ์คํ์ผ์ ์ ์ ํ Flutter ํธ์ถ๋ก ํ์ฅํฉ๋๋ค. ์ด์ ํ๊ทธ ๊ตฌ์กฐ๊ฐ ํจ์ฌ ๊นจ๋ํด์ง๊ณ InVision, Figma, Atomic ๋ฑ๊ณผ ๊ฐ์ ๋์์ด๋ ๋๊ตฌ์์ ์คํ์ผ์ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
@cbazza Cool, ์ ๋ FutureBuilder
์ ๊ฐ์ ํด๋ก์ ๊ฐ ์๋ ๋ง์ ์์ ฏ์ ์ฌ์ฉํฉ๋๋ค. ํธ๋์คํ์ผ๋ฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์์ฑํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
return new FutureBuilder(
future: Firestore.instance
.collection('stuff')
.document(id)
.get(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return const Text('Loading...');
default:
return new Text('${id} not found');
}
}
return new Text(snapshot.data['name']);
},
);
@jayjun , ๋ค, ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ํธ๋์คํ์ผ๋ฌ๋ ๊ฐ๋จํ XML ํ๋ก์ธ์์ด๋ฉฐ ์({} ๋ด๋ถ์ ๋ชจ๋ ๊ฒ)์ ๊ตฌ๋ฌธ ๋ถ์ํ ๋ ํ ์คํธ ๋ฉ์ด๋ฆฌ๊ฐ ๋์ด ๊ทธ๋๋ก ๊ธฐ๋กํฉ๋๋ค.
@xinthink
Kotlin ํ์ด Android ๊ฐ๋ฐ์๋ฅผ ์ํด ํ๋ ๊ฒ์ฒ๋ผ DSL์ ๊ตฌ์ถํ ์ ์์๊น์?
๋ง์ ์ฌ๋๋ค์ด Flutter์ ํจ๊ป Kotlin์ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์งํ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ์ ๊ฐ๋ฐ์๋ค์ Dart์์ ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ๊ธฐ๋ก ๊ฒฐ์ ํ์๊น์?
๋ด ๊ฒธ์ํ ์๊ฒฌ์ผ๋ก๋ Flutter์๋ JSX๊ฐ ํ์ํ์ง ์์ต๋๋ค. Flutter๋ Dart ๋์ Kotlin์ ์ ํํ์ด์ผ ํ์ต๋๋ค. Kotlin์ ์ฌ์ฉํ๋ฉด ์ฆ์ ์ฌ์ฉํ ์ ์๋ ์๋ฆ๋ค์ด ๊ตฌ๋ฌธ์ผ๋ก ๋ณต์กํ UI ๋ก์ง์ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ, ํ๋ก๋์ ์ค๋น ๋๊ตฌ, Android ๊ฐ๋ฐ์์ ์ ํฌ ํ ์คํธ๋ฅผ ๊ฑฐ์ณค์ต๋๋ค...
๊ทธ๋ฅ.
Kotlin์ ํ๋ฅญํฉ๋๋ค. ์ ๋ ํฌ ์ด์ง๋ง iOS์์ ์คํ๋์ง ์์ต๋๋ค..... ์ค์ ๋ก๋ ์คํ๋์ง๋ง ์์ง ์ถ์๋์ง ์์์ต๋๋ค(ํ์ฌ ์ฌ์ ์ถ์ ๋จ๊ณ).
UI/UX ๊ฐ๋ฐ์ ๊ฒฝ์ฐ ์ฌ์ ํ Anko DSL ๋์ JSX๋ฅผ ์ ํธํฉ๋๋ค. ๋ช
๋ นํ ์ฝ๋์์ ์ ์ธ์ ๋งํฌ์
์ ์๊ฐ์ ์ผ๋ก ๋ถ๋ฆฌํ ์ ์๊ณ ๊ตฌ์ฑ ์์๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ํผํฉ ๋ฐ ์ผ์น์ํฌ ์ ์๋ค๋ ์ฌ์ค์ด ๋ง์์ ๋ญ๋๋ค.
Dart, Kotlin ๋ฐ Swift๋ ๋ชจ๋ ์ ์ฌ์ ์ด ์์ต๋๋ค.
https://sethladd.github.io/swift-is-like-kotlin-and-kinda-like-dart/
๋๋ ๊ทธ๊ฒ์ ์ข์ํ๋ค :
์ด๊ฒ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๊ฐ Kotlin / Swift / React๋ณด๋ค Dart๋ฅผ ์ ํํ ์ด์ ์ ๋๋ค.
_Google์ ์๋ก์ด Fuchsia OS์์ Dart์ Swift๋ฅผ ์ง์ํ๊ธฐ๋ก ํ ๊ฒฐ์ ์ด ์ ์๊ฒ๋ ํผ๋์ค๋ฝ๊ธด ํ์ง๋ง._
Java ์ถ์ ์ด๋ผ๋ฉด Dart๊ฐ ๋ ์น์ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ๋ Java์์ ์์ผ๋ฉฐ Kotlin ๋๋ Swift์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์ ์ธ์ ๋ฐ๋์ด๋ฉฐ Pascal ๋ฐ ActionScript์์ ์ฌ์ฉ๋ ๊ฒ์ฒ๋ผ ์ค์ ๋ก ์๋ก์ด ๊ฒ์ ์์ต๋๋ค.
์, Dart๋ก ์น ํ์ด์ง๋ฅผ ๊ตฌ์ถํ ์ ์์ง๋ง ์ฃผ์ ๋ด์ฉ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์น์์ ์ ์๋ํ๋ ์ ์ผํ ๋ค๋ฅธ ์ธ์ด๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์์ 3๊ฐ ์น ํ๋ ์์ํฌ์ ์ ํตํฉ๋๊ธฐ ๋๋ฌธ์ TypeScript์ ๋๋ค.
์น์์ React์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ๊ตฌ๋ฌธ์ ์ดํด๋ณด์ธ์.
https://github.com/Workiva/over_react#fluent -style-component-consumption
๋ Dart ๋ฒ์ ๋ชจ๋ JSX์ ๋ํญํ ๊ธฐํ๊ฐ ์์ต๋๋ค!!!
TypeScript๋ Javascript๋ก ์ปดํ์ผํ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ Dart๋ณด๋ค ๋ซ์ต๋๋ค. JSX๋ ์ง์ํฉ๋๋ค.
๋คํธ๊ฐ ์ฌ๋ฐฉ์์ ์๋ฐ๋๊ณ ์์ต๋๋ค. Swift๋ ์ถ์ง๋ ฅ์ด ์์ผ๋ฏ๋ก ์๊ธฐ์ ํจ๊ป Fuchsia OS์์ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ๋กํ ํ์ ๊น์ง ์ผ๋ง๋ ๊ฑธ๋ฆฝ๋๊น? ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค!
๋๋ ํ๋์ React๋ฅผ ์ฌ์ฉํ๊ณ JSX๋ ์์ฐ์ฑ์ 10๋ฐฐ ์ฆ๊ฐ์์ผฐ์ต๋๋ค. ์ด๊ฒ์ ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋ค๋ฅธ ํ์ ์ด๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฐ์ ํ๋๋ฐ Flutter๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? (์์ฌ์ : ์ค๋ ๋๋ฅผ ์ฝ์ต๋๋ค... (ํ์ด์คํ))
์ด๋ฒ ์ฃผ๋ง์ ์์ ์ ํ๊ณ ์์ง๋ง ์๋ก์ด ์์ด๋์ด๋ก ๋ฒ์๋ฅผ ๊ณ์ ๋๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ์ด๋ฒ ์ฃผ๋ง์ ๋ฌด์ธ๊ฐ๋ฅผ ์ป์ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ด๊ฐ ์คํํ๊ณ ์๋ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ฒ๋ค:
1) ์์ ํ๊ทธ์ xml ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ์ ์ฌ๋ฐ๋ฅธ Dart ์ด๋ฆ ์ธ์์ ํจ๊ป ์ฝ์
๋๋๋ก ํฉ๋๋ค.
2) ์์ฑ๊ณผ ๊ฐ์ ์คํ์ผ์ ๋ ์ ๊ตฌ์ฑํ๊ธฐ ์ํด ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋งต์ xml ์ธ๋ถ์์ ์ ์/๊ทธ๋ฃนํํ ๋ค์ ์ผ๋ฐ์ ์ธ React ํญ๋ชฉ๊ณผ ๊ฐ์ ํ๊ทธ์ ๊ฐ์ ธ์์ ํผ๋จ๋ฆด ์ ์์ต๋๋ค.
3) CSS์์ ํ๋ฌํฐ ์คํ์ผ์ ์์ฑํ๋ styleCSS ์์ฑ.
(1) & (2)๋ ์ผ๋ฐ์ ์ด๋ฏ๋ก ๋ชจ๋ Dart Flutter ์ฝ๋์์ ์๋ํฉ๋๋ค.
(3)์ Flutter ์์ ฏ(์ปจํ
์ด๋, ํ
์คํธ ๋ฑ)๋ณ๋ก ํนํ๋์ด ์์ผ๋ฉฐ ์ง๊ธ์ ์ด 2๊ฐ๋ง ํ๊ณ ์์ต๋๋ค.
@yuriy-manifold JS์์ ํจ๊ณผ๊ฐ ์์๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด Dart์ ์ข์ ์์ด๋์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
์์ ํ ๋ก ์ ์ฝ์๋ค๋ฉด ์ฌ์ค ๊ทธ๊ฒ์ด ๋
ผ๋์ ์ฌ์ง ๊ฐ ์์์ ์ ์ ์์ต๋๋ค.
2๊ฐ ์ธ์ด๊ฐ 1๊ฐ ์ธ์ด๋ณด๋ค ๋์ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
JS์์ ํจ๊ณผ๊ฐ ์์๋ค๊ณ ํด์ ๊ทธ๊ฒ์ด Dart์ ์ข์ ์์ด๋์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
JSX๋ ์ธ์ด์ ๊ด๊ณ์์ด ๋ฐ์ํ ํ๋ ์์ํฌ์์ UI/UX ๊ฐ๋ฐ์ ์ํ ๋๋ผ์ด ์์ด๋์ด์ ๋๋ค. ์ฌ์ ์๊ฐ์ด ๋ ์์๋ค๋ฉด ๋ก๊ณ ์ฉ JSX์ธ LSX๋ฅผ ๋ด๋์์ ๊ฒ์ ๋๋ค.)
2๊ฐ ์ธ์ด๊ฐ 1๊ฐ ์ธ์ด๋ณด๋ค ๋์ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Objective-C ๋ฐ Swift๋ก iOS๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค(2๊ฐ ์ธ์ด)
Java ๋ฐ Kotlin์ผ๋ก Android ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ(2๊ฐ ์ธ์ด)
...
๋๋ ์์ง JSX์ ์ฐฌ์ฑํ๋ ์ฃผ์ฅ์ ๋ณด์ง ๋ชปํ์ต๋๋ค.
์์ ๋
ผ์์๋ "๋ ๋ซ๋ค", "์์ฐ์ฑ ํฅ์" ๋๋ ์ด์ ์ ์ฌํ ์ฃผ์ฅ๋ง ํฌํจ๋์ด ์์ง๋ง ์์ Dart ์ฝ๋๋ณด๋ค ์ค์ ๋ก ์ ๋๋ ์ด๋ป๊ฒ ๋ ์ข์์ง์ ๋ํ ๋
ผ์์ ์์ต๋๋ค.
์์ํ Dart ์ฝ๋๋ ๋์ฑ ๋.
@cbazza
Objective-C ๋ฐ Swift๋ก iOS๋ฅผ ํ๋ก๊ทธ๋๋ฐํ ์ ์์ต๋๋ค(2๊ฐ ์ธ์ด)
Java ๋ฐ Kotlin์ผ๋ก Android ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ(2๊ฐ ์ธ์ด)
JSX ํ ๋ก ๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๊น?
Objective-C์ ํ์ ์ ํ์ด๊ธฐ ๋๋ฌธ์ iOS์์ Swift๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Java์ ๋ํ ๋งค๋๋ฌ์ด ๊ฐ์ ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ Android์์ Kotlin์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JSX๊ฐ Dart๋ฅผ ๋์ฒดํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ํฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
@zoechi
JSX ํ ๋ก ๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๊น?
Objective-C์ ํ์ ์ ํ์ด๊ธฐ ๋๋ฌธ์ iOS์์ Swift๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Java์ ๋ํ ๋งค๋๋ฌ์ด ๊ฐ์ ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์ Android์์ Kotlin์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
JSX๊ฐ Dart๋ฅผ ๋์ฒดํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ํฐ ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋น์ ์ ์ค์ ๋ก ๊ทธ๊ฒ์ ๋งํ์ง๋ง(JSX๋ ํ์ฌ ๋ฐฉ์์ ๋นํด ๋งค๋๋ฌ์ด ๊ฐ์ ์ ๋๋ค) ์๋ชป๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค(JSX๋ Dart๋ฅผ ๋์ฒดํจ).
@cbazza ๊ทธ ์ด์์ ๋๋ค.
์ผ๋ฐ Dart์ ๋นํด ์ค์ ์ด์ ์ ๋ฌด์์ ๋๊น?
"JSX๋ ๋งค๋๋ฌ์ด ๊ฐ์ ์
๋๋ค"๋ ์ด๋ค ์์ผ๋ก๋ ์ค๋๋ ฅ์ด ์๊ณ ๋
ผ์๊ฑฐ๋ฆฌ๊ฐ ์๋๋๋ค.
(๋ค์) ๋ท๋ฐ์นจํ ๊ทผ๊ฑฐ๊ฐ ์๋ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ผ ๋ฟ์
๋๋ค.
์์ ๋ค๋ฅธ pro-JSX ์ธ์์ ์ ์ฌํฉ๋๋ค.
๋น์ ์ด ์ข์ ๋ ผ๊ฑฐ๋ฅผ ์ ๊ณตํ ์์ฌ๊ฐ ์๋ค๋ฉด ์๋ฌด๋ ๋น์ ์ ์ ์์ ๊ณ ๋ คํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
JSX์ ๊ฐ์ ๊ฒ์ Dart์ ์ถ๊ฐํ๋ฉด Flutter ๋๊ตฌ์ IDE์์ ์์ฒญ๋ ์์ ์์ ๊ณผ ๋ณต์ก์ฑ์ด ๋ฐ์ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ฒํ ํ ์ ์๋๋ก ์ ์ ํ ๋ ผ๊ฑฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
@zoechi ๋ '์ข์' ์ธ์๋ฅผ ์๊ตฌํ๋ ๊นจ์ง ๋ ์ฝ๋์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ด์ ์ ๋ง์ ๊ฒ์ด ์ฃผ์ด์ก์ง๋ง ๋น์ ์ ๊ทธ๊ฒ์ ์ป์ง ๋ชปํ์ต๋๋ค. '๊ฐ์์๊ฒ' ๋ง์ต๋๋ค.
JSX์ ๊ฐ์ ๊ฒ์ Dart์ ์ถ๊ฐํ๋ฉด Flutter ๋๊ตฌ์ IDE์์ ์์ฒญ๋ ์์ ์์ ๊ณผ ๋ณต์ก์ฑ์ด ๋ฐ์ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ฒํ ํ ์ ์๋๋ก ์ ์ ํ ๋ ผ๊ฑฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์๋์, ์ ์์ ์ ๊ฑฐ์ ์ค๋น๊ฐ ๋์๊ณ ์ฃผ๋ง์๋ง ์์ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ฑฐ์ ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, DSX๋ ํ์ฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ค๋ฅธ ์ฌ๋๋ค(React ๊ฐ๋ฐ์)์ด ์ฆ์ ์น์ํด์ง ๋์์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ ํํ ์ ์๋ ๋งค๋๋ฌ์ด ๊ฐ์ ์ฌํญ์ ๋๋ค.
@cbazza
๋ง์ด ์ฃผ์ด์ก๋ค
์ค๋ง. ์ฌ์ค์ผ ์๋ ์๊ณ ์๋ ์๋ ์๋ ์ผ๋ฐ์ ์ธ ์ฃผ์ฅ์ผ ๋ฟ์
๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ํ์ธํ ์ ์๋ ์ถ๊ฐ ์ธ๋ถ์ ๋ณด๋ ์ ๊ณต๋์ง ์์์ต๋๋ค.
์๋์, ๋ด ์์ ์ ๊ฑฐ์ ์ค๋น๋์์ต๋๋ค.
์์ฒญ๋. ๊ทธ๋ฌ๋ฉด Flutter ํ์ด ์๋ฌด ๊ฒ๋ ํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ฌธ์ ๋ฅผ ์ข
๋ฃํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ Flutter๊ฐ ์ง์ํ๋ ๋ชจ๋ IDE์ ์๋ ์์ฑ ๋ฐ ๊ตฌ๋ฌธ ๊ฒ์ฌ ์ง์์ด ํฌํจ๋ฉ๋๊น?
์์ฒญ๋. ๊ทธ๋ฌ๋ฉด Flutter ํ์ด ์๋ฌด ๊ฒ๋ ํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์์ต๋๋ค.
;)
์ฌ๊ธฐ์๋ Flutter๊ฐ ์ง์ํ๋ ๋ชจ๋ IDE์ ์๋ ์์ฑ ๋ฐ ๊ตฌ๋ฌธ ๊ฒ์ฌ ์ง์์ด ํฌํจ๋ฉ๋๊น?
๋๋ถ๋ถ์ IDE๋ ์ด๋ฏธ XML๊ณผ JSX๋ฅผ ์ง์ํ๋ฏ๋ก ๋ด๊ฐ ์ฌ์ํ ์ถ๊ฐ ์ฌํญ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ด๋ ต์ง ์์ ๊ฒ์ ๋๋ค.
JSX ๊ตฌ๋ฌธ์ด Angular Dart์์ ๋ ๋์ด ํ๊ฐ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. "๋ ๋ซ๋ค"๋ ๊ฒ๋ณด๋ค ์ต์ํ ์ํฉ์ ๋ ๊ฐ๊น์ด ๊ฒ ๊ฐ์ต๋๋ค. JSX ๊ตฌ๋ฌธ์ ์น ๊ฐ๋ฐ์์๊ฒ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋๊ปด์ง ๊ฒ์ ๋๋ค.
ํ๋ฃจ ๋์ ๋ค๋ฅธ ์ฝ๋ ๊ฐ์กฐ ํ์ ์์์ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ํ๋ก๊ทธ๋๋ฐ์ด ์ด์ํ๊ฒ ๋๊ปด์ง๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์, Angular ์ฌ๋๋ค์ JSX์ ๋งค์ฐ ์ต์ํ ๊ฒ์ด์ง๋ง React Native ๊ฐ๋ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ฉฐ ์ด๊ฒ์ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ ์ํ ๊ฒ์ ๋๋ค. JSX๋ ํ์ฌ Flutter ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด์ง๋ง ์ด ๋ ๋ฒ์งธ ๋์์ ์๋ก์ด ๊ฐ๋ฐ์๋ฅผ Flutter๋ก ๋์ด๋ค์ผ ๊ฒ์ ๋๋ค.
์์ ๊ธฐ์ฌ๋ ๋๋ฌด ํ๋ ธ์ต๋๋ค. JSX๊ฐ ์๋ React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ๋ฐ์ํ ์น ํ๋ ์์ํฌ๋ DSL์์ ๋งํฌ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ํผํฉํ ์ ์์ต๋๋ค.
์๊ฐ์ด ์๋ค...
์จ๋ผ์ธ DSX ๋ณํ๊ธฐ๋ฅผ ๋ฐํํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
ํธ๋์ค ํ์ผ๋ฌ cbazza๋ก ์์
ํ๊ธฐ ์ข์ต๋๋ค.
๋ด๊ฐ ๋งํ๊ณ ์ถ์ ํ ๊ฐ์ง๋ JSX๋ฅผ ๋ฐ๋ผํ๊ธฐ๊ฐ ๋ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. ๋ซ๋ ํ๊ทธ์
๋๋ค. ๋ด๊ฐ ์ ์ ์ธ๊ธํ ์์ด๋์ด :
์์ด๋์ด: ์๋ ์์ฑ๋ ๋ซ๋ ํ๊ทธ
์ฒซ ๋ฒ์งธ ์์์ ๋ค์๊ณผ ๊ฐ์ ํ๋ฌํฐ ์ฝ๋๋ฅผ ์ ๊ณตํฉ๋๋ค(๋ฏธ๋์ Dart์์ ์ ํ์ new ์ ๊ฑฐ).
Material(
child: Column(
children: <Widget>[
MyAppBar(
title: Text(
'Example title',
style: Theme.of(context).primaryTextTheme.title,
)-Text,
)-MyAppBar,
Expanded(
child: Center(
child: Text(
'Hello, world!',
)-Text,
)-Center,
)-Expanded,
],
)-Column,
)-Material;
@cbazza ์ปค๋ฎค๋ํฐ์ UI๋ฅผ ๊ทธ๋ฐ ์์ผ๋ก ๊ตฌ์ถํ๋ ค๋ ์ฌ๋๋ค์ ์ํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ์ง๋ง Flutter์์ ๊ทธ๋ฐ ๊ฒ์ ๊ฐ์ ๋ก ์ฌ์ฉํ์ง ์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค :-(((
Flutter๋ฅผ ์ฒ์ ์ ํ์ง๋ง React์ ๊ฝค ์ต์ํ ์ ์๊ฒ ๋ช ๊ฐ์ง ๋์ ๋๋ ์ ์ด ์์์ต๋๋ค.
JSX์ ๊ดํ์ฌ:
<Item
right={() => new Text("Right")} {/* a named slot */}
left={() => new Text("Left")}> {/* another named slot */}
<ChildOne /> {/* generic children prop with 2 children */}
<ChildTwo>
<NestedChild />
</ChildTwo>
</Item>
Angular, React ๋ฑ์ ๋ํ ์ฝ๊ฐ์ ๊ฒฝํ์ด ์๋ Flutter์ ์ด๋ณด์์ธ ์ ๋ ์ฌ์ ํ ์ผ๋ฐ์ ์ธ Dart ๋ฐฉ์๊ณผ Dart 2.0์ ๊ธฐํ ๋ฐฉ์์ด ์ด DSX๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ถ XML ๋ฐ CSS-ish ๋งค๊ฐ๋ณ์๋ณด๋ค ๋ ํฉ๋ฆฌ์ ์ ๋๋ค. ๐คทโโ๏ธ
@cbazza ๋ ๋ฒ์งธ ๋ฐ๋ชจ ์์ ์๋ dart์ 391๊ฐ(๋ ๋ค ๊ณต๋ฐฑ ์์)์ ๋น๊ตํ์ฌ 466๊ฐ์ ๋ฌธ์๊ฐ ์์ต๋๋ค. ์ ๊ฐ ๋ณด๊ธฐ์๋ ์๊ฐ์ ์ผ๋ก ๋ถํ์ด ์ค๋ฅด๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋ฏธ๋ก ์ด๋ผ๋ ๊ฒ์ ๋ฐฐ์์ผ ํ ๊ฒ์ ๋๋ค. ์ ์์ ์ธ Dart ์ฝ๋์์๋ ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์(if, forEach ๋ฑ)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ํ์ ์ฌ์ง๊ฐ ์๋ค๋ฉด ํ์ฌ ๋ชจ๋ธ์ ๊ณ ์ํ ๊ฒ์ ๋๋ค.
๋ชจ๋๊ฐ ๋ ๊ตฌ๋ฌธ์ ๋น๊ตํ๋ ๋ฐ ์์ด ์ฃผ๊ด์ ์ธ ์๊ฒฌ์ ์ ์ํ๊ณ ์์ง๋ง ํ ๊ฐ์ง ์ฌ์ค์ ๋์ํด์ผ ํฉ๋๋ค. ์ด๋ ๋งค์ฐ ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฌ๋๊ณผ ๋ฏธ์์ด ์์ง๋ง ๋๋ถ๋ถ์ ์๊ฒฌ์ ์ผ๋ฐ Dart๋ณด๋ค JSX์ ์ ์ฉ์ฑ์ ๋ํด ๋ค๋ฆ ๋๋ค.
์ด์จ๋ Flutter ํ์ 1.0 ๋ฆด๋ฆฌ์ค ์ด์ ์ ์ด ๊ธฐ๋ฅ์ ์ง์ํ๋๋ก ์ฝ์ํ๋ ๊ฒ์ ์์ ํ ๋ถํฉ๋ฆฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. UI๋ฅผ ๊ตฌ์ถํ๋ ํ์ฌ ๋ฐฉ๋ฒ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์ข์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์๋ํฉ๋๋ค(์ผ๋ถ ์๊ฒฌ์์๋ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค).
์ฌ๋๋ค์ด ์ง๊ธ JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ํ๋ค๋ฉด ์ปค๋ฎค๋ํฐ ์ฃผ๋์ ๋ ธ๋ ฅ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Flutter ํ์ด 1.0 ์ดํ ๋ฆด๋ฆฌ์ค์์ ์ด๋ฅผ ๊ณ ๋ คํ ๋ ์ฌ๋ก๋ฅผ ๋ง๋๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ค์ ์ฃผ์ฅ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํฉ๋๋ค. JSX๊ฐ React(์ด๋ฏธ ๋งํฌ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ๋น๋ํ๊ณ ์๋ ๊ณณ)์์ ์๋ํ๊ธฐ ๋๋ฌธ์ Flutter์์ ์๋์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ด ์๋๋๋ค.
@tehfailsafe
์ข์ ์์์ ์ด๊ฒ์ด Flutter ํ(์ด ์ค๋ ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์)์ ์ํด ์ฑํ๋์์ง๋ง ์๋ฌด๋ ๊ฐ์ ๋ก ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ต์ ์ ๋๋ค. ์ ์ผ๋ถ ์ฌ๋๋ค์ ๋น์ ์ด ์ข์ํ์ง ์๋ ๊ตฌ๋ฌธ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ข์ํ ์ ๋๋ก ๊ฐ์ ์ ์ผ๋ก ๋ถ๋ด์ ๋๋ผ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค...
๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฌด์์ ์ข์ํ๋ ์ข์ํ์ง ์๋ ์๊ดํ์ง ์๋๋ค. ํ์ง๋ง ์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์งํํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ฆฌ์์ค๊ฐ ์ ํ๋์ด ์์ผ๋ฉฐ ์ ์ ํ ๋น๋์ค/์คํธ๋ฆผ ํ๋ ์ด์ด, ๊ธฐ๋ณธ ํ์ ๋ณด๊ธฐ ๋ฐ ์ผ๋ถ ๋ฒกํฐ ๊ทธ๋ํฝ ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํ์ฌ React ๋ฐ React Native์์ JSX ์์ด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์์ผ๋ฉฐ ์ด๋ ๋จ์ง ์ต์ ์ผ ๋ฟ์ ๋๋ค. JSX๊ฐ ์๋ React๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[...]
JSX ๋ฒ์ ๋ณด๋ค ํจ์ฌ ๋ ์ง์ ๋ถํ๊ณ ๊ฑฐ์ ์๋ฌด๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์๋ง๋ React์์ ์จ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๊ฐ ์ด ์คํ์ผ์ ๋ค์ ์ํํ์ง ์์๋ ๋๋ ๊ฐ๋ฅ์ฑ์ ๋์ด ํ๊ฐํ๋ ์ด์ ์ผ ๊ฒ์ ๋๋ค.
์น์ด ๊ทธ๋ฐ ์์คํ
์ ์ํด ์ค๊ณ๋์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. HTML๊ณผ ๊ฐ์ ์ ์ ๋งํฌ์
์ธ์ด๊ฐ ์๊ณ ์ด๋ฅผ "๋์ ํ"ํ๋ ค๋ฉด ๊ทธ ์์์ ์๋ํด์ผ ํ๋ ์์คํ
์ ๋ฐ๋ช
ํด์ผ ํฉ๋๋ค. ๊ฒฐ๊ตญ ๊ธฐ๋ณธ ํ๋ซํผ์ ์ํด ์ ์ฝ์ ๋ฐ๋ ์ผ๋ถ ๊ตฌ์ฑ์ผ๋ก ๋๋ฉ๋๋ค.
(์ฐธ์กฐ: https://gbracha.blogspot.de/2014/09/a-domain-of-shadows.html)
๋ฐ๋ฉด Flutter์๋ ๋งํฌ์ ์ธ์ด๊ฐ ์์ต๋๋ค. ๋ ์ญ๋์ ์ด๊ณ ๋ ํํ์ ์ธ ๊ฒ์ ์์์ ํฌ์ํ ์ด์ ๋ฅผ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค.
์ด์ ๋์ํ์ง ์๋ ์ฌ๋๋ค์ด JSX๊ฐ ์๊ฑฐ๋ ์๋ React๋ฅผ ์ฌ์ฉํ๋์ง ์๊ณ ์ถ์ต๋๋ค. ๋๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์๋ํ๋๋ก ๊ถ์ฅํ๋ฏ๋ก ์ด ํ ๋ก ์ ๋ ์ด๋ก ์ ์
๋๋ค. ์ด๊ธฐ์ ์์ ํ์ต ๊ณก์ ํ์๋ ๋งค์ฐ ์์ฐ์ค๋ฌ์์ง๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์๊ฐ ์ ๋ถ๋ ์๋๋๋ค). ์ฅ๊ธฐ์ ์ผ๋ก ์์ฐ์ฑ์ ๋์ด๋ Flutter์ ๊ฐ์ด ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ๊ณผ ๋ค๋ฅด์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋ชจ๋ ์ฌ๋์ ์ํ ๊ฒ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ํ ์ฌํญ์ด ๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ์๋ก์ ์ต๋ ์ด์ต์ ์ผ๋์ ๋๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๋ฌผ๊ฑด์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ํธ๋์คํ์ผ๋ฌ๊ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ๊ณต์ ์ง์์ด ์์๋ค๋ฉด ์ฑํํ๊ธฐ๊ฐ ๋ ์ฌ์ ์ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ @cbazza ๊ฐ์ฌํฉ๋๋ค :)
@yuriy-manifold
์ฌ๊ธฐ ์๋ ๋๊ตฌ๋ JSX React๊ฐ ๊ณ ์ ์ ์ธ React๋ณด๋ค ๊ฐ์ ๋์๋ค๋ ์ ์ ์์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด ๊ทธ ์๋ฃจ์ ์ ๊ธฐ๋ณธ ํ๋ซํผ์ ์์ฑ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋๋ฌธ์ ๋ง๋ค์ด์ก์ต๋๋ค. Flutter์๋ ์ด๋ฌํ ์์ฑ์ด ์์ต๋๋ค.
์ง๋ฌธ์ 'JSX๊ฐ React์ ๋์์ด ๋๋์?'๊ฐ ์๋๋๋ค. ์ง๋ฌธ์ 'JSX์ ๊ฐ์ ๊ฒ์ด Flutter์ ๋์์ด ๋๋์?'์ ๋๋ค.
๋๋ ๋๋ต์ด ์๋์ค๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๋ค๋ฅธ ์ฌํญ์ด ์์ต๋๋ค.
build
๋ฉ์๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.ํธ๋์ค ํ์ผ๋ฌ cbazza๋ก ์์ ํ๊ธฐ ์ข์ต๋๋ค.
@Rockvole , ๊ฐ์ฌํฉ๋๋ค.
์ปค๋ฎค๋ํฐ์ UI๋ฅผ ๊ทธ๋ฐ ์์ผ๋ก ๊ตฌ์ถํ๋ ค๋ ์ฌ๋๋ค์ ์ํ ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ์ง๋ง Flutter์์ ๊ทธ๋ฐ ๊ฒ์ ๊ฐ์ ๋ก ์ฌ์ฉํ์ง ์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค :-(((
@zoechi๋ , ๊ฐ์ฌํฉ๋๋ค. ์, JSX๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํ ๋ ๋ค๋ฅธ ์ต์ ์ผ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ด ๋น์ ์ ์ผ์ด ์๋๋ผ๋ฉด ๋น์ ์ดํ๊ณ ์๋๋๋ก ๊ณ์ํ์ญ์์ค. ๊ฑฐ๊ธฐ์๋ ์๋ฌด ๊ฒ๋ ๋ฐ๋์ง ์์ต๋๋ค.
Flutter ํจํด์ ์ง์ํ๊ธฐ ์ํด ์๋ก์ด JSX ๊ตฌ๋ฌธ์ ๋ฐ๋ช ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@alexkrolick ์, ๋ช ๋ช ๋ ๋งค๊ฐ๋ณ์์ ๋ํด ๋ ๋๋ง ์ํ์ ์ฌ์ฉํ ์ ์์ง๋ง ์์น ๋งค๊ฐ๋ณ์์ ๋ํด ํ ์ ์๋ ์ผ์ ์์ต๋๋ค. ํต์ฌ์ ๋ชจ๋ ๊ฒ์ ์ํด ์๋ํ๋๋ก ํธ๋์คํ์ผ๋ฌ์์ ์ด๋ค ๊ฒ๋ ํ๋ ์ฝ๋ฉํ๊ณ ์ถ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
Angular, React ๋ฑ์ ๋ํ ์ฝ๊ฐ์ ๊ฒฝํ์ด ์๋ Flutter์ ์ด๋ณด์์ธ ์ ๋ ์ฌ์ ํ ์ผ๋ฐ์ ์ธ Dart ๋ฐฉ์๊ณผ Dart 2.0์ ๊ธฐํ ๋ฐฉ์์ด ์ด DSX๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ถ XML ๋ฐ CSS-ish ๋งค๊ฐ๋ณ์๋ณด๋ค ๋ ํฉ๋ฆฌ์ ์ ๋๋ค.
@tenhobi , ํ์คํ DSX๊ฐ ๋ชจ๋ ์ฌ๋์ ์ํ ๊ฒ์ ์๋๋๋ค.
์ ํ์ ์ฌ์ง๊ฐ ์๋ค๋ฉด ํ์ฌ ๋ชจ๋ธ์ ๊ณ ์ํ ๊ฒ์ ๋๋ค.
@b-strauss, ์ด๊ฒ์ ๋์ฒดํ์ด ์๋๋ผ JSX๋ฅผ ์ข์ํ๋ ์ฌ๋๋ค์ ์ํ ์ต์ ์ ๋๋ค.
์ฌ๋๊ณผ ๋ฏธ์์ด ์์ง๋ง ๋๋ถ๋ถ์ ์๊ฒฌ์ ์ผ๋ฐ Dart๋ณด๋ค JSX์ ์ ์ฉ์ฑ์ ๋ํด ๋ค๋ฆ ๋๋ค.
@lukaspili , DSX๋ JSX๋ฅผ ์ฌ๋ํ๋ React Native ์ฌ๋๋ค์ ์ํ ๊ฒ์ ๋๋ค. ์ด์ ์ด ๋ณด์ด์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค. DSX ๋ ์ผ๋ฐ Dart๊ฐ ์๋๋๋ค. DSX ๋ JSX์ ๋๋ค. 2๊ฐ ๊ฐ๊น์ธ์๋ก ์ข์ต๋๋ค.
์ข์ ์์์ ์ด๊ฒ์ด Flutter ํ(์ด ์ค๋ ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์)์ ์ํด ์ฑํ๋์์ง๋ง ์๋ฌด๋ ๊ฐ์ ๋ก ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ต์ ์ ๋๋ค. ์ ์ผ๋ถ ์ฌ๋๋ค์ ๋น์ ์ด ์ข์ํ์ง ์๋ ๊ตฌ๋ฌธ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ข์ํ ์ ๋๋ก ๊ฐ์ ์ ์ผ๋ก ๋ถ๋ด์ ๋๋ผ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค...
@tehfailsafe , ๋ค์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!!! React Native ์ฌ๋๋ค์ ์ ๋ง ํ๋ณตํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํด ์ ๊ทธ๋ ๊ฒ ํฐ ์ ํญ์ ํ๋์ง ๋น์ ์ ๋จธ๋ฆฌ์ ๋ชป์ ๋ฐ์์ต๋๋ค.
๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ฌด์์ ์ข์ํ๋ ์ข์ํ์ง ์๋ ์๊ดํ์ง ์๋๋ค. ํ์ง๋ง ์ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ์งํํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ฅ์ ๊ด์ฌ์ด ์์ต๋๋ค. ๋ฆฌ์์ค๊ฐ ์ ํ๋์ด ์์ผ๋ฉฐ ์ ์ ํ ๋น๋์ค/์คํธ๋ฆผ ํ๋ ์ด์ด, ๊ธฐ๋ณธ ํ์ ๋ณด๊ธฐ ๋ฐ ์ผ๋ถ ๋ฒกํฐ ๊ทธ๋ํฝ ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@b-strauss, React Native ํฌ์ด Flutter๋ก ์ด๋ํ๋ฉด ์ด๋ฌํ ๋ค๋ฅธ ํ์ํ ์์ ์ ๋์์ค ์๋ง์ ์ฌ๋๋ค์ด ์์ ๊ฒ์ ๋๋ค. ์ฐ์ ์์ 1์ React Native์์ ๋ง์ ์ ์ ์จ์ ํ์น๊ณ React Native ์ฌ๋๋ค์ด ์ต๋ํ ์ฝ๊ฒ ์ด๋ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ฉด Flutter์๋ ๋งํฌ์ ์ธ์ด๊ฐ ์์ต๋๋ค. ๋ ์ญ๋์ ์ด๊ณ ๋ ํํ์ ์ธ ๊ฒ์ ์์์ ํฌ์ํ ์ด์ ๋ฅผ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค.
@b-strauss, DSX๋ ์ด๋ป๊ฒ ์ผ๋ฐ Dart๋ณด๋ค '๋ ๋ค์ด๋ด๋ฏนํ๊ณ ' '๋ ํํ๋ ฅ์ด ์์ต๋๊น'? DSX๋ Dart๊ฐ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์๋ํ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค.
@yuriy-manifold ๊ฐ์ฌํฉ๋๋ค.
์ง๋ฌธ์ 'JSX๊ฐ React์ ๋์์ด ๋๋์?'๊ฐ ์๋๋๋ค. ์ง๋ฌธ์ 'JSX์ ๊ฐ์ ๊ฒ์ด Flutter์ ๋์์ด ๋๋์?'์ ๋๋ค.
@b-strauss, ๋ฌผ๋ก ์ ๋๋ค. ํ์ฌ Flutter ๊ฐ๋ฐ์์๊ฒ๋ ๋์์ด ๋์ง ์์ง๋ง ๋๊ตฌ์์ CSS๋ฅผ ์ถ๋ ฅํ ์ ์๋ ๋์์ด๋์๊ฒ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ React Native ํ๋ซํผ์ ์ํด ์๋ ์ฌ๋๋ค์๊ฒ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
@alexkrolick , ์์ฃผ ์ข์ ๊ด์ฐฐ์ ๋๋ค.
@cbazza
์ด๊ฒ์ ๋์ฒดํ์ด ์๋๋ผ JSX๋ฅผ ์ข์ํ๋ ์ฌ๋๋ค์ ์ํ ์ต์ ์ ๋๋ค.
์๊ฒ ์ต๋๋ค... ๊ทธ๋ฐ ์์ผ๋ก ์ํฅ์ ๋ฏธ์น์ง๋ ์๊ฒ ์ง๋ง, ์์ ๋งํ๋ฏ์ด ์ง๊ธ์ Flutter ์ฑ์ ๋ง๋ค์ด์ผ ํ๋ ๋๋ฝ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
React Native ํฌ์ด Flutter๋ก ์ด๋ํ๋ฉด ๋ค๋ฅธ ํ์ํ ์ผ์ ๋์์ค ์๋ง์ ์ฌ๋๋ค์ด ์์ ๊ฒ์ ๋๋ค. ์ฐ์ ์์ 1์ React Native์์ ๋ง์ ์ ์ ์จ์ ํ์น๊ณ React Native ์ฌ๋๋ค์ด ์ต๋ํ ์ฝ๊ฒ ์ด๋ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๋น์ ์ flutter ํ์ด ์์ฌ์ค๋ฝ๊ณ ํน์ ์น ๊ฐ๋ฐ์ ํ์ ์งํฉ์ ์ผ๋ถ๋ฅผ ๋์ด๋ค์ผ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์๋ ๊ธฐ๋ฅ์ ๋ณด๋ฅํด์ผ ํ๋ค๊ณ ์ ์ํฉ๋๊น?
DSX๋ ์ด๋ป๊ฒ ์ผ๋ฐ Dart๋ณด๋ค '๋ ๋ค์ด๋ด๋ฏนํ๊ณ ' '๋ ํํ๋ ฅ์ด ์์ต๋๊น'? DSX๋ Dart๊ฐ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์๋ํ์ง ์์๋ค๋ ๊ฒ์ ๋๋ค.
๋ชจ๋ DSL์ ์ ์์ GPL๋ณด๋ค ํํ๋ ฅ์ด ๋จ์ด์ง๋๋ค. DSX๋ฅผ ์ฌ์ฉํ์ฌ ์์ ฏ์ ์กฐ๊ฑด๋ถ๋ก ์จ๊ธฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น? ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ๊ณ ๋ชจ๋ ์์๋ฅผ โโ์์ ฏ์ ๋งคํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์ค์์น๋ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? ์ด์ GPL์ ์ด๋ฏธ ์๋ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฒ์์ DSL์ ๋ฐ๋ช ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋น์ฐํ์ง. ํ์ฌ Flutter ๊ฐ๋ฐ์์๊ฒ๋ ๋์์ด ๋์ง ์์ง๋ง ๋๊ตฌ์์ CSS๋ฅผ ์ถ๋ ฅํ ์ ์๋ ๋์์ด๋์๊ฒ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ React Native ํ๋ซํผ์ ์ํด ์๋ ์ฌ๋๋ค์๊ฒ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๊ทธ๊ฒ์ ์ง๋ฌธ์ด ์๋์์ต๋๋ค... DSL์ ๋น์ ์ด ์ง๊ธ ํด๊ฒฐํ ์ ์๋ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น? ๋ ์ข๋ค๋ ๋ง๋ง ๊ณ์ ํ๋๊ฑด๋ฐ ์ ๋ ๋ซ์ง? DSX๊ฐ JSX ์ฌ๋๋ค์ ๋์ด๋ค์ผ ๊ฒ์ด๋ผ๋ ๋ฐ๋ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๋๋ ์ฌ๋๋ค์ด ๋ค๋ฅธ ๊ฒ์ ์ข์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ํจ์ด ์ ์ผํ ์ฃผ์ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด CSS๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
JavaScript๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? Dart๋ณด๋ค ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค.
์ต์ํด์ง๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ ์ค๊ณํ๋ค๋ฉด ์ง์ ํ ํ์ ์ด ์๋๋๋ค.
@b-strauss๋ฅผ ๋ช
ํํ ํ๊ธฐ ์ํด JSX๋ ํจ์ ํธ์ถ๋ก ์ปดํ์ผ๋ฉ๋๋ค( createElement(ComponentClass)
์ ๋ํ React ํธ์ถ์์ Dart์์๋ ์์ฑ์์ฌ์ผ ํจ).
<A property="a" />
new A(property: a)
<A property="a">
<B />
<C />
</A>
new A(property: a, children: <Widget>[new B(), new C()])
์ ์ผํ ๊ตฌ์ฑ์ ์์ ์ด๋ฆ+์์ฑ๊ณผ ํจ์ ํธ์ถ+์ธ์ ๊ฐ์ ๋ณํ๊ณผ ์ด์ค์ผ์ดํ๋ ํํ์( {...}
)์
๋๋ค.
(JS)
{ condition && <A /> }
{ condition ? <A /> : <B /> }
(JS)
{ ['a', 'b'].map(i => <A property={i} />) }
๊ทธ๋์ ๋น์ ์ flutter ํ์ด ์์ฌ์ค๋ฝ๊ณ ํน์ ์น ๊ฐ๋ฐ์ ํ์ ์งํฉ์ ์ผ๋ถ๋ฅผ ๋์ด๋ค์ผ ์๋ ์๊ณ ๊ทธ๋ ์ง ์์ ์๋ ์๋ ๊ธฐ๋ฅ์ ๋ณด๋ฅํด์ผ ํ๋ค๊ณ ์ ์ํฉ๋๊น?
@b-strauss, React Native๋ ์น ๊ฐ๋ฐ์ด ์๋๋ผ Flutter์ ์ฃผ์ ๊ฒฝ์์์ธ ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ ๋๋ค. ์, JSX๋ ๊ด์๊ณผ ๊ฐ์์ ๋ง์ React Native ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ผ ๊ฒ์ ๋๋ค. 2017๋ 8์์ ์ด ๊ธฐ๋ฅ์ ์์ฒญํ๋๋ฐ ๋ง์ด ๋๋ฌด ๋ง๊ณ ํ๋์ด ์ ์ต๋๋ค.
๋ชจ๋ DSL์ ์ ์์ GPL๋ณด๋ค ํํ๋ ฅ์ด ๋จ์ด์ง๋๋ค. DSX๋ฅผ ์ฌ์ฉํ์ฌ ์์ ฏ์ ์กฐ๊ฑด๋ถ๋ก ์จ๊ธฐ๋ ค๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น? ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ๊ณ ๋ชจ๋ ์์๋ฅผ โโ์์ ฏ์ ๋งคํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์ค์์น๋ ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? ์ด์ GPL์ ์ด๋ฏธ ์๋ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฒ์์ DSL์ ๋ฐ๋ช ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋น์ ์ ์์ ํ ํ๋ ธ์ต๋๋ค. ์ข์ ์์์ ๋๋ ํ ๋ฒ ํ๋ ธ๋ค๋ ๊ฒ์
๋๋ค. ์ ๋ถ๋ ์๋์ง๋ง ๋๋ถ๋ถ์ DSL์ ๋งํฌ์
์์ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์ฑ์ ๋ค์ ๋ง๋ค๋ ค๊ณ ์๋ํ์ง๋ง(๋งค์ฐ ๊ฐ๋ ฅํ์ง ์์), JSX๋ ๋งํฌ์
์ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ์ ธ์ต๋๋ค(ํธ์คํธ ์ธ์ด๋ฅผ ์ต๋ํ ํ์ฉ). ์ฐจ์ด์ ์ ๋ณํ์
๋๋ค. ๋ชจ๋ ์ง๋ฌธ์ ๋ํ ๋ต์ ๊ธฐ๋ณธ์ ์ผ๋ก Dart์์ ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. Dart๋ ๋คํธ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ ์ธํ๊ณ '{}' ์ฌ์ด์ ๋ชจ๋ ๊ฒ์ Dart ์ฝ๋์
๋๋ค. ๋ชจ๋ ๋คํธ ํํ์์ด์ง๋ง ํํ์์ ๋ฐํํ๋ ์ต๋ช
ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ํธ๋์คํ์ผ๋ฌ ํ๊ทธ(\
DSL์ ํ์ฌ ํด๊ฒฐํ ์ ์๋ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น?
0๊ณผ 1์ ์ฌ์ฉํ ์ ์๋๋ฐ ์ Dart๋ฅผ ์ฌ์ฉํฉ๋๊น? ๊ทธ๊ฒ ์ปดํจํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์ํ ์ ๋ถ๊ฐ ์๋๋๊น?
๋ ์ข๋ค๋ ๋ง๋ง ๊ณ์ ํ๋๊ฑด๋ฐ ์ ๋ ๋ซ์ง?
๋๋ ์ด์ ์ ๋ด ์ด์ ๋ฅผ ์ ์ํ๊ณ ์ฌ๊ธฐ์์ ๋ฐ๋ณตํ์ง ์์ ๊ฒ์ ๋๋ค. JSX ์ฌ๋๋ค์ ์ ์๊ฒ ๋์ํ์ง๋ง '๊ฐ๊ฐ ์์ ์ ๊ฒ'์ ๋๋ค.
DSX๊ฐ JSX ์ฌ๋๋ค์ ๋์ด๋ค์ผ ๊ฒ์ด๋ผ๋ ๋ฐ๋ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๋๋ ์ฌ๋๋ค์ด ๋ค๋ฅธ ๊ฒ์ ์ข์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ํจ์ด ์ ์ผํ ์ฃผ์ฅ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด CSS๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
JavaScript๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? Dart๋ณด๋ค ๋ ๋ง์ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค.
์, CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋์์ด๋-๊ฐ๋ฐ์ ์ํฌํ๋ก๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. DSX๋ ์ด๋ฅผ ์ง์ํฉ๋๋ค. Dart๊ฐ Javascript์ ๋นํด ์ฅ์ ์ ์คํ ์๋(์ฑ๋ฅ)์ ๋๋ค.
์ต์ํด์ง๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ์ ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ ์ค๊ณํ๋ค๋ฉด ์ง์ ํ ํ์ ์ด ์๋๋๋ค.
๋น์ ์ ๋น์ ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ์๋ชป๋ ํธ๊ฒฌ์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ๋ง์์ ์ด๊ณ ๋ค์ํ ์๋๋ฅผ ํด๋ณด์ธ์.
@alexkrolick , ์์ธํ ๋ด์ฉ ๊ฐ์ฌํฉ๋๋ค.
@cbazza
๋น์ ์ ๋น์ ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๋ ๊ฒ์ ๋ฐฉํดํ๋ ์๋ชป๋ ํธ๊ฒฌ์ผ๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ๋ง์์ ์ด๊ณ ๋ค์ํ ์๋๋ฅผ ํด๋ณด์ธ์.
์ง๊ธ ์ด ๋ฌธ์ ์ ๊ตฌ๋ ์ ์ทจ์ํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ๋ ์ด๋์์๋ ๋ค์๋ ์ ๋ฅผ ์ธ๊ธํ์ง ๋ง์ธ์, thx.
@b-์คํธ๋ผ์ฐ์ค
๋ฏธ์ํด์, ๋น์ ์ ๊ธฐ๋ถ์ ์ํ๊ฒ ํ ์๊ฐ์ ์์์ด์... ๊ทธ๋ฅ ๋ด ์์ ์ ์ข์ ๊ฐ์ ๋ค์ค๋ฆฌ๋ ค๊ณ ์ ์ฐ๋ฉด์ ๋น์ ์ ๋ถ๋๋ฝ๊ฒ ์๋ดํ๋ ค๊ณ ํ๋ ๊ฒ๋ฟ์ด์์. ์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ ๋ชจ๋ ์ธ๊ฐ์ ๋๋ค.
@cbazza ์ด๋ฉ์ผ์ ๋ณด๋ด์ฃผ์๊ฒ ์ต๋๊น? [email protected]
์ด๋ฏธ ์ด์ ์ค๋ ๋์์ ์ด ์ ์์ ํ์ง๋ง ์ฌ์ ํ ์ค์ํ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
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,
),
),
JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ ํ๋ฌํฐ๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ชฉ์ ์ ๋์ํ๊ณ ์ฌ๋ฌ ์์ ฏ์ผ๋ก ๋ถํ ํ๋ ๊ฐ๋ ๋ ์ง์ํ์ง๋ง ์ด์ ๋ MVC ์๋๊ฐ jquery๋ก ๋์๊ฐ ๊ฒ์ฒ๋ผ ๋๋ผ๊ฒ ํฉ๋๋ค. ๋์ค์ ํจ๋ฉ, ํ ๋๋ฆฌ ๋ฐ ์ค์ ๋ ์ด์์์ด ์๋ ๊ฐ๋จํ ์์ ฏ์ด ์๋ ์๋๋ฆฌ์ค์์๋ ๋ง์ "}" ๊ธฐํธ๊ฐ ๊ฐ๋ ์ฑ์ ์ฌ๊ฐํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ทธ๋ฌ๋ ํตํฉ ์์ ฏ์ด๋ฏ๋ก ๋ถํ ํ๊ณ ์ถ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ? ๋น๋ก ์์ด๋ ์ํด์ง๋ง, ๋๋ ๋ด ์๊ฐ์ ํํํ๊ธฐ ์ํด ๋ ธ๋ ฅํฉ๋๋ค.
์ฃผ๋ ์ฐ๋ฆฌ ๋ชจ๋๋ฅผ ๋์ฐ์์.
์ข์, ์ด๊ฒ์ ์๋ฌด๋ฐ๋ ๊ฐ์ง ์๋๋ค. ์๋ฌด๋ ๊ณง ์ ์ฅ์ ๋ฐ๊พธ๋ ค๊ณ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์ผ์ข ์ ํํ์ ๋๋ฌํด์ผ ํฉ๋๋ค. ๋ฌผ๋ก "pro-DSX" ๋ "anti-DSX"๋ ์ค์ ๋ก ์๊ฒฉ์ผ๋ก ๋ง์กฑ์ค๋ฌ์ด ํํ์ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉฐ, ์ด๋ ์ค๋ง์ค๋ฌ์ด ํ์ค์ ๋๋ค. ๋ ํธํ๋ ์ ์๋๋ก ์์น๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์์ต๋๊น?
@naiveaiguy "๊ทธ๋ค"์ DSX๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
Flutter ํ์ด ์ด๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด ์คํ ์์ค ์ด๋์
ํฐ๋ธ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ์ง๊ธ๊ณผ ๊ฐ์ ์์ Dart ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ด์ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
๋ ์ธ๊ณ๋ ๊ณต์กดํ ์ ์์ต๋๋ค.
๋๋ @zoechi ๊ฐ ๊ณต์กดํ ์ ์๋ค๋ ๊ฒ์ ๋๋ฌด ๋์ํฉ๋๋ค...๊ทธ๊ฒ ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ์ค๋๋ ์ค๋ ๋์์ ํด๊ฒฐ๋์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
@lrhn
์๋ฏผ ์ฌ๋ฌ๋ถ, ๊ฑด์ค์ ์ด์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์คํ์ผ์ ๋ํด ๋ ผ์ํ๊ณ ์์ต๋๋ค. ๋งค์ฐ ์ฃผ๊ด์ ์ธ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ์ฌ๋์ด ์์ ์ ์ ํธ๋๋ฅผ ์๋ฌด๋ฆฌ ์ข์ํ๋๋ผ๋ ๋ณธ์ง์ ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ณด๋ค ์ฐ์ํ์ง๋ ์์ต๋๋ค. ๊ธฐ์กด ๋ฐ ์ ์๋ ๊ตฌ๋ฌธ์์ ๋ณผ ์ ์๋ ์ฅ์ ๊ณผ ๋จ์ ์ ๋์ดํ์ญ์์ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ณด๋ ๊ฒ์ ์๋๋ฉฐ ์๋ฒฝํ๊ฒ ๊ด์ฐฎ์ต๋๋ค.
๋ธ๋ผ๋ณด, ๋ฐ๋ก ๊ทธ๊ฒ์ ๋๋ค.
React์์๋ 4๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์์ต๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ ๋ ์ค๋ ๋ค๋ฅธ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ์๊ฒ ๋์์ต๋๋ค!!!)
(1) JSX(๋ด๊ฐ ์ข์ํ๋ ๊ฒ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://reactjs.org/docs/introducing-jsx.html
(2) Flutter์ ์ ์ฌํ ์๋ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://reactjs.org/docs/react-without-jsx.html
์์ ๋งํฌ ๋์๋ 2๊ฐ์ ์ ๋งํ ์ปค๋ฎค๋ํฐ ํ๋ก์ ํธ๋ ์ธ๊ธ๋์ด ์์ต๋๋ค.
(3) React.js ๋งํฌ์
์ ์ํ ํ์ดํผ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ
https://github.com/mlmorg/react-hyperscript
(4) ํ์ดํผ์คํฌ๋ฆฝํธ์ ๋ํ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ.
https://github.com/ohanhi/hyperscript-helpers
๋์์ด ์๋ค๋ ๊ฒ์ ์ข์ ์ผ์ ๋๋ค. ๊ฒ์ ์์ด๋ฉด ์ํ๋ ์์์ผ๋ก Ford๋ฅผ ๊ตฌ์ ํ ์ ์๋ ์๋๋ ์ง๋ฌ์ต๋๋ค. :)
@naiveaiguy ํ์ฌ ์ ๊ทผ ๋ฐฉ์ ๊ณผ DSX๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
(๊ทธ๊ฒ์ ๋ด๊ฐ ๋น์ ์ downvotes์์ ํ์ ๋ ๊ฒ์
๋๋ค)
@naiveaiguy "๊ทธ๋ค"์ DSX๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
Flutter ํ์ด ์ด๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด ์คํ ์์ค ์ด๋์ ํฐ๋ธ๊ฐ ๋ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๊ณ ํด์ ์ง๊ธ๊ณผ ๊ฐ์ ์์ Dart ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ด์ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
๋ ์ธ๊ณ๋ ๊ณต์กดํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด ์๋๋ผ ํ๋ฌ๊ทธ ๊ฐ๋ฅํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ ํ๋์ ํ์ค์ ๊ฐ์ง์ง๋ง ์ถ๊ฐ ํญ๋ชฉ์ผ๋ก ๊ฒฝํ์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ํ๋ฅญํ ํจ๋ฌ๋ค์์ ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก Flutter ํ์ ๋ ๊ด๋ จ์ฑ ๋์ ๋ฌธ์ ์ ๊ณ์ ์ด์ ์ ๋ง์ถ ์ ์๊ณ ์ปค๋ฎค๋ํฐ๋ ๋ค์ํ ๋๊ตฌ/์๋ฃจ์ ์ ์คํํ ์ ์์ผ๋ฉฐ DSX ๋๋ ํ์ฌ์ ๋ํ ๋ค๋ฅธ ๋์์ ๋ํด ๋ ๋ง์ ๋ฐ์ดํฐ์ ๊ฒฝํ์ ๊ฐ์ง๊ณ ํ ๋ก ํ ์ ์์ต๋๋ค. ๋ฉํ.
๋์์ด ์๋ค๋ ๊ฒ์ ์ข์ ์ผ์ ๋๋ค. ์ํ๋ ์์์ผ๋ก Ford๋ฅผ ๊ตฌ์ ํ ์ ์์๋ ์๋๋ ์ง๋ฌ์ต๋๋ค.
๋ธ๋์ด๋ฉด ์ข์์ :)
์ฌ์ค์ ๋๋ค. ํ์ง๋ง Dart/Flutter๊ฐ ๋ ๋ค๋ฅธ JS/Web Frontend ์ํ๊ณ๊ฐ ๋๋ ๊ฒ์ ์ํ์ง ์๋๋ค๋ ๋ฐ ๋ชจ๋ ๋์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Flutter๋ ์์ง ๋ฒ ํ๋ ๋๋์ง ์์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์ฃผ๊ด์ ์ธ ๊ฒ์ ๋ํด 2๊ฐ์ง ํ์ค์ ๊ฐ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
React์์๋ 4๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์์ต๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ ๋ ์ค๋ ๋ค๋ฅธ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ์๊ฒ ๋์์ต๋๋ค!!!)
React์์ ์ธ๊ธํ์ง๋ง ๋๋ถ๋ถ์ ์ปค๋ฎค๋ํฐ ์ค์ฌ์
๋๋ค. ์ข์ ์ค๊ฐ. ์ด์ ๊ณต์์ ์ผ๋ก๋ React.createElement
์ JSX ๋ฐฉ์(๋ค๋ฅธ ํ๋์ ๋ํผ์ธ JSX ๋ฐฉ์)๋ง ๊ณต์์ ์ผ๋ก ์ง์๋ฉ๋๋ค. JSX์ ๊ฐ์น๋ ๊ทธ ๋งฅ๋ฝ์์ ์
๋ช
์ด ๋์ง๋ง ์ฌ๊ธฐ์๋ ๊ทธ๋ ๊ฒ ๋ช
ํํ์ง ์์ต๋๋ค. ์ด๋ฅผ ์ผ๋์ ๋๊ณ ํ๋์ ๊ณต์ ํ์ค๊ณผ ๊ด๋ จ๋ ๋๋ง๋ค DSX๋ฅผ ์ฐธ์กฐํ๋ ๋ฌธ์๋ง ์์ผ๋ฉด ์ค๊ฐ์ ์ถฉ์กฑํ ์ ์์ต๋๊น?
Flutter ํ์ ๊ฐ๋ฐ์๊ฐ ์ฑ์ ๋น๋ํ์ง ๋ชปํ๋๋ก ๋ง๋ ๋ถ์กฑํ ๊ธฐ๋ฅ์ ์ง์คํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ง๋ ์ง์์ ์ถ๊ฐํ ์ ์๊ณ ์นด๋ฉ๋ผ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋ฐ 2์ฃผ๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด ๊ด๋ฆฌ์์๊ฒ Flutter๋ฅผ ์ถ์ฒํ ์ ์์ต๋๋ค.
๋๋ DSX์ ๋ฌธ์ ์์ํ ๋ซ์ง ์์ ๊ฒ์์ ๋ช ์ฌํ์ญ์์ค. UI ๊ตฌ์ถ์ ์ํ ์๋ฃจ์ ์ด ๋ ์๋ ์์ง๋ง ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด์๋ ์ด๋ฅผ ์คํํ๋ ์ปค๋ฎค๋ํฐ๊ฐ ํ์ํฉ๋๋ค.
@zoechi ๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ ๊ฐ์ง ์์ด๋์ด๊ฐ ํ์ฌ Flutter ์ํ์์ ๊ณต์กดํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ํน์ฑ์ ์ผ์ฐ๋ถํฐ ๋ถํ ํ๋๋ก ๊ถ์ฅํด์๋ ์ ๋ฉ๋๋ค. ํ์ง๋ง ํ์ฌ๋ก์๋ ์ด๊ฒ์ด ์ ์ผํ ํํ์ ์ผ๋ก ๋ณด์ ๋๋ค.
@naiveaiguy
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ๋ ๊ฐ์ง ์์ด๋์ด๊ฐ ํ์ฌ Flutter ์ํ์์ ๊ณต์กดํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฑ๊ฒฉ์ ๋ถ๋ฆฌ๋ฅผ ์ผ์ฐ๋ถํฐ ๊ถ์ฅํด์๋ ์ ๋ฉ๋๋ค.
๊ทธ๋ค์ด ๊ณต์กดํ ์ ์๋ ์ด์ ์ ๋ํด ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? (DSX๊ฐ ๋จ์ง ํฉ์ฑ ์คํ์ด๋ผ๋ ์ฌ์ค์ ๊ฐ์ํ ๋; ๋๋ @emalamela ๊ฐ "ํ์ฌ ๋ฐฉ์์ ๋ํผ"๋ผ๊ณ ๋งํ ๊ฒ์ฒ๋ผ).
๋ํ ์ ํํ ๊ฐ์ ๊ฒ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ์ ๋๋ฌด ์ด๋ฆ ๋๋ค. ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ด๊ฒ์ ์ฐ๊ธฐํ ํ์๊ฐ ์๋์ง ๋ฌป์ต๋๋ค. ์ง๊ธ์ ์์ง ์กด์ฌํ์ง ์๋ ๋ฏธ๋์๋ ๋ฌด์์ด ๋ค๋ฅผ๊น์?
@emalamela
ํ์ง๋ง Dart/Flutter๊ฐ ๋ ๋ค๋ฅธ JS/Web Frontend ์ํ๊ณ๊ฐ ๋๋ ๊ฒ์ ์ํ์ง ์๋๋ค๋ ๋ฐ ๋ชจ๋ ๋์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ฌ๋๋ค์ด Dart/Flutter๋ก ํ ์ ์๋ ์ผ์ ์ ํ์ ๋์ง ์์ต๋๋ค. ์์ฅ/์ปค๋ฎค๋ํฐ๊ฐ ๊ฒฐ์ ํ๊ฒ ํ์ญ์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด์ง ๊ฒ์ด ๊ฐ์น๋ฅผ ๋ํ์ง ์๋๋ค๋ฉด ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๊ณ ์ฃฝ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋์คํ๋๋ค๋ฉด ์ปค๋ฎค๋ํฐ์์ ์ ์ฉํ๊ณ ๊ฐ์น์๊ฒ ์ฌ๊ฒจ์ก๊ธฐ ๋๋ฌธ์ด๋ค. ์ง๊ธ ์น์์ ํจ์๋ฅผ ์ ํํ ํ์๊ฐ ์์ต๋๋ค.
๋ด๊ฐ Flutter๋ฅผ ์๋ํ์ง ๋ชปํ๊ฒ ๋ง๋ ์ ์ผํ ์ด์ ๋ ๊ทธ๋ค์ด JSX๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ์ ํํ๋ค๋ ์ฌ์ค์
๋๋ค.
IMHO JSX๋ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํํํ๋ ์ต์ ์ ์ ํ์
๋๋ค.
Flutter์ ๋ํด ๋ฃ๊ณ ์๋ํด ๋ณด๊ณ ์ถ์์ง๋ง ๊ตฌ๋ฌธ์ ๋ณด๋ ์๊ฐ ์๊ฐ์กฐ์ฐจ ํ์ง ์๊ณ ์ฆ์ ์ค๋จ๋์์ต๋๋ค. ์ด๊ฒ์ ์ด๊ฒ์ด ํ๋ฅญํ ๊ธฐ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ์ ํ์ ๊ตฌ์ถํฉ๋๋ค.
์ ๋ ์ง๋ 2.5๋ ๋์ React/React Native ๊ฐ๋ฐ์ ํด์์ผ๋ฉฐ ์์ฐ์ฑ์ ํฌ์ํ๋ฉด์ UI๋ฅผ ์ค๋ช ํ ๋ JSX ๊ตฌ๋ฌธ์ด ์ ๊ณตํ๋ ์ด์ ์ ๋ง์ด ๋ฌป์ต๋๋ค. Flutter์ ๋ํ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์ฐ๊ณ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋๋ ์์ ์ผ๋ก ์ ํํ ๊ฐ์น๊ฐ ์๋์ง ์ฐ๊ตฌํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ๋ ๊ฒ์ ์ง์งํ๊ฒ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ด ๋๋ฌธ์ Flutter๊ฐ ์๊ณ ์๋ ์ ์ฌ์ ์ธ ์ฑํ์/์ฌ์ฉ์/๊ฐ๋ฐ์์ ์๋ ์์์กฐ์ฐจ ํ ์ ์์ต๋๋ค. ๋ค์ ๋ฌ์ ๋ค์ ๋ฐฉ๋ฌธํ ๊ฒ์ ๋๋ค.
์ด ๋๋ฌธ์ Flutter๊ฐ ์๊ณ ์๋ ์ ์ฌ์ ์ธ ์ฑํ์/์ฌ์ฉ์/๊ฐ๋ฐ์์ ์๋ ์์์กฐ์ฐจ ํ ์ ์์ต๋๋ค. ๋ค์ ๋ฌ์ ๋ค์ ๋ฐฉ๋ฌธํ ๊ฒ์ ๋๋ค.
๋ค, 44 Mio ๋ ํฌํ๋ฅผ ํ ๋งํผ ์ค์ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค :D
๋ค, 44๋ ํฌํ๋ฅผ ํ ๋งํผ ์ค์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค :D
'upvote'๋ก ์ ๋ ฌํ๋ฉด ์ด ๊ธฐ๋ฅ ์์ฒญ์ 3131๊ฐ์ ์ด๋ฆฐ ํฐ์ผ ๋ชฉ๋ก์์ 7์์ ๋์ด๋ฉ๋๋ค.
https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc
@cbazza ์ด ๊ธฐ๋ฅ์ ๋ํด ๋ ผ์ํ๊ณ ์ถ์ง๋ ์์ง๋ง "x๋ฅผ ์ํํ์ง ์์ผ๋ฉด ๋์ฐํ๊ฒ y๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค"์ ๊ฐ์ ์๊ฒฌ์ ์ฐ์ค๊ฝ์ค๋ฝ์ต๋๋ค.
์ ๋ ์ง๋ 2.5๋ ๋์ React/React Native ๊ฐ๋ฐ์ ํด์์ผ๋ฉฐ ์์ฐ์ฑ์ ํฌ์ํ๋ฉด์ UI๋ฅผ ์ค๋ช ํ ๋ JSX ๊ตฌ๋ฌธ์ด ์ ๊ณตํ๋ ์ด์ ์ ๋ง์ด ๋ฌป์ต๋๋ค. Flutter์ ๋ํ ๋ชจ๋ ๊ฒ์ ๋ฐฐ์ฐ๊ณ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋๋ ์์ ์ผ๋ก ์ ํํ ๊ฐ์น๊ฐ ์๋์ง ์ฐ๊ตฌํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ๋ ๊ฒ์ ์ง์งํ๊ฒ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
@์๋์
์์ฐ์ฑ์ ๋ํด ์ธ๊ธํ์ จ๋๋ฐ JSX ๋์ Flutter's Pattern์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์์ฐ์ฑ ์์ค์ ๋ช ํํ๊ฒ ๋ณด์ฌ์ฃผ๋ ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น? ์์ ๋ ํด๋น ์์ ๋ฅผ ์ฝ๋ฉํ ์ ์์ ๋งํผ JS ์ Dart๋ฅผ ์ถฉ๋ถํ ์๊ณ ์๋ค๋ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์ด์ผ ํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๊ณ ๋ คํ์ง ์๋๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ํ ๊ฐ์ ๋ ผ์๊ฐ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋น๊ตํ๊ณ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
'upvote'๋ก ์ ๋ ฌํ๋ฉด ์ด ๊ธฐ๋ฅ ์์ฒญ์ 3131๊ฐ์ ์ด๋ฆฐ ํฐ์ผ ๋ชฉ๋ก์์ 7์์ ๋์ด๋ฉ๋๋ค.
@cbazza
๊ฐ์ฅ ๋ง์ด ๋ค์ด๋ ํฌํ์ด๊ธฐ๋ ํฉ๋๋ค. ์๋นํ ๋ ผ๋์ด ๋๊ณ ์์ต๋๋ค.
@์ ๋ง๋ผ๋ฉ๋ผ ,
๊ฐ์ฅ ๋ง์ด ๋ค์ด๋ ํฌํ์ด๊ธฐ๋ ํฉ๋๋ค. ์๋นํ ๋ ผ๋์ด ๋๊ณ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ ์์ฒญ์ ํ์ฌ ๋ฐฉ์์ ๋์์ด๋ฉฐ ํ์ฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฏ๋ก ์ ํ ๋ ผ๋์ ์ฌ์ง๊ฐ ์์ด์ผ ํฉ๋๋ค. JSX/DSX๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ง๊ธ์ฒ๋ผ ํ๋ก๊ทธ๋๋ฐ์ ๊ณ์ํ์ญ์์ค.
์ด๋ฅธ๋ฐ ๋ ผ์์ Flutter ํ์ด ์ปค๋ฎค๋ํฐ๊ฐ DSX๋ฅผ ์ ์ ํ๊ฒ ์ํํ ์ ์๋๋ก ์์ ์ ์ํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์กด์ฌํฉ๋๋ค. Flutter ๋๊ตฌ(์ปดํ์ผ๋ฌ, ๋ถ์๊ธฐ, IDE ์ง์ ๋ฑ)๊ฐ ์์ค ๋งต์ ์ฌ์ฉํ ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค๋ฉด DSX๋ ์ค๋ ์ ์ ์ํ๋์์ ๊ฒ์ด๋ฉฐ ํ์ฌ ๊ฐ๋ฐ์์ ๋ค๋ฅธ ์ธ์ด ํ์ /์์ด๋์ด๋ ๋ฐ์ํ์ ๊ฒ์ ๋๋ค.
new Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
AspectRatio(
aspectRatio: 18 / 11,
child: Image.asset('assets/diamond.png'),
),
new Padding(
padding: EdgeInsets.fromLTRB(16, 12, 16, 8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Title'),
SizedBox(height: 8),
Text('Secondary Text'),
],
),
),
],
),
)
๋ค์์ด ๋ฉ๋๋ค.
<Card>
<Column crossAxisAlignment={CrossAxisAlignment.start}>
<AspectRatio aspectRatio={18 / 11}>
<Image src={asset('assets/diamond.png')} />
</AspectRatio>
<Padding padding={EdgeInsets.fromLTRB(16, 12, 16, 8)}>
<Column crossAxisAlignment={CrossAxisAlignment.start}>
<Text>Title</Text>
<SizedBox height={8} />
<Text>Secondary Text</Text>
</Column>
</Padding>
</Column>
</Card>
@emalamela JSX ์ ๋ํ ์ฐฌ์ฑ๊ณผ ๋ฐ๋ ๋ ผ์์ ํ ๋ก ์ผ๋ก ์์ง๋์์ต๋๋ค. ์ฐพ์๋ณผ ์ ์๋ ์๋ฃ๊ฐ ๋ง์ด ์์ต๋๋ค. ์ ๋ ์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ๊ณต์ ํ ๋ฟ์ ๋๋ค.
์ฒซ์งธ, ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋๋ค. JSX์ UI ๊ตฌ์กฐ์ ๋ํ ๋ช ํํ๊ณ ๋ช ํํ ์์ด๋์ด๋ฅผ ์ฆ์ ์ป์ ์ ์์ต๋๋ค(๋ช ์ด ์์). ์ ์ ์ ๋ชจ๋ฌ์ ๋งค์ฐ ์๊ฐ์ ์ ๋๋ค. ๋์งธ, ์ฌ์ฉ์ฑ. JS/Dart ๋๋ ๊ธฐ๋ณธ API์ ๋ํ ์ง์์ด ์์ด๋ JSX๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด๊ฒ์ ์ด์ ๋ง ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ฐ๋ ์ฌ๋์ด๋ ์ฐ๋ฆฌ ํ์ ์ผ๋ถ์ธ ๋๊ตฐ๊ฐ์๊ฒ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ์ด์ ๋์์ด๋๋ UI๋ฅผ ์ฝ๋ฉ ํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ค๋ช ์ ์์ ํ ์ ์ธ์ ์ ๋๋ค(๋จ์ํ ํํ์ ์ธ ๊ฒ์ด ์๋). ์๋ฐฑ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์์ ํ ๋ UI๋ฅผ ์ค๋ช ํ๋ ์ด ๋ฐฉ๋ฒ์ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ญ๋๋ค(์ ๋ง ๊ฐ์ฌํ๊ฒ ์ฌ๊ธฐ๋ ค๋ฉด ์๋ํด์ผ ํจ). JSX๋ฅผ ์ฒ์ ๋ณด์์ ๋๋ ๋ง์์ ๋ค์ง ์์์ต๋๋ค. ์ผ๋จ ์ฌ์ฉํด๋ณด๋ ๋ฑ ๋ง์์ต๋๋ค. ์์ผ๋ก UI๋ฅผ ์ด๋ ๊ฒ ์ค๋ช ํ๊ณ ์ถ์ ๊ฒ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์์ด ๋ถ๋ช ํ ๋ํ๊ตฌ์์ต๋๋ค.
๋ ์ ์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ "๊ตฌ๋ฌธ ์คํ"์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ธ๊ฐ์ ์ํ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ํ ๋ชจ๋ ์ฌ๋์ด JSX๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ ๋ฐ๋ํฉ๋๋ค. ์ด๊ฒ์ ํฐ๋ฌด๋์๋ ์ผ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค(์ ๋ฅผ ํฌํจํ์ฌ)์ ๊ฒฝ์ฐ JSX(๋๋ Flutter์ ๊ฒฝ์ฐ DSX)๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค.
์ ๋ React์์ ์์ผ๋ฉฐ Flutter๋ฅผ ์ฒ์ ์ฌ์ฉํด ๋ด ๋๋ค. flutter ํ์ JSX ๊ตฌ๋ฌธ์ด ์๋ค๋ ๊ฒ์ ์ ๋ง ์ด์ํ ์ผ์ ๋๋ค. ์ง์ฌ์ผ๋ก ๋ง์ ๋๋ค! JS ์ธ๊ณ์์ JSX๋ ํ์ฌ ๋ชจ๋ React ๋์์์ ๋งค์ฐ ๋๋ฆฌ ํผ์ ธ ์์ต๋๋ค! JSX๋ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์น์ํฉ๋๋ค. ์ด ์ปค๋ฎค๋ํฐ๋ฅผ ์ฑ์ฅ์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์๋๋ก ์ต๋ํ ๋นจ๋ฆฌ ๊ตฌํํด ์ฃผ์ญ์์ค.
JSX(๋๋ ์ด ๊ฒฝ์ฐ DSX)๊ฐ ์ด ๋ฌธ์ ์ ๋ํ ์ฃผ์์ ์์ ์ฐพ๋ ๊ฒ๋ง์ผ๋ก ํฐ ๋ฌธ์ ์์ ์ ์ ์์ต๋๋ค.
JSX๋ ์ฌ์ฉํด ๋ณด๊ธฐ ์ ๊น์ง๋ ๋น์ ์ด ์ฌ๋ํ๋์ง ๋ชจ๋ฅด๋ ๊ฒ์ ๋๋ค. ์ฝ๋์ ๋งํฌ์ ์ด ์๋ ๊ฒ์ด ์ฒ์์๋ ์ด์ํ์ง๋ง ๋์ค์๋ ๋ฉ์ง๋๋ค.
์ด๋ฏธ ํ๋ฌํฐ/๋คํธ๋ฅผ ์๊ณ ์๋ ์ฌ๋๋ค์๊ฒ๋ ๋ถํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ฒ๋ผ ๋คํธ๋ฅผ ๋ง์ ธ๋ณธ ์ ์ด ์๋ ์ฌ๋์๊ฒ๋ JSX๊ฐ ์์ํ๊ธฐ ํจ์ฌ ์ฝ๊ณ ๊ทธ๊ฒ ์์ ์ ๋๋ค. ๋ ๋ง์ ์ฌ๋๋ค์ด ์์ ๋ ๋ฉ์ง ๊ฒ์ ๋ง๋ค๊ธฐ ์์ํ๋ ค๋ฉด ๋๊ตฌ๊ฐ ๋ ์ฌ์์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ @eseidelGoogle (https://youtu.be/h7HOt3Jb1Ts?t=2m41s)์ด ๋ค๋ฅธ ์ฌ๋์๊ฒ ๋งํ๋ฏ์ด "Flutter๋ ๋จ์ผ ์ฝ๋๋ฒ ์ด์ค์์ iOS์ Android์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค. ..] Flutter๋ ํ๋์จ์ด์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ์ด์ผ๊ธฐํฉ๋๋ค [...] ์ฐ๋ฆฌ๋ ๋งค์ฐ ๊ณ์ธตํ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ํ๋ ๋งํผ ์ ๊ฒ ๋๋ ๋ง์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. [...] ์ฐ๋ฆฌ๋ ๋๊ตฌ ์ ๋ง์ ํฌ์๋ฅผ ํ์ต๋๋ค. ."
JSX๋ฅผ ๊ตฌํํด ์ฃผ์ธ์.
์ ๋ Dart์ ํฌ์ด์ react๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ฌ์ฉ์์ด๊ธฐ๋ ํฉ๋๋ค. ๋๋ ํญ์ Dart๊ฐ JSX๋ณด๋ค ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ JSX/DSX๋ ์ปค๋ฎค๋ํฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ ์ ์๊ณ ๊ตฌํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rajaraodv Flutter๊ฐ ๋ฐ์ํ ์คํ์ผ ํ๋ ์์ํฌ๋ก ์น๊ฒฉ๋์๋ค๊ณ ํด์ ์ด๊ฒ์ด ๋จ์ง ReactJS์ ํ๋ฏธ๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
๋๋ถ๋ถ์ ๋๊ธ์์ ๋๋ ์ฌ๋๋ค์ด ์๋ก์ด ๊ฒ์ด ๊ทธ๋ค์ด ์ด๋ฏธ ์๊ณ ์๋ ๊ฒ๊ณผ ๊ฐ์ง ์๋ค๋ ๊ฒ์ ๋ฐ์๋ค์ด๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๋๋ค๋ ์ธ์์ ๋ฐ์ต๋๋ค.
ํ์ฌ ์ํ๋ฅผ ์ ์ ๋์ Flutter๋ก ์์ ํ ๋ค์ JSX/DSX๊ฐ ๋จ์ํ Dart๋ณด๋ค "๊ฐ์ธ์ ์ธ ์ ํธ" ๋๋ "๋ ์ข์์ก๊ธฐ ๋๋ฌธ์"๊ฐ ์๋๋ผ ์ฌ์ค์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ๋์ ์ด์ ๋ฅผ ์ ์ ํ ๋ ผ๊ฑฐ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. .
@zoechi , ๋น์ ์ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๋ค: Flutter ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด flutter๋ React์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.
์๋ง๋ ๊ทธ๊ฒ์ ๋ด ๋ฌธ์ ์ผ๋ฟ์
๋๋ค. Dart 2 ๊ตฌ๋ฌธ์ผ๋ก ๋์ด ์์ด๋ UI ์ฝ๋๋ฅผ ์ฝ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์ ๋ง ๋๋๋๋ค.
Flutter๋ React Native์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด "์ธ์ด๊ฐ JS ๋์ Flutter๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๊ฒ์ด ๋์ผํฉ๋๋ค"๋ผ๊ณ ๋งํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํฉ๋๋ค.
UI ์ฝ๋๋ฅผ ์ฝ๊ธฐ๊ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์ ๋ง ๋๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ํ ์์ํ ์ ์๋ ์ ์ผํ ์๋ฃจ์ ์ด DSX๋ผ๊ณ ์ฃผ์ฅํฉ๋๊น?
Flutter๊ฐ 1.0๋ ์๋๊ณ IDE ์ง์์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํฅ์๋ ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ์ จ์ต๋๊น?
๋น ๋ฅธ ์์ ("wrap xxx") ๋ฐ ๋ซ๊ธฐ ๋ ์ด๋ธ๊ณผ ๊ฐ์ ์ฝ๋ ํธ์ง๊ธฐ์์ ๋ ๋์ Flutter IDE ์ง์์ ์ป๊ธฐ ์ํด ์ต๊ทผ์ ์ทจํ ์ฒซ ๋ฒ์งธ ์์ ๋จ๊ณ๋ง ์์์ต๋๋ค.
๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ ์ด ํ ๋ก ์์ ๋๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"Flutter๋ ์์ง ์๋ฒฝํ์ง ์์ผ๋ฏ๋ก DSX๊ฐ ํ์ํฉ๋๋ค."
์ผ๋ฐ์ ์ผ๋ก DSX๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ ๋๋ ์ด์ ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋
ผ์๊ฐ ์์ต๋๋ค.
@zoechi ,
ํ์ฌ ์ํ๋ฅผ ์ ์ ๋์ Flutter๋ก ์์ ํ ๋ค์ JSX/DSX๊ฐ ๋จ์ํ Dart๋ณด๋ค "๊ฐ์ธ์ ์ธ ์ ํธ" ๋๋ "๋ ์ข์์ก๊ธฐ ๋๋ฌธ์"๊ฐ ์๋๋ผ ์ฌ์ค์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ๋์ ์ด์ ๋ฅผ ์ ์ ํ ๋ ผ๊ฑฐ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. .
๋ค์ ํ๋ฒ Plain Dart ๋๋ DSX๋ ๋จ์ํ ์คํ์ผ์ ๋ฌธ์ ์ด๋ฉฐ ์ด๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๊ฐ์ธ์ ์ธ ์ทจํฅ์ด๋ฉฐ ์ฌ๋๋ค์ ํ๋ ๋๋ ๋ค๋ฅธ ๊ฒ์ ์ ํํ๋ ์ด์ ๊ฐ ์์ต๋๋ค.
React World์์ ์ผ์ด๋ ์ผ์ JSX๋ฅผ ์ฌ์ฉํ๊ณ ๋๋ฉด ๋ค์ ๋์๊ฐ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์์ ์ธ๊ธํ๋ฏ์ด ์ ์ ์ฌ์ฉํ๋ฉด JSX์ ํน ๋น ์ง๊ฒ ๋ฉ๋๋ค. JSX๋ React's World(Typescript, Vue) ์ธ๋ถ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฑํํ์ผ๋ฉฐ Flutter์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ํ ์์ํ ์ ์๋ ์ ์ผํ ์๋ฃจ์ ์ด DSX๋ผ๊ณ ์ฃผ์ฅํฉ๋๊น?
์ปค๋ฎค๋ํฐ์ ํ์ํ ๊ฒ์ DSX ๋๋ ๋ ๋์ ๊ฒ์ ์ปค๋ฎค๋ํฐ์์ ๊ฐ๋ฐํ๊ณ Flutter(๋๋ฒ๊ฑฐ, ์๋ ์๋ฃ ๋ฑ).
๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ ์ด ํ ๋ก ์์ ๋๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"Flutter๋ ์์ง ์๋ฒฝํ์ง ์์ผ๋ฏ๋ก DSX๊ฐ ํ์ํฉ๋๋ค."
์ผ๋ฐ์ ์ผ๋ก DSX๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฑฐ๋ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ ๋๋ ์ด์ ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ ผ์๊ฐ ์์ต๋๋ค.
๋ฌผ๋ก , ์ด ํฐ์ผ์ ์ผ๋ฐ์ ์ธ '๊ฐ๋ฐ์ ๊ฒฝํ ๊ฐ์ '์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ๊ตฌ์ฒด์ ์ด๋ฉฐ Flutter์์ JSX ์ง์์ ๋ฐ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์ปค๋ฎค๋ํฐ๋ DSX๋ฅผ ์ผ๋ฐ Dart ๋ฐฉ์์ ๋์์ผ๋ก ์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค(๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ์๋ํ ์ฉ์๊ฐ ์๋ค). ๋๋ ์ด๊ฒ์ด ์์ด์์ด๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง, ํ ๊ฐ์น๊ฐ ์๋ ์ด์ ์ด ๋๋ฌด ๋ง์ต๋๋ค.
์ปค๋ฎค๋ํฐ๊ฐ ์ํ๋ ๊ฒ์ ๊ตฌ์ถํ ์ ์๋๋ก Google์ด ์ธ์ด ์ฅ์ ๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ Google์ Flutter/Dart ํ ์ธ๋ถ์ ์๋ ๋๊ตฐ๊ฐ๊ฐ Dart/Flutter์ ๋ํด JSX์ ์ ์ฌํ ๊ฒ์ ์์ฑํ๋ ๋ฐ ๋ฐฉํด๊ฐ ๋๋ ์ฅ์ ๋ฌผ์ ๋ํด ์์ง ๋ชปํฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์๋ํ๋ค๋ฉด ๋ฒ๊ทธ ๋ฅผ๋ณด๊ณ ์ถ์ต๋๋ค. (์ด ๋งค์ฐ ๊ธด ๋ฒ๊ทธ์ ๋ชจ๋ ๋จ์ด๋ฅผ ์ฝ์ง ์์๋ค๋ ๊ฒ์ ์ธ์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ฃผ์์์ ๋์ณค์ ์๋ ์์ต๋๋ค.) :)
๊ฐ์ฌ ํด์! ๊ทธ๋ฐ ์ด์ ์ ๋ณด๋ ๋ฐ๊ฐ์ต๋๋ค!
@eseidelGoogle ,
Intellij ๋ฐ/๋๋ VS Code(Dart-Code ํฌํจ)๋ ์ด๋ป๊ฒ ์ค๋จ์ ์ ์ค์ ํ๊ณ .dsx ํ์ผ์์ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ ์ ์์ต๋๊น? (์ด๊ฒ์ .dart ํ์ผ์ด ์๋์ ์๋ฏธํฉ๋๋ค). .dsx ํ์ผ์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ด๋ป์ต๋๊น(.dart ํ์ผ์์์ ๊ฐ์ด)?
๋๊ตฌ์ ๋ง์ ํฌ์๋ฅผ ํ์ง๋ง ๋๊ตฌ๋ Dart/Flutter๋ก ์ํํ๊ฒ ๋ณํ๋๋ DSX์ ๊ฐ์ ์ ์ธ์ด์ ์ฌ์ ์ฒ๋ฆฌ(์์ค ๋งต ํฌํจ)๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
ํธ๋์คํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ์์ ํ ํตํฉํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
์ถ์ : ์ด ํฐ์ผ์ ๋๊ธ์ ์ ๋ฐ์ ๋ถ๊ณผํฉ๋๋ค!!!
https://github.com/flutter/flutter/issues/15922
@cbazza ์ด๋๊ฐ์ ํด๋น ์ปดํ์ผ๋ฌ๊ฐ ์๋ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์์ต๋๊น? ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ ์ปค๋ฎค๋ํฐ๋ฅผ ํดํน์ ์ฐธ์ฌํ๊ฒ ํ๋ฉด ์๋ฒฝํ์ง ์๋๋ผ๋ ์ข์ ๊ฒ์ ๋๋ค.
@jonahwilliams , DSX ํธ๋์คํ์ผ๋ฌ ์ฝ๋๋ ๋๋ฌด ์ด๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฆด๋ฆฌ์ค๋์ง ์์์ต๋๋ค.
์์ผ๋ก ์ด 2๊ฐ์ ๋๋ฑํ ํ์ผ(.dsx ๋ฐ .dart)์ ์ฌ์ฉํ์ฌ ์ค๋จ์ , ์คํ
ํ, ์๋ ์์ฑ ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํ
์คํธํ ์ ์์ต๋๋ค.
๋๊ตฌ๊ฐ ์ผ์ข ์ ์์ค ๋งต์ผ๋ก ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ฉด ์ด๋ฅผ ํธ๋์คํ์ผ๋ฌ์ ์ถ๊ฐํ๊ณ ์ฐจ๋จ์ ํด์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ง์์ ์๋ง์ ์คํํ ์ ์๊ฒ ํด ์ค ๊ฒ์ ๋๋ค.
๋๋ Flutter์์ ์ผํ์ง ์์ง๋ง, ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ด์ต์ ์ฃผ๊ธฐ ์ํด ํน์ ๋๊ตฌ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ์ผ์ข ์ ๋ถํฉ๋ฆฌํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ํ ๋๊ตฌ๊ฐ ํตํฉ๋๊ธฐ๋ฅผ ์ํ๋ ์ด๊ธฐ ์์ค ์ฝ๋๋ ์์ ๋ฅผ ๊ณต๊ฐํ๋ ๊ฒ์ ๊ฑฐ๋ถํฉ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค๋ ์ ์์ ์ ๋ ์ ์ฒ๋ฆฌ ํํฌ๋ฅผ ์ ๊ณตํ๋ ์ธ์ด๋ ํดํท์ ๋ํด ์์ง ๋ชปํฉ๋๋ค. ์๋ง๋ ๋จ์ํ์ง ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. ์ธ์ด์ ๊ตฌ๋ฌธ ์ฃผ์์ ๋ง์ ๊ฒฝ์ฐ์ ๊ฐ์ ์ด ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.
์์ค ๋งต(https://pub.dartlang.org/packages/source_maps)์ ์์ฑํ๋ค๋ฉด Dart/Flutter์ ์๊ด์์ด IDE์์ ์ต์ํ์ ๊ธฐ๋ณธ ์ง์์ ์ป๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ๋งํ์ง๋ง, ์ด๊ฒ์ ๋๊ตฌ์ ๊ธฐ๋ฅ๊ณผ ์๋ ๋ฐฉ์์ ์์ง ๋ชปํ๋ ๋ชจ๋ ์ถ์ธก์ ๋๋ค.
@matanlurey , ์์ค ๋งต์ ํตํ ์ ์ฒ๋ฆฌ ์ง์์ ํน์ ํธ๋์คํ์ผ๋ฌ์ ์์กดํ์ง ์๋ ์ผ๋ฐ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ฏธ๋์ ์์ํ ์ ์๋ ๋ชจ๋ ์ธ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ๋๋ค. Chrome ๋ธ๋ผ์ฐ์ /๋๋ฒ๊ฑฐ๋ ์ด๋ฅผ ๋งค์ฐ ํ๋ฅญํ๊ฒ ์ง์ํ๋ฉฐ JS๋ก ๋ณํ๋๋ ๋ชจ๋ ์ธ์ด๋ฅผ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
ํ ์คํธ๋ฅผ ์ํด ์์ค ๋งต์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๊ฐ๋จํ ์ข ๋ฅ์ ๋ณํ๊ธฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ณธ ํ์ผ์ ๋ชจ๋ ์ค ์ฌ์ด์ ๋น ์ค์ด ์๋ Dart/Flutter ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ๋จํ ๋ณํ๊ธฐ๋ฅผ ์์ฑํ์ญ์์ค. (.d2 => .dart, .d2๋ Dart/Flutter ํ์ผ, out .dart ํ์ผ์๋ ์๋ณธ ํ์ผ์ ๋ชจ๋ ์ค ์ฌ์ด์ ๋น ์ค์ด ํฌํจ๋ฉ๋๋ค.)
์, ํ ์คํธ ํ์ผ์ ๋ํ ์์ค ๋งต ์์ฑ ์์ ์ ํ ์ ์์ต๋๋ค.
Flutter๋ ํ์ฌ NativeScript, ReactNative, Android, Web ๋ฐ ์ ์ฌํ XML ๋ ์ด์์์ ์ต์ํ ๊ธฐํ ๊ฐ๋ฐ์๋ฅผ ๋ง์กฑ์ํค๋ ค๋ ์๋๋ฅผ ๊บผ๋ฆฝ๋๋ค. ๋ ์ค์ํ ํ ์ผ์ด ์์ผ๋ ํด์ฐํ๊ณ ์์.
JSX Syntax๋ฅผ ์ง์งํ๋ Amy๊ฐ ๊ณ์ํด์ ํํํ๊ธฐ ์ ์ Flutter๋ก ๋ฉฐ์น ์ ์ค์ ๋ก ์์ ํ๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค. ์ ๋ Xaml ๊ธฐ๋ฐ ์์คํ ์์ ์์ง๋ง ๊ธ์ธ ์ต์ํด์ก์ต๋๋ค. ์ ๋ง ์๋ํด๋ณด์ญ์์ค.
@escamoteur
์ด๋ด, ์์ค์นด๋ชจํฐ. ์ ๊ฐ ํ๋ฌํฐ๋ฅผ ๋ฐฐ์ฐ๋๋ฐ ๋ง์ ์๊ฐ์ ๋ค์ด์ง ์์๋ค๊ณ ์๊ฐํ์๋์?
flutter.io/tutorials/layout/์์ "์์ ฏ ํฌ์ฅ" ์น์
์ ๋ ๋ถ๋ถ์ ์์ต์์์ ์ ๊ณตํ ์ฝ๋๊ฐ ์๋ํ์ง ์์ต๋๋ค.
Flutter ๋ฌธ์ ๋ธ๋ก์์ ๋ฌธ์ ๋ฅผ ์ธ๊ธํ์ง๋ง ์๋ฌด๋ ์ด์ ๋ํด ๊ด์ฌ์ ๊ฐ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค.
@JonathanSum ๊ทํ์ ์๊ฒฌ์ด ์ด ๋ฌธ์ ์ ์ฃผ์ ์ ๊ด๋ จ์ด ์์ต๋๊น?
@zoechi
escamoteur๋ JSX Syntax์ ์ง์ง์๊ฐ ๊ณ์ํด์ ํํํ๊ธฐ ์ ์ Flutter์ ํจ๊ป ๋ฉฐ์น ์ ์ค์ ๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ํฌ๋งํ๋ค๊ณ ๋งํ์ต๋๋ค.
์ด ๋๊ธ์ ์ฐ๋ฆฌ๊ฐ Flutter๋ก ์์
ํ๋ ๋ฐ ์ ๋ง ๋ง์ ๋ ์ ๋ณด๋๊ณ JSX์ ์์ฒญ์ด ์ ๋ง ๋ง์์์ ์ฐ๋ฌ๋์จ ๋๋์์ ๋ณด์ฌ์ค๋๋ค.
Group Dart: "Dart ๊ตฌ๋ฌธ์ ํจ์ฌ ๋ซ๊ณ JSX/DSX๋ ์ข์ง ์์ต๋๋ค"
๊ทธ๋ฃน JSX/DSX: "JSX/DSX ๊ตฌ๋ฌธ์ ํจ์ฌ ๋ ์ข๊ณ Dart๋ ์ข์ง ์์ต๋๋ค."
์ด๊ฑฐ ๋๋ง ๋ณผ ์ ์๋๊ฑฐ ์๋์ผ? ์์ธก์ ์์ ์ ์ ์ฅ์ ๋ํด ์ฐฌ์ฑ๊ณผ ๋ฐ๋ ์ ์ฅ์ ๋ถ๋ช ํ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์์ด๋ฒ๋ฆฐ ๊ฒ์ @cbazza ๊ฐ ๋นํ์ ๋ฐ์์ ๋ฟ๋ง ์๋๋ผ ๊ทธ๊ฒ์ ๋ํด ๋ญ๊ฐ๋ฅผ ํ๋ค๋ ๊ฒ์ ๋๋ค. Flutter๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์น ๊ฐ๋ฐ์/๋ฐ์/๋ฐ์ ๋ค์ดํฐ๋ธ์ Flutter์ ๊ฒฉ์ฐจ๋ฅผ ์ขํ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ด 2์ผํธ... ํ ์คํ ๊ฐ๋ฐ์๋ก์ ์ ๋ ๋ค์ํ ์ธ์ด์ ์ ๊ทผ ๋ฐฉ์์ ๊ฒฝํํ์ต๋๋ค... JSX๋ ์ ๊ฐ ๊ฐ์ฅ ์ข์ํ๋ ์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ฉฐ Darts์ ๋ํ ๋์ฒด ๊ตฌ๋ฌธ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ํ์ฌ ๊ตฌ๋ฌธ์ด ๋์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋ผ JSX ์คํ์ผ์ ์ ํธํ๋ค๋ ๊ฒ์ ๋๋ค.
JSX/DSX ๊ทธ๋ฃน ์ ์ด ์ธ์ฉ๋ฌธ์ ๋์ํ์ง ์์ต๋๋ค.
๋คํธ๋ ์ข์ง ์๋ค
Dart๋ ๋งค์ฐ ํ๋ฅญํ๊ณ ๊ฐ๋ ฅํ ์ธ์ด์ด๋ฉฐ ์๋ฌด๋ ์ธ์ด๋ฅผ ํํํ์ง ์์ต๋๋ค. ๋ ผ์๋ Dart์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ค๋๋ ๋๋ถ๋ถ์ UI ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๊ทธ ์์ ํฉ์ฑ ๋ ์ด์ด์ด๋ฉฐ Flutter๊ฐ ๊ทธ๋ฐ ๊ฒ์ ํตํฉํ ๊ฒ์ ์ ์ํฉ๋๋ค.
์ด๋ฌํ ํ๋ ์์ํฌ์ ์ธ์ด์ ๋๋ถ๋ถ์๋ View์ Controller ๋ก์ง์ ๊ตฌ๋ถํ๋ UI ๋งํฌ์ ์ธ์ด๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ React๋ (์ฌ๊ธฐ์์ ์ ์ํ๋) ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๊ณผ ํจ๊ป ์ ๊ณต๋๋ฉฐ RN์ด ์ฌ์ฉ์ ์ฑ์ฅ ๋ฐ ์ธ๊ธฐ ์ธก๋ฉด์์ ์ง๊ธ ๋ ์๊ฐ๊ณ ์๋ค๋ ๋ฐ ๋์ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๊ฐ ํ๋ฆด ์๋ ์์ง๋ง ์ฃผ๋ก JSX ๋๋ฌธ์ ๋๋ค.
...
Flutter ํ/์ฌ์ฉ์๋ก๋ถํฐ ์ด๋ฐ ์ข ๋ฅ์ ํผ๋๋ฐฑ์ ๋ฐ์์ผ ํ๋ ๊ฒ์ด ์ ๋ง ๋ฏธ์น ์ ์์ธ๊ฐ์?
@birkir ์ ๊ทธ๋ค ๋ชจ๋๋ Flutter์ \o/๊ฐ ์๋ ๋ง์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋ค๋ฅธ ์ธ์ด๋ ํ์ํ์ง ์์ต๋๋ค.
๊ฐ์ ์ธ์ด๋ผ๋ Flutter์์ ๋ณด๊ธฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
@birkir ์ด ์ค๋ ๋๋ Dart์ ๊ตฌ๋ฌธ์ ๋ํ 100%์ ๋๋ค.
๋ ผ์๋ Dart์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์ค๋๋ ๋๋ถ๋ถ์ UI ๊ฐ๋ฐ์๊ฐ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์๋ ๊ทธ ์์ ํฉ์ฑ ๋ ์ด์ด์ด๋ฉฐ Flutter๊ฐ ๊ทธ๋ฐ ๊ฒ์ ํตํฉํ ๊ฒ์ ์ ์ํฉ๋๋ค.
๊ทธ๋์ ๊ทธ๊ฒ์ Dart์ ๊ดํ ๊ฒ์ด ์๋๋๋ค... ๊ทธ๋ฌ๋ Flutter๋ ๋ ์ด์์์ ์ํด Dart ์ธ์ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํด์ผ ํฉ๋๊น? ๋คํธ์ ๊ด๋ จ์ด ์๋ค๊ณ ์ฃผ์ฅํ๋ฉด์ ๋คํธ๊ฐ ์ถฉ๋ถํ์ง ์๋ค๊ณ ๋งํ๋ ๊ฒ ๊ฐ์ต๋๊น?
์ด ์์ ์์ ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Flutter ํ์ ์ด ํผ๋๋ฐฑ(JSX/DSX ์ ๊ทผ ๋ฐฉ์ ์์ฒญ ์)์ ๋ณด์๊ณ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ ๋ฐ๋ฅด๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋ ์ ์ฒ๋ฆฌ๋ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ค์ด ์๋ฃจ์ ์ ๋ง๋๋ ์ปค๋ฎค๋ํฐ์ ๋ฐ๋ํ๋ ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค.
๋๋ ๋ ๋ค๋ฅธ ํฌ๋ก์ค ํ๋ซํผ ์ต์ ์ด ์์ด์ ๊ธฐ์ฉ๋๋ค... Apple์ด ๋ค์์ผ๋ก ๋ญ๊ฐ๋ฅผ ์ ๊ณตํ ๊ฒ์ ๋๊น? ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๊ทธ๋ค์ ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด react/react-native์ ๋ํด ์ข์ํ๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊น์? ์๋ฆฌ๊ฐ ์์ผ๋ฉด IDK.
Flutter ํ์ ์ด ํผ๋๋ฐฑ(JSX/DSX ์ ๊ทผ ๋ฐฉ์ ์์ฒญ ์)์ ๋ณด๊ณ
์ด ๋ฒ๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ํ๊ณ ์ถ์์ง ์์๋ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ด๋ ค ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋ณด๊ธฐ ์ํด ์คํ(์: cbazza's)์ ์ด์ฌํ ๋ณด๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ธ์ ๊ฐ ์ด์ ๊ฐ์ codegen ๋๊ตฌ๋ฅผ ์ํ ๋น๋ ์์คํ ์ ํํฌ๋ฅผ ์ ๊ณตํ ๊ณํ์ด์ง๋ง ๊ฐ๊น์ด ์ฅ๋์ ํ ์ผ์ ์๋๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ๋ฐฐ์ด ๊ฒ์ ์ธ์ด๋ก์์ Dart์ ๋ฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ ๋ฐ ์ฌ์ฉํ๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค. ์ด๊ฒ์ E4X/H4X/JSX/DSX์ ๊ฐ์ ๊ฒ์ Dart ์์ฒด์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค. ์๋๋ฉด ์๋ฌด๋ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ์๋ฌด ๊ฒ๋ ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋๋ ๋ชจ๋ ์ฌ๋์ด ๋ค๋ฅธ ๊ฒ์ ํ์๋ก ํ๋ฏ๋ก codegen ํํฌ ๋ฐ cbazza์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ํจํค์ง๊ฐ ๋ต์ ๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ๋ชจ๋ฅธ๋ค.
@jstansbe - Apple์ ํฌ๋ก์ค ํ๋ซํผ์ด iPhone, IPad ๋ฐ Mac OS๋ฅผ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ํ๋ซํผ์ ๊ฐ๋ก ์ง๋ฌ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ๋ฒฝ์ผ๋ก ๋๋ฌ์ธ์ธ ์ ์ ์์ ํฌํ์ ์ถ๊ฐ ํ ๊ฐ๋ฅ์ฑ์ด ๋ ํฝ๋๋ค. :)
๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ ฏ์ ๋ค์ฌ์ฐ๊ณ ํ์์ ์ง์ ํ ์ ์๋ค๋ฉด jsx์ ๋ ์ ์ฌํ๊ณ xml ๋ฐ html(๊ฑฐ์ ๋ชจ๋ Android ๊ฐ๋ฐ์)์ ๋ํ ๊ฒฝํ์ด ์๋ ์ฌ์ฉ์์๊ฒ ์น์ํ ๊ฒ์ ๋๋ค. Codelab ์์ ์ด ์ฝ๋๋ฅผ ํ์ธํ์ธ์.
return new Container(
margin: const EdgeInsets.symmetric(horizontal: 8.0),
child: new Row(
children: <Widget>[
new Flexible(
child: new TextField(
controller: _textController,
onSubmitted: _handleSubmitted,
decoration: new InputDecoration.collapsed(
hintText: "Send a message"),
),
),
new Container( //new
margin: new EdgeInsets.symmetric(horizontal: 4.0), //new
child: new IconButton( //new
icon: new Icon(Icons.send), //new
onPressed: () => _handleSubmitted(_textController.text)), //new
), //new
],
),
);
์ด ๋คํธ๋ฅผ jsx ์ฝ๋๋ก ํ์ธ
<Container margin="">
<Row>
<Flexible>
<TextField controller=""
onSubmitted=""
decoration="">
<OtherWidget></OtherWidget>
</TextField>
</Flexible>
</Row>
</Container>
์ด ๋ค๋ฅธ ํ์๊ณผ ๋ HTML ๊ฐ์ ๋น๊ต
return Container(margin: const EdgeInsets.symmetric(horizontal: 8.0), child:
Row(children: <Widget>[
Flexible(child:
TextField(controller: _textController,
onSubmitted: _handleSubmit,
decoration: new InputDecoration.collapsed(hintText: "manda un mensaje"),),
),
Container(margin: const EdgeInsets.symmetric(horizontal: 4.0),child:
IconButton(icon: Icon(Icons.send),
onPressed: ()=>_handleSubmit(_textController.text),),)
],
)
);
์ด๊ฒ์ ์กฐ๊ธ ๋ ์ ์ฌํ๋ฉฐ ์ด์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๊ธฐ๋ง ํ๋ฉด html/xml/jsx์ ์ ์ฌํ ๋ค๋ฅธ ์์ ฏ์ ์ ์ ์์ต๋๋ค.
์์(์์ ฏ) ์์ฑ์ ์ ์์ ฏ๋ณด๋ค ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๋ ๋ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ ๋ช ํํ๊ฒ ์ดํดํ๊ณ ํ์ธํ ์ ์์ต๋๋ค.
๋ค๋ฅธ IDE์์ ์ด ํ์์ ๋ํ ์๋ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ง๊ธ์ ์์ผ๋ก ์ด ์์ ์ ์ํํฉ๋๋ค....
์ฌ๊ธฐ์ ์๋ ๋ชจ๋ ๋๊ธ์ ์ฝ๊ณ ๋ด ์น๊ตฌ(๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ์, java/kotlin/objective-c/swift ๋ ์)์ ๊ฐ์ธ์ ์ผ๋ก ํ ๋ก ํ ํ ๋ด ๊ด์ฐฐ:
์ฌ๋๋ค์ ๋ ๊ฐ์ง๋ฅผ ์๊ตฌํฉ๋๋ค.
new
, child
, children
)์ ํผํฉ๋ ๊น์ ์ค์ฒฉ์ ํ์ฌ ์ฝ๋ฉ ๋ฐฉ์์์ ์ฑ๊ฐ์ญ๋๋ค.๋ํ ์๊ฒฌ์ด ๋ค๋ฅธ ๋ ๊ทธ๋ฃน์ด ์ฃผ๋ก ์์ต๋๋ค.
new
, Dart 2.0์ const
๋ฐ ์ ์๋ virtual "closing tag" comments
๊ธฐ๋ฅ์
๋๋ค.ํ์ฌ๋ก์๋ ์ด๋ ๊ฒ์ด ๋ ๋ซ๋ค๊ณ ์ฝ๊ฒ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปค๋ฎค๋ํฐ๊ฐ ๋จผ์ ์คํ์ ํ๊ณ ๋์ค์ ์ต์ข ๊ฒฐ์ (์๋ฝ ๋๋ ๊ฑฐ๋ถ)์ ๋ด๋ฆฌ๋๋ก ํ์ธ์.
@hooluupog ๊ฐ์ ๋ซ๊ธฐ ํ๊ทธ ์ฃผ์์ ์ด๋ฏธ IntelliJ, AS, VSCode์์ ์ ์ ๋์ ์๋ํฉ๋๋ค.
@Hixie
์ด ๋ฒ๊ทธ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ํ๊ณ ์ถ์์ง ์์๋ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ด๋ ค ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋ณด๊ธฐ ์ํด ์คํ(์: cbazza's)์ ์ด์ฌํ ๋ณด๊ณ ์์ต๋๋ค.
์ฌ๋๋ค์ ๋ด ์คํ์ Flutter์ ์ง๊ธ ๋งค๋๋ฝ๊ฒ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฌ๋๋ค์ด ๊ฐ๋ฅ์ฑ๋ง ๋ณผ ์ ์๋ ์ธ๋ถ/์จ๋ผ์ธ ์คํ์ผ๋ก ๋จ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ธ์ ๊ฐ ์ด์ ๊ฐ์ codegen ๋๊ตฌ๋ฅผ ์ํ ๋น๋ ์์คํ ์ ํํฌ๋ฅผ ์ ๊ณตํ ๊ณํ์ด์ง๋ง ๊ฐ๊น์ด ์ฅ๋์ ํ ์ผ์ ์๋๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ๋ฐฐ์ด ๊ฒ์ ์ธ์ด๋ก์์ Dart์ ๋ฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ ๋ฐ ์ฌ์ฉํ๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค.
์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋น๋ ์์คํ ์ด ๋ณ๊ฒฝ๋ ๋ ์ฝ๊ฐ์ ์์ง์์ ์์ํ ์ ์๋ ์๊ฐ์ ๋ํด ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ๋ ํ ๋ฌ, ๋ถ๊ธฐ, 6๊ฐ์, 1๋ , 2๋ , 10๋ , ํฌ๋ ๋ฑ์ ๋งํ๊ณ ์์ต๋๊น?
์ด๊ฒ์ E4X/H4X/JSX/DSX์ ๊ฐ์ ๊ฒ์ Dart ์์ฒด์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค.
JSX/DSX์๋ ์๋ฏธ ์ฒด๊ณ๊ฐ ์๊ณ ์์ง์ ์ํด ๊ตฌํ๋๊ฑฐ๋ ์ธ์ด์ ํตํฉ๋์ง ์๊ธฐ ๋๋ฌธ์ Dart ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์์ ํ์ธํ๋ ค๋ฉด JSX ์ฌ์์ ๋งจ ์ ๋จ๋ฝ์ ์ฝ์ผ์ญ์์ค. ์ ์ฒ๋ฆฌ๊ธฐ(ํธ๋์คํ์ผ๋ฌ)์์ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. DSX๋ ์น์์ Flutter์ ํจ๊ป ์ฌ์ฉํ์ฌ React-Dart๋ฅผ React.js์ ์ ํํ ๊ฐ์ง๋ง Dart ์ธ์ด๋ก ๋ง๋ค ์ ์์ต๋๋ค.
https://facebook.github.io/jsx/
์๋๋ฉด ์๋ฌด๋ ์ค์ ๋ก ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ์๋ฌด ๊ฒ๋ ํ์ง ์์ ๊ฒ์ ๋๋ค.
์ด๋ป๊ฒ ์ฌ๋๋ค์ด ์ฒ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๊ณ ๋์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋ ํ ํ์๊ฐ ์๋ค๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๊น? ์ด๊ฒ์ '์ฌํ ๊ธ์ง'... '๋จ์ด์ ์ํ ์ฌ์ฉ'์ ๋ํด SNL์์ Melissa McCarthy์ Sean Spicer ์ฌ์นญ์ ๋๋ฌด ๋ง์ด ์๊ฐ๋๊ฒ ํฉ๋๋ค. :)
https://www.youtube.com/watch?v=1Dvo6EHEJQE&t=48s
๋๋ ๋ชจ๋ ์ฌ๋์ด ๋ค๋ฅธ ๊ฒ์ ํ์๋ก ํ๋ฏ๋ก codegen ํํฌ ๋ฐ cbazza์ ๊ฐ์ ์ฌ์ฉ์ ์ ์ ํจํค์ง๊ฐ ๋ต์ ๋๋ค. ์ฐ๋ฆฌ๋ ์์ง ๋ชจ๋ฅธ๋ค.
์คํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ค๋ฉด ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ด ์ ์คํ ํ์ํฉ๋๋ค. ๊ทธ๊ฒ ์์ด๋ ์๋ฌด๊ฒ๋ ๋ฐ์ ํ์ง ์์ผ๋ฉฐ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์ฌ๋๋ค์ด ๋ด ์คํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ์ฌ๋๋ค์ด ์์ ํ ์ฐ๋ง๋์ง ์์ ๊ฒฝ์ฐ์๋ ๊ธฐ๊บผ์ด ์๋ํ๋ ค๋ ๊ฒ์ ๊ณผ์ํ๊ฐํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋๊ตฐ๊ฐ๊ฐ flutter run
๋ฅผ ๋ํํ์ฌ ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ๋จผ์ ์ํํ ๋ค์ flutter run
๋ฅผ ํธ์ถํ๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋น์ทํ ์์
์ ์ํํ๊ธฐ ์ํด ํซ ๋ฆฌ๋ก๋๋ฅผ ๋ํํ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค(๋ถ์๊ธฐ๋ฅผ ๋จผ์ ์คํํ ๋ค์ ํต๊ณผํ๋ ๊ฒฝ์ฐ์๋ง ํซ ๋ฆฌ๋ก๋ ์ ํธ๋ฅผ flutter
์คํฌ๋ฆฝํธ๋ก ๋ณด๋
๋๋ค).
๋น๋ ์์คํ ์ด ๋ณ๊ฒฝ๋ ๋ ์ฝ๊ฐ์ ์์ง์์ด ์์๋๋ ์์ ์ ๋ํด ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ค์ ๋ก๋ ์๋์ง๋ง(์: ๊ทธ๋ฌํ ์ง์ ์ ํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์๋ ์ด์ ๋ https://en.wikipedia.org/wiki/Forward-looking_statement ์ฐธ์กฐ), ์๋ง๋ ์์ผ๋ก ๋ช ์ฃผ ๋์์ ์๋ ๊ฒ์ ๋๋ค.
Dart ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค
๊ทธ๊ฒ์ ์ ๋ง๋ก ๊ฐ๋ฅํฉ๋๋ค. ์ ๋ ์ด๋ฌํ ์คํ์ ๊ธฐ๋ฐ์ผ๋ก "์๋ฌด๊ฒ๋ ํ์ง ์์"์์ "์ธ์ด ๊ตฌ๋ฌธ์ ๊ธ์ง์ ์ธ ์ ๊ธฐ๋ฅ ์ถ๊ฐ" ๋ฐ ๊ทธ ์ฌ์ด์ ๋ชจ๋ ๊ฒ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ง์ ๊ฒฐ๋ก ์ ๋๋ฌํ ์ ์๋ค๊ณ ๋งํ๊ณ ์์ต๋๋ค. ์์ ์, ์ฐ๋ฆฌ๋ ์์ง ์ด๋ค ๊ฒฐ์ ๋ ๋ด๋ฆฌ์ง ์์์ผ๋ฉฐ ์ด๋ฌํ ๋ชจ๋ ํ ๋ก ๊ณผ ์คํ์ ๊ธฐ๋ฐ์ผ๋ก ํด์ผ ํ ์ผ์ ๋ฐฐ์ฐ๋ ๋ฐ ๋งค์ฐ ์ด๋ ค ์์ต๋๋ค.
๋ฐฑ๋ก๊ทธ์ JSX๋ฅผ ์ถ๊ฐํ๊ณ ๋ฐฑ๋ง ๊ฐ ์ด์์ ๋ค๋ฅธ ๊ธด๊ธ ์๊ตฌ ์ฌํญ๊ณผ ํจ๊ป ๊ฒํฌ์ฌ ์คํ์ผ๋ก ๊ฒฝ์ํ๊ฒ ํ์๊ฒ ์ต๋๊น?
React๋ ์น์ฉ์ผ๋ก ์์ฑ๋์์ผ๋ฏ๋ก HTML ์์ฑ์ ์ํ ๊ฐ๋จํ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. JSX๋ UI ์์ฑ์ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ์ธ๊ธฐ๋ฅผ ๋์ง ๋ชปํ์ง๋ง HTML์ ์์ฑํ๊ธฐ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
Flutter์๋ ๊ทธ๋ฐ ์ ์ฝ์ด ์์ผ๋ฏ๋ก ์๋ชป๋ ์ด์ ๋ก ํ๋ฒํ๊ณ ์ฅํฉํ ์๋ฃจ์ ์ผ๋ก ์์ฃผํด์๋ ์ ๋ฉ๋๋ค.
์ฅํฉํจ์ ์ค์ด๊ณ ์ถ๋ค๋ฉด Anko(https://github.com/Kotlin/anko/wiki/Anko-Layouts)์์ ์๊ฐ์ ์ป๊ณ ์ถ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ ์ง์ญ ๋ณ์๋ฅผ ์ด๋์์๋ ์ ์ํ๊ณ ์ผ๋ฐ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ชฉ๋ก์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค. ๋ํ ๊ฐ ์ค์ฒฉ ์์ค์ด ์ด์จ๋ ์ด๋ฏธ ๋๋ค ํจ์์ด๊ธฐ ๋๋ฌธ์ LayoutBuilder๋ ๋ณด๊ธฐ์ ๋ ์ฌ์์ง๋๋ค(์ถ๊ฐ ๋น๋ ๋๋ค๋ฅผ ์ ๋ฌํ ํ์๊ฐ ์์). ์ด์จ๋ ์ด๊ฒ์ ์๊ฐ์ ์ํ ๊ฒ์ด๋ฉฐ Flutter๊ฐ 1:1๋ก ๋ณต์ฌํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
React๋ ์น์ฉ์ผ๋ก ์์ฑ๋์์ผ๋ฏ๋ก HTML ์์ฑ์ ์ํ ๊ฐ๋จํ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. JSX๋ UI ์์ฑ์ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ์ธ๊ธฐ๋ฅผ ๋์ง ๋ชปํ์ง๋ง HTML์ ์์ฑํ๊ธฐ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
React Native๋ ์น ๊ฐ๋ฐ์ด ์๋๋ฉฐ HTML์ ์ฌ์ฉํฉ๋๋ค. ์๋ จ๋ React ๊ฐ๋ฐ์์๊ฒ ๋ฌผ์ด๋ณด๋ฉด(๋๋ ์ด ์ค๋ ๋์ ๋ค๋ฅธ JSX ์ค๋ ๋๋ฅผ ์์ ํ ์ฝ์ด๋ณด์ธ์) ๋ง์ React ๊ฐ๋ฐ์๊ฐ JSX๋ฅผ UI๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์์ ์ ์ง์ญ ๋ณ์๋ฅผ ์ด๋์์๋ ์ ์ํ๊ณ ์ผ๋ฐ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ชฉ๋ก์ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ฅ์ ๋น์ ์ด JSX๋ฅผ ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ๋ณด์ฌ์ค๋๋ค. JSX(DSX์์์ ๊ฐ์ด)๋ ํธ์คํ ์ธ์ด(Javascript/Dart)์ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์ฑ(for-loop ๋ฑ)์ ์ฌ์ฉํฉ๋๋ค.
์ด ํฐ์ผ์ JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์๋ง ๊ด์ฌ์ด ์์ต๋๋ค. ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์(์: Anko)์ ๊ฒฝ์ฐ ํ ๋ก ์ ์ํด ๊ณ ์ ํ ํฐ์ผ์ ๋ง๋์ญ์์ค.
React Native๋ ์น ๊ฐ๋ฐ์ด ์๋๋ฉฐ HTML์ ์ฌ์ฉํฉ๋๋ค. ์๋ จ๋ React ๊ฐ๋ฐ์์๊ฒ ๋ฌผ์ด๋ณด๋ฉด(๋๋ ์ด ์ค๋ ๋์ ๋ค๋ฅธ JSX ์ค๋ ๋๋ฅผ ์์ ํ ์ฝ์ด๋ณด์ธ์) ๋ง์ React ๊ฐ๋ฐ์๊ฐ JSX๋ฅผ UI๋ฅผ ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
React๋ React Native๋ณด๋ค ์ค๋ ์ ์ ๋์์ต๋๋ค. JSX์ ์๋ ๋์์ธ์ ๊ธฐ๋ณธ UI๊ฐ ์๋ Rendering HTML์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. JSX๊ฐ ๋ฌด์์ ๋ ์ํ๋์ง์ ๋ํ ํ๋์ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ๋ณด์ฌ์ค ์ ์๋ ์ฌ๋์ ์๋ฌด๋ ์์์ต๋๋ค. ๋น๊ตํจ์ผ๋ก์จ
new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Column(
child: ...,
),
)
์๊ฒ
<Scaffold
appBar={<AppBar title={<Text>{widget.title}</Text>} />}
>
<Column>
...
</Column>
</Scaffold>
์ต์ ๋น๊ต๋ฅผ ์ํํ์ง ์์์ผ๋ฉฐ ๋จ์ํ ํ ์ค์ ๋ ๋ง์ ํญ๋ชฉ์ ์ ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ค์๊ณผ ๋น๊ตํด์ผ ํฉ๋๋ค.
Scaffold(
appBar: AppBar(title: Text(widget.title)),
body: Column(
child: ...,
),
)
๋ชจ๋ ๋ชป์๊ธด {<{<>} />}
๋ฐ ๋ซ๋ </...>
ํ๊ทธ๊ฐ ์ด๋ป๊ฒ ์ฌ๋ผ์ก๋์ง ํ์ธํ์ญ์์ค.
์ด ๋ฌธ์ฅ์ ๋น์ ์ด JSX๋ฅผ ๋ชจ๋ฅธ๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ๋ณด์ฌ์ค๋๋ค. JSX(DSX์์์ ๊ฐ์ด)๋ ํธ์คํ ์ธ์ด(Javascript/Dart)์ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์ฑ(for-loop ๋ฑ)์ ์ฌ์ฉํฉ๋๋ค.
์๋์, JSX ๋ด์์ if ๋ฌธ์ด๋ for ๋ฃจํ(๋๋ switch ๋๋ ๊ธฐํ ๋ฌธ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
function render(data) {
return (
<div>
// This is impossible
let total = 0;
for (let item of data.list) {
total += item.value;
<div>{ total }</div>
<div>{ item.name }</div>
}
</div>
)
}
ํํ์๋ง ํ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์( c ? x : y
, ์ด๋ else if
๋ฅผ ๋งค์ฐ ๋ณด๊ธฐ ํํ๊ฒ ๋ง๋ญ๋๋ค) ๋ฐ Array.map
๋ฑ(๋ํ ๋งค์ฐ ๋ณด๊ธฐ ํํ ์ ์์)์ ์ฌ์ฉํ๊ฑฐ๋ ์ฝ๋์ ์ผ๋ถ๋ฅผ ๋ค์ ์์น๋ก ์ด๋ํด์ผ ํฉ๋๋ค. ๋ ๋ ํจ์์ ์๋จ ๋๋ ๋ณ๋์ ๋์ฐ๋ฏธ ํจ์๋ก. ๋ฌผ๋ก Flutter๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. Anko๋ ์ด๋ฌํ ์ ํ์ด ์์ผ๋ฉฐ (์ผ๋ถ) UI ์ฝ๋๋ฅผ ๋ณด๋ค ์์ฐ์ค๋ฝ๊ฒ ์์ฑํฉ๋๋ค.
JSX ๋์ ์ ๋ํ ํ ๋ก ์์ ์ด๊ฒ์ด ์ค์ ๋ก ์ต์์ ์๋ฃจ์ ์ธ์ง ๋๋ ๋ ๋์ ์๋ฃจ์ ์ ์ฐพ์ ์ ์๋์ง ๋ฌป๋ ๊ฒ์ด ๋งค์ฐ ํ๋นํ๊ณ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ชป๋ ์์ ์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค.
React๋ React Native๋ณด๋ค ์ค๋ ์ ์ ๋์์ต๋๋ค. JSX์ ์๋ ๋์์ธ์ ๊ธฐ๋ณธ UI๊ฐ ์๋ Rendering HTML์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
JSX์ ์๋ ๋์์ธ์ UI ์์ ์ ์ํํ ๋ ํน๋ณํ ๋ํ๋๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑ/์กฐ์ํ๋ ์น์ํ ๋ฐฉ๋ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์น ๊ฐ๋ฐ, ๊ธฐ๋ณธ ๊ฐ๋ฐ, ๋ชจ๋ UI ๊ฐ๋ฐ ๋ฑ์ ๋ํ๋๋ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ(https://facebook.github.io/jsx/)๋ฅผ ์๊ฐํ์ญ์์ค.
JSX๊ฐ ๋ฌด์์ ๋ ์ํ๋์ง์ ๋ํ ํ๋์ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ์ ๋ณด์ฌ์ค ์ ์๋ ์ฌ๋์ ์๋ฌด๋ ์์์ต๋๋ค.
์์ ์ ํ์ฌ ๋ฐฉ์์ ๋์ฒดํ๋ ค๋ ๊ฒ์ด ์๋๋ผ React ๊ฐ๋ฐ์์๊ฒ ์น์ํ ๋์ฒด ๋ฐฉ์์ ์ถ๊ฐํ๋ ค๋ ๊ฒ์ ๋๋ค.
Anko ์ ์์ Android Kotlin ๊ฐ๋ฐ์์๊ฒ ์ต์ํ ๊ฒ์ด๋ฏ๋ก ๋ณ๋์ ํฐ์ผ์์ ํ์ฌ Flutter ๊ณ์ธต ๊ตฌ์กฐ์ ์๋ํ๋ ์ฌ์์ ์ ์ํ์ธ์. ์ฌ์์ ์จ๋ผ์ธ ๋ฒ์ ์ ํ์ธํ๊ฑฐ๋ ์๋ํ๋ฉด ํ์ฌ Flutter ์์ ฏ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์์ฑ/์ํธ ์ด์ฉํ ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์๋์, JSX ๋ด์์ if ๋ฌธ์ด๋ for ๋ฃจํ(๋๋ switch ๋๋ ๊ธฐํ ๋ฌธ)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์์ ์ ๊ถ์ฅํ๋ ๊ฒ์ ์๋์ง๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ต๋ช ํจ์๋ฅผ ๋ง๋ค๊ณ ํธ์ถํฉ๋๋ค.
function render(data) {
return (
<div>
{ ()=>{
// This is *not* impossible
let divs=[];
let total = 0;
for (let item of data.list) {
total += item.value;
divs.push(<div>{ total }</div>);
divs.push(<div>{ item.name }</div>);
}
return divs;
}() }
</div>
)
}
JSX ๋์ ์ ๋ํ ํ ๋ก ์์ ๊ทธ๊ฒ์ด ์ค์ ๋ก ์ต์์ ์๋ฃจ์ ์ธ์ง ๋ฌป๋ ๊ฒ์ด ๋งค์ฐ ํ๋นํ๊ณ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ต์์ ์๋ฃจ์ ์ ์์ต๋๋ค. Flutter ์์ ฏ์ ์ง์ ๋งคํ๋๊ณ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ์ง ์๋ ์น์ํ ๊ฒ์ ์ฌ์ฉํ๋๋ก ์ ํํ๋ ๊ฒ์ด ์ ๋ถ์ ๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ด ์จ๋ผ์ธ ๋ณํ๊ธฐ์์ ๋ค์์ ์๋ํ์ญ์์ค.
https://spark-heroku-dsx.herokuapp.com/index.html
@<Scaffold>
<appBar:AppBar>
<title:Text [widget.title]/>
</appBar:AppBar>
<Column>
{kids}
</Column>
</Scaffold>@
๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ป์:
--------new Scaffold(
-------- appBar: new AppBar(
-------- title: new Text(
-------- widget.title,
-------- ),
-------- ),
-------- child: new Column(
-------- child: kids,
-------- ),
--------);
DSX๋ JSX์ ์ ์ฌํ์ง๋ง Dart & Flutter์ ๊ฒฝ์ฐ ์ ๋งํฌ์ ์ค๋ช ๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
์ด๊ฒ์ ๋ณผ ๋ Android์์ xml ๋ ์ด์์์ ํ๋์๋ฐฑ์ ์ป์ต๋๋ค. ์ด๊ฒ์ ๊ตฌํํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด์ new
๋ฐ const
๋ฅผ ์ฐ์ง ์์๋ ๋๋ฏ๋ก ํจ์ฌ ๋ณด๊ธฐ ์ข์ต๋๋ค.
@charafau ๋น์ ์ด ์ธ๊ธํ๋ "Android์ xml ๋ ์ด์์"์ ์์ /img/๋งํฌ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
์๋, @wkornewald. "JSX๊ฐ UI ์์ฑ์ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์ ์ธ๊ธฐ๋ฅผ ๋์ง ๋ชปํ์ง๋ง HTML์ ์์ฑํ๊ธฐ ์ํ ์ต๊ณ ์ ์๋ฃจ์ ์ด๊ธฐ ๋๋ฌธ์" ์ธ๊ธฐ๊ฐ ์์๋ค๋ฉด, React๋ ์ ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ๋ฐ์คํฌํ ์ฑ์ ๋น๋ํ๊ธฐ ์ํด ์ฌ์ ํ JSX๋ฅผ ์ฌ์ฉํ ๊น์? Github ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ , Walmart ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ, Tesla ์ฑ, Skype๋ RN์์ ๊ตฌ์ถํ์ต๋๋ค.
React์ ๊ฐ๋ ์ ์ปดํฌ๋ํธ์ ๊ดํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ React๋ JSX ํ๊ทธ์ for ๋ฃจํ๋ฅผ ๋ฃ์ง ์์ต๋๋ค. ์์ชฝ์ ๋ก์ง, ์๋์ชฝ์ JSX๋ก ํญ์ ์ด๋ ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ๋ง์ ๊ตฌ์ฑ ์์๋ก ๋ถ๋ฆฌ๋์ด ํฐ ๊ตฌ์ฑ ์์๋ก ํจ๊ป ์ฐ๊ฒฐ๋ฉ๋๋ค.
์ฌ์ค, JSX์ ๋ฐ๋ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ JSX๊ฐ ์ผ์ข ์ HTML, XML ๋๋ ๋ ์ฅํฉํ ์๋ฃจ์ ์ด๋ผ๊ณ ์ถ์ธกํ ์ ์์ ๋ฟ์ ๋๋ค.
@JonathanSum
JSX์ ๋ฐ๋ํ๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ JSX๊ฐ ์ผ์ข ์ HTML์ด๋ผ๊ณ ์ถ์ธกํ ์ ์์ ๋ฟ์ ๋๋ค.
์คํ๋ ค ๊ฐ์ธ์ ์ทจํฅ ์ธ์ JSX/DSX๋ฅผ ์นํธํ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฌผ๋ก ์์์ ์ด๋ฏธ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ JSX๊ฐ ์ผ๋ฐ Dart๋ณด๋ค ๋์ ์ฌ์ค์ ๋ณด์ฌ์ฃผ๋ ์ข์ ์ฌ์ค์ ๋ ผ์ฆ ๋ชฉ๋ก์ด ์์ ๋ ์ฌ๋๋ค์ด JSX๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๊ณ ํด์ JSX์ ๋ฐ๋ํ๋ค๊ณ ์์ํ์ง ๋ง์ญ์์ค.
์คํ๋ ค ๊ฐ์ธ์ ์ทจํฅ ์ธ์ JSX/DSX๋ฅผ ์นํธํ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ค์ ๋ก๋ ์ด์ ์ ๋ง์ ๊ฒ์ด ์ ๊ณต๋์ง ์์์ผ๋ฉฐ ๋ ์ค๋ ๋๋ฅผ ์์ ํ ์ฝ์ผ์ญ์์ค. ๋๋ ์ ์ ์ด 2๊ฐ์ง๋ฅผ ์ธ๊ธํ๋ค:
(1) ๋ ์ด์ '์๋' ๋ฐ '์๋' ๋ฌผ๊ฑด ์์
(2) ์ 3์ ๋๊ตฌ๊ฐ ์กฐ์ํ๊ธฐ ์ฝ์ต๋๋ค(๋ถ์, ๋ถ์ ๋ฐ ์ฌ์์ฑ).
(2)๋ฅผ ์ฌ์ฉํ๋ฉด ๋งํฌ์ ์ ํฅ์์์ผ Dart๋ง์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ ์ผ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DSX์ ์คํ๋ ๋ ์ฐ์ฐ์ ๋๋ ๋ ์์ ์งํฉ์์ ๋ง์ ํจ์ ๋งค๊ฐ๋ณ์ ์์ฑ.
๋ค๋ฅธ ๋ถ๋ค์ด ์ข์ ์ ์ ๋ง์ด ์๋ ค์ฃผ์ จ์ง๋ง ๊ตณ์ด ๋ฐ์ง๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค ;)
(1) ์ธ๊ธํ ๋ฐ์ ๊ฐ์ด ์ด๋ฌํ ์ฌํญ์ Dart์์๋ ๋ณ๊ฒฝ/๊ฐ์ ๋ ์ ์์ผ๋ฉฐ ์ด๋ฏธ ๋
ผ์๊ฐ ์์์ต๋๋ค. ์ด๊ฒ์ Dart 2๊ฐ ์ถ์๋๊ธฐ ์ ์๋ ์ผ์ด๋์ง ์์ ๊ฒ์
๋๋ค.
DSX๊ฐ ๋ชจ๋ ์ข
๋ฅ์ ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ Dart๊ฐ ๋ด ์๊ฐ์๋ ๊ณต์ ํ ์ฃผ์ฅ์ด ์๋๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
(2) ๋๋ ์ด๊ฒ์ด Dart๋ก๋ ํ ์ ์๋ค๊ณ ํ์ ํ๋ฉฐ ๋ฌผ๋ก ์ด๋ฏธ Dart์ฉ ํ์๊ฐ ์์ต๋๋ค.
๋ค๋ฅธ ๋ถ๋ค์ด ์ข์ ์ ์ ๋ง์ด ์๋ ค์ฃผ์ จ์ง๋ง ๊ตณ์ด ๋ฐ์ง๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค ;)
๋๋ฅผ ์ํด ๊ทธ๊ฒ๋ค์ ํํค์น ํ์๋ ์์ง๋ง, ์ด๊ฒ์ ์์ฃผ ๋ฑ์ฅํ๋ฉฐ ๋น์ ์ด ์ค์ ๋ก ์ ํจํ ์ฃผ์ฅ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ํ์ ์ํฌ ์ ์์ ๊ฒ์
๋๋ค.
๋๋ ํ ๋ก ์ ๋ฐ๋๊ณ ์ข์ ์ฌ์ค ๊ทผ๊ฑฐ๊ฐ ๊ธฐ์ต๋์ง ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค๋ ๋ง์ฐฌ๊ฐ์ง์ผ ์ ์์ต๋๋ค. ์์ฝํ๋ฉด ๋ค์ ์ง๋ฌธ์ ๋ํ ๋งํฌ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด ๊ฐ์ธ์ ์ทจํฅ์ ํ๋นํ ๋ ผ๊ฑฐ๋ก ๋ฐ์๋ค์ผ ์ ์์ง๋ง, ์ฌ์ค์ ๊ทผ๊ฑฐํ ์ฃผ์ฅ๋ ๋ง๋ค๋ฉด ์ง์ ํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ ๊ฒ์ด ํ๋นํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋น์ ์ ๊ณ์ '์ ํจํ ๋ ผ์ฆ'์ ์๊ตฌํ๊ณ ๊ทธ๋ค์ด ์ฃผ์ด์ก์ ๋ '๋ฏธ๋์ Dart๋ ์ด๊ฒ์ ๊ฐ์ง ๊ฒ์ ๋๋ค' ๋๋ '์ด๊ฒ์ ์ ํจํ ๋ ผ๊ฑฐ๊ฐ ์๋๋๋ค'๋ผ๊ณ ๋ฌด์ํฉ๋๋ค.
์ฌ์ค์ ํ์ฌ Dart/Flutter๋ ์์ ฏ์ ๋น๋ํ ๋ ๋ชจ๋ ๊ณณ์์ ์๋๋ฌ์ด ์์/์์์ ๊ฐ๊ณ ์์ง๋ง XML/DSX๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ํ์ฌ๋ก์๋ DSX๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ด๋ฆฐ์ด/์ด๋ฆฐ์ด ์์์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋งค์ฐ ํ๋นํ ์ฃผ์ฅ์ ๋๋ค. ๊ทธ๊ฒ์ ์ ๋นํ ์ฃผ์ฅ์ผ๋ก ๋ฐ์๋ค์ผ ์ ์์ต๋๊น? (๋น์ ์ด Dart๊ฐ ๋ฏธ๋์ ๊ทธ๊ฒ์ ๊ฐ์ง ๊ฒ์ด๋ผ๊ณ ๋งํ๋ค๊ณ ํด์ ๊ทธ ์ฃผ์ฅ์ด ๋ฌดํจ๊ฐ ๋์ง๋ ์์ต๋๋ค).
๋ํ XML์ ํ์ฑํ๋ ๊ฒ์ด ์ ์ฒด Dart ์ธ์ด๋ฅผ ํ์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จ ํ๊ณ ๋ชจ๋ ์ธ์ด์๋ XML ํ์๊ฐ ์๋ ๋ฐ๋ฉด Dart๋ง์ด ์์ ํ๊ณ ์์ ํ Dart ์ธ์ด ํ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค์ ๋๋ค. ์ด๊ฒ๋ ์ ํจํ ์ฃผ์ฅ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๊น?
์ ํจํ ์ฃผ์ฅ์ด ๋ง์ด ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ๋น์ ์๊ฒ ์ ํจํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ ๊ฐ ๊ทธ๊ฒ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ ์ค๋จํ์ต๋๋ค. ์ฌ๋๋ค์ด ๋งํ ๋ด์ฉ์ ๊ด์ฌ์ด ์๋ค๋ฉด JSX์์ 2๊ฐ์ ์ค๋ ๋๋ฅผ ์์ ํ ์ฝ์ผ์ญ์์ค. ๋๋ ๋น์ ์ด DSX๋ฅผ ์ฌ์ฉํ๋๋ก ์ค๋ํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ๋น์ ์ ํ๋ฒํ Dart์ ๋ง์กฑํฉ๋๋ค. ๋๋ ์๋๋ค.
์ ํ์ DSX ๊ตฌ๋ฌธ์ ๋ํ ์ธ์:
1) React(์น ๋ฐ ๋ค์ดํฐ๋ธ)์์ ์ค๋ ๋ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ์จ๋ณด๋ฉ ๋ฐ ์ ์น
2) React Native ๊ตฌ์ฑ ์์๋ฅผ Flutter ์์ ฏ์ผ๋ก ์ด์ํ๋ ๋ ๋์ ๊ฒฝํ
3) ์์ ฏ์์ ์์/์์ ์์ฑ์ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
4) ์ฝ๋ ๊ฐ๋
์ฑ(์๊ฒฌ์ ์ฃผ์ฅ)
5) ๋คํธ ๋ฆฐํ
๊ณผ ๋ณ๋๋ก ๋ก์ง ๋ฆฐํ
๋ณด๊ธฐ
6) UI ๊ตฌ์ถ ๋๊ตฌ์ ์ธ๊ณ๋ฅผ ์ฝ๋๋ค.
7) ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ํ ์ํ๊ณ๋ฅผ ์ฝ๋๋ค.
DSX +1
DSX +1
์ฐฌ๋ฐ ์๋ก ์ ๋ง์ด ์ฐ๊ณ ์ถ์์ง๋ง ์ด ๋ชจ๋ ๋๊ธ์ ์ฝ์ผ๋ฉด์ ๋ชจ๋ ๊ฒ์ ๊ณ์ํด์ ๋ฐ๋ณตํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ญ๋๋ค.
๋๋ฌด ์์งํ๊ณ ๋ฌด์งํ์ง ๋ง์ญ์์ค. ์๋ฌด๋ DSX๋ฅผ ์ฌ์ฉํ์ฌ UI๋ฅผ ์์ฑํ๋๋ก ๊ฐ์๋นํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋งํฉ๋๋ค. ์ด๋ ๋จ์ํ ์ต์
(๋ ๋์ ๋์)์ผ ๋ฟ์
๋๋ค.
101203103 ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก JS๋ฅผ ์์ฑํ ์ ์๋ ์ด์ ๊ฐ ์์ต๋๋ค.
์, DSX๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ด๋ฅผ ์ผ๋ฐ Dart ํจ์ ํธ์ถ๋ก ๋ณํํ๋ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๋ ์ต์ ์ด ํญ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ถ๊ฐ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
์ง์ง ์ง๋ฌธ์ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ด ์ปดํ์ผ๋ฌ์ ์ปจํ ์คํธ ๋ด์์ ์ ์ฉ๋๋์ง ์ฌ๋ถ์ ๋๋ค.
์ ๊ฒ ๋ฌป๋๋ค๋ฉด DSX๋ ์ด์์ ์ผ๋ก๋ ์ผ์ข ์ ํ๋ฌ๊ทธ์ธ์ ํตํด์๋ง ์ตํธ์ธ๋์ด์ผ ํฉ๋๋ค. Flutter ์ฌ์ฉ์๋ฟ๋ง ์๋๋ผ Dart์ ์๋ฒ ์ธก ๋ฐ ์น ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํด์ผ ํ๋ฏ๋ก ์ธ์ด โโ์์ฒด์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Dart๋ก ์์ฑ๋ ๋๋ถ๋ถ์ ์ฝ๋์๋ XML ๊ตฌ๋ฌธ์ด ์๊ฒฉ์ผ๋ก ํ์ํ์ง๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ฌ๋์๊ฒ XML ๊ตฌ๋ฌธ์ ์ ์ฉํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒฐ์ ์ ๋๋ค.
TLDR; DSX๋ฅผ ๊ทธ๋ ๊ฒ ๋์๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๊ณ Dart์ ์ง์ ๊ฐ์ ธ์ค์ธ์. ์ธํฐ๋ท์ ๋น์ ์ ์ฌ๋ํ ๊ฒ์ด๊ณ , ์์ฒ ๊ฐ์ Github ๋ณ์ ์ป๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ๋ง์น React์ฒ๋ผ ๋๊ปด์ง ๊ฒ์ ๋๋ค. ์์.
PS ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ํ๊ธฐ ์ํด ๊ฒฝ์ฃผ ํ ๊ฒ์ ๋๋ค
์, DSX๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ด๋ฅผ ์ผ๋ฐ Dart ํจ์ ํธ์ถ๋ก ๋ณํํ๋ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๋ ์ต์ ์ด ํญ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ถ๊ฐ ์์ ์ ์ํํ ํ์๊ฐ ์์ต๋๋ค.
ํ์ฌ ๋คํธ ์ธ์ด์์๋ ํดํน ์์ด ์ด๊ฒ์ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค(๊ฒฝํฉ ์กฐ๊ฑด, ์ฌ๊ท ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๊ธฐํ ์ฌํญ์ ์๊ฐํด ๋ณด์ธ์). ์ด๊ฒ์ ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํ๋ ์์ค, ํซ ๋ฆฌ๋ก๋ฉ, ์ ์ ๋ถ์ ๋ฑ์ด ํตํฉ๋์ด์ผ ํฉ๋๋ค.
์ ๊ฒ ๋ฌป๋๋ค๋ฉด DSX๋ ์ด์์ ์ผ๋ก๋ ์ผ์ข ์ ํ๋ฌ๊ทธ์ธ์ ํตํด์๋ง ์ตํธ์ธ๋์ด์ผ ํฉ๋๋ค. Flutter ์ฌ์ฉ์๋ฟ๋ง ์๋๋ผ Dart์ ์๋ฒ ์ธก ๋ฐ ์น ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํด์ผ ํ๋ฏ๋ก ์ธ์ด โโ์์ฒด์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ๋ถํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Dart๋ก ์์ฑ๋ ๋๋ถ๋ถ์ ์ฝ๋์๋ XML ๊ตฌ๋ฌธ์ด ์๊ฒฉ์ผ๋ก ํ์ํ์ง๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ฌ๋์๊ฒ XML ๊ตฌ๋ฌธ์ ์ ์ฉํ๋ ๊ฒ์ ์๋ชป๋ ๊ฒฐ์ ์ ๋๋ค.
์ค๋ ๋๋ฅผ ์ฝ๋๋ค๋ฉด ๊ทธ๊ฒ์ ์ฒซ๋ ๋ถํฐ ์์ด๋์ด์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ง transpiler๋ฅผ ๋ง๋ค๊ธฐ ์ํด flutter/dart์ ์ง์์ ์ํฉ๋๋ค.
TLDR; DSX๋ฅผ ๊ทธ๋ ๊ฒ ๋์๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๊ณ ์ง์ Dart์ ๊ฐ์ ธ์ค์ธ์. ์ธํฐ๋ท์ ๋น์ ์ ์ฌ๋ํ ๊ฒ์ด๊ณ , ์์ฒ ๊ฐ์ Github ๋ณ์ ์ป๊ฒ ๋ ๊ฒ์ด๋ฉฐ, ๋ง์น React์ฒ๋ผ ๋๊ปด์ง ๊ฒ์ ๋๋ค. ์์.
์ค๋ ๋๋ฅผ ์ฝ์ผ์ญ์์ค. ์ด๊ฒ์ @cbazza ์ ์ํด ์ด๋ฏธ ์ํ๋์์ต๋๋ค(๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ด ์๋ฆฌ์ง ์์)
https://github.com/flutter/flutter/issues/11609#issuecomment -388484681
PS ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ํ๊ธฐ ์ํด ๊ฒฝ์ฃผ ํ ๊ฒ์ ๋๋ค
์์ฒญ๋! ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ด๋ก ๋ง์ผ๋ก๋ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
SGTM. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ ๋ชจ๋๋ ์ผ์ข ์ ์ฌ์ ์ฒ๋ฆฌ ์ง์์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๊ณ ์๊ฐํ์ญ์์ค.
์์ฑ์๋ฅผ ํตํด ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ๋ณด๋ค ๋น๋ ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค.
<strong i="6">@override</strong>
Widget build(BuildContext context) {
return container()
.height(56.0)
.padding(8.0)
.decoration(BoxDecoration(color: Colors.blue[500]))
.child(text("Hello world!")
.style(...)
.build());
}
https://fblitho.com/ ์์์ ๊ฐ์ด
Text.create(context)
.text("Hello World")
.textSizeDip(50)
.build();
DSX +1
๋๋ JSX์ ๋ํ ์ฃผ์ฅ์ ์ดํดํ์ง๋ง XML์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๋ฐฉํดํ๋ ์๊ฐ์ ์ซ์ดํ๋ ๋ง์ ์ฌ๋๋ค(์์ฒด ํฌํจ)์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ์๋ชป๋ ๋๋์ ๋๋ค(๊ทธ๋ฌ๋ ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ฐ์ ๋๋์ ๊ฐ์ง ์๋๋ค๋ ๊ฒ์ ์์ ํ ์ดํดํฉ๋๋ค).
์ผ๋จ ๊ตฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์ฌ์ ์๋ฐฉ ์์น์ ์ ์ํฉ๋๋ค. Flutter ์ฑ์ด ๋น๋๋๋ ๋ฐฉ์์ ํฌ๊ฒ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ์ผ๋ถ ์ต์ Dart 2 ๊ตฌ๋ฌธ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@wstrange
๋๋ ๋น์ ์ ์ดํดํฉ๋๋ค. ๋๋ JSX์ ๋ฐ๋ํ๊ณ js๋ฅผ xml/html๊ณผ ํผํฉํ์ต๋๋ค.... ๊ทธ๋ฐ ๋ค์ ์๋ํ์ต๋๋ค. react์ ํจ๊ป ๋ช ๋ฌ์ ๋ณด๋ธ ํ, ์ ๋ JSX์ ์ฌ๋์ ๋น ์ก์ต๋๋ค. ๋ ๊ฐ์ง ํฌ๋ฌ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@wstrange ,
์ผ๋จ ๊ตฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ ๊ฐ์ํ ๋,
Google์ด Chrome์์ MathML์ ์ ๊ฑฐํ ๊ฒ์ด๋ผ๊ณ ๋๊ฐ ์๊ฐ์ด๋ ํ๊ฒ ์ต๋๊น?
Flutter ์ฑ์ด ๋น๋๋๋ ๋ฐฉ์์ ํฌ๊ฒ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ์ผ๋ถ ์ต์ Dart 2 ๊ตฌ๋ฌธ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Flutter ์ฑ์ด ๋น๋๋๋ ๋ฐฉ์์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํ ์๋๋ฉฐ, ํ์ฌ ๋ฐฉ์์ ๋ณ๊ฒฝํ์ง ์๋ ๋์ฒด ๋ฐฉ์์ผ ๋ฟ์ด๋ฉฐ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋จ์ํ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๋๋ค. ๊ฐ๋จํ ํธ๋์คํ์ผ๋ฌ๋ Flutter ํด๋์ค์ ์ ๋ณด ์์ด ๋งคํ์ ์ํํ๋ฏ๋ก ํ์ฌ์ ๋ฏธ๋์ Flutter๋ ๋ฌผ๋ก ๋ชจ๋ ์ฌ๋์ ์ฝ๋์์ ์ ์๋ํฉ๋๋ค.
@๋ฒ ์๋ ธํ
์, ๋ช ๋ฌ ๋์ ์์ ํ๋ฉด์ React๊ฐ ๊ตฌ์ฑ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ผ๋ง๋ ๋๋ผ์ด์ง ๊นจ๋ซ๊ฒ ๋ ๋๊น์ง React๋ฅผ ๋ชจ๋ฆ ๋๋ค.
@cbazza Flutter์ ๋ํด ์ ํํ ๊ฐ์ ๋ง์ ํ ์ ์์ต๋๋ค. ๋ช ์ฃผ ๋์ ์ฌ์ฉํ๋ฉด JSX๋ฅผ ๋์น์ง ์์ ๊ฒ์ ๋๋ค.
๋ฐ์์ด ๋ชจ๋ ๊ฒ์ ๋งํด์ค๋๋ค.
์ง๊ธ๊ณผ ๊ฐ์ด +1
๋ -1
$์ ๊ฑฐ์ ๋ ๋ฐฐ์
๋๋ค.
@์์ค์นด๋ชจํฐ ,
์, ๋งค์ฐ ๊ณต์ ํ ์ง์ ์ด์ง๋ง ์ ๋ Flutter์ ๋ง์ ์๊ฐ์ ๋ณด๋๊ณ DSX๊ฐ ๊ทธ๊ฒ์ ์ถ๊ฐํ ๊ฐ์น๋ฅผ ํ์คํ ์ ์ ์์ต๋๋ค. @leedstyh ๊ฐ ์์์ฐจ๋ ธ๋ฏ์ด DSX ํฌ์ ๊ฑฐ์ 2:1๋ก ๋ ์ด์ค๋ฅผ ์ด๋๊ณ ์๋๋ฐ, ์ด๋ ์ด ํฌ๋ผ์ ์ฌ๋๋ค์ด Flutter ์ฌ์ฉ์๋ผ๋ ์ ์ ๊ณ ๋ คํ๋ฉด ๋งค์ฐ ๋๋ผ์ด ์ผ์
๋๋ค.
์ง๋ฌธ์ด ์์ต๋๋ค:
DSX ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ๋ ๋ดํฌ๋ ์์์ด Widget ์ ํ์ด๋ผ๊ณ ์์์ ์ผ๋ก ๊ฐ์ ํฉ๋๋ค. ์ค์ฒฉ๋ ์์์ด Widget์ ํน์ ํ์ ์ ํ์ด ๋๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๋ช ์์ ์ผ๋ก ์ง์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
์๋ฅผ ๋ค์ด, ๋ด ์ฌ์ฉ์ ์ ์ ์์ ฏ์ ์์์ด ์ปจํ
์ด๋ ๋ชฉ๋ก๋ง ํ์ฉํ๋๋ก ํ๋ ค๋ ๊ฒฝ์ฐ ์์์ List<Container>
์ฃผ์์ ๋ฌ ์ ์์ผ๋ฉฐ ์ปจํ
์ด๋์ ๋ค๋ฅธ ๊ฒ์ ์
๋ ฅํ์๋ง์ IDE์์ ์ค๋ฅ๋ฅผ ํ์ํฉ๋๋ค. dsx๋ฅผ ์ฌ์ฉํ ๋ ์ด์ ๊ฐ์ด ์ ํ ์์ ์ ์ ์ฉํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ฑ์ด ์ปดํ์ผ๋ ๋ ์ฝ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ง๋ง ์
๋ ฅํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ์ฌ์ ํ ๋ ๋์ ๊ฒฝํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ์ด๋ v1 ๋ฆด๋ฆฌ์ค ์ดํ์๋ UI๋ฅผ ์ ์ธํ๋ flutter ๋ฐฉ๋ฒ์ ์๋ํ๊ณ ์ต์ํด์ง ์๊ฐ์ ๋ชจ๋ ์ฌ๋์๊ฒ ์ฃผ์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๊ธฐ๋ฅ์ ๋ ์ ๋ณผ ์ ์์ต๋๋ค.
@์ฐ๋จ๊ฒ ,
์์ฃผ ์ข์ ์บ์น!!! ๋๋ ๋น์ ์๊ฒ ๋ด ๊ฐ์ ๋ชจ์๋ฅผ ๋ณผ๋งํฉ๋๋ค. ๋ด ์ด๊ธฐ ํ๋กํ ํ์ ์๋ ์ฒ์๋ถํฐ ๋ด๊ฐ ์๊ณ ์์๊ณ ์ฌ๋๋ค์ด ์ฐพ์์ ์์ผ๋ก ๋์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ช ๊ฐ์ง ๊ตฌ๋ฉ์ด ์์์ต๋๋ค. ๋๋ ์ฌ๋๋ค์ด ๊ธฐ์ ์ ๋ํด ์ธ์ฐ๋ ๋์ ๊ธฐ์ ์ ๋ํด ๋ ผ์ํ๋ ๋ฐ ๊ด์ฌ์ ๊ฐ๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค.
์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ฐฐ์ด ์ ํ์ ๋ค์์คํ์ด์ค์ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ๋ค์์คํ์ด์ค๊ฐ ์ปค์ง๋ฉด์ 'children'์ ์ฝ์นญ์ '*'๋ก ์ค์ ํ ์ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html ์ ์์ 2์์ ์์ ์ด ๊ธฐ๋ณธ '์์ ฏ' ๋์ '์ปจํ ์ด๋'์ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ ๋ค์ ๋์์ฒ๋ผ ๋ณด์ผ ๊ฒ์ ๋๋ค.
<actions:children:Container>
<IconButton
icon={new Icon(Icons.search)}
tooltip='Search'
onPress={null}
/>
</actions:children:Container>
<actions:*:Container>
<IconButton
icon={new Icon(Icons.search)}
tooltip='Search'
onPress={null}
/>
</actions:*:Container>
์๋ ํ์ธ์ @cbazza , ์๋ตํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ทํ์ ์๋ฃจ์ ์ด ๊ถ๊ธํฉ๋๋ค. w3shool-XML ๋ค์์คํ์ด์ค ์ ์ค๋ช ๋ ๋๋ก xml ๋ค์์คํ์ด์ค๋ฅผ ์ค์ฉํ๊ณ ์์ต๋๊น?
๋ค์์คํ์ด์ค๋ ์ฃผ๋ก XML ๋ฌธ์์์ ๋ช ๋ช ์ถฉ๋์ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๊ณ ๋ช ์๋์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ๋๊ตฐ๊ฐ ์์ XML์ ์ฝ์ผ๋ฉด 'actions' ๋ค์์คํ์ด์ค์ 'children' ๋ค์์คํ์ด์ค ์๋์ Container ํ๊ทธ๋ฅผ ์ ์ธํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ์ค์ฒฉ๋ ๋ชจ๋ ์์์ด ์ปจํ ์ด๋์ฌ์ผ ํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ์๋๋๋ค. ์์ ์ค๋ช ์ ์ฝ์ง ์๊ณ ์ ์ ๊ตฌ๋ฌธ์ ์ฒ์ ์ฝ์ ๋ ํผ๋์ค๋ฝ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ ๋์ ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๊น?
DSX๋ XML์ด ์๋๋ผ XML๊ณผ ์ ์ฌํ๋ฏ๋ก Angular ํ ํ๋ฆฟ ์ธ์ด์ ๊ฐ์ XML ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅผ ํ์๊ฐ ์์ต๋๋ค.
React-native์์ ์ฒ์์ผ๋ก JSX์ ๊ฐ์ ๊ตฌํ์ ์ง์ํ๊ณ ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์ข์ํ์ง ์์์ง๋ง OOP๋ฅผ ์ฆ๊ธฐ๊ณ ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋ก ๋ณด๊ธฐ ์์ํ์ต๋๋ค!
React-native์์ ์จ ์ฌ๋๋ค์๊ฒ ์ด ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ ฅํ ์ถ์ฒํฉ๋๋ค! https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer
@clarktank
react-native(JSX), Flutter(OOP) ๋ฐ ํ๋์์ ๋ค๋ฅธ ๊ฒ์ผ๋ก์ ์ฌ์ ์ ํตํด ๊ฒฝํ์ ํ์ฅํ ์ ์์ต๋๊น?
@cbazza ๊ฐ๋ ํ ํ๋ฆฟ ๊ตฌ๋ฌธ์ xml ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅด๊ณ ๊ฐ๋ ๊ตฌ๋ฌธ๊ณผ xml ๋ฌธ์ ๊ฐ์ ์ถฉ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
typescript์์๋ ์ผ๋ฐ ๊ตฌ์ฑ ์์ ๋ฅผ ์ง์ํฉ๋๋ค.
๊ทธ๋์ ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค:
<children<Container>>
<Container/>
</children>
๊ทธ๋ฌ๋ ๋ค์ ์ผ๋ฐ ๊ตฌ์ฑ ์์๋ ์์ฑ ์ ๋ ฅ์ ์ ํ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ๊ตฌ๋ฌธ์ด ์ด ์ฌ์ฉ ์ฌ๋ก์์ ์ฌ๋ฐ๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ๋ Flutter ํ์ด JSX๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ๋ UI๋ฅผ ์ ์ธํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ํด ํน๋ณํ ํ์ฌ API๋ฅผ ๋ง๋ค์๋ค๊ณ ์๊ฐํฉ๋๋ค. JSX ๊ตฌ๋ฌธ์ ํ์ฌ API์ ๋ฐ์ธ๋ฉํ๋ ค๋ ๋ชจ๋ ๋ ธ๋ ฅ์ ์ฌ์ฉํ๊ธฐ์ ๋ถ์์ฐ์ค๋ฝ๊ณ /๋ถํธํด ๋ณด์ด๊ฒ ๋ง๋ญ๋๋ค.
๋ฐ์์ด ๋ชจ๋ ๊ฒ์ ๋งํด์ค๋๋ค.
์ง๊ธ๊ณผ ๊ฐ์ด +1์ -1์ ๊ฑฐ์ ๋ ๋ฐฐ์ ๋๋ค.
์ด๊ฒ์ ์๋ฌด ์๋ฏธ๊ฐ ์์ต๋๋ค.
๋ชจ๋ Flutter ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์๋ ์ฌ๋๋ค์ ์ ์ธํ๊ณ ๋ ์ด๋ฏธ JSX์ ์ต์ํ๊ณ ๋ช ์์ ์ผ๋ก ์ฐพ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์ ๋ํด ๋ ๋ฐฐ๋ก ๋ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฒ์ ์คํ๋ ค _JSX์ ๊ฐ์ ๊ฒฝํ์ ์ํ๋ ์ฌ๋๋ค์ด -1๋ก ํฌํํ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ณด๋ ์ฌ๋๋ค์ ๋ ๋ฐฐ๋ฅผ ์๋ฏธํฉ๋๋ค. (์ํธ +1์ ํฌํํ๋ ์ฌ๋ ์ค ์ผ๋ถ๋ ์ค์ ๋ก ํ๋ฌํฐ๋ฅผ ์๋ํ์ง๋ ์์์ต๋๋ค)
@์ฐ๋จ๊ฒ ,
๊ฐ๋ ํ ํ๋ฆฟ ๊ตฌ๋ฌธ์ xml ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅด๊ณ ๊ฐ๋ ๊ตฌ๋ฌธ๊ณผ xml ๋ฌธ์ ๊ฐ์ ์ถฉ๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
๋ฌผ๋ก JSX๋ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๊ด์ฌ ์๋ XML ๊ธฐ๋ฅ์ด ์๋๋๋ค.
<children<Container>>
<Container/>
</children>
'์์'์ ์์ฒด ํ๊ทธ๋ก ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ React์ ์๋ก์ด Fragment ํ๊ทธ๊ฐ ์๊ฐ๋ฉ๋๋ค. ์ฅํฉํจ๊ณผ ๊ฐ๊ฒฐํจ ์ฌ์ด์ ๊ท ํ์ ํ์คํฉ๋๋ค.
์ ๋ Flutter ํ์ด JSX๋ณด๋ค ๋ซ๋ค๊ณ ์๊ฐํ๋ UI๋ฅผ ์ ์ธํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ํด ํน๋ณํ ํ์ฌ API๋ฅผ ๋ง๋ค์๋ค๊ณ ์๊ฐํฉ๋๋ค. JSX ๊ตฌ๋ฌธ์ ํ์ฌ API์ ๋ฐ์ธ๋ฉํ๋ ค๋ ๋ชจ๋ ๋ ธ๋ ฅ์ ์ฌ์ฉํ๊ธฐ์ ๋ถ์์ฐ์ค๋ฝ๊ณ /๋ถํธํด ๋ณด์ด๊ฒ ๋ง๋ญ๋๋ค.
Flutter๊ฐ ์ฝ๋์์ UI๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์๋ ์๋ก์ด ๊ฒ์ด ์์ต๋๋ค. ์๋ง๋ DSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋น์ ์๊ฒ๋ ๋ถ์์ฐ์ค๋ฝ๊ณ ๋ถํธํ ์ ์์ง๋ง JSX ๊ฐ๋ฐ์์๊ฒ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. JSX/DSX๋ Flutter์ ์๋ฒฝํฉ๋๋ค. ์ฅ๊ฐ์ฒ๋ผ ๋ฑ ๋ง๊ณ ์ฅ๊ฐ์ด ๋ง์์ ๋ค์ง ์์ผ๋ฉด ๋งจ์์ผ๋ก ๊ฐ์ธ์ ;)
@a14n ,
์ด๊ฒ์ ์๋ฌด ์๋ฏธ๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ์ ํ์คํ ์์ต๋๋ค !!! '๋๋', '์๊ฐ', โโ'์ฉ์์', '์ํธ', '์๊ฒฌ'์ผ๋ก ๋ ผ์ํ ์ ์์ง๋ง ์ด๊ฒ์ ๋ฐ์ดํฐ, ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ธ๋ชจ ์์ผ๋ฉด ์์งํด์๋ ์ ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ ๋น์ ์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ธ๋ชจ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@cbazza ์์/์ด๋ฆฐ์ด๋ฅผ ์ํ ์์ ฏ์ ํ์ ์ ํ์ ์ ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์์์ ์ง๋ฌธ์ ๋ตํ๋ ค๊ณ ํ ๋ Dart ์ฝ๋๊ฐ JSX๋ณด๋ค ๋ ๋์ ์์ ์ ์ํํ๊ณ ์๋ค๊ณ ๋๋๋๋ค.
DSX๋ XML์ด ์๋๋ฉฐ XML๊ณผ ์ ์ฌํ๋ฏ๋ก XML ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋ฐ๋ฅผ ํ์๊ฐ ์์ต๋๋ค.
๋ฌผ๋ก JSX๋ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๊ด์ฌ ์๋ XML ๊ธฐ๋ฅ์ด ์๋๋๋ค.
ํ์คํ์ง ์์ง๋ง ์์ ๊ทํ์ ์๊ฒฌ ์ค ์ผ๋ถ๋ฅผ ์ฝ์์ผ๋ฉฐ JSX/XML ๋ ธ๋๋ฅผ ์๋ก ๋ฐ๊ฟ์ ์ธ๊ธํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์จ๋ ๊ฐ์ธ์ ์ผ๋ก ๋ค์์คํ์ด์ค๋ฅผ ์๋ฃจ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ด์์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฅ ๋น๊ต
<actions:children:Container>
</actions:children:Container>
๊ทธ๋ฆฌ๊ณ
actions: <Container>[]
ํต์ฌ๋ก .
@์ฐ๋จ๊ฒ ,
๋ค, ์ด ๊ฒฝ์ฐ์ ํ๊น ๊ตฌ๋ฌธ์ด ๋ ์ฅํฉํฉ๋๋ค. ๊ทธ๋์ ์ ๊ฐ ์ด๋ฆฐ์ด์ฉ ์ถ์ฝํ์ '*'๋ผ๊ณ ์ธ๊ธํ ์ด์ ์ ๋๋ค. ์ด์จ๋ ์ด ๊ฒฝ์ฐ๋ ์์ธ์ด๋ฉฐ ๊ท์น์ด ์๋๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ '์ปจํ ์ด๋'๋ ๊ณ ์ฌํ๊ณ '์์'๋ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํฌ๊ดํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ด์ผ ํฉ๋๋ค.
@a14n ํฌํ๋ ํฌํ์ ๋๋ค.
๋๋ ๋น์ ์ ๊ฐ์ ์ ์กด์คํฉ๋๋ค. ์๋ง๋ ์ฌ์ค์ผ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋ ๋น์จ(1:2)์ด ์๋๋ผ๋ ์ด๋ ์ฌ์ ํ 33%์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์๋ฏธํฉ๋๋ค. 33%๊ฐ ์์ ๋ชซ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๊น?
JSX์ ๊ฐ์ ๊ฒฝํ์ ์ํ๋ ์ฌ๋๋ค
์, ๋ช๋ช ์ฌ๋๋ค์ด ๋ณด๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ _JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ค์ด flutter๋ฅผ ์ ํํ์ง ๋ชปํ๋ ์ด์ ์ค ํ๋์์ ์๋ฏธํฉ๋๋ค.
Flutter๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ฝ์ ๋ฟ๋ง ์๋๋ผ ๋ ๋ง์ ๊ฐ๋ฐ์๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
@jstansbe
์ ๋ ๋
ํ ํ๋ก๊ทธ๋๋จธ์ด๋ฉฐ ๋๋ถ๋ถ์ ๋
ํ ์ฌ๋๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Javascript๋ก ์์ํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ React์ React-Native๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ํ์ต๋๋ค. ์ต๊ทผ์๋ ํนํ ES6 ์ดํ์ Javascript์ OOP ์คํ์ผ์ด ์ถ๊ฐ๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋์ ๋ ๊ฐ์ ์ฌ๋๋ค์ OOP ์คํ์ผ์ ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํ์ง ์์ต๋๋ค. React ๋ค์ดํฐ๋ธ Component
๋ Flutter์ Widgets
์ ๊ฐ์ ํด๋์ค์ด์ง๋ง.
JSX ์ข ๋ฅ๋ ์์ํ OOP ๊ทธ๋ฆผ์ ์จ๊น๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ ์๋์์ ์ผ์ด๋๋ ์ผ์ ์จ๊น๋๋ค. ์ฐธ๊ณ : React๋ ์น ๊ฐ๋ฐ์๋ฅผ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ ์น ๊ฐ๋ฐ์๋ html ๊ตฌ๋ฌธ์ ์ต์ํฉ๋๋ค. ์ด๊ฒ์ด ์น ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ JSX๊ฐ ์ธ๊ธฐ ์๋ ์ด์ ์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์์ OOP๊ฐ ํฐ ํ๋ก์ ํธ์ ๋ ์ ํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ํด๋ฝํฑํฌ ,
์ปดํจํฐ ์ธ์ด์ ๋ํด ๋
ผ์ํ ๋ ๋ค์ ์ฌํญ์ ์ ์ํด์ผ ํฉ๋๋ค.
(1) ๊ตฌ๋ฌธ - ์ธ์ด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฌธ์์ ๋จ์ด
(2) ์๋ฏธ๋ก - ํด๋น ๋ฌธ์ ๋ฐ ๋จ์ด์ ์๋ฏธ
์๋ฅผ ๋ค์ด, ๋ง์ ์ธ์ด์์ ํจ์ ํธ์ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(์ฆ, ๋ค์ ๊ตฌ๋ฌธ์ ๊ฐ์ง).
a = someFunction(param1, param2)
์ด์ ๋ค๋ฅธ ์ธ์ด๊ฐ ํจ์ ํธ์ถ์ ๋ฅ๊ทผ ๋๊ดํธ ๋์ ๋๊ดํธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์ ๋๋ค.
a = someFunction[param1, param2]
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๊ตฌ๋ฌธ์ ๋ค๋ฅด์ง๋ง ์๋ฏธ๋ ๋์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ด ๋ง์ ๋ ๋ค ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ํธ์ถ์ ์ํํ์ง๋ง ๊ตฌ๋ฌธ์ด ๋ค๋ฆ ๋๋ค.
JSX ์ข ๋ฅ๋ ์์ํ OOP ๊ทธ๋ฆผ์ ์จ๊น๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ ์๋์์ ์ผ์ด๋๋ ์ผ์ ์จ๊น๋๋ค.
์ ํ ์ฌ์ค์ด ์๋๋๋ค. JSX/DSX๋ ์ ํํ ๊ฐ์ ๊ฒ์ ๋ํ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ผ ๋ฟ์ ๋๋ค(์๋ฏธ๋ ๋์ผํฉ๋๋ค). JSX์ ๊ฒฝ์ฐ XML ํ๊ทธ๋ React ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํฉ๋๋ค(์์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ํํ ์ ์๋ ๊ฒ์ฒ๋ผ). DSX์ ๊ฒฝ์ฐ XML ํ๊ทธ๋ Flutter ์์ ฏ์ ์์ฑํฉ๋๋ค(Pure Dart์์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ). ๊ตฌ๋ฌธ์ ๋ค๋ฅด์ง๋ง ์ ํํ ๋์ผํ ๊ฒ์ ์์ฑํ๋ฏ๋ก ๋ด๋ถ์ ์ผ๋ก ๋์ผํฉ๋๋ค.
์ฐธ๊ณ : React๋ ์น ๊ฐ๋ฐ์๋ฅผ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ ์น ๊ฐ๋ฐ์๋ html ๊ตฌ๋ฌธ์ ์ต์ํฉ๋๋ค. ์ด๊ฒ์ด ์น ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ JSX๊ฐ ์ธ๊ธฐ ์๋ ์ด์ ์ ๋๋ค.
JSX๋ ์น, ๋ชจ๋ฐ์ผ ๋๋ ๋ชจ๋ UI ๊ฐ๋ฐ์์ ๊ตฌ์ฑ ์์ ํธ๋ฆฌ ๊ณ์ธต์ ๊ด๋ฆฌํ๋ ์ข์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ ์ฝ๋์์ ๋๋กญ๋ค์ด ๊ตฌ์ฑ ์์๊ฐ ์๋ฅผ ๋ค์ด ์น์ฉ์ธ์ง ๋ชจ๋ฐ์ผ์ฉ์ธ์ง ์ ์ ์์ต๋๋ค.
https://facebook.github.io/jsx/
// Using JSX to express UI components.
var dropdown =
<Dropdown>
A dropdown list
<Menu>
<MenuItem>Do Something</MenuItem>
<MenuItem>Do Something Fun!</MenuItem>
<MenuItem>Do Something Else</MenuItem>
</Menu>
</Dropdown>;
render(dropdown);
๊ฐ์ธ์ ์ผ๋ก ์์ OOP๊ฐ ํฐ ํ๋ก์ ํธ์ ๋ ์ ํฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐฉ๋ฒ ๊ฒ์ ๋๋ค? (JSX/DSX ๋๋ Pure Javascript/Dart๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ ์๋์์ ์ ํํ ๋์ผํ ๊ฒ์ ์์ฑํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด).
@cbazza
์ ๋ ๊ฑฐ์ 1๋ ๋์ react-native๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ Flutter/Dart๋ฅผ ์์ํ ๋๊น์ง JSX ์์๊ฐ ์ธ์คํด์คํ๋๋ ๊ฐ์ฒด๋ผ๋ ์ฌ์ค์ ์ ํ ๋ชฐ๋์ต๋๋ค. ๋ด ๊ด์ ์์ ๋ณผ ๋ OOP ๊ทธ๋ฆผ์ ์จ๊น๋๋ค. ๋น๋ก ๋น์ ์ด ๋งํ๋ฏ์ด ์๋ฏธ์ ์ผ๋ก ํ๋ ์๋์์ ๊ฐ์ ์ผ์ ํฉ๋๋ค!
ํฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ JSX๋ ๋ง์ด ์ค์ฒฉ๋ ๊ฐ์ฒด๋งํผ ๋ณด๊ธฐ ํํ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ๋ฌธ๋ฒ์ ์ผ๋ก, ๋๋ ํผ๋์ค๋ฌ์ธ ์ ์๋ ๋ค๋ฅธ ์คํ์ผ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ถ์ต๋๋ค.
@ํด๋ฝํฑํฌ ,
ํฐ ์์ฉ ํ๋ก๊ทธ๋จ์์ JSX๋ ๋ง์ด ์ค์ฒฉ๋ ๊ฐ์ฒด๋งํผ ๋ณด๊ธฐ ํํ ์๋ ์์ต๋๋ค. ๊ทธ๋์ ๋ฌธ๋ฒ์ ์ผ๋ก, ๋๋ ํผ๋์ค๋ฌ์ธ ์ ์๋ ๋ค๋ฅธ ์คํ์ผ์ ๋์ ํ๋ ๊ฒ๋ณด๋ค ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ์ถ์ต๋๋ค.
๋์๊ฒ ์ฝ๋์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋ค๋ฅด๊ฒ ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ ์ค์ ๋ก ์ด์ ์ ๋๋ค.
(ํ ์คํธ์ ๋ฒฝ์ ๋ํด ๋ฏธ๋ฆฌ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.)
Raw Dart ๋๋ JSX/DSX๊ฐ "๋ ๋์"์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ์ ์ธ ์์ค๋ผ๊ณ ์๊ฐํ ๋งํผ ์ค๋ซ๋์ React-Native ๋๋ Flutter๋ฅผ ์ฌ์ฉํ์ง ์์ ์ฌ๋์ผ๋ก์ ์ด ๋ฌธ์ ์ค๋ ๋๋ ์ฝ๊ธฐ์ ๋ค์ ๋งค๋ ฅ์ ์ด์์ต๋๋ค. ๊ทธ๋๋ ๋ด $0.02๋ฅผ ๋ด๋ ค ๋๊ณ ์ถ์ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์์ํ๊ธฐ ์ํด JSX๊ฐ ์ค์ ๋ก ๋ฌด์์ธ์ง ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ด ๊ฐ๋ฐ์์๊ฒ ์ด๋ค ์ด์ ์ด ์๋์ง์ ๋ํด ๋ค์ํ ์ฌ๋๋ค๊ณผ ๋์ํ๊ณ ์์ต๋๋ค. ๋ฌด์๋ณด๋ค๋ JSX๋ ๊ธฐ์กด Javascript ์ฝ๋์ ์ธ๋ผ์ธ๋ ์ ์๋ "๋์ HTML" ํ์์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. React์ ๊ฐ์ JS ๊ธฐ๋ฐ ์น ํ๋ซํผ์ ์์ด์๋ ์ ๋ ์์์ ๋๋ค. ์น ๊ฐ๋ฐ์๊ฐ ์์ฒญ๋๊ฒ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์(๋๋ ์ ์ผํ๊ฒ ์ฝ๊ฐ ๋ ๋์ jQuery ๋ฐฉ์)๊ณผ ์จ๋ฆํ์ง ์๊ณ ๋ DOM๊ณผ ๊นจ๋ํ๊ณ ํจ์จ์ ์ผ๋ก ์ํธ ์์ฉํ ์ ์๋ค๋ ์ ์ ๋๋ค. ๋ํ JSX๋ ๋ณธ์ง์ ์ผ๋ก ๊ธฐ๋ณธ ๋ฐ์ดํฐ์์ ์ฝ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ UI ๊ฐ๋ฐ์ ์ฅ๋ คํ์ฌ ์ ๊ตฌ์ฑ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ด์งํฉ๋๋ค. ๊ทธ๋ฐ ํ๊ฒฝ์์ JSX๋ ์์ฐ์ฑ์ ๋์ผ ์ ์๋ ๋๊ตฌ์ด๋ฉฐ ์ด์ ๋ํด ๋ ผํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด๋น ๋จ๋ฝ์ด React-Native์ ๊ด๋ จ๋๋ ๋ฐฉ์์ ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ ํ๋ซํผ์์๋ ๋ถ๊ตฌํ๊ณ React์ ์ง๊ณ ํ์์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๊ฑฐ์ ๋ชจ๋ ๊ตฌ๋ฌธ๊ณผ ํจ๋ฌ๋ค์์ ์๋ ์น ๊ฐ๋ฐ์ ์ผ๋์ ๋๊ณ ๋ง๋ค์ด์ก์ต๋๋ค. ๊ทธ๊ฒ์ ์๋์ ์ผ๋ก ์ค๊ณ๋ ๊ฒ์ ๋๋ค - RN์ ์ ์ฒด์ ์ธ ํน์ง์ "React๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ซํผ ๊ฐ ๋ชจ๋ฐ์ผ ์ฑ์ ์์ฑ"ํ ์ ์๋ค๋ ๊ฒ์ด๋ฏ๋ก ์ฌ์ฉํ ๋ ์น ๊ฐ๋ฐ๊ณผ ๊ฐ์ ๋๋์ _์ถ์ _ํฉ๋๋ค. RN ์ฑ๋ ๋๋ถ๋ถ Javascript๋ก ์์ฑ๋๋ฏ๋ก JSX๋ฅผ ํฌํจํ๋ ๊ฒ์ ์์ฐ์ค๋ฌ์ด ์ผ์ ๋๋ค. JSX๋ ์น ๊ฐ๋ฐ์ ๋์์ด ๋๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ ์ด์ ๋ก RN ๊ฐ๋ฐ์ ๋์ต๋๋ค. (๋๋ ์ด๊ฒ์ด ์ ์ด๋ RN์์ JSX ์ ๊ทผ ๋ฐฉ์์ด ๊ธฐ๋ณธ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ์ฌ์ฉ๋๋ ํฐ ์ด์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. RN ์์ฒด๋ ์น ํ๋ซํผ์ฒ๋ผ _๋๋ผ๊ณ _ํ๋ฏ๋ก ๋ณด๋ค ์น์ ์์ฐ์ค๋ฝ๊ฒ ์ ๊ทผํ ์ ๋ฐ์ ์์ต๋๋ค. ์ฐ์ธํ๊ฒ ๋๋ค.)
๋ฐ๋ฉด Flutter์๋ ๊ทธ๋ฌํ ๋์์ธ ์ฒ ํ์ด ์์ต๋๋ค. ์์ ํ ๋ค์ดํฐ๋ธ ํฌ๋ก์ค ํ๋ซํผ ์๋ฃจ์ ์ผ๋ก ์๋๋์์ผ๋ฉฐ React-Native์์ ์๊ฐ์ ๋ฐ์๋ค๊ณ ๋ช ์๋์ด ์์ง๋ง ์น ์ฑ๋ณด๋ค ๋ค์ดํฐ๋ธ ๋ฐ์คํฌํฑ์ด๋ ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ํจ์ฌ ๋ ์ ์ฌํ๊ฒ ์์ฑํฉ๋๋ค. ๋ํ Javascript๊ฐ ์๋ Dart๋ฅผ ์ฌ์ฉํ์ฌ ์คํ๋๋ฉฐ JSX์ ๊ฐ์ ๊ฒ์ ํตํฉํ๋ ๊ด์ ์์ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค. ํ๋๋ JS DOM ํจ์๊ฐ ๋์ฐํ๊ฒ ์ฅํฉํ ์ ์์ง๋ง(๋ ๋ค ํจ์์ ๋์์ธ๊ณผ JS ์ธ์ด ์์ฒด ๋๋ฌธ์), ์ธ์ด๋ก์์ Dart๋ ๊นจ๋ํ UI ์ ์ธ์ ์ฝ๋๋ฅผ ํจ์ฌ ๋ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ๋ฉด Flutter๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ข์ ์ผ์ ํฉ๋๋ค. UI ์์ฑ์๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํฉ๋๋ค. @sandangel ์ด ์ง์ ํ๋ฏ์ด Dart๋ ์ ์ ์ผ๋ก ์ ํ์ด ์ง์ ๋ ์ธ์ด์ด๋ฏ๋ก JS์ ๊ฐ์ ๋์ ์ผ๋ก ์ ํ์ด ์ง์ ๋ ์ธ์ด์ฉ์ผ๋ก ์ค๊ณ๋ JSX์ ํน์ฑ์ ์๋ฅผ ๋ค์ด UI ์์ฑ์๊ฐ ๋ค์์ ์๊ตฌํ๋ ๊ฒฝ์ฐ์ ๊ฑธ๋ฆผ๋์ด ๋ ๊ฒ์ ๋๋ค. ํน์ ์ ํ์ ์์ ฏ์ผ๋ก, ์์ธํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ์ ์ผํ ์๋ฃจ์ ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ถ๊ฐํผํ๊ฒ DSL์ด ๋ถํ์ด ์ค๋ฅด๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ ์๋ฃจ์ ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ์ฌ์ฉ.
๋ฐ๋ผ์ JSX/DSX๊ฐ ๊ฐ์ธ ์ทจํฅ์ ๋ฌธ์ ๋ฅผ ๋์ด Flutter ๊ฐ๋ฐ ์์ฐ์ฑ์ ์ด๋ค ์ด์ ์ด ์๋์ง ์ ๋ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ ๊ตฌ๋ฌธ์ ์ ์ฒด์ ์ผ๋ก ๋๋ต์ ์ผ๋ก ์์ธํ ์ ๋๊ฐ ๋์ผํ๋ฉฐ, ํน์ ์ฌ๋ก์์ ์์ธํ ์ ๋ณด๋ฅผ ์๋ ๊ฒฝ์ฐ ๋ช ํ์ฑ์ผ๋ก ๋ณด์ถฉํฉ๋๋ค(์: ๋ซ๋ XML ํ๊ทธ). ์น ์งํฅ ๋ฐฐ๊ฒฝ(React/RN, Angular ๋ฑ) ๋๋ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ(Java/Kotlin/Swift, WPF/UWP ๋ฑ)์์ Flutter์ ์ค๋ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ผ๋ก ํฌ๊ฒ ์์ฝ๋ฉ๋๋ค. ๊ทธ๋ค์ด ์ ํธํ๋ ์ ๊ทผ ๋ฐฉ์. ์ด ์ค๋ ๋๋ง์ผ๋ก๋ ์ฒ์์๋ JSX์ ๋ํด ๋งค์ฐ ํ์์ ์ด์๋ค๊ฐ ๋ช ๋ฌ ๋์ ์ฌ์ฉํ๋ฉด์ "์์ผ๋ฉด ํ ์ ์๋ค"๋ผ๋ ์๊ฒฌ์ผ๋ก ๋ฐ๋์๋ค๋ ์ฌ์ฉ์ ์คํ ๋ฆฌ๊ฐ ๋ง์ด ์์ต๋๋ค. (๋น๋ก ๋ด ๋์์ ์ธ ๋ถ๋ถ์ ๊ทธ๋ค์ด ๊ธฐํ๋ฅผ ์ค๋ค๋ฉด ๋ค์ดํฐ๋ธ Dart ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋๊ฐ์ ์ผ์ด ๊ทธ๋ค์๊ฒ ๋งค์ฐ ์ ์ผ์ด๋ ์ ์์์ ์ง์ ํ๊ณ ์ถ์ดํ์ง๋ง.)
๊ทธ๋ ๊ธด ํ์ง๋ง, ๋๋ DSX๊ฐ ๋ค์ดํฐ๋ธ UI ์์ฑ์์ ๋์์ผ๋ก Flutter ํ์์ ๊ณต์์ ์ผ๋ก ์ง์๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ ์ ์์ต๋๋ค. ํ์ฌ ์๋ฃจ์ (๋ฐ ์ค์ ๋ก ๊ตฌํํ๊ธฐ ์ํ @cbazza ์ ๋ชจ๋ ์ํ)์ผ๋ก์๋ ์๋ฒฝํ์ง๋ง ์น ๊ธฐ์ ๊ธฐ๋ฐ์ด ์๋ ํ๋ซํผ์ธ Flutter์ ํต์ฌ ํน์ฑ์๋ ์ค์ ๋ก ๋ง์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ ์ ํ๋ก์ ํธ์์ DSX๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๋ ๋ง์ ๊ถํ์ด ๋ถ์ฌ๋์ง๋ง Flutter ํ์ด ์๊ฐ์ ํ ์ ํ ์ ์๊ณ ํด์ผ ํ๋ ๋ค๋ฅธ ๋ ์ค์ํ ์ผ์ด ๋ง๋ค๋ ์๊ฐ์ ํ๊ณ ์ถ์ต๋๋ค.
์ด์ DSX๊ฐ ๊ณต์์ ์ผ๋ก ์ง์๋๋ค๋ ๋ฐ์๋ ๋์ํ์ง ์์ง๋ง ์ผ์ข ์ ๊ณต์ UI ํ์์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. @birkir ๊ฐ ์ง์ ํ๋ฏ์ด ๋ฐ์คํฌํฑ์ด๋ ๋ชจ๋ฐ์ผ์ด๋ ๊ฑฐ์ ๋ชจ๋ ์ฃผ์ ๊ธฐ๋ณธ UI ํ๋ซํผ์๋ ์ง์ ์ ์ธ ์ฝ๋ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์ ์ธ์ UI ํ์์ด ์์ต๋๋ค(๋๋ถ๋ถ์ ์ด์จ๋ ์ฝ๋ ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ฌ์ ์ฒ๋ฆฌ๋จ). ๋ ผ๋ฆฌ ํ์ผ์์ ๋ณ๋์ UI ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ํญ์ MVVM ํจํด์ ์์ฉํ๋ ๋ฐ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ด๊ฐ ์ฃผ์ฅํ๊ณ ์ถ์ ๊ฒ์ Flutter๊ฐ ๋น์ทํ ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ธ๋ผ์ธ UI DSL ํ์ ๋์ Dart ์ฝ๋์ ๋ณ๊ฐ๋ก ์์ฒด ํ์ผ๋ก ์ด๋ํ๋๋ก ์๋๋ ๋ณ๋์ UI ํ์์ด ์์ด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์๊ฐ์ ์ผํ์ผ๋ก, ์ ๋ ์ง๋ ์ฃผ๋ง์ ์ค์ ๋ก ์ผ๋ถ ์์ ์ ์๋ฃํ์ต๋๋ค. ์ ์ ์๊ฐ์ ํ ์ ํ ์ ์๋ค๋ฉด "FLUI"๋ผ๋ ์ด๋ฆ์ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋๋ฐ, ์ด๋ ๊ทธ๋ฌํ ํ์์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณด์ฌ์ฃผ๋ ค๋ ์๋ ์ ๋๋ค. ๊ธฐ์กด DSL(๋๋ ์์ ๋ ๋ฒ์ )์ ์ฌ์ฉํ๋ ๋์ YAML์์ ์๊ฐ์ ์ป์ ์์ ํ ์๋ก์ด DSL์ ๊ฐ๋ฐํ์ผ๋ฉฐ Flutter-constructor-approach ๋ ์ด์์์ "๋๋"์ ๊ฐ๊น๊ฒ ์ ์งํ๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค. ๋ฌผ๋ก _๋งค์ฐ_ ์ด๊ธฐ ๊ตฌํ์ด๋ฏ๋ก ๋ง์ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ผ๋ก ์์ํ์ง๋ ์์ง๋ง ์ฌ๋๋ค์ด ํ๋ ์ดํ ์ ์๋๋ก ํ๋ก์ธ์ ์คํฌ๋ฆฝํธ(C#/.NET Standard๋ก ์์ฑ)์ ์์ค๋ฅผ ํฌํจํ์ต๋๋ค. ๊ทธ๋ค์ด ์ํ๋ค๋ฉด ๊ทธ๊ฒ์ผ๋ก. :)
React/RN๊ณผ Flutter ์ฌ์ฉ์๋ก์ ์ ๋ "DSX"๋ผ๋ ์์ด๋์ด์ ํฌ๊ฒ ๋์ํ์ง ์์ต๋๋ค.
DSX๋ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ์ค์ง ์์ ๊ฒ์ ๋๋ค. JSX๋ JS ๊ตฌ๋ฌธ์ด ๋์ฐํ๊ธฐ ๋๋ฌธ์ ๋ฐ์์ ์ฌ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ Flutter์ ๊ฒฝ์ฐ ์์ ฏ ์์ฑ์ ๋งค์ฐ ์ฝ์ต๋๋ค.
ํด๋์:
Widget build(BuildContext context) {
return Center(
child: Text("foo"),
);
}
๊ทธ๊ฒ์ ์ด๋ฏธ ์ฆ์ ์ฌ์ฉํ ์ ์๊ณ , ์ฐ๊ธฐ ์ฝ๊ณ , ์ ํ/์ผ๋ฐ ํธํ์ด ๊ฐ๋ฅํ๊ณ , ๋ถํ์ํ ์ค๋ณต์ด ์์ต๋๋ค.
ํ์ฌ ๊ตฌ๋ฌธ์ ๋ํด ๊ฐ์ง ์ ์๋ ์ ์ผํ ๋ถ๋ง์ "์์ ฏ์ ๋ซ๋ ๊ดํธ๊ฐ ์ด๋์ ์๋์ง ์๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค"์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ค์ ๊ณต์์ ์ผ๋ก ์ง์๋๋ IDE์ dart ํ๋ฌ๊ทธ์ธ์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ฐ๋ผ์ vscode์์ ์ด์ ์ ์ฝ๋๋ฅผ ์ด๋ฉด ๋ค์์ ๋ณผ ์ ์์ต๋๋ค.
Widget build(BuildContext context) {
return Center(
child: Text("foo"),
); // Center
}
"์บ์ฃผ์ผ ์ฝ๋์ UI ์ฝ๋๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ด๋ ต๋ค"๋ ๋ฐ์ ๊ท์น์ด flutter์๋ ์ ์ฉ๋ฉ๋๋ค.
์์ ฏ์ ๋ฉ์ฒญํ๊ฑฐ๋ ๋๋ํด์ผ ํฉ๋๋ค. ์ค๋งํธ ์์ ฏ์๋ UI ๋ก์ง์ด ์์ต๋๋ค. ๋ฉ์ฒญํ ์์ ฏ์๋ UI ๋ก์ง ์ธ์๋ ์๋ฌด๊ฒ๋ ์์ต๋๋ค.
์ด ํจํด์ ๋ฐ๋ฅด๋ฉด UI๋ฅผ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ตฌ๋ณํ์ง ๋ชปํ๋ ์ํฉ์ ๋น ์ง์ง ์์ ๊ฒ์
๋๋ค.
์ด๊ฒ์ BLoC ํจํด๊ณผ ๊ฐ์ ๊ฒ์ ๋ฐ๋ฅผ ๋ ๋์ฑ ์ฌ์ค์
๋๋ค. ๋น์ฆ๋์ค์ UI์ ๋ถ๋ฆฌ๋ฅผ ๊ฐ๋ ฅํ๊ฒ ์ํํฉ๋๋ค.
JS ๊ตฌ๋ฌธ์ด ๋์ฐํ๊ธฐ ๋๋ฌธ์ JSX๊ฐ ๋ฐ์์ ์ฌ์ฉ๋ฉ๋๋ค.
๋งค์ฐ ๋ ๋จ์ ์ธ ์ง์ ์ด๋ฉฐ ์ฌ์ค์ด ์๋๋๋ค.
render() {
return React.createElement(Container, { padding: EdgeInsets.all(20.0) },
React.createElement(Text, { style: { color: Colors.black } },
'foo'
)
);
}
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(20.0),
child: Text(
'foo',
style: TextStyle(color: Colors.black)
),
);
}
render() {
return (
<Container padding={EdgeInsets.all(20.0)}>
<Text style={{ color: Colors.black }}>foo</Text>
</Container>
);
}
Widget build(BuildContext context) {
return (
<Container padding={EdgeInsets.all(20.0)}>
<Text style={TextStyle(color: Colors.black)}>{'foo'}</Text>
</Container>
);
}
๋งค์ฐ ๋ ๋จ์ ์ธ ์ง์ ์ด๋ฉฐ ์ฌ์ค์ด ์๋๋๋ค.
๊ธฐ๋ณธ ๋ฐ์ ๊ตฌ๋ฌธ์๋ ๋ถํ์ํ ๋ฌธ์๊ฐ ๋ง์ด ์์ต๋๋ค.
๊ฐ ๋ฌธ๋ฒ(ํจ์ ์ ์, ๋ค์ฌ์ฐ๊ธฐ, '๋ฐํ' ์ ์ธ)์ ๋ํ ๋จ์ด ๋ฐ๋ณต ๋ฐ ๋ฌธ์ ์๋ฅผ ๋น๊ตํด๋ณด์
JSX ์์ด ๋ฐ์:
:
3๊ฐ, ,
4๊ฐ ๋ฐ ๊ณต๋ฐฑ 11๊ฐ ํฌํจ)React.createElement
๋ ๋ฒ ์์ฑ๋จJSX:
:
1๊ฐ, <>
๊ฐ, ๊ณต๋ฐฑ 5๊ฐContainer
๋ฐ Text
๋ ๋ฒ ์์ฑ๋คํธ:
:
4๊ฐ, ,
3๊ฐ, ๊ณต๋ฐฑ 4๊ฐ๋ฌธ์ ์ธก๋ฉด์์ ๋ช ๋ฐฑํ ์น์๋ ๋คํธ ๊ตฌ๋ฌธ์ ๋๋ค.
์ด์ ๋ค๋ฅธ ๋คํธ ํน์ฑ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋คํธ ์ ํ์ ๋จ์ผ ์์ ๋ ๋ค์ค ์์์ด๋ฉฐ const
์์ฑ์๊ฐ ์์ผ๋ฉฐ ์ ๋ค๋ฆญ ๋ฐ ์์น ์ง์ ๋งค๊ฐ๋ณ์๋ ํ์ฉํฉ๋๋ค. JSX๋ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ง์ํ์ง ์์ต๋๋ค.
JSX๋ก ์๋ชป ๋ณํ๋๋ ๋ช ๊ฐ์ง ์:
ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋ children
:
Scaffold(
appBar: AppBar(),
body: Container(),
)
OR
SingleChildScrollView(
child: Container(
height: 100.0,
),
)
const
์์ ฏ ์์ฒด์ ์์ฑ์
const Padding(
padding: const EdgeInsets.all(4.0),
)
์ ๋ค๋ฆญ
NotificationListener<ScrollNotification>(
onNotification: (foo) {
},
child: child,
)
์์น ์ํ:
Text("foo")
๋ช ๋ช ๋ ์์ฑ์
Positioned.fill(
child: Container(),
);
๋น๋(dart๋ ๊ณต์ฉ์ฒด ์ ํ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก children
๋ ์์ ฏ๊ณผ ํจ์๊ฐ ๋ ์ ์์)
Builder(
builder: (context) => Container(),
)
@rrousselGit
DSX๋ ์ด์ ์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด ๋จ์ํ ๋ค๋ฆ
๋๋ค.
๊ตฌ๋ฌธ์ด๋ฉฐ Dart์ ์์ ์งํฉ์ด๋ฏ๋ก ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ด
๋คํธ DSX ๋ด์์ ํ ์ ์์ต๋๋ค. ๋ ๋ค ๋ฏน์ค ์ค ๋งค์น ํ ์๋ ์์ต๋๋ค
๋น์ ์ด ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ ๊ตฌ๋ฌธ. ๋ถ๋ช
ํ ๋น์ ์ ํ์ธ์ ๊ท์ฐฎ๊ฒํ์ง ์์์ต๋๋ค
์ง์ํ๊ธฐ ์ํด ์ํ๋ DSX ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋
๋คํธ:
https://spark-heroku-dsx.herokuapp.com/index.html
-1---------------------------------------
๋คํธ์์:
Scaffold(
appBar: AppBar(),
body: Container(),
)
OR
SingleChildScrollView(
child: Container(
height: 100.0,
),
)
DSX์์:
<Scaffold
appBar={<AppBar/>}
body={<Container/>}
/>
OR
<SingleChildScrollView>
<Container
height={100.0}
/>
</SingleChildScrollView>
-2----------------------------------------------------
๋คํธ์์:
const Padding(
padding: const EdgeInsets.all(4.0),
)
DSX์์:
const Padding(
padding: const EdgeInsets.all(4.0),
)
-์ผ---------------------------------------
๋คํธ์์:
NotificationListener<ScrollNotification>(
onNotification: (foo) {
},
child: child,
)
DSX์์:
<NotificationListener<ScrollNotification>
onNotification={(foo) {
}}
child={child}
/>
-4 ---------------------------------------
๋คํธ์์:
Text("foo")
DSX์์:
<Text ["foo"]/>
-5--------------------------------------------------------
๋คํธ์์:
Positioned.fill(
child: Container(),
);
DSX์์:
<Positioned.fill>
<Container/>
</Positioned.fill>
-6---------------------------------------
๋คํธ์์:
Builder(
builder: (context) => Container(),
)
DSX์์:
<Builder
builder={(context) => <Container/>}
/>
<MyAppBar>
<title:Text [] style={Theme.of(context).primaryTextTheme.title}>
Example title
</title:Text>
</MyAppBar>
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ ๋๋ ๋งํฌ์ ์๋ ์์ ์ค ์ด๋ ๊ฒ๋ ์ค์ ๋ก ์ฝ๋๋ฅผ ๋จ์ํํ๊ฑฐ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํค์ง ์์ต๋๋ค.
JSX๊ฐ ๋๋ฝ๋์๋ค๋ ๋๋๊ณผ ๊ด๋ จ์ด ์์ ์ ์๋ ํ(ํ๋ฌํฐ๋ฅผ ์์ํ ๋์ ๋์ผํจ) ์ฝ๊ฐ์ ๊ฒฝํ ํ์๋ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ด ์ค์ ๋ก ๊ฝค ์ข๊ฒ ๋๊ปด์ง๋๋ค.
์ฐธ๊ณ ๋ก, ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๋ํ ํจ์ฌ ๋ ๋์ ์๋ฃจ์
์ด ์์ต๋๋ค. ํ
ํ๋ฆฟ ํ์ผ์
๋๋ค
์์ ฏ ์์ xml/yaml ํ์ผ์ด ์์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ dart๊ฐ ์ ๊ณตํ๋ ๋ฉ์ง ์ฝ๋ ์์ฑ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๋๋ ์คํ๋ ค ์ ํธํ๋ค :
// main.dart
import 'package:flutter/material.dart';
part 'main.g.dart';
class MyState extends StatefulWidget {
<strong i="14">@override</strong>
_MyStateState createState() => _MyStateState();
}
class _MyStateState extends State<MyState> {
<strong i="15">@override</strong>
Widget build(BuildContext context) {
return $myStateStateTemplate(theme: Theme.of(context));
}
}
์ ๊ฒฐํฉ
// main.xml
<strong i="19">@theme</strong> ThemeData
<Container color={@theme.cardColor} />
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์ ์ ์ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋ค์ ๋คํธ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
part of 'main.dart';
Widget $myStateStateTemplate({ThemeData theme}) {
return Container(
color: theme.cardColor,
);
}
์ต์ข
๊ฒฐ๊ณผ๋ UI/๋
ผ๋ฆฌ ๋ถ๋ฆฌ๋ฅผ ์ํ "DSX"๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค. ์ ์ฌ์ ์ธ UI ์์ฑ๊ธฐ์๋ ๋ ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ built
๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ํจ์ฌ ์ฝ์ต๋๋ค.
JSX๋ ํ๋กํ ํ์ ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์:
์ ๋ง๋ก !!! ์ด๋ฌํ ๋ ผ์์์ ๊ธ์ง์ ์ด์๋ ์ ์ผํ ๊ฒ์ ๋ฐ๋๋ก ์๋ค์ ๋ฐ์์ด์์ต๋๋ค.
์ด ํฐ์ผ์ ์ ๋ชฉ์์ ์ ์ ์๋ฏ์ด DSX๋ JSX์ ์ ์ฌํ๋ฉฐ JSX์ ๋์ผํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด JSX๋ผ๊ณ ๋ถ๋ ธ์ ๊ฒ์ ๋๋ค. ์ถ๊ฐ ์ฌํญ์ ๋ฏธ๋ฏธํ๋ฉฐ ๊ฐ๋ฐ์์๊ฒ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
<MyAppBar>
<title:Text [] style={Theme.of(context).primaryTextTheme.title}>
Example title
</title:Text>
</MyAppBar>
or
<MyAppBar>
<title:Text ['Example title'] style={Theme.of(context).primaryTextTheme.title}/>
</MyAppBar>
or
<MyAppBar
title={<Text [] style={Theme.of(context).primaryTextTheme.title}>
Example title
<Text>}
/>
or
<MyAppBar
title={<Text ['Example title'] style={Theme.of(context).primaryTextTheme.title}/>}
/>
ํ '๊ด์ฌ์ ๋ถ๋ฆฌ'๋ฅผ '๊ธฐ์ ์ ๋ถ๋ฆฌ'์ ํผ๋ํ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ๊ฒ๋ค์ ๋งค์ฐ ๋ค๋ฆ ๋๋ค. ๋ค๋ฅธ ํ์ผ์์ dart ์ฝ๋์ ๋งํฌ์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋จ์ํ '๊ธฐ์ ๋ถ๋ฆฌ'์ด๋ฉฐ '๊ด์ฌ ๋ถ๋ฆฌ'์ โโ์ด์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ ค๋๋ ์ฌํญ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์บก์ํํ๋ ๊ตฌ์ฑ ์์/์์ ฏ์ ๋๋ค. ํด๋น ๊ตฌ์ฑ ์์/์์ ฏ ๋ด๋ถ์์ ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค.
๋ํ ๊ถ์ฅํ๋ ๋๋ก ๊ธฐ์ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ชจ๋ ๋ช ๋ นํ ๊ตฌ๋ฌธ(for ๋ฃจํ, ํจ์ ํธ์ถ, if ๋ฌธ ๋ฑ)์ ํธ์คํธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ JSX/DSX๋ณด๋ค ํจ์ฌ ์ด๋ฑํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ง์ ์ฝ๋์ ์์ ๊ฐ ๊ฒ์๋ ํ( ํนํ ), JSX๊ฐ DSX ๋ฐ Dart์ ๋ฌ๋ฆฌ JS์ ํจ์ฌ ๋ ๋ง์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ด ๊ด์ ์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฐ๋ก ํ๊ทธ ๋ซ๊ธฐ์ ๋๋ค. ์ข๋ค:
<SingleChildScrollView>
<Container
height={100.0}
/>
</SingleChildScrollView>
๋ค์ ๊ณผ ๋์กฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฌ์ธต ๊ตฌ์กฐ์์ ์ธ์ง ๋ณต์ก์ฑ์ ๋ง์ด ์ค์ ๋๋ค.
SingleChildScrollView(
child: Container(
height: 100.0,
),
)
ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Scaffold
appBar={<AppBar/>}
body={<Container/>}
/>
์์ ์ด์ต์ด ์์ต๋๋ค.
์ด ํฐ์ผ์ ์ ๋ชฉ์ ๋์ ์๋ฏ์ด DSX๋ JSX์ ์ ์ฌํ๋ฉฐ JSX์ ๋์ผํ์ง ์์ต๋๋ค.
๋ด "ํ์ง๋ง ๋ฐ์์์ ํ๋ฌํฐ๋ก์ ๋ณํ์ด ๋ ์ฝ๋ค๋ ์ฃผ์ฅ์ ์ ํจํ์ง ์์ต๋๋ค."๋ฅผ ๋์ณค์ต๋๋ค.
DSX์ ๋ํ ์ฃผ์ฅ์ ์ ๋ฐ์ "JSX๋ ๋ฐ์์์ ์ธ๊ธฐ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์์๋ ํ์ํฉ๋๋ค."์
๋๋ค. ๊ทธ๋ฌ๋ JSX์ ๋ค๋ฅธ(๊ทธ๋ฆฌ๊ณ ๋ ๋ณต์กํ) ๊ฒ์ ์ ์ํ๊ณ ์์ต๋๋ค.
๋๋จธ์ง ์ ๋ฐ์ UI๋ฅผ ์ฝ๋์์ ๋ถ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ํ
ํ๋ฆฟ ํ์ผ๋ ํ ์ ์์ต๋๋ค.
๋ํ ๊ถ์ฅํ๋ ๋๋ก ๊ธฐ์ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ชจ๋ ๋ช ๋ นํ ๊ตฌ๋ฌธ(for ๋ฃจํ, ํจ์ ํธ์ถ, if ๋ฌธ ๋ฑ)์ ํธ์คํธ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ JSX/DSX๋ณด๋ค ํจ์ฌ ์ด๋ฑํฉ๋๋ค.
์ฌ์ค์ด ์๋๋ค. ํ
ํ๋ฆฟ ํ์ผ ๋ด if
๋ฐ ๊ธฐํ ์์
์ ์ํํ ์ ์์ต๋๋ค. cshtml
๋๋ ๊ฐ๋ ํ
ํ๋ฆฟ์ ๋ณด์ญ์์ค.
๋ฌธ์ ๋ ํ
ํ๋ฆฟ ํ์ผ์
๋๋ค. ์ด๋ฏธ ํ์๊ฐ ์๋ ํ ์์ ํ ์๋ํ๋ ์ผ์ฃผ์ผ ์ด๋ด์ flutter์ ๋ํด ๊ตฌํํ ์ ์์ต๋๋ค.
์ง์๋ฌธ์ด ์๋ yaml, xml, cshtml ๋๋ html์
๋๋ค.
DSX์๋ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค.
@Bessonov ๊ทธ๋ค์ ์ต๊ทผ์ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ์กฐ๋กฑํ๊ธฐ ์ํด ์ง์๋๋ IDE์ ๋ํ ๊ฐ์ ์ฃผ์์ ์ถ๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ vscode์์ ๋ค์์ ๋ณผ ์ ์์ต๋๋ค.
SingleChildScrollView(
child: Container(
height: 100.0,
), // Container
) // SingleChildScrollView
ํ๊ทธ ๋ซ๊ธฐ์ ์ด์ . ์ ๋ ฅํ์ง ์๊ณ ๋
@rrousselGit
๊ทธ๋ค์ ์ต๊ทผ์ ๋ซ๊ธฐ ํ๊ทธ๋ฅผ ์กฐ๋กฑํ๊ธฐ ์ํด ์ง์๋๋ IDE์ ๊ฐ์ ์ฃผ์์ ์ถ๊ฐํ์ต๋๋ค.
๋ค, ์ธ์ฉ ๋๊ธ์์ ๋ดค์ต๋๋ค. ํ์ง๋ง ๊ฐ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ ๋ ฌ ์ํํธ๋ฅผ ๋์ ํ๊ณ ์ฝ๊ธฐ ํ๋ฆ์ ๋ฐฉํดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ค๋ฅธ IDE์ ํ ์คํธ ํ๋ก์ธ์์์๋ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ฌผ๊ฑด์ ํ ํ๋ฆฟ ํ์ผ์ ๋๋ค
IMHO ํ ํ๋ฆฟ์ NIH ์ฆํ๊ตฐ์ ์๊ณ ์์ต๋๋ค. ์ ๋ PHP์ HTML์ ํผํฉํ๋ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋งํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐ์์ JSX๋ก ์ด๋ป๊ฒ ๋ ์ ํ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค.
@rrousselGit
๋ด "ํ์ง๋ง ๋ฐ์์์ ํ๋ฌํฐ๋ก์ ๋ณํ์ด ๋ ์ฝ๋ค๋ ์ฃผ์ฅ์ ์ ํจํ์ง ์์ต๋๋ค."๋ฅผ ๋์ณค์ต๋๋ค.
์๋์, ๋๊ธ์ ์ ํ ๋์น์ง ์์์ต๋๋ค. JSX์์ ์จ ์ฌ๋๋ค์ด DSX๋ฅผ ๋๋ฌด ๋ณต์กํ๊ฒ ์๊ฐํ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
DSX์ ๋ํ ์ฃผ์ฅ์ ์ ๋ฐ...
DSX๋ฅผ ์ ํํ๋ ๋ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ง๋ง ๋์์ด ์์ผ๋ฉด ์ฌ๋๋ค์ ์ด์ ๊ฐ ๋ฌด์์ด๋ ์ ํธํ๋ ๊ฒ์ ์ ํํ ๊ฒ์ ๋๋ค.
์ฌ์ค์ด ์๋๋ค. ๋น์ ์ ๋น์ ์ ํ ํ๋ฆฟ ํ์ผ ๋ด์์ if์ ๋ฌผ๊ฑด์ ํ ์ ์์ต๋๋ค. cshtml ๋๋ ๊ฐ๋ ํ ํ๋ฆฟ์ ์ดํด๋ณด์ธ์.
๋ฌธ์ ๋ ํ ํ๋ฆฟ ํ์ผ์ ๋๋ค. ์ด๋ฏธ ํ์๊ฐ ์๋ ํ ์์ ํ ์๋ํ๋ ์ผ์ฃผ์ผ ์ด๋ด์ flutter์ ๋ํด ๊ตฌํํ ์ ์์ต๋๋ค.
์ง์๋ฌธ์ด ์๋ yaml, xml, cshtml ๋๋ html์ ๋๋ค.
DSX์๋ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค.
์์ ํ ๋ฐ๋๋๋ DSX๋ 2๊ฐ์ xml ๋ณํ๋ง ๊ตฌํํ๊ณ ๋๋จธ์ง๋ ํธ์คํ ์ธ์ด์์ ๋ฌด๋ฃ๋ก ์ป์ต๋๋ค. ์๋ก์ด ํ ํ๋ฆฟ ์ธ์ด ๋ด์์ Dart์ ๊ธฐ๋ฅ์ ๋ค์ ๊ตฌํํ๋ ค๋ ๋ ธ๋ ฅ์ ์์ํด ๋ณด์ญ์์ค. ์๋์, ๋คํธ๋ฅผ ๊ฐ์ ธ๊ฐ๊ฒ ์ต๋๋ค.
์๋์, ๋๊ธ์ ์ ํ ๋์น์ง ์์์ต๋๋ค. JSX์์ ์จ ์ฌ๋๋ค์ด DSX๋ฅผ ๋๋ฌด ๋ณต์กํ๊ฒ ์๊ฐํ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
ํ์ฌ dart ๊ตฌํ์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
์ด์จ๋ , ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก๋ฅผ ์ค๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ JSX๋ฅผ ํ๋ฌํฐ๋ก ์ซ์ดํ๊ณ "๊ธฐ๋ค๋ ค๋ณด๊ณ " ์๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์ด์ ๋ฅผ ๋ ๋์ดํ ๊ฒ์ ๋๋ค.
1. ์์ ฏ ์์ฑ์ React์ ๋ค๋ฆ ๋๋ค.
๋ฐ์์์ ๊ตฌ์ฑ ์์ ์์ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. JSX๋ "์ผ์ด ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ์ ๊ฒฝ์ฐ์ง ๋ง์ธ์. ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด ์ผ์ ํฉ๋๋ค"๋ผ๊ณ ๋งํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
ํ๋ฌํฐ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋น๋ ํธ์ถ ์๋ง๋ค ์ ์์ ฏ์ ์๋์ผ๋ก ์ธ์คํด์คํํฉ๋๋ค. ์ด๊ฒ์ ์ดํดํ๋ ๊ฒ์ด ์ ๋ง ์ค์ํ๋ฉฐ JSX๋ ์ด๋ฅผ ๋ ๋ช ํํ๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ผ๋ฆฌ์ ์ฐ์์์ :
2. ์ฌ๋๋ค์ <Foo />
์ด new Foo()
๊ฐ ํ์ง ์๋ ํน๋ณํ ์ผ์ ํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๋ฉ์๋์ <Foo />
๋ ํน๋ณํ๊ฒ ๋๊ปด์ง๋๋ค. ํ๋ ์์ํฌ์ ๋ด์ฅ๋ ๊ด๋ จ ์๋ ์์
์ ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ตฌ์ฑ ์์๊ฐ React.Element
๋ก ๋ํ๋ ๋ฐ์์์๋ ์ฌ์ค์
๋๋ค.
์ด๊ฒ์ ๋ฐ์์์ <Foo />
!= new Foo()
๋ก ๋ณํ๋๋ฉฐ Foo
์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ํ๋ฌํฐ์ ์ ์ฉ๋์ง ์์ผ๋ฉฐ ํผ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค.
๋ํ :
<Foo>
<Bar />
</Foo>
๋ฐ์์์ Foo
๊ฐ ์์์ ์ฌ์ฉํ์ง ์์ผ๋ฉด $ Bar
๊ฐ ์ธ์คํด์คํ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ $# render
๋ฉ์๋๊ฐ ๋ฐํ๋ ํ Foo
๊ฐ ์ธ์คํด์คํ๋ฉ๋๋ค.
ํ๋ฌํฐ์์๋ ๊ทธ ๋ฐ๋์
๋๋ค. Bar
๋ฐ Foo
๋ชจ๋ ์ฆ์ ์์ฑ๋ฉ๋๋ค.
์ด๊ฒ์ ์ ์ฌ์ ์ผ๋ก React ๊ฐ๋ฐ์๊ฐ ์ต์ ํ๋์ง ์์ ํ๋ฌํฐ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
3. ์ผ๋ฐ์ ์ผ๋ก Dart/flutter๋ JS/react๊ฐ ์๋๋๋ค.
๋คํธ์ JSX๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฏธ ์ ํ ํตํฉ์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์๊ฑฐ๋ ํ ์ ์์ต๋๋ค.
return foo && <Component />
๋๋ ๋ฐ์์ ๋ค๊ฐ์ค๋ ๋น๋๊ธฐ ๋ ๋๋ง.
"์ฐ๋ฆฌ๋ ์ด๋ฏธ JSX๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค!"๋ก ์ ๋นํ๋ฉ๋๋ค.
dart์์ ์ต์ JSX/react ๊ธฐ๋ฅ์ ๊ตฌํํ ํ์๊ฐ ์๋๋ก ๋ ์ ์ ์ธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
4. JSX๋ ์ผ๋ถ ๋คํธ ์ธ๋ถ ์ฌํญ์ ๋ถ๋ถ๋ช ํ๊ฒ ๋ง๋ญ๋๋ค.
์์ ์์ธ Scaffold
์๋ appbar
a PrefferedSizeWidget
๊ฐ ํ์ํฉ๋๋ค.
JSX๋ฅผ ์ฌ์ฉํ์ฌ Scaffold
๋ฅผ ๋ง๋ค์๋ค๋ฉด ์ฌ๋๋ค์ ์ฃผ์ด์ง JSX๋ฅผ ๋ค๋ฅธ JSX๋ก ๋ฐ๊ฟ ์ ์์ ๊ฑฐ๋ผ๊ณ ์์ํ ๊ฒ์
๋๋ค. ์ฌ์ค์ด ์๋ ๊ฒ
๋ด ๋ง์, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ํ ์ ์๋์ง ๋งค์ฐ ๋ถ๋ถ๋ช ํ๊ฒ ๋ง๋ญ๋๋ค
<Scaffold
appbar={<AppBar />}
/>
ํ์ง๋ง
<Scaffold
appbar={<Container />}
/>
@rrousselGit
์ด์จ๋ , ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก๋ฅผ ์ค๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ JSX๋ฅผ ํ๋ฌํฐ๋ก ์ซ์ดํ๊ณ "๊ธฐ๋ค๋ ค๋ณด๊ณ " ์๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์ด์ ๋ฅผ ๋ ๋์ดํ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ ๋ง์ ๋ถ๋ถ์ ๋์ํ์ง ์์ง๋ง, ๋น์ ์ด ์ด ๋ฌธ์ ์ ๋ํด ๊น์ด ์๊ฐํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
- ์์ ฏ ์์ฑ์ React์ ๋ค๋ฆ ๋๋ค.
๋์๊ฒ ์ด๊ฒ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์ค์ํ์ง ์์ต๋๋ค. ๊ฐ๋ ์ ์ผ๋ก XML์ ๋ณด๋ฉด React์์๋ ๊ตฌ์ฑ ์์์ด๊ณ Flutter์์๋ ์์ ฏ์ ๋๋ค.
- ์ฌ๋๋ค์ ์๊ฐํ ์ ์์ต๋๋ค
new Foo()๊ฐ ํ์ง ์๋ ํน๋ณํ ์ผ์ ํฉ๋๋ค.
๋๋ ์ฌ๋๋ค์ด Dart/DSX๊ฐ Javascript/JSX๊ฐ ์๋๋ผ๋ ๊ฒ์ ๊ฝค ๋นจ๋ฆฌ ๋ฐฐ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก Dart/flutter๋ JS/react๊ฐ ์๋๋๋ค.
์, ๋ง์นจ๋ด ์ฐ๋ฆฌ๋ ๋ฌด์ธ๊ฐ์ ๋์ํ์ง๋ง ๊ทธ๊ฒ๋ค์ด ์๋ก ๋ค๋ฅด์ง๋ง ๊ณตํต ์ค๋ ๋๋ ์ ์ธ์ UI ํ๋ ์์ํฌ์ด๊ณ ์ ์ธ์ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ JSX/DSX์์ ์ ์ฒ๋ฆฌ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ์ฌ๊ณ ๋ฐฉ์์ ์ ์งํฉ๋๋ค.
dart์ JSX๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฏธ type union์ ๋ํ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์๊ฑฐ๋ ๋ฐ์์์
return foo && <Component />
๋๋ ๋ค๊ฐ์ค๋ ๋น๋๊ธฐ ๋ ๋๋ง์ ์ํํ ์ ์์ต๋๋ค.
"์ฐ๋ฆฌ๋ ์ด๋ฏธ JSX๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค!"๋ก ์ ๋นํ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ Dart์ JSX๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋๋ผ DSX๋ฅผ ์ถ๊ฐํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅด์ง๋ง JSX์ ์ ์ฌํ๊ณ ์น์ํจ์ด ํฐ ๊ฒ์ ๋๋ค.
๋๋ dart์์ ์ต์ JSX/react ๊ธฐ๋ฅ์ ๊ตฌํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ Dart๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น? Java์ ๋งค์ฐ ์ ์ฌํด ๋ณด์ด์ง๋ง Java์๋ ๋ค๋ฆ ๋๋ค. ์ ์ฅ, ์ด ๋ชจ๋ Java ํค์๋์ ๊ฐ๋ ์ ์คํฌ๋ฉํ๊ณ ์๋ฒ ๋ ์คํธ ์ฐ ๊ผญ๋๊ธฐ์์ ํ๋ ์ฒผ ์๊ฐ ๋์์ ํ๋ฉด์ ํ ์์ผ๋ก๋ง ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ Erland์ ๋ง์ฐํ๊ฒ ์ ์ฌํ ๊ฒ์ ์๊ฐํด ๋ด ์๋ค ;)
- JSX๋ ์ผ๋ถ ๋คํธ ์ธ๋ถ ์ฌํญ์ ๋ถ๋ถ๋ช ํ๊ฒ ๋ง๋ญ๋๋ค.
์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋น๊ตํ ์ ์๋ ์์ ฏ์ ์ฐ๊ฒฐํ๋ฉด Dart ์ปดํ์ผ๋ฌ๋ ์ผ๋ฐ Dart์์ ์ํํ ๊ฒ์ฒ๋ผ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. ๋๋ DSX๊ฐ ๋จ์ํ ์์ ๊ตฌ๋ฌธ ์คํ์ด๋ผ๋ ๊ฒ์ ์ถฉ๋ถํ ๊ฐ์กฐํ ์ ์์ต๋๋ค. ๋ง๋ฒ์ ์์ผ๋ฉฐ ๋์ผํ ๊ฒ์ ๋ํ ๊ตฌ๋ฌธ์ ์ฐจ์ด์ผ ๋ฟ์ ๋๋ค.
@cbazza ๊ทํ์ ๊ฒ์๋ฌผ์ ์ฝ๋ ๋ฐ ๋ช ์๊ฐ์ ๋ณด๋์ผ๋ฉฐ ์ด ๋ฌธ์ ์ ๋ํ ๊ทํ์ ๋ ธ๋ ฅ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๋ ผ์์ ๋๋ด๋ ๊ฒ์ด (์ผ์ข ์) ์ฝ๋ค๊ณ ์๊ฐํ๋ค. ํ๋ญ์ค๊ฐ react์ ๊ณต์ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ด์์ง๋ง ์ง๊ธ์ ๋ชจ๋๊ฐ redux๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ๋ฐ์ ๋ค์ดํฐ๋ธ๋ฅผ ์ํ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ช ๊ฐ์ ๋๊น? DSX ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ ๋ฐ์ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ด๋ค๊ฒ ํ์ญ์์ค.
@rrousselGit
์ด์ ์ Dart์์ part
/ part of
๊ตฌ๋ฌธ์ ๋ณธ ์ ์ด ์์ผ๋ฉฐ ์ด์ ๋ํ ๋ฌธ์๋ฅผ ์ฐพ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. Dart/Flutter๊ฐ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ๊ฒ์
๋๊น? FLUI์์ ๊ทธ๋ฐ ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
@cbazza
๋น์ ์ DSX ์ ๋น์ฑ์ ๊ฐ์ง๊ณ ๊ณ์ ์์ ๊ทธ๋ฆฌ๋ฉฐ ๋์๋ค๋๋๋ค. DSX๋ JSX๊ฐ ์๋๋๋ค. DSX๋ JSX์ ์ ์ฌํฉ๋๋ค. DSX๋ React ๊ฐ๋ฐ์์๊ฒ ์น์ํ ๊ตฌ๋ฌธ์ ๋๋ค. DSX๋ Dart๋ฅผ ์ํ ๋จ์ํ ์๊ฐ ๊ตฌ๋ฌธ ์คํ์ ๋๋ค. ์ฌ๋๋ค์ DSX๊ฐ JSX๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค. (๋ฑ๋ฑ.)
๊ทธ ๋ชจ๋ ์ค๋ช ์ผ๋ก ๋น์ ์ด ํ๋ ค๋ ์์ ์ ์ดํดํ์ง๋ง, ๊ณ์ ๋ง๋ค์ด์ผ ํ๋ค๋ ์ฌ์ค์ ์ผ๋ฐ์ ์ผ๋ก DSX์ ํน์ฑ์ ๊ดํ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋๋ฌ๋ด๊ณ rrouselGit๋ ์ ๊ธฐํ ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. DSX๊ฐ JSX๊ฐ _์๋๋๋ค_๋ผ๊ณ ๊ณ์ ๋ง์ํ์๋๋ผ๋ ๊ทธ๊ฒ์ ์ฐพ๋ ์ฌ๋๋ค์ ๊ทธ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ ๊ฒ์ ๋๋ค. JSX์ JSX๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ๊ธฐ๋ณธ ์์ค์์ Dart/Flutter์ ๊ฐ๋ ์ ์ผ๋ก ๋งค์ฐ ๋ค๋ฅธ ์ํ๊ณ์์ ์์ต๋๋ค. ๋ฐ๋ผ์ "์ต์ํจ"์ ์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๋ฐ๋์ ์ข์ ๊ฒ์ ์๋๋๋ค. ์ด์ ๊ฐ์ ๋ ๋ถ๋ช ํ ์ด์ ์ค ํ๋๋ ์ง์ ํ ๋ฐ์ ๊ฐ์ด ์ฌ๋๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
Widget build(BuildContext context) {
return isDialogVisible && <Widget>...</Widget>;
}
Javascript/JSX์์ ๊ฐ์ ธ์๊ธฐ ๋๋ฌธ์ ํด๋น ๊ตฌ๋ฌธ์ด DSX์์ ์๋ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ง ๋ถ์กฐํ์ ์ง์ ์ด ๋์ด ์ค์ ๋ก DSX๋ฟ๋ง ์๋๋ผ Flutter ์ ์ฒด์ ๋ํ ๊ด์ฌ์ _์์ฒ_ํ ์ ์์ต๋๋ค. ์น์ํจ์ ์ฌ๋๋ค์ ์๋ก์ด ๊ฒ์ ์ฝ๊ฒ ๋ชฐ์ ํ๊ฒ ํ๋ ์๋จ์ผ๋ก ์ฌ์ฉ๋ ๋ ์ ์ตํ์ง๋ง ๊ทธ๊ฒ์ ์๋ ์ ๊ฒ์ด ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ฅ์ 90%๊ฐ ๋์ผํ ๋ ๋๋จธ์ง 10%๋ ๋จ์ง ์ข์ ๊ฐ๊ณผ ์ฑ๊ฐ์ฌ์ผ๋ก ์์ฉํ ์ ์์ต๋๋ค.
DSX์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ์ 3์ ํ๋ฌ๊ทธ์ธ์ธ์ง ๋๋ Flutter์์ ๊ณต์์ ์ผ๋ก ์ฑํํ๋์ง์ ๊ด๊ณ์์ด ๊ณง ์ํํ๊ฒ ํตํฉ๋๋ ๊ธฐ๋ฅ์ด ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ค์ค๋ก ๋งํ๋ฏ์ด Flutter ๋๋ฒ๊น ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค์ ์ง์ ์ผ๋ก ์๋ํ๋ ค๋ฉด Flutter ํ๋ฟ๋ง ์๋๋ผ Dart ํ์ ๊ณต์ ์ง์์ด ํ์ํฉ๋๋ค. ์ฌ์ ์ฒ๋ฆฌ ๋ฐ ๋๊ตฌ ์ง์ ์์ด DSX๊ฐ ์๋ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ธ๋ถ ์๋ โโ๋ณํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๊ฑฐ์ณ์ผ ํ๋ ๋ ๋ค๋ฅธ (์ ์ฌ์ ์ผ๋ก ๊ธด) ๋จ๊ณ์ผ ๋ฟ์ ๋๋ค.
์ด๊ฒ์ ์ ๋ ฅํ๋ ๋์ ๋์๊ฒ ์ผ์ด๋ ๋ ๋ค๋ฅธ ์ผ์ด ์์ต๋๋ค. ์ด ์ค๋ ๋์๋ UI ๋์์ธ์ ๋ํ "๊ด์ฌ ๋ถ๋ฆฌ" ์ ๊ทผ ๋ฐฉ์์ด UI ๊ฐ๋ฐ์ ๋ค์ ๊ณ ๋ คํ๊ฒ ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ JSX๋ฅผ ์นญ์ฐฌํ ์ฌ๋ฌ ์น JSX ์ฌ๋๋ค์ด ์์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ React๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์์ฅ์์ ์ ์ผํ ํ๋ ์์ํฌ์ ๋๊น? ๋ค์ดํฐ๋ธ ๋ฐ ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ ํ๋ ์์ํฌ๋ ๋ชจ๋ ์คํ ๋ฆฌ๋ณด๋, XML ํ์ผ, XAML ํ์ผ ๋ฐ ๊ธฐํ UI ์ ์ DST๋ฅผ ๊ณ ์ํ๊ณ ์์ต๋๋ค. Angular ๋ฐ ๋ ์ค๋ฅด๋ Vue์ ๊ฐ์ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ JS ํ๋ ์์ํฌ์กฐ์ฐจ๋ ์ฌ์ ํ "๊ธฐ์ ๋ถ๋ฆฌ" ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. React ๊ฐ๋ฐ์๋ค์ JSX๊ฐ ๋ฏธ๋์ ๋ฐฉ์์ธ ๊ฒ์ฒ๋ผ ๋งํ์ง๋ง ์ค์ ๊ฒฌ์ธ๋ ฅ์ ์ป์ ํ๋ ์์ํฌ์์ React ์ด์ธ์ ๋ค๋ฅธ ๊ณณ์์๋ ์์ง ๋ํ๋์ง ์์์ต๋๋ค.
@andrewackerman
part
/ part of
๋ ๊ธฐ์กด ๋คํธ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ป๊ฒ ๋ ๋ ๊ฐ์ ํ์ผ์ ํ๋๋ก ๊ฒฐํฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ ์์ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ค์ ์ฌ๋ก ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. toJSON
๋ฉ์๋์ ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋์ค์ ๋ํ fromJSON
ํฉํ ๋ฆฌ๋ฅผ ์์ฑํ๋ $#$ json_serializable
$#$์ ๊ฐ์ต๋๋ค.
part
/ part of
ํผ์์๋ ์๋ฌด ๊ฒ๋ ํ์ง ์์ต๋๋ค. ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ ์ด๊ฒ์ source_gen ๊ณผ ๊ฐ์ ๊ฒ๊ณผ ๊ฒฐํฉํ ๋์
๋๋ค.
@sunnylqm
ํ์ฌ ๋ฌธ์ ๋ .dsx ํ์ผ์์ ์์ ํ๋ ๋๋ฒ๊ฑฐ, ์๋ ์์ฑ ๋ฑ์ผ๋ก ํ๋ฅญํ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด DSX๋ฅผ Flutter ๋๊ตฌ์ ์ ์ ํ๊ฒ ํตํฉํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ repo์ ์ฝ๋๋ฅผ ๋ฃ๋ ๊ฒ์ด ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฌ์ฉ์์๊ฒ DSX๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์ ์๊ฒ๋ ์์ํ๊ธฐ ์ด๋ ค์ด ์ผ์ ๋๋ค. ๋๊ตฐ๊ฐ ๋์์ฃผ๊ณ ์ถ๋ค๋ฉด ๋ด๊ฐ ํ์ํ ๊ฒ์ Dart Tools ๋ฐ VS Code Dart ํ๋ฌ๊ทธ์ธ์ ์์ ํ ์ ์ฒ๋ฆฌ ์ง์(์์ค ๋งต ํฌํจ)์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ผ๋จ ๋๊ตฌ๊ฐ ํด๋น DSX ๋๋ ๋ค๋ฅธ ํธ๋์คํ์ผ๋ง ์ธ์ด(๋ชจ๋ ์ธ์ด Dart์ ์์ ์งํฉ์ด์ง๋ง ๋ชจ๋ ๊ฒ์ Dart๊น์ง ์ปดํ์ผํจ)์ด ์๋ํฉ๋๋ค.
@andrewackerman
๋๋ ์๋ฌด ๊ฒ๋ ์ ๋นํํ ํ์๊ฐ ์์ต๋๋ค. ์ ๋ DSX๊ฐ ํํธํ ๊ฒ์ด๋ผ๊ณ ๋งค์ฐ ํ์ ํ๋ฉฐ ์ด ํฐ์ผ์๋ง ๊ฑฐ์ 100๋ช ์ ์ฌ๋๋ค์ด ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฌ์ ์ฒ๋ฆฌ ๋ฐ ๋๊ตฌ ์ง์ ์์ด DSX๊ฐ ์๋ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์ธ๋ถ ์๋ โโ๋ณํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๊ฑฐ์ณ์ผ ํ๋ ๋ ๋ค๋ฅธ (์ ์ฌ์ ์ผ๋ก ๊ธด) ๋จ๊ณ์ผ ๋ฟ์ ๋๋ค.
DSX ๋ณํ๊ธฐ๋ ๋๋ถ์๊ฒ ๋น ๋ฅด๋ฉฐ .dsx ํ์ผ์ ๊น๋ฐ์ด๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ .dart ํ์ผ๋ก ๋ณํํ ์ ์์ผ๋ฏ๋ก ์๋๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด DSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๋ฅ ํจ๋ฆฌํฐ๋ฅผ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ React๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์์ฅ์์ ์ ์ผํ ํ๋ ์์ํฌ์ ๋๊น? ๋ค์ดํฐ๋ธ ๋ฐ ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ ํ๋ ์์ํฌ๋ ๋ชจ๋ ์คํ ๋ฆฌ๋ณด๋, XML ํ์ผ, XAML ํ์ผ ๋ฐ ๊ธฐํ UI ์ ์ DST๋ฅผ ๊ณ ์ํ๊ณ ์์ต๋๋ค.
ํ์๋ผ์ธ์ ๋ง๋ค๊ธฐ๋ง ํ๋ฉด UI ๊ฐ๋ฐ์ ์งํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํ์ฌ ๋ฐฉ์์ผ๋ก Android ๋ฐ iOS ๊ฐ๋ฐ์ด ์์๋ ์ง 10๋ ์ด ๋์์ผ๋ฏ๋ก 10๋ ๋ ๊ธฐ์ (์์ ํ ๋ช ๋ น์ ์ธ ๊ธฐ์ )์ ์ฌ์ฉํฉ๋๋ค. Reactive UI ๊ฐ๋ฐ(์ ์ธ์ ) ๊ธฐ์ ์ ์ฝ 8๋ ์ ์ ์น์ ๋ฑ์ฅํ๊ธฐ ์์ํ์ต๋๋ค. React๋ 5๋ ์ ์ ๋ฑ์ฅํ์ผ๋ฉฐ JSX์ ๊ธฐ์ ์ ๋งค๋๋ฝ๊ฒ ๊ฒฐํฉํ ์ต์ด์ Reactive ํ๋ ์์ํฌ์์ต๋๋ค. Vue๋ ์ด์ ์ด์ ์ '๊ธฐ์ ๋ถ๋ฆฌ' ๊ธฐ์ ์ ์ง์ํ์ง๋ง JSX๋ ์ง์ํ๋ ์ต์ Reactive ํ๋ ์์ํฌ์ ๋๋ค. ๋ชจ๋ฐ์ผ์์ Flutter๋ ์ต์ ๋ฒ์ ์ด๋ฉฐ React๋ก Reactive ํ๋ ์์ํฌ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉฐ Vue๊ฐ JSX๋ฅผ ํ์ฉํ๋ ๊ฒ์ฒ๋ผ DSX๋ ํ์ฉํ ์ ์์ต๋๋ค. Vue๋ ๊ฐ๋ฐ์์๊ฒ ์ ํ๊ถ์ ์ ๊ณตํ๊ณ ์ง๋์น๊ฒ ๋ ๋จ์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ Angular๋ฅผ ์ฃฝ์ด๊ณ ์์ต๋๋ค.
๋ณ๋์ ํ ํ๋ฆฟ ํ์ผ์ ๋ฌธ์ ๋ ๊ฑฐ๊ธฐ์ ์๋ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ์ฑ(if, for ๋ฃจํ ๋ฑ)์ด ๋น์ฆ๋์ค ๋ ผ๋ฆฌ์ ์ฌ์ฉ๋๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋นํด ๋๋ฌด ์ฝํ๋ค๋ ๊ฒ์ ๋๋ค. JSX๊ฐ ํ๋ ๋ฐฉ์์ผ๋ก 2๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ๋ถ๋ช ํ ๋ฏธ๋์ ๋๋ค.
React ๊ฐ๋ฐ์๋ JSX๊ฐ ๋ฏธ๋์ ๊ธธ์ธ ๊ฒ์ฒ๋ผ ์ด์ผ๊ธฐํฉ๋๋ค.
๊ทธ๊ฒ์ !!!
๊ทธ๋ฌ๋ ์ค์ ๊ฒฌ์ธ๋ ฅ์ ์ป์ ํ๋ ์์ํฌ์์ React ์ด์ธ์ ๋ค๋ฅธ ๊ณณ์์ ํ์ ์ด ํ์๋๋ ๊ฒ์ ์์ง ๋ณด์ง ๋ชปํ์ต๋๋ค.
Vue๋ JSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@cbazza
๋๋ ์๋ฌด ๊ฒ๋ ์ ๋นํํ ํ์๊ฐ ์์ต๋๋ค. ์ ๋ DSX๊ฐ ํํธํ ๊ฒ์ด๋ผ๊ณ ๋งค์ฐ ํ์ ํ๋ฉฐ ์ด ํฐ์ผ์๋ง ๊ฑฐ์ 100๋ช ์ ์ฌ๋๋ค์ด ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ๋ฌด์์ด๋ ์ ๋นํํ ํ์๊ฐ _ํด์ผ_ ํ๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์๋๋๋ค. Flutter ํ์ด ์ด ์ ์์ ์ ํํ๊ณ ์ค์ค๋ก ๊ตฌํํด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ์ ๋, ๋ค, ์ถฉ๋ถํ ์ ๋นํํ ์ ์๋ค๊ณ ๋งํ์ ๊ฒ์ ๋๋ค. ์ด์ ๋น์ ์ด ์ค์ค๋ก ํ๋ ค๊ณ ํ๊ณ ์์ผ๋ฏ๋ก, ๋น์ ์ด ์๊ฐํ๊ธฐ์ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ๋ ์ ๋นํ์ ๋น์ ์๊ฒ ๋ ๋ง์ ํ์ ์ํด ๋น์ ์ด ์ํ๋ ๊ฒ์ ๋ฌด์์ด๋ ํ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ด ์๊ฐํ๋ ๊ฒ๋งํผ ์ฝ๊ฑฐ๋ ์ธ๊ธฐ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ด์ ๋ฅผ ๋งํ ๋ฟ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๋ค์ ๋ฌด์ํ๊ธฐ ์ํด ๋น์ ์ ์ฝํธ์ ๊ณต์ ๋๊ณ ์์ต๋๋ค.
DSX ๋ณํ๊ธฐ๋ ๋๋ถ์๊ฒ ๋น ๋ฅด๋ฉฐ .dsx ํ์ผ์ ๊น๋ฐ์ด๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ .dart ํ์ผ๋ก ๋ณํํ ์ ์์ผ๋ฏ๋ก ์๋๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ฌ๋๋ค์ด DSX๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๋ฅ ํจ๋ฆฌํฐ๋ฅผ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
์ง๊ธ๊น์ง ํฌ๊ธฐ๊ฐ ์์ UI ๋ฐ ์ฑ์์ ํ ์คํธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ค์ํ์ง ์์ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ฃ์ง ์ผ์ด์ค์ ์ํ๋ ๊ฒ๋ค์ ์ด๋ป๊ฒ ๋ฉ๋๊น? ๋ํ ํ๋ก์ธ์ค์ ์์๋๋ ์ค์ ์๊ฐ์ด ์ ์ผํ ๊ด๋ จ ๋ถ๋ถ์ ์๋๋๋ค. ๊ฐ๋ฐ์๊ฐ ๋น๋ํ๊ธฐ ์ ์ ์๋ ์์ ์ ๋ ๋ค๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ ๋ง์ ์ฌ๋๋ค์ด ๊บผ๋ฆฌ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
๋ํ ์์ง ํ๋ก์ ํธ์ ์์ค ์ฝ๋๋ฅผ ์ค์ ๋ก ๊ณต๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋น์ ์ ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด๊ณ ๋ฐ๊ฒฌํ ๋ด์ฉ์ ๋ค์ ํ์ธํ๊ณ ๊ฐ์ ์ฌํญ์ ์ ์ํ ์ ์์์ต๋๋ค. ์ด ์์ ์์ ๋๊ตฌ๋ ํ ์ ์๋ ์ผ์ ํธ๋ฆฌํ๊ณ ์ฑ๋ฅ์ด ์ข๋ค๋ ๋ง์ ๋์ํ๋ ๊ฒ๋ฟ์ ๋๋ค.
Vue๋ JSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ๋ Vue๋ฅผ ๊ฑฐ์ 1๋
๊ฐ๊น์ด ์ฌ์ฉํด ์์ผ๋ฉฐ ๊ทธ ๋์ ๋ค์ํ ์์
์ด ์ํ๋๋ ๋ฐฉ์์ ๋ณด๊ธฐ ์ํด ๋ง์ ์คํ ์์ค ํ๋ก์ ํธ ์ ์ฅ์๋ฅผ ์ดํด๋ณด์์ต๋๋ค. ๋๋ ์ค์ค๋ก๋ฅผ Vue ๋ง์คํฐ๋ผ๊ณ ์๊ฐํ์ง ์์ง๋ง, ๋ด๊ฐ ๋งํ๊ณ ์ ํ๋ ๊ฒ์ ๊ทธ๋ค ์ค ๋จ ํ ๊ณณ์์๋ JSX๊ฐ ์ค์ ๋ก ํ์ฉ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๋๋ค์ .vue
์ ๊ทผ ๋ฐฉ์์ ์์ฒญ๋๊ฒ ์ ํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค(ํ
ํ๋ฆฟ -script-styling) ๋ ๋+JSX ์ ๊ทผ ๋ฐฉ์๋ณด๋ค. ๋๋ Vue๊ฐ Vue ๋ฌธ์๋ฅผ ์กฐ์ฌํ๊ณ ๋ ๋๋ง ๊ธฐ๋ฅ ์น์
์์ ์ด์ ๋ํ ์์ ์ ๋ณด ์กฐ๊ฐ์ ๋ฐ๊ฒฌํ ๋๊น์ง Vue๊ฐ JSX(์ ์ด๋ babel ํ๋ฌ๊ทธ์ธ์ ํตํด)๋ฅผ ์ง์ํ๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ชฐ๋์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋์ ์ ๋ฐ์ ์ธ ์์ ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. Vue๋ ์ฌ์ ํ Javascript ํ๋ ์์ํฌ์ ๋๋ค. Flutter๋ ํ์คํ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Dart+Flutter๋ก ๋ณํ๋์ง ์๋ Javascript ์ค์ฌ ํ๊ฒฝ์์ JSX๋ฅผ ๊ฐ์ฅ ์ต์ ์ ๊ฒ์ผ๋ก ๋ง๋๋ ๋ฐ์๋ ๋ง์ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ค ๋ง์ ๋ถ๋ถ์ด ์ด ์ค๋ ๋์์ ์ด๋ฏธ ๋ค๋ค์ต๋๋ค.
๊ทธ๊ฒ์ !!!
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๊ทธ๊ฒ์ด ์ธ๊ธฐ๋ฅผ ์ป๋ ๊ฒ์ ๋ณผ ๋๊น์ง ๋๋ ์ ์คํ๊ฒ ๋์ํ์ง ์์ ๊ฒ์ ๋๋ค.
Vue๋ JSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Vue ์ง์ ์ ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. JSX๋ "๊ฑฐ๊ธฐ"์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง๋ฐฐ์ ์ธ ๊ตฌ๋ฌธ์ ์๋๋๋ค.
์ํ๋ค๋ฉด JSX๋ฅผ Angular์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฌด๋ ํ์ง ์์ง๋ง
React ๊ฐ๋ฐ์๋ JSX๊ฐ ๋ฏธ๋์ ๊ธธ์ธ ๊ฒ์ฒ๋ผ ์ด์ผ๊ธฐํฉ๋๋ค.
๊ทธ๊ฒ์ !!!
๋ฏธ๋์ ํฐ ํ๋ณด๋ ์น ๊ตฌ์ฑ ์์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Angular ๋๋ Vue์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํ์์์ ์ฐพ์ ์ ์๋ ๊ฒ๊ณผ ์ ์ฌํ html์์ ์ง์ ์ฌ์ฉ๋ฉ๋๋ค.
@andrewackerman
๊ฐ๋ฐ์๊ฐ ๋น๋ํ๊ธฐ ์ ์ ์ง์ ์กฐ์น์ ๋ํ ๋ ๋ค๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ ๋ง์ ์ฌ๋๋ค์ด ๊บผ๋ คํฉ๋๋ค.
๋๊ฐ ์ง์ ์กฐ์น์ ๋ํด ๋ญ๋ผ๊ณ ํ์ต๋๊น? ๋๋ ์์ ํ IDE ํตํฉ(๊ฐ๋ฐ์๋ฅผ ์ํ ์ต์์ ์ฌ์ฉ์ ๊ฒฝํ)์ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์์ ๋ถ๋ช ํ ํ์ง ์์์ต๋๊น?
๋ํ ์์ง ํ๋ก์ ํธ์ ์์ค ์ฝ๋๋ฅผ ์ค์ ๋ก ๊ณต๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ ๋น์ ์ ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด๊ณ ๋ฐ๊ฒฌํ ๋ด์ฉ์ ๋ค์ ํ์ธํ๊ณ ๊ฐ์ ์ฌํญ์ ์ ์ํ ์ ์์์ต๋๋ค.
๊ทธ๊ฒ์ด DSX๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ์ ๋ 2๋ ๋๊ฒ JSX๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์์ค ์ฝ๋์ ๋ํด ๊ทธ๋ค์ง ์ ๊ฒฝ์ ์ฐ์ง ์์์ต๋๋ค. Dart์์ ํ๋ก๊ทธ๋๋ฐํ๋ ค๋ฉด Dart ์ปดํ์ผ๋ฌ์ ์์ค ์ฝ๋๋ฅผ ๋ด์ผ ํฉ๋๊น?
๋ด๊ฐ ๋งํ๋ ค๋ ๊ฒ์ ๊ทธ๋ค ์ค ๋จ ํ ๊ณณ์์๋ JSX๊ฐ ์ค์ ๋ก ํ์ฉ๋๋ ๊ฒ์ ๋ณธ ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ ๋ ๋+JSX ์ ๊ทผ ๋ฐฉ์๋ณด๋ค .vue ์ ๊ทผ ๋ฐฉ์(ํ ํ๋ฆฟ ์คํฌ๋ฆฝํธ ์คํ์ผ ์ง์ )์ ํจ์ฌ ๋ ์ ํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
JSX๋ ์๋ก ์ถ๊ฐ๋ ๊ฒ์ด๋ฏ๋ก ํผ๋จ๋ฆฌ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง ์ค์ํ ์ ์ Vue์์ ๊ฐ๋ฐ์๊ฐ Vue์์ ์ํํด์ผ ํ๋ '์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ๊ณผ ์ ์ผํ ๋ฐฉ๋ฒ'์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ์ง ์๊ณ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
Vue๋ ์ฌ์ ํ Javascript ํ๋ ์์ํฌ์ ๋๋ค. Flutter๋ ํ์คํ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ฐ๋ผ์ JSX ๋์ Flutter์ ํจ๊ป DSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@rrousselGit
๋ฏธ๋์ ํฐ ํ๋ณด๋ ์น ๊ตฌ์ฑ ์์์ ๋๋ค.
์น ๊ตฌ์ฑ ์์๋ ์ฃฝ์์ง๋ง ์ฌ์ ํ ๊ฑท๊ณ ์๋ ๋๋ฌผ์์
๋๋ค. ๊ทธ๋ค์ ์บ๋๋ค์์ ์บฅ๊ฑฐ๋ฃจ๋งํผ ๋๋ฆฌ ํผ์ ธ ์์ต๋๋ค. ๋๋ ๋ฉฐ์น ๋์ ๊ณ์ํ ์ ์์ง๋ง ํ์ ์ ํผํ๊ธฐ ์ํด ...
https://dmitriid.com/blog/2017/03/the-broken-promise-of-web-components/
@cbazza
๋๊ฐ ์ง์ ์กฐ์น์ ๋ํด ๋ญ๋ผ๊ณ ํ์ต๋๊น? ๋๋ ์์ ํ IDE ํตํฉ(๊ฐ๋ฐ์๋ฅผ ์ํ ์ต์์ ์ฌ์ฉ์ ๊ฒฝํ)์ ์ป์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์์ ๋ถ๋ช ํ ํ์ง ์์์ต๋๊น?
๋ํ ์ด๋ฅผ ์ํด์๋ Flutter/Dart ํ์ ์ ์ฒ๋ฆฌ ์ง์์ด ํ์ํ๋ค๊ณ ๋ง์ํ์ จ์ต๋๋ค. ๋ด๊ฐ ์๋ชป ์๊ณ ์์ต๋๊น?
๊ทธ๊ฒ์ด DSX๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค๊ณผ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ์ ๋ 2๋ ๋๊ฒ JSX๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ์์ค ์ฝ๋์ ๋ํด ๊ทธ๋ค์ง ์ ๊ฒฝ์ ์ฐ์ง ์์์ต๋๋ค.
JSX๋ Facebook์์ React์ฉ์ผ๋ก ๊ฐ๋ฐํ์ผ๋ฉฐ ์๊ฒฉํ ์ ์/์ค๊ณ/๊ตฌํ/๋ฐ๋ณต ํ๋ก์ธ์ค๋ฅผ ๊ฑฐ์น ํ ์์ ๋ค์ด๊ฐ๊ธฐ ๋ช ๋ ์ ์ ์ธ์์ ์ถ์๋์์ต๋๋ค. ์ค์ ํ๊ฒฝ์์ ์๊ฒฉํ๊ฒ ํ ์คํธ๋๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฆ๋์์ต๋๋ค. ์ฑ์ํ ๊ธฐ์ ์ ๋๋ค. ๊ทธ๋ฐ ๊ฒ์ ๋ํ ์ฌ์ ์ํธ๋ฅผ ๋ณผ ๊ฒ์ ์๊ตฌํ ์ด์ ๊ฐ ์์ต๋๋ค.
๋ฐ๋ฉด์ DSX๋ ์ค๋๋ ๋น์ ๊ณผ ์์์ ์ฌ๋๋ค์ ์ํด ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ๋น์ ์ ๊ทธ๊ฒ์ด ๋ฌด์์ ํ ์ ์๊ณ ๋ฌด์์ ํ ์ ์์์ง์ ๋ํด ์ค๋๋ ฅ ์๊ฒ ์ค๋ช ํ์ง๋ง ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ _๋ณธ_ ๊ฒ์ ์์์ ํน์ ๋ชฉ์ ์ฝ๋ ์ค๋ํซ๊ณผ ๊ทธ๊ฒ๋ค์ด ํธ๋์คํ์ผ๋ฌ์ ์ํด ์์ฑ๋์๋ค๋ ๊ทํ์ ๋ง๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ์๋ํ๊ณ ๊ฐ๋ฅํ ๋ณ๊ฒฝ์ด๋ ๊ฐ์ ์ฌํญ์ ์ ์ํ๊ณ ์ถ์ดํ๋ ์ฌ๋๋ค์ ๊ทธ๋ ๊ฒ ํ ์ ์์ผ๋ฏ๋ก "Yay JSX!" ์ด์์ ๋ ธ๋ ฅ์ ์ง์ํ ์ด์ ๊ฐ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ๊ฑฐ์ง๋ง์ ํ๊ฑฐ๋ ๋ค๋ฅธ ๊ฒ์ ๋น๋ํ๋ ๊ฒ์ด ์๋๋ผ ๋จ์ง JSX๊ฐ DSX๊ฐ ๊ฐ์ง์ง ๋ชปํ ์์ค์ ๋ฏฟ์์ ์ป์๋ค๊ณ ๋งํ๋ ๊ฒ๋ฟ์ ๋๋ค. ๊ทธ๋์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ง์ง์๊ฑฐ๋ฆฌ๊ฒ ํ์ง ์๋๋ค๋ฉด ์ด๋ป๊ฒ ๊ณ ๊ฐ๋ฅผ ๋๋ฆด ๊ฒ์ ๋๊น?
JSX๋ ์๋ก ์ถ๊ฐ๋ ๊ฒ์ด๋ฏ๋ก ํผ๋จ๋ฆฌ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง ์ค์ํ ์ ์ Vue์์ ๊ฐ๋ฐ์๊ฐ Vue์์ ์ํํด์ผ ํ๋ '์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ๊ณผ ์ ์ผํ ๋ฐฉ๋ฒ'์ ์ฌ์ฉํ๋๋ก ๊ฐ์ํ์ง ์๊ณ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์์ฉํ๋ค๋ ๊ฒ์ ๋๋ค.
JSX๋ ๊ฑฐ์ 2๋ ๋์ Vue์ ์์์ต๋๋ค. Vue ์์ฒด์ ๋ฌ๋ฆฌ JSX๋ ํนํ React์ ์ต์ํ ์ฌ๋๋ค์๊ฒ ์๊ฐ๊ฐ ํ์ ์๋ ๊ธฐ์กด ๊ธฐ์ ์ ๋๋ค. JSX๊ฐ Vue.js ์ธ๊ณ๋ฅผ ํญํ์ผ๋ก ๋ชฐ์๋ฃ์ ์์ ์ด๋ผ๋ฉด ์ง๊ธ์ฏค์ด๋ฉด ๊ทธ๋ ๊ฒ ํ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ ์ ์์ต๋๋ค. (ํนํ ๋น์ ์ด ์ฃผ์ฅํ๋ ๊ฒ์ฒ๋ผ ๋ง์ ์ฌ๋๋ค์ด Flutter์์ JSX๋ฅผ ์๊ตฌํ๊ณ ์๋ค๋ ์งํ๋ผ๋ฉด ๋์ฑ ๊ทธ๋ ์ต๋๋ค.)
๋ฐ๋ผ์ JSX ๋์ Flutter์ ํจ๊ป DSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
JSX์ DSX๋ ๋์ผํ ๊ตฌ๋ฌธ ๊ฐ๋ ์ ๋๋ค. ๋ฌธ์ ๋ JSX๊ฐ JavaScript์ ๊ฐ์ ์ฝํ ์ ํ์ ๋์ ์ธ์ด์ ๊ตฌ์ถ๋ ๋ฐ๋ฉด DSX๋ Dart์ ๊ฐ์ ๊ฐ๋ ฅํ ์ ํ์ ์ ์ ์ธ์ด์ ๊ตฌ์ถ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ํ์ "JSX for Flutter" ๊ตฌํ์ด ์๋ ๋ค๋ฅธ ์ด๋ค ๊ฒ์ด๋ JSX๊ฐ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค๋ ์ ์ DSX๊ฐ ์ค๋ช ํด์ผ ํ๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ DSX๊ฐ ์ค์ ๋ก ์๋ํ๋ ค๋ฉด ๋ช ๊ฐ์ง _๋ ์ฐฝ์ ์ธ_ ์์ ์ด ํ์ํฉ๋๋ค. ์๊ฐ์ ์ผ๋ก ๋ ๊ฐ๊ฒฐํ๋ค๋ ์ฃผ์ฅ์ ์ ๋นํํ๊ธฐ์๋ ๋๋ฌด ๋ถํ๋ ค์ง์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ "DSX๋ ๋จ์ง Dart์ ๋๋ค. DSX๊ฐ ๋ญ๊ฐ๋ฅผ ํ ์ ์๋ค๋ฉด Dart๋ฅผ ์ฌ์ฉํ์ญ์์ค"๋ผ๋ ๋ฐ๋ฐ์ ๋ค๋ฃจ๊ธฐ ์ํด DSX๊ฐ ํ์ง ์๋ ์๋๋ฆฌ์ค์ ์ง๋ฉดํ ๋๋ง๋ค Dart๋ก ๊ณ์ ๋์๊ฐ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ํญ์ Dart๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ๊น์?
๊ทธ๋ฆฌ๊ณ "์ํ๋ค๋ฉด ํ ์ ์์ต๋๋ค. DSX๋ ํ๋์ ์ต์ ์ผ ๋ฟ์ ๋๋ค"๋ผ๋ ๋ฐ๋ก ์ ๋ค๋ฃจ๊ธฐ ์ํด, ๋น์ ์ ์ ๋ง๋ก ์์ ์ ๊ณผ์ํ๊ฐํ๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ ๋ง๋ก "์ต์ "์ด ๋๋๋ผ๋ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ก ์ค๋ํ ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ด๋ธ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. DSX๋ JSX๊ฐ ์๋๋ฏ๋ก JSX๋ง ์ํ๋ ์ฌ๋๋ค์ ์ํ๋ ๊ฒ์ ์ป์ง ๋ชปํ ๊ฒ์ด๋ผ๊ณ ์ค์ค๋ก ๋ง์ํ์ จ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ "JSX์ ๊ฐ์ ๋งค๋ ฅ"์ ๋์ด์ ๋ช ๊ฐ์ง ํ์คํ ์ด์ ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์ ์ด ์ฌ์ฉํ๊ณ ์ถ์ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํ๋ ์ค์ด๋ผ๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ๋ฌด์๋ฏธํด์ง๊ณ ๋ฏธ์ณ๋ฒ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋๋ก ์๋ํ ๊ฒ์ ์ค์ ๋ก ๊ตฌ์ถํ๊ณ ์๋ค๋ฉด, ์ ๊ทธ๋ค์ด ๊ทธ๋์ผ ํ๋ค๊ณ ์๊ฐํ๋์ง ํ๊ณ ํ ํ์์ผ๋ก ๋ฃ์ด์ผ ํฉ๋๋ค.
์น ๊ตฌ์ฑ ์์๋ ์ฃฝ์์ง๋ง ์ฌ์ ํ ๊ฑท๊ณ ์๋ ๋๋ฌผ์์ ๋๋ค. ๊ทธ๋ค์ ์บ๋๋ค์์ ์บฅ๊ฑฐ๋ฃจ๋งํผ ๋๋ฆฌ ํผ์ ธ ์์ต๋๋ค. ๋๋ ๋ฉฐ์น ๋์ ๊ณ์ํ ์ ์์ง๋ง ํ์ ์ ํผํ๊ธฐ ์ํด ...
๋ค์ ์ฃผ์ ์์ ๋ฒ์ด๋์ง๋ง ์น ๊ตฌ์ฑ ์์์ ๋ํ ์ง์์ด tar๋ณด๋ค ๋๋ฆฌ๊ฒ ์ถ๊ฐ๋๋๋ผ๋ ์น ๊ตฌ์ฑ ์์๋ ๋ฏธ๋์ ๋ํ ์ ๋งํ ๋ชจ์ต์ด๋ผ๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ ๊ฒ ์๊ฐํด ๋ณด์ธ์. React๋ ๊ธฐ๋ณธ์ ์ผ๋ก Javascript ์ ์ฉ ์น ๊ตฌ์ฑ ์์ ์์ด๋์ด๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ํํ๋ ์์ ์ ์ํํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๊ณ ์๋๋ฐ์ฑ๋์ง ์์ ์ฑ๋ฅ์ ์ด์ ์ ๋๋ฆฌ๊ณ DOM ์กฐ์์ ํตํด ์๋ํ์ง ์์๋ ๋๋ค๋ฉด ์ผ๋ง๋ ๋ ์ข์์ง ์์ํด ๋ณด์ญ์์ค. (์๊ธฐ๊น์ง 20๋ ์ ๋ ๊ฑธ๋ฆด ์๋ ์์ง๋ง ์ฌ์ ํ...)
@andrewackerman
๋ฏธ์ ์น๊ตฌ์ผ ๋๋ ๋์์ด ๋ ผ์ํ๊ณ ๋ด๊ฐ ์ ์ ๋งํ ๊ฒ์ ๊ณ์ํด์ ๋ฐ๋ณตํ ์๊ฐ์ด ์๋ค. ์ด์จ๋ ์ฐ๋ฆฌ๋ ํฉ์๋ก ๋๋์ง ์์ ๊ฒ์ด๋ฏ๋ก ๊ทํ์ FLUI์ ํ์ด์ ๋น๋๋ค.
๋น์ ์ ๊ทธ๊ฒ์ด ๋ฌด์์ ํ ์ ์๊ณ ๋ฌด์์ ํ ์ ์์์ง์ ๋ํด ์ค๋๋ ฅ ์๊ฒ ์ค๋ช ํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ๋ณธ ๊ฒ์ ์์์ ํน์ ๋ชฉ์ ์ฝ๋ ์ค๋ํซ๊ณผ ํธ๋์คํ์ผ๋ฌ์ ์ํด ์์ฑ๋์๋ค๋ ๊ทํ์ ๋ง์๋ฟ์ ๋๋ค.
์จ๋ผ์ธ DSX ํธ๋์คํ์ผ๋ฌ๋ 2018๋
2์๋ถํฐ ์ฌ์ฉ ์ค์ด๋ฉฐ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ด ๋ง์ ๋ฐ๋ฅผ ํ์๊ฐ ์์ต๋๋ค. '์ปดํ์ผ'์ ๋๋ฅด๋ฉด ์ผ์ชฝ ํจ๋์ ์์ฑ๋ ๋ด์ฉ์ ์ปดํ์ผํ๊ณ ์ค๋ฅธ์ชฝ ํจ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ๋๋ฒ๊ฑฐ๋ฅผ ์ด๋ฉด AST๊ฐ ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
https://spark-heroku-dsx.herokuapp.com/index.html
๋ฌธ์ ๋ JSX๊ฐ JavaScript์ ๊ฐ์ ์ฝํ ์ ํ์ ๋์ ์ธ์ด์ ๊ตฌ์ถ๋ ๋ฐ๋ฉด DSX๋ Dart์ ๊ฐ์ ๊ฐ๋ ฅํ ์ ํ์ ์ ์ ์ธ์ด์ ๊ตฌ์ถ๋๋ค๋ ๊ฒ์ ๋๋ค.
OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ) ๊ฐ๋ ๋ฐ 'ํด๋์ค' ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ด ํฐ ์ฐจ์ด๋ ์์ต๋๋ค. ์ ํ์ด ์๋ Javascript ๋๋ ์ ํ์ด ์ง์ ๋ Dart์์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. 'if' ๋ฌธ, 'for' ๋ฌธ ๋ฑ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์ฌ์ ํ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ก ์ค๋ํ ๋ฌด์ธ๊ฐ๋ฅผ ํ ์ด๋ธ์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค.
๋ถ๋ช ํ ์ด ํฐ์ผ์ 100๋ช ์๊ฒ ์ด๋ฏธ ์ ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค 100๋ฐฐ ๋ ํฝ๋๋ค. ๋์๊ฒ ์ถฉ๋ถํ ์ข๋ค.
@cbazza
๋ฏธ์ ์น๊ตฌ์ผ ๋๋ ๋์์ด ๋ ผ์ํ๊ณ ๋ด๊ฐ ์ ์ ๋งํ ๊ฒ์ ๊ณ์ํด์ ๋ฐ๋ณตํ ์๊ฐ์ด ์๋ค. ์ด์จ๋ ์ฐ๋ฆฌ๋ ํฉ์๋ก ๋๋์ง ์์ ๊ฒ์ด๋ฏ๋ก ๊ทํ์ FLUI์ ํ์ด์ ๋น๋๋ค.
๋๋ ๋จ์ง ๋ ผ์์ ์ํด ๋๋ ๋ฟ๋ฆฌ๊น์ ๋ฐ JSX ํธ๊ฒฌ ๋๋ฌธ์ ๋น์ ๊ณผ ๋ ผ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ๋๋ ๋น์ ์ด ๋๋ตํด์ผ ํ ์ง๋ฌธ์ ๋๋ตํ๋๋ก ํ๋ ค๊ณ ํฉ๋๋ค. ๋น์ ์ ์๋ง๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋๋ก ์๋ํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ง๋ง ์ฌ์ ํ "์ต์ํจ"๊ณผ "๋ ์ข๊ธฐ ๋๋ฌธ์"๋ผ๋ ๋ชจํธํ๊ณ ์ฃผ๊ด์ ์ธ ์ด์ ์ ๋์ด์ ์ฌ์ฉํด์ผ ํ๋ ์ค๋๋ ฅ ์๋ ์ด์ ๋ฅผ ์ ์ํ์ง ์์์ต๋๋ค. ์์ ๋งํ๋ฏ์ด ์ ์๊ฐ ๋ฐ๋์ ์ข์ ๊ฒ์ ์๋๋ฉฐ ํ์๋ ์์ง๊น์ง ์ค์ง์ ์ธ ๊ทผ๊ฑฐ๊ฐ ์๋ ์ฃผ์ฅ์ ๋๋ค.
๋น์ ์ ๋๊ตฌ๊ฐ ์ฑ๊ณตํ๊ธฐ๋ฅผ ๋ฐ๋๋ค๋ฉด ๋น์ ์ด ํ๋ ์ผ๊ณผ ๊ทธ ์ผ์ ํ๋ ์ด์ ๋ฅผ ๋ช ํํ ํด์ผ ํ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ฝ๊ฒ ์ ๋ฌํ ์ ์๋ ๋ฐฉ์์ผ๋ก ํด์ผ ํฉ๋๋ค. _๋ชจ๋๊ฐ ์ข์ํ ๋๊น์ง ์ ํ์ ๋ง๋ค ์ ์๋ค๋ ๋ง์ ์๋์ง๋ง ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ชฉํ๋ ๋์์ธ ๋ฐ ๊ตฌํ์ ํ์ฑํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๊ปํด์ผ ํ์ ์ ํ์ด ๋ ๋ฐฉํฅ ์๋ ์ ํธ๋ฆฌํฐ๋ก ๋๋ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ด ์ด๋ค ๊ท๋ชจ์ ํ๋ก๋์ ์ฝ๋๋ก ๋๋ ๊ฒฝ์ฐ ๋งค์ฐ ์ด์ด ์ข์ ๊ฒ์ ๋๋ค.
์จ๋ผ์ธ DSX ํธ๋์คํ์ผ๋ฌ๋ 2018๋ 2์๋ถํฐ ์ฌ์ฉ ์ค์ด๋ฉฐ ๋๊ตฌ๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ด ๋ง์ ๋ฐ๋ฅผ ํ์๊ฐ ์์ต๋๋ค. '์ปดํ์ผ'์ ๋๋ฅด๋ฉด ์ผ์ชฝ ํจ๋์ ์์ฑ๋ ๋ด์ฉ์ ์ปดํ์ผํ๊ณ ์ค๋ฅธ์ชฝ ํจ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ๋๋ฒ๊ฑฐ๋ฅผ ์ด๋ฉด AST๊ฐ ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ๋งํฌ๊ฐ ์ค์ ์ฌ๋ก๋ผ๋ ๊ฒ์ ๋ณด์ง๋ ๋ชปํ์ต๋๋ค. ๋๋ ์ ์ herokuapp์ ์ฌ์ฉํ ์ ์ด ์์ผ๋ฉฐ ๊ทธ๊ฒ์ ๋จ์ง ์์ง์ ๊ฐ์ ๊ฒ์ฒ๋ผ ๋ณด์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ๋์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค. :ํผ
(์จ๋ผ์ธ ์๋๋ฐ์ค๋ฅผ ์์ ํ๋ ๊ฒ์ด ๋ณด๋ค ์ค์ฉ์ ์ธ ํ๊ฒฝ์์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ํ ์คํธํ๋ ๊ฒ๊ณผ ๊ฐ์ง ์์์ ์ง์ ํ๊ฒ ์ต๋๋ค.)
OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ) ๊ฐ๋ ๋ฐ 'ํด๋์ค' ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ด ํฐ ์ฐจ์ด๋ ์์ต๋๋ค. ์ ํ์ด ์๋ Javascript ๋๋ ์ ํ์ด ์ง์ ๋ Dart์์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. 'if' ๋ฌธ, 'for' ๋ฌธ ๋ฑ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
๋น์ ์ ์ด๋ฏธ child strong-typing ์์ ์ด๋ฌํ ์ฐจ์ด์ ์ ๋ค๋ฃจ์ด์ผ ํ์ต๋๋ค. ์์ฑ ๊ฐํ์ ์ด๋ป์ต๋๊น? ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ฏ์ ์ด๋ป์ต๋๊น? ๋๊ตฐ๊ฐ๊ฐ ๋ ๊ฐ ์ด์์ ์ด๋ฆ ์๋ ์์น ์ธ์๋ก ์์ ฏ์ ๋ง๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ฐ์ ์ด๋ฆ์ ์์ ฏ์ด ์๋ ๋ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? Javascript์ Dart์ ๊ฐ์ ์์คํ ๊ฐ์ ๊ณ ์ ํ ์ฐจ์ด์ ์ ์ถ๊ฐ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ํ์ ์ผ๋ก ์๊ฐํ์ง ์์ ์ผ๋ถ ์๋๋ฆฌ์ค์์ ์ด๋ค ์ผ์ด ๋ฐ์ํฉ๋๊น? ์ด ํ ๋ก ํฌ์ธํธ์ ๋ํด ๋๋ฌด ๊ฒฝ์ํ ํ๋๋ฅผ ๋ณด์ฌ ์ค์ ํ๊ฒฝ์์ DSX์ ์๋ช ์ ๋ํด ๊ฑฑ์ ํ๊ฒ ๋ง๋ญ๋๋ค.
๋ถ๋ช ํ ์ด ํฐ์ผ์ 100๋ช ์๊ฒ ์ด๋ฏธ ์ ์ฉ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ด๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค 100๋ฐฐ ๋ ํฝ๋๋ค. ๋์๊ฒ ์ถฉ๋ถํ ์ข๋ค.
๋ค์ ๋งํ์ง๋ง, "๋คํธ ์ฝ๋ ๋ด์์ JSX์ ์ ์ฌํ ๊ตฌ๋ฌธ์ ๊ณ ๋ คํ์ญ์์ค"๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด ๋ฌธ์ ์ ์ฐฌ์ฑํ๋ฅผ ๋์ง ์ฌ๋์ 100๋ช ์ ๋๋ค. ๊ทธ๋ค์ _JSX_๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ฐฌ์ฑํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ง์ ํ๊ณ ์ถ์ดํ๋ ๊ฒ์ฒ๋ผ DSX๋ JSX๊ฐ ์๋๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๊ทธ๋ค์ด DSX๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ ๊น์? ์ธ๋ผ์ธ XML๊ณผ ๊ฐ์ UI ์ ์ธ์ด "๋ฏธ๋"์ด๊ธฐ ๋๋ฌธ์? ๋ค์ ๋งํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ Vue์์ JSX๋ฅผ ๋ค๋ฃจ์ง ์๊ณ ์์ง๋ง ๋งํฌํ Web Components ๊ธฐ์ฌ์์ ์ธ๊ธํ ๋ ๊ฐ์ง React ๋์์ธ Inferno์ Preact๋ ์์ต๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๋ ๋ค ๊ธฐ๋ณธ์ ์ผ๋ก JSX์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ง์ํจ์๋ ๋ถ๊ตฌํ๊ณ JS ๊ธฐ๋ฐ ์น ์ฑ ๊ฐ๋ฐ ์ธ๊ณ์์ ์ด๋ค ์ข ๋ฅ์ ํ๋๋ ๋ง๋ค์ง ๋ชปํ์ต๋๋ค. ๋๋ ์ ๋ง๋ก ์ฌ๋๋ค์ด React์์ JSX๋ฅผ ์ข์ํ๋ _์ ํํ ์ด์ _์ ๋ํด ๊ธธ๊ณ ์ด์ฌํ ์ดํด๋ณผ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ ๊ณ์ ์์ JSX ์์ฒด ๋๋ฌธ์ด ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค. _๊ทธ_ ์ง๋ฌธ์ ๋ตํ ์ ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ณณ์์ ์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ ํ๋์ผ์ํ์ธํ๋ ๊ฒ๋ณด๋ค "๋ฏธ๋" ํ์ ์ ํฅํด ๋์๊ฐ ์ ์์ต๋๋ค.
์ด ํ ๋ก ์ ํฌ์ํ ์๋์ง์ ์๊ณผ ํ์ฌ ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์๋์ง ์๊ฐํ๋ฉด ์คํ๋ ค ์ํ๊น์ต๋๋ค.
@andrewackerman
๋ฌธ์ ๋ JSX๊ฐ JavaScript์ ๊ฐ์ ์ฝํ ์ ํ์ ๋์ ์ธ์ด์ ๊ตฌ์ถ๋ ๋ฐ๋ฉด DSX๋ Dart์ ๊ฐ์ ๊ฐ๋ ฅํ ์ ํ์ ์ ์ ์ธ์ด์ ๊ตฌ์ถ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ฃ์กํ์ง๋ง ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ ์ธ์๋ TypeScript์ ํจ๊ป JSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@escamoteur ์ ๋์ ์ผ๋ก!
@escamoteur ์ด ๋ฌธ์ ์ ๋ํด ํจ๊ปํ๊ฒ ์ต๋๋ค. _100._
@๋ฒ ์๋ ธํ
์ฃ์กํ์ง๋ง ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด๊ฒ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ ์ธ์๋ TypeScript์ ํจ๊ป JSX๋ฅผ ์ฌ์ฉํฉ๋๋ค.
React๋ TypeScript์ฉ์ผ๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ฉ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ชจ๋ ์์ ฏ ์ ์, ์์ฑ, ์์ฑ ๋ฐ ๊ธฐํ ๋ชจ๋ ๊ฒ์ JavaScript์ ๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก TypeScript์ ์ ํ ์์ ์ฑ์ JSX๊ฐ React์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ์๋ก์ด ์์๋ฅผ ๋์ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ JSX๊ฐ Flutter์ ์์ ํ ๋ค๋ฅธ ์ค์ ์ ์ํด ์ด๋ป๊ฒ ์ค๊ณ๋์๋์ง์ ๋ํ ๋ ๋ค๋ฅธ ์์ ๋๋ค.
@andrewackerman
๊ทธ๊ฒ์ด ์ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๊น? JSX๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๋ช
ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ทธ ์์ฒด๋ก ์ธ์ด ๋ถ๊ฐ์ง๋ก ์
๋๋ค. ์ฌ๊ธฐ ๋ด . ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋๋๋ค. ํ์ง๋ง ์ JSX๋ก ํ ์ ์์ต๋๊น? (๊ฒ๋ค๊ฐ (์์ง) ๊ตฌํ๋์ง ์์)
๊ทธ๋ฆฌ๊ณ .. ์์๋ค์ํผ... ํ๋ฆ๋ fb์์ ๋์ต๋๋ค.
Flow๋ JavaScript์ฉ ์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ์ ๋๋ค.
ํ ๋ฒ๋ ์ฌ์ฉํ์ง ์์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋ํ ์ฐฌ๋ฐ ๋ ผ์์ ์ค๋จํ์ญ์์ค. ๋๋ JSX๋ฅผ ๋งค์ผ ์ฌ์ฉํ๊ณ ATM์ ๋ง์กฑํ์ง๋ง ๊ทธ๊ฒ์ ๋ํด ๋งค์ฐ ํ์์ ์ ๋๋ค. JSX๊ฐ AngularJS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ํจํด์ผ๋ก ๋ฐ์ ํ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์ฃผ์ ๊ฐ ๋ ๋์ Dart ํจํด์ ์ฐพ๋ ๋ฐ ๋์์ด ๋ ๊น์? DSX๋ ํ๋์ ์ ์์ผ ๋ฟ์ ๋๋ค. ์์ ๋น๋ ํจํด ์์ ๋๋ ์ฌ๊ธฐ์ ์ ์๋ ๋ค๋ฅธ ์ธ์ด ์กฐ์ ์ ๋ณด์ญ์์ค. ๊ทธ๋ฆฌ๊ณ , ์๋ง๋ ๋ ๊ฐ ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ผ๊น์? ๋ชจ๋ฅด๊ฒ ์ด์. ํ์ง๋ง ๋จ์ ์ ์์์ ์ ์ข์ ์ ์ ๋ ผํ๊ธฐ ๋ณด๋ค๋ ๊ทธ๊ฒ์ ์ฐพ์ ์๋ก์ ์ ์์ ๊ฐ์ ํ ์ ์๋๋ก ๋์์๋ค.
๋๋ ์ด ์ฃผ์ ๋ฅผ ๋ซ๊ณ ์ ํ๋ ๋ํ๋ก ์๋ก์ด ์ฐ์ฐ ์ฃผ์ ๋ฅผ ์ด ๊ฒ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ชจ๋ ์ ์, flutter ์ฌ์ฉ ๋ฐฉ๋ฒ, ์ฌ๋๊ณผ ๋ฏธ์ ์์ด ๊ฐ๊ด์ ์ผ๋ก ์์ ์ ์ฃผ์ ์ ๋ํด ํ ๋ก ํฉ๋๋ค.
์, ์ฌ๊ธฐ์ ์๋ ์ฆ์ค์ ์์ด ์ด๋ง์ด๋งํฉ๋๋ค. ๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
3587๊ฐ์ ๊ณต๊ฐ ํฐ์ผ์ด ์์ต๋๋ค. "์ข์์"๋ก ์ ๋ ฌํ๋ฉด ์ป์ ์ ์์ต๋๋ค.
1(์ด๊ฒ์) 57 "์ซ์ด์"
3586(๊ธฐํ ํฐ์ผ) 1๊ฐ ์ดํ์ "์ถ์ฒ"
@๋ฒ ์๋ ธํ
๊ทธ๊ฒ์ด ์ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๊น? JSX๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ ์์ฒด๋ก ์ธ์ด ๋ถ๊ฐ์ง๋ก ์ ๋๋ค. ์ด๋ด. ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์๋๋๋ค. ํ์ง๋ง ์ JSX๋ก ํ ์ ์์ต๋๊น? (๊ฒ๋ค๊ฐ (์์ง) ๊ตฌํ๋์ง ์์)
์ด๊ฒ์ _Javascript_์์ UI๋ฅผ ์ค๋ช ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค(๋ฐ๋ผ์ ์ด๋ฆ์ "JS" ๋ถ๋ถ). ๊ทธ๋ฆฌ๊ณ ์๋์ค, ์ธ๋ผ์ธ DSL์ด๊ธฐ ๋๋ฌธ์ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง _์์ต๋๋ค_. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๋ค๊ณ ํด๋ ์ฌ์ ํ "๋ ๋์ ์ ํ"์ด ๋์ง๋ ์์ต๋๋ค. ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ DSL์ด ๋ง์ด ์๊ธฐ ๋๋ฌธ์ UI ์ ์ธ์ ๋น์ฐธํ๊ฒ ๋ถ์ ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ .. ์์๋ค์ํผ... ํ๋ฆ๋ fb์์ ๋์ต๋๋ค.
Flow๋ TypeScript์ ๊ฐ์ต๋๋ค. Javascript์ฉ ์ ์ ์ ํ ๊ฒ์ฌ ์์คํ ์ ๋๋ค. React ๋๊ตฌ๊ฐ ์๋๋ฉฐ React์ ํจ๊ป ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ง๋ ์์์ต๋๋ค. React๋ ๋ฌด์๋ณด๋ค๋ Javascript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ JSX๋ React์ ํจ๊ป ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. React ๊ฐ๋ฐ์ ๋์ ๋ ๋ณด์กฐ ๋๊ตฌ์ ์ ํธ๋ฆฌํฐ๋ ๊ถ๊ทน์ ์ผ๋ก React+JSX ์ํธ ์ด์ฉ์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
ํ ๋ฒ๋ ์ฌ์ฉํ์ง ์์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋ํ ์ฐฌ๋ฐ ๋ ผ์์ ์ค๋จํ์ญ์์ค. ๋๋ JSX๋ฅผ ๋งค์ผ ์ฌ์ฉํ๊ณ ๊ทธ๊ฒ์ ๋ํด ๋งค์ฐ ํ์์ ์ด์์ง๋ง ATM์ ๋ง์กฑํฉ๋๋ค. JSX๊ฐ AngularJS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ํจํด์ผ๋ก ๋ฐ์ ํ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค.
๋๋ JSX๋ฅผ ์ฌ์ฉํด ์์ผ๋ฉฐ ๊ทธ๊ฒ์ ๋ํ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ด ์์ง๋ง ์๋์ ์ผ๋ก ์ด๋ฌํ ์๊ฒฌ์ ์ด ํ ๋ก ์์ ์ ์ธํ์ต๋๋ค. ์ฌ์ค, ๋ด ์ด์ ๋๊ธ์ ์ฝ์๋ค๋ฉด ๋ด๊ฐ React์ UI ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผํจ JSX๋ฅผ ์นญ์ฐฌํ๋ค๋ ๊ฒ์ ์ ์ ์์ ๊ฒ์ ๋๋ค. JSX ์ ์ฒด์ ์์ฅ ์นจํฌ์ ๋ํด ๋ด๊ฐ ํ๋ ์ฝ๊ฐ์ ์ ์ ์ ์ธ ์๊ฒฌ ์ธ์, ๋ด ์ฃผ์ฅ์ ํนํ _in Flutter_์์ JSX์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ฃผ์ ์ ๊ดํด์๋ DSX์ ํจ๋ฅ์ ํ๋จํ ์ค์ง์ ์ธ ๊ทผ๊ฑฐ๊ฐ ์์ผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ JSX๊ฐ ๋ค๋ฅธ ๊ณณ์์ ์ด๋ป๊ฒ ๊ตฌํ๋์๋์ง ์กฐ์ฌํ๋ ๊ฒ๋ฟ์ ๋๋ค.
๋ฌผ๋ก DSX๋ฅผ ๋งค์ผ ์ฌ์ฉํ๊ณ ์๊ณ Flutter์์ DSX๋ฅผ ์ฌ์ฉํ ๋์ ์ค์ง์ ์ธ ์ด์ ์ ์๋ ค์ค ์ ์๋ค๋ฉด?
๊ทธ๋ฆฌ๊ณ ์ด ์ฃผ์ ๊ฐ ๋ ๋์ Dart ํจํด์ ์ฐพ๋ ๋ฐ ๋์์ด ๋ ๊น์? DSX๋ ํ๋์ ์ ์์ผ ๋ฟ์ ๋๋ค. ์์ ๋น๋ ํจํด ์์ ๋๋ ์ฌ๊ธฐ์ ์ ์๋ ๋ค๋ฅธ ์ธ์ด ์กฐ์ ์ ๋ณด์ญ์์ค. ๊ทธ๋ฆฌ๊ณ , ์ด์ฉ๋ฉด ๋ ๊ฐ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ผ๊น์? ๋ชจ๋ฅด๊ฒ ์ด์. ๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ฌ๋์ ์ ์์์ ๋์ ์ ์ ๋ํด ํ ๋ก ํ๊ธฐ ๋ณด๋ค๋ ๊ทธ๊ฒ์ ์ฐพ์๋ด๊ณ ์๋ก์ ์ ์์ ๊ฐ์ ํ๋๋ก ๋์์ค์๋ค.
_๊ทธ๋ ๊ฒ ํ๊ณ ์์ต๋๋ค._ DSX๋ JSX์ ์ต์ํ ์ฌ๋๋ค์ ์ํ UI ์๋ฃจ์ ์ผ๋ก ์ ์๋๊ณ ์์ต๋๋ค. JSX์๋ Dart ๋ฐ Flutter์ ์์ ํ ๋ค๋ฅธ ํ๊ฒฝ์์ ์ฌ์ฉํ๋๋ก ์๋๋ ์ฃผ์ ๋์์ธ ์์๊ฐ ์์ต๋๋ค. _ DSX๊ฐ ์ฑ๊ณตํ๋ ค๋ฉด ์ด๋ฌํ ์ฐจ์ด์ ์ ํด๊ฒฐํด์ผ ํฉ๋๋ค._ ์ ๋ _ํ์ค์_๊ฐ ์๋๋๋ค. ๋๋ ๊ฑด์ค์ ์ธ ํ ๋ก ์ ์ด์งํ๊ณ ์ค์ํ ์ง๋ฌธ์ ํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋ฐ์ ๋ชจ๋ ์๋ต์ ์ฃผ๊ด์ ์ธ ๋์ด๋ฐ๋ณต์ด("JSX๋ ๋ฏธ๋์ด๊ธฐ ๋๋ฌธ์ ์ข๊ณ ๋ฏธ๋๊ฐ ์ข๊ธฐ ๋๋ฌธ์ ๋ฏธ๋์ ๋๋ค"), ์ค์ํ ๋์์ธ ํฌ์ธํธ์ ๋ํ ๋ฌด์๋ฌด์ํ ์์ง("DSX๋ ์ค๋ช ํ ํ์๊ฐ ์์ต๋๋ค. JS์ Dart ์ฌ์ด์ ์ฐจ์ด์ ์ ์๊ธฐ ๋๋ฌธ์") ๋๋ ๊ทธ๋ฅ ์ ๋์ ์ ๋๋ค("๋น์ ์ ๋ถ๋ช ํ JSX๋ฅผ ์ข์ํ์ง ์์ผ๋ฏ๋ก DSX์ ๋ํด ์ด์ผ๊ธฐํ์ง ๋ง์ญ์์ค").
์์ํ ์นญ์ฐฌ๋ง์ผ๋ก๋ ์ฑ๊ณต์ ์ธ ์ ํ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋นํ์๋ ๋์ํ๊ณ ๋์ํด์ผ ํ๋ค. ์ฌ๋๋ค์ด ๋ํ๋์ "์ด๋จธ, ๋ค, DSX ๋ง๋ค์ด์ฃผ์ธ์"๋ผ๊ณ ํ๋ ๊ฒ์ ๊ธฐ๋ถ์ ๊ณ ์์ํค๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค. ์ด ์ค๋ ๋ ์ ๋ฐ์ ๊ฑธ์ณ ์ด๊ธฐ ๋์์ธ๊ณผ ์ ์ฒด ๊ฐ๋ ๋ชจ๋์์ DSX์ ๋ํด ์๋ฒฝํ๊ฒ ํ๋นํ ๋นํ์ ์ ๊ธฐํ ์ฌ๋ฌ ์ฌ๋๋ค์ด ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ๋นํ์ ๋๋ถ๋ถ์ ์์ง ์ง์ ์ ์ผ๋ก ๋ค๋ฃจ์ด์ง์ง ์์์ผ๋ฉฐ ์ผ๋ฐ์ ์ธ ํ๋๋ ๋ฌด์ํฉ๋๋ค.
๋ด ์ ์ผํ ๋๋ ค์์ JSX์ ๋ํ ์ด ๋ชจ๋ ๋ฌด์กฐ๊ฑด์ ์ธ ์ฌ๋์ด ์ฌ๋๋ค์ด DSX๋ฅผ ๊ฐ๊ด์ ์ผ๋ก ๋ณด๋ ๊ฒ์ ๋ฐฉํดํ๋ค๋ ๊ฒ์ ๋๋ค. Flutter์์ JSX์ ๊ฐ์ ๊ฒ์ ์ํ๋ ์ด์ ๋ฅผ ์๊ฒ ์ต๋๋ค. Flutter์๋ ์ ์ฉ UI DSL์ด ํ์ํ๋ค๋ ์ ์๊ฐ์ด Flui๋ฅผ ๋ง๋ค๊ฒ ๋ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ DSX์ ๋ํด ์ด์ผ๊ธฐํ ์ ์๋ ์ ์ผํ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ์ข์ ๋ง๋ง ํ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ _์คํจํ _ ๊ฒ์ ๋๋ค.
์ด ์ฃผ์ ์ ๋ํ ํ ๋ก ์ ์ฌ๊ฐํ ์ ์์ต๋๊น?
์ฌ์ค ์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ์ด์ด๋ ์ด์ ๊ฐ ์์ต๋๋ค.
Dart ํ์ ๋ค๋ฅธ ์ฐ์ ์์๊ฐ ์๋ค๊ณ ๋งํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก JSX ์ธก์์๋ ์๋ฐ์ ์ผ๋ก DSX ๊ตฌํ์ ๋ง๋ค์์ต๋๋ค.
์ด์ฉ๋ฉด ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์๋ฃจ์
์ ์ ์ํ๋ ๋ช ๊ฐ์ ์คํ ์์ค ์ ์ฅ์๊ฐ ์์ด์ผ ํฉ๋๋ค(๊ฐ์ ํ ์๋ํ๋ ๊ฒฝ์ฐ์๋). DSX ๋๋ ํ
ํ๋ฆฟ๊ณผ ๊ฐ์.
๊ทธ๋ฐ ๋ค์ Flutter์ readme ๋๋ Awesome_flutter์์ ์ด ์ ์ฅ์๋ก ๋ฆฌ๋๋ ์
ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ๊ทธ๋ฆฌ๊ณ DSX ๊ตฌํ์ ๋ฐฉํดํ๋ ๊ฒ์ด ์๋ค๋ฉด ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ผ๋ก ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ฅผ ๋ง๋์ญ์์ค.
๊ทธ๋ฐ ๋ค์ ์ปค๋ฎค๋ํฐ๊ฐ ์ ์ญํ ์ ํ๋๋ก ํ์ญ์์ค.
์ฌ๋๋ค์ด JSX๋ฅผ ์์ฒญํ๋ ์ ํฐ์ผ์ ๊ณ์ ์ด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋์ญ์์ค(์ด๋ฏธ ๋ ๋ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์).
์ฌ๋๋ค์ด JSX๋ฅผ ์์ฒญํ๋ ์ ํฐ์ผ์ ๊ณ์ ์ด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋์ญ์์ค(์ด๋ฏธ ๋ ๋ฒ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์).
์ฌ๊ธฐ์ ์ฐจ์ด์ ์ ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋๋ตํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
"ํ์ฌ๋ก์๋ ์ด๊ฒ์ dart/flutter์ ๊ตฌํํ ๊ณํ์ด ์์ต๋๋ค. ํ์ง๋ง [์ฌ๊ธฐ] ๋ฐ [๊ฑฐ๊ธฐ] ์ปค๋ฎค๋ํฐ ๋์์ ๋ณด๊ฑฐ๋ [์ด ๋ฌธ์ ]๋ฅผ ์ฝ์ ์ ์์ต๋๋ค."
๋ฌธ์ ๋ฅผ ์ค๋ณต์ผ๋ก ๋ซ์ต๋๋ค.
๋๊ธ๊ณผ ํฌํ๋ฅผ ํ ์ ์๋ ๊ณณ์ด ์ฌ๊ธฐ ์์ต๋๋ค. JSX์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํ ์์ฒญ์ ์ฌ๋ผ์ง์ง ์๊ณ Flutter ๋๊ตฌ ์ง์(์ปดํ์ผ๋ฌ ๋ฐ VS Code IDE)์ด ํ์ํ๊ณ ํฐ์ผ ์์ฒญ์ ์ด ์ ๋ณด(์ฒซ ๋ฒ์งธ ์ฃผ์)๋ก ์ ๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ํฐ์ผ์ด ์ด๋ฆฝ๋๋ค. ์์ฒญ๋ ์์ ์ฌ๋๋ค์ด ์ด๊ฒ์ ์๊ตฌํ๊ธฐ ์์ํ๋ฉด Flutter ํ์ด ์ฌ๊ธฐ์ ๋ฆฌ์์ค๋ฅผ ํฌ์ ํ ์ธ์ผํฐ๋ธ๋ฅผ ์ค ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์์ ๋ ผ๋์ ๋๋ถ๋ถ์ ํ์ฌ JSX๊ฐ ์๋๋ผ DSX์ ๊ดํ ๊ฒ ๊ฐ์ต๋๋ค. DSX ํ ๋ก ์ ์์ฒด ์ค๋ ๋๋ก ๋ถํ ํ๊ณ ์ด๊ฒ์ JSX์ ์ผ๋ฐ์ผ๋ก ๋จ๊ฒจ๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฒฐ๊ตญ DSX๋ JSX์ ๋ ๊ฐ๊น์์ง๋ ํ๋์ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ ์ด ๋ ๊ฐ์ง ๋ ผ์๋ฅผ ํ๋์ ์ค๋ ๋์์ ํผํฉํด์๋ ์ ๋ฉ๋๋ค.
์๋์ค, ์ ๋ 1๊ฐ ์ธ์ด๋ง ํฐ ์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. jsx ๊ตฌ๋ฌธ์ js์์ xml์ ๋ถ๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ ๋ง์ ๊ฒ๋ค์ ์ ๊ณตํ ๊ฒ์ ๋๋ค... ์ข์ง ์์ต๋๋ค.
์ ์๊ฒฌ์ ๋๋ค.
๊ทธ๊ฒ์ ๋ด๊ฐ ๋ณธ ๊ฐ์ฅ ๊ธธ๊ณ ๋ฌด์๋ฏธํ Github ๋ฌธ์ ์ ๋๋ค.
@cbazza ์ํ์ด ๐
DSX + 1
@BarryYan , ๊ฐ์ฌํฉ๋๋ค.
"+1"์ด๋ "๊ณ ๋ง์์"์ด๋ ์ด๋ฐ ์ข
๋ฅ์ ๋๊ธ์ ํผํ์ธ์.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ์ํด ๋ชจ๋ ๊ตฌ๋
์์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋
๋๋ค.
"+1"์ด๋ "๊ณ ๋ง์์"์ด๋ ์ด๋ฐ ์ข ๋ฅ์ ๋๊ธ์ ํผํ์ธ์.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ์ํด ๋ชจ๋ ๊ตฌ๋ ์์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋ ๋๋ค.
๋น์ ์๊ฒ ํฅ๋ฏธ๋ก์ด ๊ฒ์ ์์ต๋๋ค !!!
์ฌ๋๋ค์ด ํ ์ ์๋ ๋ง์ด๋ ํ๋์ ๋งํ์ง ๋ง๊ณ ๋น์ ์ด ํ ์ ์๋ ๋ง์ด๋ ํ๋์๋ง ์ง์คํ์ธ์.
@cbazza
ํ, ๊ธฐ๋ณธ ์ํฐ์ผ์ ๋๋ค. ์ด ์ค๋ ๋์ ์ ๋ฉ์์ง๋ ๊ตฌ๋ ํ ๋ชจ๋ ์ฌ๋์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ฏ๋ก ํ ๋ก ์ ๊ธฐ์ฌํ์ง ์๋ ๋๊ธ์ ๊ฒ์ํ๋ ๊ฒ์ ์๋ฌด ์ด์ ์์ด ์ฌ๋๋ค์ ์ง์ฆ๋๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ก์ ๋๋ค. "+1", "๊ณ ๋ง์์"์ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ๋ฆฌ์ก์ ์ ๊ฐ๋จํ ์์ง์ฒ ๋ฆฌ์ก์ ์ผ๋ก ์ ๋ฌํ ์ ์์ผ๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ์ธ์.
์ฆ, ์ด ์ค๋ ๋๊ฐ ๋๊ตฐ๊ฐ๊ฐ "+1" ๋ฉ์์ง๋ฅผ ๊ฒ์ํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ผ๋ก ๋ฐ๋์๋ค๋ฉด ๋ชจ๋ ๊ฑด์ค์ ์ธ ํ ๋ก ์ด ๊ณต์์ ์ผ๋ก ์ค๋จ๋์์ผ๋ฉฐ ์ค์ ๋ก ๋ซํ์ผ ํ๋ค๋ ํฐ ์ํ ์ ํธ์ ๋๋ค(์๋ง๋ ์๊ตฌ์ ์ผ๋ก ์ด ์๊ฐ).
@andrewackerman ,
์์ง๋ง ์ด ๊ธ์ ์ฐ๋ ๋์ ๊ธฐ๋ณธ ์ํฐ์ผ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ฌด์๋ฏธํ ์ง๋ฌธ(๋น์ ๋ ์๋ค์ํผ, ๋ฒฝ์ ๋ง์ ์ฐ๋ ๊ธฐ๋ฅผ ๋์ง๊ณ ๋ฌด์์ด ๋ถ๋์ง ํ์ธํ์ญ์์ค)๊ณผ ์๊ตฌ์ ์คํ๋ ์ด ๋ฐ ๊ธฐ๋ ๊ณต์ธ์ ํจ๊ป FUD(๋ถํ์ค์ฑ ๋ฐ ์์ฌ์ ๋ํ ๋๋ ค์)๋ฅผ ํผ๋จ๋ฆฌ๋ ๊ฒ์ ์ค๋จํ์ญ์์ค.
๋ชจ๋ ๊ธ์ ์์ฑํ ํ์๋ DSX์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ์ง ์์์ผ๋ฏ๋ก ์ด ์ฃผ์ ์ ๋ํด ๊ทํ์ ํ ๋ก ํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ๋๊ธฐ๋ ๋ถ๋ช ํฉ๋๋ค. DSX๋ฅผ ์คํํ๋ฉด์ FLUI๋ฅผ ํ๋ณดํ์ญ์์ค.
FLUI์ ์ ์ฉํ์ ๋ ์์ ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์์ต๋๊น? ์ ์ FLUI์ ๋ํด ์์๋ณผ๊น์?
@cbazza
์์ง๋ง ์ด ๊ธ์ ์ฐ๋ ๋์ ๊ธฐ๋ณธ ์ํฐ์ผ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ ๊ฐ ๋ต๋ณ์ '๊ธธ๊ณ ํ๊ตฌ์ ์ธ ๊ธ'์ฒ๋ผ ์ ์๊ฐํ๊ณ ํธํฅ๋์ง ์๊ธฐ ์ํด ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ๋ค์๋ค๋ ์ ์ ์ธ๊ธํด์ฃผ์๋ ๊ฒ์ ๋น์ ์ ์ฑ๊ฒฉ๊ณผ ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋ง์ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ํ ๋ก . ์ ๋ Flutter์์ JSX๋ฅผ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋งค์ฐ ์ค์ ์ ์ธ ๋ฌธ์ ์ ๋ํ ํ ๋ก ์ ์ด์งํ๋ ค๊ณ ํ๋ ๋ฐ๋ฉด ๋ฐ๋ ์๊ฒฌ์ ๊ฐ์ง ์ฌ๋์ ๋งน๋น๋ํฉ๋๋ค. ์ฐ๋ฆฌ ์ค ๋๊ฐ ๊ธฐ๋ณธ ์์ ์ ๋ ๋ง์ด ๋ฒํฉ๋๊น?
๋ฌด์๋ฏธํ ์ง๋ฌธ(๋น์ ๋ ์๋ค์ํผ, ๋ฒฝ์ ๋ง์ ์ฐ๋ ๊ธฐ๋ฅผ ๋์ง๊ณ ์ด๋ค ๊ฒ์ด ๋ถ๋์ง ํ์ธํ์ญ์์ค)๊ณผ ์๊ตฌ์ ์คํ๋ ์ด ๋ฐ ๊ธฐ๋ ๊ณต์ธ์ ํจ๊ป FUD(๋ถํ์ค์ฑ ๋ฐ ์์ฌ์ ๋ํ ๋๋ ค์)๋ฅผ ํผ๋จ๋ฆฌ๋ ๊ฒ์ ์ค๋จํ์ญ์์ค.
๋ด๊ฐ "์๊ตฌํ๋" ์ ์ผํ ๊ฒ์ DSX์ ๊ด๋ จํ์ฌ ๋ง์ ์ฌ๋๋ค์ด ์ ๊ธฐํ ์๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๋ฐฉ์ ์ด๊ฑฐ๋ ๊ณต๊ฐ์ ์ธ ์ ๋๊ฐ ์ด์์ผ๋ก ํด๊ฒฐํ๋ค๋ ๊ฒ์ ๋๋ค. Flutter์ ๊ธฐ๋ฅ ์ธํธ์ ์ค์ํ ๋ณ๊ฒฝ/์ถ๊ฐ๋ฅผ ์ ์ํ๋ ์ฌ๋์๊ฒ๋ ๊ทธ๊ฒ์ด ๋ฌด๋ฆฌํ ๊ธฐ๋๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ชจ๋ ๊ธ์ ์์ฑํ ํ์๋ DSX์ ๊ฐ์น๋ฅผ ์ถ๊ฐํ์ง ์์์ผ๋ฏ๋ก ์ด ์ฃผ์ ์ ๋ํด ๊ทํ์ ํ ๋ก ํ๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค. ๋๊ธฐ๋ ๋ถ๋ช ํฉ๋๋ค. DSX๋ฅผ ์คํํ๋ฉด์ FLUI๋ฅผ ํ๋ณดํ์ญ์์ค.
๋๋ _๋น์ ์๊ฒ_ ๋น์ ์ ์ ์ฅ์ ๋ณํธํ ๊ฒ์ ์์ฒญํฉ๋๋ค. JSX/DSX๊ฐ ์ต๊ณ /๋ฏธ๋๋ผ๊ณ ๋ฐ๋ณตํด์ ๋งํ์ง๋ง, ์์ง ์ด๋ป๊ฒ ๋๋ ์ ์ค๋ช ํ์ง ์์์ต๋๋ค. ์ฌ๋ฌ ์ฌ๋๋ค์ด DSX์ ๋ํด ํ๋นํ ์ฐ๋ ค๋ฅผ ํ๋ช ํ์ง๋ง, ์ด๋ฅผ ํด๊ฒฐํ๋ ๋์ "๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ฌ์ฉํ์ง ๋ง์ญ์์ค"๋ผ๋ ๋ฐ๋ก ๋ค์ ์จ์ด ์ด๋ฅผ ๋จ์ณ ๋ฒ๋ฆฝ๋๋ค. ์ "๋๊ธฐ"๋ _๋ชจ๋ _ ๊ธฐ์ ํ๋ก์ ํธ์ ๊ด๋ จํ์ฌ ์ง๋ฌธํด์ผ ํ๋ ์ง๋ฌธ์ ๋ตํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๋ฌด์๋ณด๋ค๋ ์ฌ๋๋ค์ด ๋์๋ณด๋ค ์ด ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋๋ค. (๊ทธ๋ฆฌ๊ณ ์์ ์ค๋ช ํ๋ฏ์ด ์น์ํจ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.)
FLUI์ ๊ดํ ํ, ๋ด๊ฐ ํ๊ณ ์๋ ์ผ์ ์ ์ฒด ๋ฌธ์ ์ ๋ํ ๋์ ์๋ฃจ์ (Flutter์ UI ์ ์ธ์ ๊ตฌ๋ฌธ)์ ์ ์ํ๋ ๋์์ ์ฌ๋๋ค์๊ฒ ๋ด๊ฐ DSX์ ๋ํด ์ํํ๋ ๊ฒ๊ณผ ๋์ผํ ์์ ์ ์ํํ๋๋ก ์์ฒญํ๋ ๊ฒ๋ฟ์ ๋๋ค. ์ง์งํ๊ณ ๊ฑด์ค์ ์ธ ๋นํ์ ์ ๊ณตํ์ญ์์ค. FLUI๊ฐ DSX๋ณด๋ค ๊ฐ๊ด์ ์ผ๋ก ๋ซ๋ค๋ ๋ง์ ์๋๋๋ค. UI ๊ฐ๋ฐ์ ๋ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ํ์ฑ๋ ๋์์ ์ ์ํ๊ณ ์ฌ๋๋ค์ด ์์ ์ ์๊ฒฌ์ ํ์ฑํ๋๋ก ์์ฒญํ๋ ๊ฒ์ ๋๋ค.
(๋ํ GUI ํํ์ ๋ํ ๊ฐ๋ฅํ ๋์์ ์ ๊ทผ ๋ฐฉ์์ ์ ์ํ ์ด๊ธฐ ์ธ๊ธ ์ธ์ FLUI์ ๋ํด ์ด์ผ๊ธฐํ ์ ์ผํ ์๊ฐ์ ๋น์ ์ด ๊ทธ๊ฒ์ ๊บผ๋์ ๋๋ผ๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋์ ์ด๋ป๊ฒ ํฉ๋๊น? ๋ด ์จ์ ๋๊ธฐ๊ฐ ๋๋ณด๋ค ๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ๋ ๋ง์ด ๋งํ ๋ ๊ทธ๊ฒ์ ํ๋ณดํ๋ ๊ฒ์ด ์ดํด๊ฐ ๋์ญ๋๊น?)
FLUI์ ์ ์ฉํ์ ๋ ์์ ์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ด ์์ต๋๊น? ์ ์ FLUI์ ๋ํด ์์๋ณผ๊น์?
FLUI๋ DSX๊ฐ ์๋๋๋ค. FLUI๋ DSX์ ๊ด๋ จํ์ฌ ๊ทํ์๊ฒ ์ ๊ธฐํ _๋ชจ๋ _ ์ง๋ฌธ์ ๋ตํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ ์ค ๋ง์ ์ง๋ฌธ์ด DSX์ ๋์์ธ์๋ง ํด๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ๋๋ตํด์ผ ํ๋ ์์ฒด ์ง๋ฌธ ์ธํธ๊ฐ ์๋ค๋ ๋ง์ ์๋๋๋ค. ์๋์, ์ ๋ ๋ชจ๋ ๋๋ต์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ด๊ฐ ๋นํ์ ์ธ ํ ๋ก ์ ์ค์ํ๊ฒ ์ฌ๊ธฐ๋ _์ด์ _์ ๋๋ค. FLUI/DSX๋ ๋ช ๋ฒ์ด๋ ์ํ์ ๊ฐ๋ก์ง๋ฌ ๊ธํ์ ์ด์๋จ์ ์ ์๋ค๋ฉด ์ฌ๋ก ์ ๋ฒ์ ์ ์์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ FLUI๋ฅผ ๋ ผ์ํ๊ธฐ์ ์ ์ ํ ์ฅ์๊ฐ ์๋๋๋ค. FLUI์ ๋ํด ๊ธธ๊ฒ ๋ ผ์ํ๋ ค๋ฉด ํ๋ก์ ํธ์ ์์ฒด ๋ฌธ์ ๊ฒ์ํ ์ด ์์ผ๋ฏ๋ก ์์ ๋กญ๊ฒ ๊ฒ์ํ์ญ์์ค.
๋นํ์ ๋์ํ๋ ๋์ ๋ฐฉ์ด์ ์ด๊ณ ํํผ์ ์ธ ํ๋๋ฅผ ์ทจํ๊ธฐ ๋๋ฌธ์ ์ํฉ์ด ๋๋ฌด ๋จ๊ฑฐ์์ ธ์ ์ด ์ค๋ ๋๊ฐ ์ผ์์ ์ผ๋ก ๋ซํ์ผ ํ๋ ๋ ๊ฐ์ ๊ฐ๋ณ ๊ฒฝ์ฐ(3๊ฐ์ ๊ฐ๊น์์ง)์ ๋ํด ์ง์ ์ฑ ์์ด ์์ต๋๋ค. ๊ทธ๋์ ๋๋ "์ํฐ์ผ"์ ๊นจ๊ณ ํ ๋ฒ ์ด๋ ๊ฒ ๋งํ ๊ฒ์ ๋๋ค. ์์กด์ฌ์ ์ธ์ฐ๊ณ , ๋นํ์ ์ธ์ ๊ณต๊ฒฉ์ผ๋ก ํด์ํ์ง ๋ง๊ณ , ์ค์ํ ์ง๋ฌธ์ ๋ตํ์ญ์์ค. ๊ทธ ์ค ํ๋ ๋๋ DSX์ ํํ๋ฅผ ์ด๋ฃจ์ญ์์ค.
andrewackerman ์ํ์ด ๐
+ 1
@andrewackerman
์ ํ์ด
์น๊ตฌ, ๋น์ ์ ์นญ์ฐฌ์ ์์ง ์๊ฐ๋ฝ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ @jstansbe ๋ก๋ถํฐ ์นญ์ฐฌ์ ๋ฐ์๊ณ ๋น์ ์ ์นญ์ฐฌ์ ์์ง ์๊ฐ๋ฝ์ ๋์ต๋๊น?
๋ถ๋ช ํ ๋น์ ์ ๊ธธ์ด์ ๋ํ ๋ด ํํธ๋ฅผ ๋ง์์ ์๊ธฐ์ง๋ ์์์ง๋ง ๋น์ ์ด ๋๋ฅผ ์ ํ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ด ์ฑ๊ฒฉ์ ๋ํด ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์์์ต๋๋ค.
๋ด๊ฐ ํ ์ ์๋ ํ ์ ์๊ฐํ๊ณ ํธ๊ฒฌ ์์ด ๋ง๋ค๋ ค๊ณ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ๋ค์ธ ๋ด ์๋ต์ ์ฐธ์กฐํ๋ค๋ ์ฌ์ค
๋น์ ์ '๊ธด ๊ธ'์ ๋ชจ๋ ์ฝ๊ณ ๊ฐ์ฌํ๊ฒ ์๊ฐํ๊ณ ๋ชจ๋ ๊ฒ์ ๋ตํฉ๋๋ค. ์ ๋ ์๋๋๋ค. ํ์ง๋ง ์ ๊ฐ ์ ๋๋ก ๋๋ตํ๋ฉด ๋น์ ์ ๋ด ๋๋ต์ ์ดํดํ์ง ๋ชปํ๊ณ ๋ด๊ฐ ๋ฌด์ํ๊ณ ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆฝ๋๋ค.
JSX์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์๊ณ JSX๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ ๋์ ์์ ํ๊ณ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด JSX ๋ฐ DSX๋ ๋ค์ 2๊ฐ์ง ๋ณํ๋ง ์ํํฉ๋๋ค(์ด์ ์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธ๋จ).
(1)
<A property="a" />
becomes
new A(property: a)
(2)
<A property="a">
<B />
<C />
</A>
becomes
new A(property: a, children: <Widget>[new B(), new C()])
๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ํธ์คํธ ์ธ์ด์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ด๋ฆ์ ๊ตฌ์ฑ ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ต๋ณ: ํธ์คํธ ์ธ์ด. ๋๋ ๋ฌด์ํ๋ ๊ฒ์ด ์๋๋ผ ๊ทธ๊ฒ์ด ์ค๊ณ๋ ๋ฐฉ์์ด๋ฉฐ ํ์ ์์ฒ์ ๋๋ค. ๋งํฌ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ฉด 'if' ๋ฑ์ ๋ํ ๊ฐ๋จํ ๊ตฌ์ฑ์ผ๋ก ๋งํฌ์ ๋ด๋ถ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์ ํ๊ธฐ ์์ํฉ๋๋ค. ๊ฒฐ๊ตญ ๋งํฌ์ ๋ด๋ถ์ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด. ๋ฐ๋ผ์ ๋งํฌ์ ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๊ฐ์ ธ์ด์ผ๋ก์จ ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ๋๋ฆด ์ ์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ฐ๋ก JSX/DSX์ ์ฅ์ ์ ๋๋ค.
์์ (2)์์ ๋ณํ <Widget>
๋ฅผ ํ๋์ฝ๋ฉํ์ง๋ง ํญ์ ๊ทธ๋ฐ ๊ฒ์ ์๋๋ฏ๋ก ์์์ ๋
ผ์ํ ๋๋ก ํ์ํ ๊ฒฝ์ฐ ์ง์ ํ ์ ์์ต๋๋ค. ๋ณํ์ ์ดํด๋ณด๊ณ ์ด์ ๋ชจ๋ ๊ธฐํธ๋ ์์ค์์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ๋ฏธ๋์ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์
๋๋ค.
๋น์ ์ด ๋ฐ๋ ์๊ฒฌ์ ์ด๋ค ํํ๋ก ๋๊ตฐ๊ฐ๋ฅผ ๋น๋ํ๋ ๋์.
๊ทธ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๋น์ ์ ๋ฐ๋ ์๊ฒฌ์ ๊ฐ์ง ์ ์์ง๋ง ๋ด๊ฐ ๋ฌ๋ฆฌ ์ฆ๋ช ํ ์ ์์ ๋ ์ง์ค์ ์ฃผ์ฅํ ์๋ ์์ต๋๋ค.
Flutter์ ๊ธฐ๋ฅ ์ธํธ์ ์ค์ํ ๋ณ๊ฒฝ/์ถ๊ฐ๋ฅผ ์ ์ํ๋ ์ฌ๋์๊ฒ๋ ๊ทธ๊ฒ์ด ๋ฌด๋ฆฌํ ๊ธฐ๋๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ์ ๋ Flutter ํ์ด DSX๋ฅผ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ์ง๋ง DSX์ ์์กดํ์ง ์๊ณ DSX๋ง์ด ์ ์ผํ ์ํ์๊ฐ ์๋๋ผ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ DSX์ ์์กดํ์ง ์๋ ์ผ๋ฐ์ ์ธ ๊ฒ์ด๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ js ์์ง์ js๋ก ๋ณํ๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ก์ด ์ธ์ด ์ํ๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์ค ๋งต์ ์ง์ํฉ๋๋ค. ๊ทธ๊ฒ์ Dart์ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค !!! ๋ฐ ๊ธฐํ ์ฌ๋ฌ (Coffeescript, Typescript, Reason ๋ฑ). Dart๋ ์ง๊ธ ๋๊ฐ์ด ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ณดํธ๊ฐ ์์นํ๋ ๋ฐ ๋์์ด ๋๋ ์ํ๊ณ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
๋๋ ๋น์ ์ด ๋น์ ์ ์ ์ฅ์ ๋ณํธํ๊ธฐ๋ฅผ ์์ฒญํฉ๋๋ค.
๋๋ ์ด๋ฏธ ์ฌ๋ฌ ๋ฒ ํ๊ณ ๊ฒฐ๋ก ์ Plain Dart ๋๋ DSX๊ฐ ์ฌ์ฉ์ ์ ํธ๋์ ๋ฌ๋ ค ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ํ ๊ฒ์ ์ฌ๋๋ค์๊ฒ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ฐ์ํ๋ ๋์ ์ต์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
๋ฌด์๋ณด๋ค๋ ์ฌ๋๋ค์ด ๋์๋ณด๋ค ๊ทธ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋๋ค.
๋๋ ๊ณต๋ฐฑ์ด๋ ํญ๊ณผ ๊ฐ์ด ๋ณ์ ์ด๋ฆ ์์ด๋ ๋ค์ ์ ํ ์ ์๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์ DSX๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๊ฒ์ ์ํด ์ธ์ฐ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ ํธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋ฐ์๋ค์ด์ญ์์ค. ๊ฑฐ๊ธฐ์ ํ๋ ์ด์์ ํ๋ก๊ทธ๋๋ฐ ํธ์ง๊ธฐ๊ฐ ์์ต๋๊น?
์น์ํจ์ด ์ถฉ๋ถํ ์ด์ ๊ฐ ๋์ง ๋ชปํ๋ค
๊ทธ๋ฅ ๋น์ ์ ์๊ฒฌ์ ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์์ "if" ๋ฌธ, 'for' ๋ฌธ, 'class', ์ด์ 'asyn/await'๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ทธ๋ฌ๋ ์ด๊ฒ์ FLUI๋ฅผ ๋ ผ์ํ๊ธฐ์ ์ ์ ํ ์ฅ์๊ฐ ์๋๋๋ค. FLUI์ ๋ํด ๊ธธ๊ฒ ๋ ผ์ํ๊ณ ์ถ๋ค๋ฉด ํ๋ก์ ํธ์ ์์ฒด ๋ฌธ์ ๊ฒ์ํ์ด ์์ผ๋ฏ๋ก ์์ ๋กญ๊ฒ ๊ฒ์ํ์ญ์์ค.
์์ฃผ ์ข์, ์ด์ ๋น์ ์ ๋ด ์กด๊ฒฝ์ ์ป์์ต๋๋ค.
์ด ์ค๋ ๋๊ฐ ๋๋ฌด ๋จ๊ฑฐ์์ ธ์ ์ผ์์ ์ผ๋ก ๋ซํ์ผ ํ๋ ๋ ๊ฐ์ ๊ฐ๋ณ ๊ฒฝ์ฐ(3๊ฐ์ ๊ฐ๊น์์ง)์ ๋ํ ์ง์ ์ ์ธ ์ฑ ์์ด ์์ต๋๋ค.
๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ๋ค์ ๋ซํ๋๋ผ๋ ์ฌ๋๋ค์ด JSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ๊ฒ์ ๋ง์ง ๋ชปํ ๊ฒ์ ๋๋ค.
์์กด์ฌ์ ๋ฒ๋ฆฌ๊ณ ๋นํ์ ์ธ์ ๊ณต๊ฒฉ์ผ๋ก ํด์ํ์ง ๋ง๊ณ ์ค์ํ ์ง๋ฌธ์ ๋ตํ์ญ์์ค.
์๊ณ ๋ ์์ง๋ง ์ฑ๊ฒฉ์ด ๊ธํด์ ๋๊ฐ ํ๋ฅผ ๋์ ๋ ์ค์ํ ์ผ์ด ์๋ค(๋ฐ๋ก ๋์จ๋ค). ๋น์ ์ ํ๋๊ฒ ํ๋ ค๋ ๊ฒ์ ์๋์ง๋ง ๋น์ ์ ์ง๋ฌธ์ ์ค์ํ์ง ์์์ต๋๋ค.
๊ทธ ์ค ํ๋ ๋๋ DSX์ ํํ๋ฅผ ์ด๋ฃจ์ญ์์ค.
๋น์ ์ ์ฑ๊ณต์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธก์ ๊ธฐ๊ฐ ์๋๋ฉฐ ๋ด๊ฐ ๋ฌด์์ ํ๋์ง๋ ๋ชจ๋ฆ ๋๋ค.
์น๊ตฌ, ๋น์ ์ ์นญ์ฐฌ์ ์์ง ์๊ฐ๋ฝ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ @jstansbe ๋ก๋ถํฐ ์นญ์ฐฌ์ ๋ฐ์๊ณ ๋น์ ์ ์นญ์ฐฌ์ ์์ง ์๊ฐ๋ฝ์ ๋์ต๋๊น?
๋น์ ์ ๋ถ๋ช ํ ๊ทธ์ ๋ง์ ๋ด์ฌ๋ ํ์๋ฅผ ์ดํดํ์ง ๋ชปํ ๊ฒ ๊ฐ์ต๋๋ค. (๊ทธ๋ ๋ง ๊ทธ๋๋ก ๋ด๊ฐ ํ์ง ๋ง๋ผ๊ณ ๋งํ ๋ชจ๋ ๊ฒ์ ํ์ต๋๋ค.) ๋ด๊ฐ ๊ฐ์ฌํ ์ ์๋ ์ฌ๋ฏธ์๋ ํธ๋กค๋ง์ด์ง๋ง ์ฌ๊ธฐ์์๋ ์ ์ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ์ฐํ ๊ทธ๊ฐ ์ง์ฌ์ด์๋ค๋ฉด ๋ด ๋ง์ ๊ฑด๋ค์๋ ๊ฒ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ํ์ง๋ง ์ ์์ ์ ์ฌ์ ํ โโ์ ํจํฉ๋๋ค. ๊ทธ๋ฐ ์ข ๋ฅ์ ๋๊ธ์ _์ฌ์ ํ_ ์ฌ๊ธฐ์์ ์ ์ ํ์ง ์์ต๋๋ค.
JSX์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์์ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค...
์ด ์ค๋ ๋์ ๋ํ ๋์ ์ฒซ ๋ฒ์งธ ์ฝ๋ฉํธ์์ ๋ด ๋ฉด์ฑ ์กฐํญ์ด ๋น์ ์๊ฒ ํ์ ์ค ์ ์์ต๋๊น?
...๋น์ ์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๋น์ ์ ๋ด๊ฐ JSX์ ๋ํ ๋ง์ ๊ฒฝํ์ด ์๊ณ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ํ ๋ชจ๋ฅธ๋ค๊ณ ๋์ผ์ํฉ๋๊น? ๋๋ ์ง์งํ React ํ๋ก์ ํธ์ ๋ํด ์์ ํ ์ ์ด ์์ง๋ง ๋์ง์ ๊ณต์ ํ ๋ชซ์ ํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด _์๋ํ๋ ๋ฐฉ์์ ์๋ฒฝํ๊ฒ ์ดํดํฉ๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ํธ์คํธ ์ธ์ด์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ด๋ฆ์ ๊ตฌ์ฑ ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ต๋ณ: ํธ์คํธ ์ธ์ด.
๋งํฌ์ ์ธ์ด์ ํธ์คํธ ์ธ์ด๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. JSX๋ฅผ ์ฌ์ฉํ๋ฉด ๋งํฌ์ ์ธ์ด๊ฐ ํธ์คํธ ์ธ์ด์ _ํ์ฅ_์ผ๋ก ์ค๊ณ๋ฉ๋๋ค. ์ด์ ๊ฐ์ด JSX๋ JS์ ํ์ฅ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ ์ด๊ฒ์ด ์ ๋๋ก ์๋ํ๋ ์ด์ ์ ๋๋ค. DSX๋ Dart์ฉ JSX์ ๊ตฌํ์ ๋๋ค.
๋ฌธ์ ๊ฐ ๋ณด์ด์ง ์์ต๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ธ์ด๋ก ์กฐ์๋๋ ํ ์ธ์ด์ ํ์ฅ์ผ๋ก ์ค๊ณ๋ ๋งํฌ์ ์ธ์ด. ๋ง์ ๋ฌธ์ , ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ ๋ฐ ๊ณ ๋ ค ์ฌํญ์ด ์๋ ๊ฒ์ _ํ์ฐ์ ์ธ_ ๊ฒ์ ๋๋ค.
๋งํฌ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌํ๋ฉด 'if' ๋ฑ์ ๋ํ ๊ฐ๋จํ ๊ตฌ์ฑ์ผ๋ก ๋งํฌ์ ๋ด๋ถ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์ ํ๊ธฐ ์์ํฉ๋๋ค. ๊ฒฐ๊ตญ ๋งํฌ์ ๋ด๋ถ์ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด.
์ฒซ์งธ, ๋งํฌ์ ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ๋ถ๋ฆฌํ๋ ์ด๋ฉด์ ์ ์ฒด ์์ด๋์ด๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ ๊ฒฝ์ฐ ๋ ์ฌ์ด์ ๋ช ํํ ๋ถ๋ฆฌ๊ฐ ์์ด ์ค๋ณต์ด _no_ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ ๋ฒ์งธ๋ก, UI ์ฝ๋์์ if
๋ฐ for
๋ณด๋ค ํจ์ฌ ๋ ๋ณต์กํ ์์
์ ์ํํ๋ ๊ฒฝ์ฐ(๋ง์ ๋งํฌ์
์๋ฃจ์
์์ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์ฑ) ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ฅํฉ๋๋ค. ์ด์จ๋ ๋์์ธ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ ํธ์
๋๋ค. MVC/MVVM ๋์์ธ ์์น์ ๋ฐ๋ผ UI ๊ตฌ์ฑ์ ๋ณต์กํ ๋
ผ๋ฆฌ๋ฅผ ํตํฉํ๋ ๊ฒฝ์ฐ ์ฝ๋ ๋์๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ์ฌ์ค๊ณ๋ฅผ ์ง์งํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
(์ฆ, JSX๋ฅผ ์ฌ์ฉํ์ฌ MVVM ๋ฐฉ์์ผ๋ก ์ ์ธ์ UI๋ฅผ ์์ฑํ ์ _์๋ค๋ ๊ฒ์ ์๋์ง๋ง, ๊ฐ๊ด์ ์ธ ์ด๋์ด ๊ฑฐ์ ์๋ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ๋ฟ์ ๋๋ค. ์ฌ์ฉํ ์ ์๋๋ฐ๋ ํ์ค ํธํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ _๊ทธ๋ ์ง ์์_?)
๊ทธ๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ๋น์ ์ ๋ฐ๋ ์๊ฒฌ์ ๊ฐ์ง ์ ์์ง๋ง ๋ด๊ฐ ๋ฌ๋ฆฌ ์ฆ๋ช ํ ์ ์์ ๋ ์ง์ค์ ์ฃผ์ฅํ ์๋ ์์ต๋๋ค.
๋น์ ์ ์๋ฌด๊ฒ๋ "์ฆ๋ช "ํ์ง ์์์ต๋๋ค. ๋น์ ์ ์์ง ์ด๋ ํ ์ ์ฆ ๋ ผ๋ฆฌ๋ ๋ท๋ฐ์นจ๋์ง ์์ ์ฃผ๊ด์ ์ธ ์ฃผ์ฅ์ ๋ง์ด ํ์ต๋๋ค. (์ ๋ขฐํ ์ ์์ง๋ง ์ด ์ต์ ๊ฒ์๋ฌผ์ ํฌ๊ฒ ๊ฐ์ ๋์์ต๋๋ค.)
ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค. ์ ๋ Flutter ํ์ด DSX๋ฅผ ๊ตฌํํ๊ธฐ๋ฅผ ์ํ์ง๋ง DSX์ ์์กดํ์ง ์๊ณ DSX๋ง์ด ์ ์ผํ ์ํ์๊ฐ ์๋๋ผ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ DSX์ ์์กดํ์ง ์๋ ์ผ๋ฐ์ ์ธ ๊ฒ์ด๋ฏ๋ก ๊ทธ๋ ๊ฒ ํ์ต๋๋ค.
๋น์ ์ ์ฌ์ ํ โโ๊ทธ๋ค์๊ฒ ์ฌ์ํ์ง ์์ ์ผ์ ํ๋๋ก ์๊ตฌํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ค๊ณผ ๋๋จธ์ง ์ฌ๋๋ค์ ์ค๋ํด์ผ ํ๋ ์ฑ ์์ ๋น์ ์๊ฒ ์์ต๋๋ค. ๊ทธ๋์ ๊ทธ๋ค์ด ํด์ผ ํ ์ผ๊ณผ ๊ทธ๋ค์ด ํด์ผ ํ ์ผ ๋ชฉ๋ก์์ ๋ค๋ฅธ ์ผ์ ๋ฏธ๋ฃจ์ด์ผ ํ๋ ๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์ค๋ํ ์ฑ ์์ด ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ js ์์ง์ js๋ก ๋ณํ๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ก์ด ์ธ์ด ์ํ๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์ค ๋งต์ ์ง์ํฉ๋๋ค. ๊ทธ๊ฒ์ Dart์ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค !!!
JS ์์ฒด์ ํน์ฑ์ ๊ทธ๋ฐ ์ผ์ด (์๋์ ์ผ๋ก ๋งํด์) ์ฝ๊ฒ ํ ์ ์๊ธฐ ๋๋ฌธ์ Dart๋ JS์ ๋ํ ํธ๋์คํ์ผ๋ฌ๊ฐ ์๋ ์ ์ผํ ์ธ์ด๊ฐ ์๋๋๋ค. ์ฌ๋ฌ ๋ฒ ์ง์ ํ๋ฏ์ด Dart๋ JS๊ฐ ์๋๋๋ค. ์ด๊ฒ์ ์ ์ ์ด๊ณ ๊ฐ๋ ฅํ ํ์์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฆ, JS์์ ์ํํ๊ธฐ ์ฌ์ด ๋ง์ ์์ ์ด Dart์์๋ ๋งค์ฐ ๋ณต์กํฉ๋๋ค.
๋๋ ๊ณต๋ฐฑ์ด๋ ํญ๊ณผ ๊ฐ์ด ๋ณ์ ์ด๋ฆ ์์ด๋ ๋ค์ ์ ํ ์ ์๋ฅผ ์ ํธํ๊ธฐ ๋๋ฌธ์ DSX๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๊ฒ์ ์ํด ์ธ์ฐ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฌ๋๋ค์ด ๋ค๋ฅธ ์ ํธ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ๋ฐ์๋ค์ด์ญ์์ค. ๊ฑฐ๊ธฐ์ ํ๋ ์ด์์ ํ๋ก๊ทธ๋๋ฐ ํธ์ง๊ธฐ๊ฐ ์์ต๋๊น?
๊ทธ ๋ ผ๋ฆฌ์ ๋ฐ๋ผ 16์ง์๋ก ์ธ์ฝ๋ฉ๋ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฌธ์ ์ ์ํ๋ UI ์๋ฃจ์ ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ ๋ง์, ์ ๋ง๋ก ์ค์ํ ๊ฒ์ด ๊ฐ์ธ์ ์ทจํฅ์ด๋ผ๋ฉด, ๊ทธ๊ฒ์ ์กด์ฌ๋ฅผ ์นํธํ๊ธฐ ์ํด ๋ด๊ฐ ๋งํ ํ์๊ฐ ์๋ ๊ฒ์ "์ด๋ค ์ฌ๋๋ค์ ๊ทธ๊ฒ์ ์ ํธํ๋ค"๋ผ๋ ๊ฒ๋ฟ์ ๋๋ค. ๊ทธ๋ ์ฃ ?
๋น์ ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ๋๋ก ์๋ํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์ค์ด๋ฏ๋ก ์์ ์ ์ค๋๋ ฅ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด "์ผ๋ถ ์ฌ๋๋ค์ด ์ข์ํ ๊ฒ" ์ด์์ ์ถ๋ก ์ด ํ์ํฉ๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ๋ง๋ก ํํํ ์ ์๋ค๋ฉด _์_ ๊ทธ๋ค์ด ๊ทธ๊ฒ์ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ์ฌ์ฉํด์ผ ํ๋ค๋ฉด, ๊ทธ๋ค์ด ๊ทธ๋ ๊ฒ ํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๊ฒ ๋ง๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ฆฌ๊ณ DSX์ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ๋์์ธํ ๋ ๊ทธ๋ค์ด ํ ๊ฒ์ด๋ผ๊ณ _๋ณด์ฅ_ํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ ์ ์๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
๊ทธ๋ฅ ๋น์ ์ ์๊ฒฌ์ ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ธ์ด์์ "if" ๋ฌธ, 'for' ๋ฌธ, 'class', ์ด์ 'async/await'๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฒซ์งธ, ์ด๋ฌํ ํค์๋( async/await
์ ์ธ)๋ ์์ญ ๋
๋์ C ๋ฐ BASIC๊ณผ ๊ฐ์ ์ธ์ด์ ์์ฒญ๋ ์ธ๊ธฐ๋ก ์ธํด ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ดํ๊ฐ ๋์์ต๋๋ค. ์ด์ ์ ์ธ๊ธํ๋ฏ์ด JSX๋ ์๋ช
์ด ์
์ฆ๋์ง ์์์ต๋๋ค. 5๋
๋์ ์ฌ์ฉ๋์์ผ๋ฉฐ ์ต์
์ ์ฌ์ฉํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ React ์ธ๋ถ์์ ์ค์ํ ์ฉ๋๋ ์์ง ์์ต๋๋ค.
๋์งธ, ์น์ํจ๊ณผ ๊ด์ต ์ฌ์ด์๋ ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค. if
, while
, for
, struct
, class
, enum
, try/catch/finally
, async/await
... ์ด๊ฒ๋ค์ ๋ชจ๋ ๊ฐ๋
์ ๊ตฌ๋๋ก ํํํ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ์ฌ๋๋ค์๊ฒ ์ต์ํ ๊ฒ ์ด์์ผ๋ก ์ด๋ฌํ ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์นํธํ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ฐ๋
์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. (๋ฌผ๋ก , ๊ทธ๊ฒ์ด ๊ทธ๋ค์ด ์์๋ผ๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์ด๋ค ์ธ์ด๋ if ... then
ํฉ๋๋ค. ์ด๋ค ์ธ์ด๋ $ if ... elif
๋ฅผ ํ๊ณ ๋ค๋ฅธ ์ธ์ด๋ if ... else if
๋ฅผ ํ๊ณ ๋ค๋ฅธ ์ธ์ด๋ if...endif
ํฉ๋๋ค. foreach
, ๋ค๋ฅธ ์ผ๋ถ๋ $#$ from
$#$ , ๊ธฐํ ๋ฑ๋ฑ.)
ํํธ, JSX๊ฐ '์ต์ํ๋ค'๋ ์ด์ ๋ก ์ฌ์ฉํ์๋ ์ฃผ์ฅ์ ๊ฐ์ ๋ฒ์ฃผ์ ๋ค์ด๋ง์ง ์๋๋ค. JSX๋ ์ ์ธ์ UI๋ฅผ ๋ํ๋ด๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ด์ง๋ง ์ ์ผํ ๋ฐฉ๋ฒ๋ ์๋๊ณ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ฐฉ๋ฒ๋ ์๋๋๋ค. ๋ํ ํ ์ ํ์ ํ๊ฒฝ์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ฉด ์น์ํจ์ด ๋์ ๊ฒ์ผ๋ก ๋ฐ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด _ํผํ๊ณ ์ถ์_ ์ ์ ์ ๋จ์ ๋ก ์ด์ด์ง์ง ์์ต๋๋ค.
๋ฌธ์ ๋ ๊ทธ๊ฒ์ด ๋ค์ ๋ซํ๋๋ผ๋ ์ฌ๋๋ค์ด JSX์ ๊ฐ์ ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ๊ฒ์ ๋ง์ง ๋ชปํ ๊ฒ์ ๋๋ค.
๊ทธ๋ค์ ์ด์จ๋ ๊ทธ๊ฒ์ ์๊ตฌํ๊ณ ๋ฌธ์ ๋ ๋๊ฐ์ด ์ฌ๊ธฐ๋ก ๋ฆฌ๋๋ ์ ๋ฉ๋๋ค. ์ค๋ ๋๊ฐ ๋ซํ๋ฉด ์ด๋ป๊ฒ ๋ฐ๋๋์ง ์ ์ ์์ต๋๋ค.
๋น์ ์ ์ฑ๊ณต์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธก์ ๊ธฐ๊ฐ ์๋๋ฉฐ ๋ด๊ฐ ๋ฌด์์ ํ๋์ง๋ ๋ชจ๋ฆ ๋๋ค.
์ ํ ๋์์ธ์ ๊ดํ ์ฑ ์ ์ฝ์ผ์ญ์์ค. 1์ฅ์ ํญ์ ์ ํ์ด ๋ฌด์์ธ์ง, ์ ์ฌ๋๋ค์ด ์ ํ์ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ๋์ง๋ฅผ ์ค๋ช ํ๋ ์ฑ๋ช , ์ ์ธ๋ฌธ, ์ฌ๋ก๊ฑด, ์ผ๋ฐ ์์ด๋ก ์ ํ์ ์ด๊ณ ํํํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ง๋๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ์๋ง์ถ์ด ๊ธฐ์ ๊ฐ์๊ฒ ์ ๊ณต๋๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ์ ์กฐ์ธ์ 30์ด ์ด๋ด์ ์ ํ๊ณผ ์ถ์ฒจ์ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฌํ๋ "์๋ฆฌ๋ฒ ์ดํฐ ํผ์น"๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ๋น์ ์ ์ ํ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๋ค๋ฉด ์ ์ฒด์ฑ ์๊ธฐ๋ฅผ ๊ฒช๊ณ ์๋ค๋ ์ ํธ์ ๋๋ค. ์ ํ์ ๋์์ธํ๋ ์ฌ๋์ด ๋นํ์ ์ ์ ํ ๋์ํ์ง ๋ชปํ๋ค๋ฉด ์์ ์ ์ ํ์ ๋ํ ๋ฏฟ์์ด ๋ถ์กฑํ๋ค๋ ์ธ์์ ์ค๋๋ค. ์ด ๋ ๊ฐ์ง ๋ชจ๋ ํฌ์์์๊ฒ ํฐ ์ํ ์ ํธ์ ๋๋ค.
์ด ์ํฉ์์ ์ ํ์ DSX์ด๊ณ ํฌ์์๋ค์ ๊ทธ๊ฒ์ ์ฌ์ฉ์ ๊ณ ๋ คํ๋ ๊ฐ๋ฐ์์ ๋๋ค. ๋น์ ์ ์ง์งํ๋ ์ ์ผํ ์ฌ๋๋ค์ ์ค๋ช ์ "JSX"๊ฐ ์๋ ๋ชจ๋ ๊ฒ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์์ํ ๊ฒ์ ๋๋ค. ์ด ์ค๋ ๋์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ ๋น์ ์ด ๋ฌด์์ ํ๊ณ ์๋์ง ์ง๋ฌธํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
๋น์ ์ ํ์ฌ ์ ํ์จ์ด 0%์ ๊ฐ๊น๊ฑฐ๋ ๊ทธ ๊ทผ์ฒ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ๋น์ ์ด ์์ง ๋นํ์ ์ ์ ํ๊ฒ ๋์ํ์ง ๋ชปํ๋ค๊ณ ๋งํ ๋ _๊ทธ๊ฒ์ด_ ๋์จ ๊ฒ์ ๋๋ค. ์ ๊ฒฝ์ฐ์ง ์์ ์๋ ์์ง๋ง DSX๊ฐ ์ค์ ํ๋ก์ ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ๋๋ UI ์ ์ธ ๋งํฌ์ ํ๋ฌ๊ทธ์ธ์ด ๋๋๋ก ์ง์งํ๊ฒ ์๋ํ๋ค๋ฉด ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ง๋ง ๋ค์ ๋งํ์ง๋ง ๋น์ ์ ์์ธ์ผ ์ ์์ต๋๋ค.
์ข์, ์ด ๋ํ๋ ์ฐ๋ฆฌ๊ฐ Flutter ์ปค๋ฎค๋ํฐ์์ ์์ฉํ ์ ์๋ค๊ณ ์๊ฐํ๋ ์ข ๋ฅ์ ํ ๋ก ์ ํจ์ฌ ๋ฐ์ด ๋์์ผ๋ฏ๋ก ์ด ์ค๋ ๋๋ฅผ ์ ๊ทธ๊ณ ๋ฒ๊ทธ๋ฅผ ๋ซ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ํ๋ํ๋์ง์ ๋ํ ์์ธํ ๋ด์ฉ์ https://flutter.io/design-principles/#conflict - resolution์ ์ฝ์ด๋ณด์ญ์์ค.
๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ ๋ค์ ๋จ๊ณ๋ Gradle, Xcode, ํซ ๋ฆฌ๋ก๋ ๋ฐ ๊ธฐ์กด ์ฑ๊ณผ์ ํตํฉ์ผ๋ก ์ฝ๋ ์์ฑ ์์ ์ ์ํํ ์ ์๋๋ก ์์คํ ํตํฉ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋์์ธ์ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ์ด ์์ ์ ๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์ฃผ์ ํ์ง ๋ง๊ณ ์ ์๊ฒ ์ฐ๋ฝํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ด๋ ์ด์ ์์ ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ์์ผ๋ฉด DSX์ ๊ฐ์ ์๋ฃจ์ ์ Flutter ์์ฝ์์คํ ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํตํฉ๋์ด์ผ ํ๋ ์๋ฃจ์ ์ ์ฐพ์ ์๋ ์์ต๋๋ค. ๊ทธ ๋์ ์ฐ๋ฆฌ๋ UI ํํ์์ ํจ์ฌ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋์ง ์์๋ณด๊ธฐ ์ํด Dart์ ๊ตฌ๋ฌธ์ ๊ฐ์ ํ๋ ์์ ๋ ํ๊ณ ์์ต๋๋ค.
์ ๊ธฐํ ๊ฐ์น๊ฐ ์๋ ๋งค์ฐ ๊ฑด์ค์ ์ด๊ณ ์๋ก์ด ๊ฒ์ด ์๋ ํ ์ฌ๋๋ค์ด ์ด ์ฃผ์ ์ ๋ํด ์๋ก์ด ๋ฒ๊ทธ๋ฅผ ์ด์ง ์๋๋ก ์์ฒญํ๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์ต๋๋ค. ' https://flutter.io/widgets-intro/#basic -widgets'์ "๊ธฐ๋ณธ ์์ ฏ" ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.