Flutter: ๋‹คํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ JSX์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2017๋…„ 08์›” 14์ผ  ยท  238์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

์œ„์ ฏ์„ ๊ตฌ์ถ•ํ•˜๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ• ์™ธ์— JSX์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹คํŠธ ์ฝ”๋“œ ๋‚ด์—์„œ XML๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ฝ๊ณ /๊ฐœ๋ฐœ/๋””๋ฒ„๊ทธ/์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ•๋ ฅํ•œ GUI ๋นŒ๋”๊ฐ€ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์™€ ํ†ตํ•ฉํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

DSX์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
https://spark-heroku-dsx.herokuapp.com/index.html

์นด๋ฅผ๋กœ์Šค.


DSX์˜ ํ˜„์žฌ ๋ฌธ์ œ๋Š” .dsx ํŒŒ์ผ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋””๋ฒ„๊ฑฐ, ์ž๋™ ์™„์„ฑ ๋“ฑ์˜ ํ›Œ๋ฅญํ•œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Flutter ๋„๊ตฌ์™€์˜ ์ ์ ˆํ•œ ํ†ตํ•ฉ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์—๊ฒŒ DSX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์ €์—๊ฒŒ๋Š” ์‹œ์ž‘ํ•˜๊ธฐ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋„์™€์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ Dart Tools ๋ฐ VS Code Dart ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์™„์ „ํ•œ ์ „์ฒ˜๋ฆฌ ์ง€์›(์†Œ์Šค ๋งต ํฌํ•จ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋‹จ ๋„๊ตฌ๊ฐ€ ํ•ด๋‹น DSX ๋˜๋Š” ๋‹ค๋ฅธ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ์–ธ์–ด(๋ชจ๋“  ์–ธ์–ด Dart์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ Dart๊นŒ์ง€ ์ปดํŒŒ์ผํ•จ)์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋„์šธ ์ˆ˜ ์žˆ๊ณ  ๋•๊ณ  ์‹ถ๋‹ค๋ฉด ์ €์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

dart engine framework

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

์ข‹์Šต๋‹ˆ๋‹ค. ' 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/>}
  />);
}

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

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 ๋งˆํฌ์—…์—์„œ ์ƒ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ตœ์ข… 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์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ์•ˆํ•˜๋Š” ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด "ํ…์ŠคํŠธ" ์ƒ์„ฑ์ž๊ฐ€ ์‚ฌ๋ผ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ…์ŠคํŠธ ์œ„์ ฏ์„ ๋งŒ๋“œ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? <pi="37">๋‚ด๊ฐ€ ๋ฐฉ์–ด์ ์ด๊ฑฐ๋‚˜ ๊ณต๊ฒฉ์ ์œผ๋กœ ๋“ค๋ฆฐ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. :-) ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‚˜์™”๋˜ ์ฃผ์ œ์ด์ง€๋งŒ ์ €๋Š” ์ „์— ์‹ค์ œ๋กœ ์ด ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ๋…ผ์Ÿ์„ ๋ฒŒ์ด๋ ค๋Š” ์‚ฌ๋žŒ์„ ํ•œ ๋ฒˆ๋„ ๋ณธ ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด ๋Œ€ํ™”๊ฐ€ ์š”์ฒญ ๋’ค์— ์žˆ๋Š” ์ถ”๋ก ์ด ๋ฌด์—‡์ธ์ง€ ๊ฐ€๋ฅด์ณ ์ฃผ๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋…ผ์Ÿ์ ์ธ ์–ด์กฐ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.</p>

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

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 ์ •์˜๋ฅผ ์œ„ํ•œ ๋งˆํฌ์—…์˜ ๋งค๋ ฅ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๋„ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Flex ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„์ฃผ์–ผ์€ ๋งˆํฌ์—…๊ณผ ์ฝ”๋“œ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ฝ”๋“œ๋Š” ๋Œ€๊ทœ๋ชจ ์‹ค์ œ ์•ฑ์—์„œ ์ง€๋ฐฐ์ ์ธ ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์€ ๋งˆํฌ์—…๊ณผ ์ฝ”๋“œ์˜ ๋ณต์žกํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋กœ ์ •์˜๋œ ์•ฑ์— ๋ฐ˜๋“œ์‹œ ์ด์ ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • "Flex Builder" IDE๋Š” ๋งˆํฌ์—…๊ณผ ์ฝ”๋“œ๋กœ ์ •์˜๋œ ์•ฑ์„ ์ง€์›ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด IDE๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ด๊ฒƒ์„ ActionScript ๋„๊ตฌ๋กœ ๋ณด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • XML "์ปดํŒŒ์ผ๋Ÿฌ"๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ณ  ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์—”์ง€๋‹ˆ์–ด ํŒ€์„ ํ’€ํƒ€์ž„์œผ๋กœ ๋ฐ”์˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ƒ๋‹นํ•œ ๋ถ€๋‹ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํˆดํ‚ท์„ ์ž ๊ธˆ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉด ์ „์ฒด SDK์˜ ๋ฐœ์ „ ์†๋„๊ฐ€ ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋…„์ด ์ง€๋‚ฌ๊ณ  ๋” ์ด์ƒ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์ธ ์ธ์ƒ์€ ๋งˆํฌ์—…๊ณผ ์ฝ”๋“œ์˜ ์กฐํ•ฉ์œผ๋กœ 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 ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ๋ฐ˜๋Œ€ ์ฃผ์žฅ์€ ์ •๋ง ๊ทธ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

  1. ๊ด€๊ณ„๋Š” ๊ฝค ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๋Œ€์ค‘ํ™”๋˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด?
  2. ์—„์ฒญ๋‚œ! JSX ๊ฐ€๋…์„ฑ์— ๊ฐ€๊น์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ํ˜„์žฌ ์ œ์•ˆ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  3. ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฐํ˜”์Šต๋‹ˆ๋‹ค . ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ GUI ๋นŒ๋”์— ๋Œ€ํ•œ JSX ์ง€์›์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Flutter UI ์ฝ”๋“œ๋ฅผ ๋œ ์žฅํ™ฉํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด Dart๋ฅผ ๊ฐœ์„ ํ•  ๊ณ„ํš๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ์˜ ๋ฐฉ์‹์ด ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ธ์ •์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌํ•œ ์ œ์•ˆ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด React Native ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ Dart ์–ธ์–ด ๊ธฐ๋Šฅ ์š”์ฒญ์€ ์ฝ”๋“œ๋ฅผ ๋” ์งง๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  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 ๊ตฌ๋ฌธ์„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฐ์›Œ์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ - ๋Œ€์‹  Futures๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ - XML๊ณผ ์ฝ”๋“œ ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์€ ๋ถˆํ•„์š”ํ•œ ์ธ์ง€ ๋ถ€ํ•˜์ž…๋‹ˆ๋‹ค.
  3. ์•„์นจ์—๋Š” Java๋กœ, ์˜คํ›„์—๋Š” Python์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•œ ๋‚ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ Javascript, Babel, JSX, HTML, CSS ๋“ฑ์„ ์ดํ•ดํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. Flutter์—์„œ XML์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” dart๊ฐ€ XML ์†์„ฑ์„ ๋Œ€์ฒดํ•˜๋Š” ๋ช…๋ช…๋œ ์ธ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  5. Dart๋Š” ๋…ธ๋ ฅ ์—†์ด ์ฝ”๋“œ๋ฅผ ์ •๋ง ์ž˜ ๋“ค์—ฌ์“ฐ๋Š” ์•„์ฃผ ๋ฉ‹์ง„ dartfmt๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ์™€ ๋น„๊ต

  1. ์–ด์จŒ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์„ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š”๋ฐ, ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  2. Android์˜ XML ๋ ˆ์ด์•„์›ƒ์€ ์žฅ์น˜์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด์ง€๋งŒ Flutter์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด์จŒ๋“  ์‹ค์งˆ์ ์œผ๋กœ ์ฆ‰๊ฐ์ ์ด๋ฏ€๋กœ XML์„ ์ถ”๊ฐ€ํ•ด๋„ ์ด์ ์ด ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. Android XML + ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ์กฐํ•ฉ์€ XML ์Šค๋‹ˆํŽซ์„ ํ™•์žฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ XML ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. Flutter์—์„œ ์ฆ‰์‹œ ์‹คํ–‰์€ ๋งค์šฐ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— XML ๋ชจ๋ธ์ด ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ์˜ ์˜ค๋ฅ˜๋Š” 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 ๊ฐœ๋ฐœ์ž๋กœ์„œ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํƒœ๊ทธ ์„ ์–ธ์„ ๋‹ซ์œผ๋ฉด ์ž์‹ ๋Œ€ ์†์„ฑ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค. UI๋Š” ๋ถˆํ–‰ํžˆ๋„ ๊นŠ์ด ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ช…ํ™•ํ•œ ํƒœ๊ทธ ๋Œ€ ์•Œ ์ˆ˜ ์—†์Œ )์ด ์žˆ์œผ๋ฉด ํ•˜์œ„ ํ•ญ๋ชฉ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตฌ์„ฑ ์š”์†Œ ์‚ฌ์ด์—์„œ ์ฝ”๋“œ๋ฅผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ œ์ž๋ฆฌ์— ์—†์„ ๋•Œ ๋งค์šฐ ์„ ์–ธ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ํƒœ๊ทธ ์•ž์— ๋‹ซ๋Š” ํƒœ๊ทธ). ์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ์ค‘์ฒฉ๋œ ๊ฒฝ์šฐ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

  2. ์ƒ์„ฑ์ž ๋‚ด๋ถ€์˜ ์—ฌ๋Ÿฌ ์ค‘์ฒฉ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดˆ๊ธฐ ์ง๊ฐ ๋ฐ˜์‘์€ "์ฝœ๋ฐฑ ์ง€์˜ฅ" ์— ๋Œ€ํ•œ ํ”Œ๋ž˜์‹œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ ์  ๋‚˜์•„์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” JS์˜ ๋งค์šฐ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ์‹œ๋Œ€์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋Œ์•„๊ฐ€๋ฉด ํ•œ ๊ฑธ์Œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

  3. #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/

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค :

  1. Dart๋Š” Java ์ถœ์‹ ์ด๋ผ๋ฉด ๋” ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
  2. Dart ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•˜๋ฉฐ ์›น์—์„œ ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๊ณ  WebView์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google ์ƒ‰์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค).
  3. 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 ๊ตฌ๋ฌธ์€ ์›น ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋ฃจ ๋™์•ˆ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ ์ƒ‰์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

https://blog.dantup.com/2014/08/you-have-ruined-html/

์˜ˆ, 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์— ๊ฝค ์ต์ˆ™ํ•œ ์ €์—๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ๋ˆˆ์— ๋„๋Š” ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒํƒœ ๊ด€๋ฆฌ ๋ชจ๋ธ์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์ ฏ/์ปดํฌ๋„ŒํŠธ ๊ฐ€์ƒ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ ๋ชจ๋ธ์„ ์•Œ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ๋ถ€ Dart ์‚ฌ์–‘ ๋ฐ ํ”Œ๋žซํผ API๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด์ œ ์•ฑ์„ ์ž‘์„ฑํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ...
  • ์Šคํƒ€์ผ๋ง ์–ธ์–ด๋Š” ๊ฑธ๋ฆผ๋Œ์ž…๋‹ˆ๋‹ค. https://flutter.io/web-analogs/ ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํ•„์š”ํ•œ์ง€(EdgeInset? Color?) ๋˜๋Š” ์–ธ์ œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ๋Œ€์‹  ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • @cbazza ์˜ DSX ๋ณ€ํ™˜๊ธฐ์—์„œ ๊ฐ€์ ธ์˜จ CSS ํŒŒ์„œ๋Š” Flutter ๋ชจ๋ธ์—์„œ ๋™๋“ฑํ•œ ๋ ˆ์ด์•„์›ƒ์„ ์ฐพ๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

JSX์— ๊ด€ํ•˜์—ฌ:

  • Flutter ํŒจํ„ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด JSX ๊ตฌ๋ฌธ์„ ๋ฐœ๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ ์ผ๋ถ€ ๊ตฌ๋ฌธ ๋ฌธ์ œ๋Š” ๊ณ ์ฐจ ๊ตฌ์„ฑ ์š”์†Œ (๊ตฌ์„ฑ ์š”์†Œ ํด๋ž˜์Šค๋ฅผ ๋นŒ๋“œํ•˜๋Š” ํ•จ์ˆ˜) ๋ฐ ๋ Œ๋”๋ง ์†Œํ’ˆ (ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ, ํ•จ์ˆ˜๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜)๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด 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>
  • ๋‚ด๊ฐ€ ๋ณธ JSX์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ๋…ผ์Ÿ์€ Dart๊ฐ€ ์ธ์ˆ˜๋ฅผ ๋ช…๋ช…ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์š”์†Œ์— ์ž์‹์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ํ•˜๋‚˜์˜ ์ž์‹์ด ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”? ์•„๋งˆ๋„ "fragment" ๊ตฌ์กฐ ๊ฐ€ ํ•ด๋‹น API๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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์— ๋„์›€์ด ๋˜๋‚˜์š”?'์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€๋‹ต์ด ์•„๋‹ˆ์˜ค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์•ฑ ์ฝ”๋“œ์—์„œ ๋ ˆ์ด์•„์›ƒ ์‚ฌ์–‘์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ž˜์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด Dart 2 ๊ตฌ๋ฌธ ์ œ์•ˆ์€ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€๋Šฅํ•œ pragma์— ๋”ฐ๋ผ JSX์™€ ๊ฐ™์€ ๋ถˆ๊ฐ€์ง€๋ก ์  ํ˜•์‹์˜ Dart ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ ๊ฒฝ์šฐ build ๋ฉ”์„œ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ ˆ์ด์•„์›ƒ์„ ๋งˆํฌ์—…์œผ๋กœ ์ •์˜ํ•˜๋ฉด (์ƒํƒœ ์ €์žฅ/๊ฐ€์ƒํ™”) ์œ„์ ฏ ์—”์ง„๊ณผ React์˜ ReactDOM ๋ฐ React Native ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง ์—”์ง„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž ์žฌ์ ์œผ๋กœ ์œ„์ ฏ์„ ์ƒˆ ํ”Œ๋žซํผ์œผ๋กœ ๋” ์‰ฝ๊ฒŒ ์ด์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆํฌ์—… ํ˜•์‹์„ ์ •์˜ํ•˜๋ฉด ๊ธฐ์กด ๋ ˆ์ด์•„์›ƒ(์˜ˆ: Sketch ๋˜๋Š” ๊ธฐํƒ€ ๋””์ž์ธ ๋„๊ตฌ)์„ Flutter๋กœ ์‰ฝ๊ฒŒ ์ด์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์Šค ํŒŒ์ผ๋Ÿฌ 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()])

์œ ์ผํ•œ ๊ตฌ์„ฑ์€ ์š”์†Œ ์ด๋ฆ„+์†์„ฑ๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ+์ธ์ˆ˜ ๊ฐ„์˜ ๋ณ€ํ™˜๊ณผ ์ด์Šค์ผ€์ดํ”„๋œ ํ‘œํ˜„์‹( {...} )์ž…๋‹ˆ๋‹ค.

  • DSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์ ฏ์„ ์กฐ๊ฑด๋ถ€๋กœ ์ˆจ๊ธฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?
(JS)
  { condition && <A /> }
  { condition ? <A /> : <B /> }
  • ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹์œ„์ ฏ์— ๋งคํ•‘ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
(JS)
  { ['a', 'b'].map(i => <A property={i} />) }
  • ์Šค์œ„์น˜๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?
    JS์—์„œ์™€ ๊ฐ™์ด Dart์—์„œ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์Šค์œ„์น˜ ์ธ๋ผ์ธ์€ ํ‘œํ˜„์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ„์ ฏ ํŠธ๋ฆฌ ์™ธ๋ถ€์— ์žˆ๋‹ค๋ฉด ์Šค์œ„์น˜๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ flutter ํŒ€์ด ์˜์‹ฌ์Šค๋Ÿฝ๊ณ  ํŠน์ • ์›น ๊ฐœ๋ฐœ์ž ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ์ผ๋ถ€๋ฅผ ๋Œ์–ด๋“ค์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ณด๋ฅ˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

@b-strauss, React Native๋Š” ์›น ๊ฐœ๋ฐœ์ด ์•„๋‹ˆ๋ผ Flutter์˜ ์ฃผ์š” ๊ฒฝ์Ÿ์ž์ธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค. ์˜ˆ, JSX๋Š” ๊ด‘์›๊ณผ ๊ฐ™์•„์„œ ๋งŽ์€ React Native ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ์–ด๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2017๋…„ 8์›”์— ์ด ๊ธฐ๋Šฅ์„ ์š”์ฒญํ–ˆ๋Š”๋ฐ ๋ง์ด ๋„ˆ๋ฌด ๋งŽ๊ณ  ํ–‰๋™์ด ์ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  DSL์€ ์ •์˜์ƒ GPL๋ณด๋‹ค ํ‘œํ˜„๋ ฅ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. DSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์ ฏ์„ ์กฐ๊ฑด๋ถ€๋กœ ์ˆจ๊ธฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹์œ„์ ฏ์— ๋งคํ•‘ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์Šค์œ„์น˜๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด์ œ GPL์— ์ด๋ฏธ ์žˆ๋Š” ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ฒ˜์Œ์— DSL์„ ๋ฐœ๋ช…ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ์™„์ „ํžˆ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์†Œ์‹์€ ๋‚˜๋„ ํ•œ ๋ฒˆ ํ‹€๋ ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ DSL์€ ๋งˆํฌ์—…์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ๋งŒ๋“ค๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ(๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์Œ), JSX๋Š” ๋งˆํฌ์—…์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(ํ˜ธ์ŠคํŠธ ์–ธ์–ด๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉ). ์ฐจ์ด์ ์€ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Dart์—์„œ ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Dart๋Š” ๋‹คํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ  '{}' ์‚ฌ์ด์˜ ๋ชจ๋“  ๊ฒƒ์€ Dart ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋‹คํŠธ ํ‘œํ˜„์‹์ด์ง€๋งŒ ํ‘œํ˜„์‹์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ ํƒœ๊ทธ(\) ์œ„์ ฏ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค(new Text()).

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๊ฐ€ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ํ†ตํ•ฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • Android์—๋Š” XML ๋ ˆ์ด์•„์›ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • iOS์—๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ XIB(XML)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • GTK+์—๋Š” Pango ๋“ฑ์„ ์œ„ํ•œ XML์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Qt์—๋Š” QML(YAML๊ณผ ์œ ์‚ฌ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Xamarin์—๋Š” XAML์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์–ธ์–ด์˜ ๋Œ€๋ถ€๋ถ„์—๋Š” 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 )์™€ ํ˜ผํ•ฉ๋œ ๊นŠ์€ ์ค‘์ฒฉ์€ ํ˜„์žฌ ์ฝ”๋”ฉ ๋ฐฉ์‹์—์„œ ์„ฑ๊ฐ€์‹ญ๋‹ˆ๋‹ค.
  • __์ฝ”๋“œ์—์„œ ์Šคํƒ€์ผ/๋””์ž์ธ์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค__. ์‹œ๊ฐ์  ๋ถ„๋ฆฌ๋Š” ์ฝ๊ธฐ(๋ช…๋ นํ˜• ์ฝ”๋“œ์™€ ์Šคํƒ€์ผ์„ ํ•œ ๋ˆˆ์— ๊ตฌ๋ถ„)์— ์ข‹๊ณ  ์‹ค์ œ ๋ถ„๋ฆฌ๋Š” ๋„๊ตฌ(์˜ˆ: Layout Editor๊ฐ€ ์žˆ๋Š” IDE)์— ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜๊ฒฌ์ด ๋‹ค๋ฅธ ๋‘ ๊ทธ๋ฃน์ด ์ฃผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ณต์žก์„ฑ์„ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ๊ตฌ๋ฌธ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฏธ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ต์…˜ new , Dart 2.0์˜ const ๋ฐ ์ œ์•ˆ๋œ virtual "closing tag" comments ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋งˆํฌ์—… ์–ธ์–ด(JSX์™€ ๊ฐ™์€ ๋˜๋Š” XML๊ณผ ๊ฐ™์€)๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” ์–ด๋Š ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์‰ฝ๊ฒŒ ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋จผ์ € ์‹คํ—˜์„ ํ•˜๊ณ  ๋‚˜์ค‘์— ์ตœ์ข… ๊ฒฐ์ •(์ˆ˜๋ฝ ๋˜๋Š” ๊ฑฐ๋ถ€)์„ ๋‚ด๋ฆฌ๋„๋ก ํ•˜์„ธ์š”.

@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์™€ ์‚ฌ๋ž‘์— ๋น ์กŒ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ํ‚ฌ๋Ÿฌ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์—†์Œ
  2. ๋” ์ด์ƒ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ์„ ์ „๋‹ฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@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 ์—†์ด ๋ฐ˜์‘:

  • 133์ž(๊ด„ํ˜ธ 3๊ฐœ, ๋Œ€๊ด„ํ˜ธ 3๊ฐœ, : 3๊ฐœ, , 4๊ฐœ ๋ฐ ๊ณต๋ฐฑ 11๊ฐœ ํฌํ•จ)
  • React.createElement ๋‘ ๋ฒˆ ์ž‘์„ฑ๋จ

JSX:

  • 104์ž, ๊ด„ํ˜ธ 2๊ฐœ, ๋Œ€๊ด„ํ˜ธ 3๊ฐœ, : 1๊ฐœ, <> ๊ฐœ, ๊ณต๋ฐฑ 5๊ฐœ
  • Container ๋ฐ Text ๋‘ ๋ฒˆ ์ž‘์„ฑ

๋‹คํŠธ:

  • 99์ž, ๊ด„ํ˜ธ 2๊ฐœ, : 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/>}
/>

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ˜์‘์—์„œ ํ”Œ๋Ÿฌํ„ฐ๋กœ ๋” ์‰ฝ๊ฒŒ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ์ฃผ์žฅ์€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSX๋Š” ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์—:

<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๋ฅผ ํ”Œ๋Ÿฌํ„ฐ๋กœ ์‹ซ์–ดํ•˜๊ณ  "๊ธฐ๋‹ค๋ ค๋ณด๊ณ " ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋ฅผ ๋” ๋‚˜์—ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋งŽ์€ ๋ถ€๋ถ„์— ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ, ๋‹น์‹ ์ด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊นŠ์ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์œ„์ ฏ ์ƒ์„ฑ์€ React์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ XML์„ ๋ณด๋ฉด React์—์„œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ด๊ณ  Flutter์—์„œ๋Š” ์œ„์ ฏ์ž…๋‹ˆ๋‹ค.

  1. ์‚ฌ๋žŒ๋“ค์€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค new Foo()๊ฐ€ ํ•˜์ง€ ์•Š๋Š” ํŠน๋ณ„ํ•œ ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด Dart/DSX๊ฐ€ Javascript/JSX๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ฝค ๋นจ๋ฆฌ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ์ผ๋ฐ˜์ ์œผ๋กœ 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์™€ ๋ง‰์—ฐํ•˜๊ฒŒ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค ;)

  1. 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์˜ ๊ตฌ๋ฌธ์„ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…๋„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ธฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋งค์šฐ ๊ฑด์„ค์ ์ด๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์—†๋Š” ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๋ฅผ ์—ด์ง€ ์•Š๋„๋ก ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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