Flutter: ์œ„์ ฏ ํ›„ํฌ

์— ๋งŒ๋“  2018๋…„ 12์›” 12์ผ  ยท  100์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

React ํŒ€์€ ์ตœ๊ทผ ํ›„ํฌ๋ฅผ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค: https://medium.com/@dan_abramov/making -sense-of-react-hooks-fdbde8803889. Flutter๊ฐ€ React์™€ ์–ผ๋งˆ๋‚˜ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด Flutter์—๋„ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •์˜:

ํ›„ํฌ๋Š” StatefulWidget State ์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ฃผ์š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์ ฏ์—์„œ ์›ํ•˜๋Š” ๋งŒํผ ํ›„ํฌ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ›„ํฌ๋Š” State (๋˜๋Š” ์ˆ˜์ •๋œ ๋ฒ„์ „)์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ์ฃผ์–ด์ง„ ์œ„์ ฏ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŠน์ • ์œ„์ ฏ ์œ ํ˜•์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” State ์™€๋Š” ๋Œ€์กฐ์ ์ž…๋‹ˆ๋‹ค.

Hooks๋Š” ์ถฉ๋Œ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์Šˆํผ ๋ฏน์Šค์ธ๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” _์™„์ „ํžˆ_ ๋…๋ฆฝ์ ์ด๋ฉฐ ์œ„์ ฏ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.
์ฆ‰, Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ถฉ๋Œ์— ๋Œ€ํ•œ ๋‘๋ ค์›€ ์—†์ด ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฏน์Šค์ธ๊ณผ ๋‹ฌ๋ฆฌ ๋™์ผํ•œ Hook์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์›์น™:

ํ›„ํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฐ์—ด์˜ Element ๋‚ด์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์œ„์ ฏ์˜ build ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ›„ํฌ๋Š” ๋ฌด์กฐ๊ฑด ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

ํ•˜๋‹ค:

Widget build(BuildContext context) {
  Hook.use(MyHook());
}

ํ•˜์ง€๋งˆ:

Widget build(BuildContext context) {
  if (condition) {
    Hook.use(MyHook());
  }
}

์ด ์ œํ•œ์€ ๋งค์šฐ ์ œํ•œ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ›„ํฌ๊ฐ€ ์ธ๋ฑ์Šค์— ์˜ํ•ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์œ ํ˜•๋„ ์ด๋ฆ„๋„ ์•„๋‹™๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ถฉ๋Œ ์—†์ด ์›ํ•˜๋Š” ๋งŒํผ ๋™์ผํ•œ ํ›„ํฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€

Hooks์˜ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋ถ€๋ถ„์€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋กœ์ง์„ โ€‹โ€‹์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Flutter ์œ„์ ฏ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” AnimationController ์™€ ๊ฐ™์€ ์ผํšŒ์šฉ ๊ฐœ์ฒด์ž…๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ initState ๋ฐ dispose ์žฌ์ •์˜๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ์œ ์ง€ ๊ด€๋ฆฌ์ƒ์˜ ์ด์œ ๋กœ ๋ฏน์Šค์ธ์œผ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ ์Šค๋‹ˆํผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค: stanim

class Example extends StatefulWidget {
  <strong i="7">@override</strong>
  ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;

  <strong i="8">@override</strong>
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this, duration: const Duration(seconds: 1));
  }

  <strong i="9">@override</strong>
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  <strong i="10">@override</strong>
  Widget build(BuildContext context) {
    return Container(

    );
  }
}

Hooks๋Š” ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž ์žฌ์ ์œผ๋กœ _ํ›จ์”ฌ_ ์ž‘์€ ์ฝ”๋“œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

class Example extends StatelessWidget {
  <strong i="15">@override</strong>
  Widget build(BuildContext context) {
    AnimationController controller = useAnimationController(duration: const Duration(seconds: 1));
    return Container(

    );
  }
}

์ด๋Ÿฌํ•œ ํ›„ํฌ์˜ ์ˆœ์ง„ํ•œ ๊ตฌํ˜„์€ ๋‹ค์Œ ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AnimationController useAnimationController({Duration duration}) {
  // use another hook to obtain a TickerProvider
  final tickerProvider = useTickerProvider();

  // create an AnimationController once
  final animationController = useMemoized<AnimationController>(
    () => AnimationController(vsync: tickerProvider, duration: duration)
  );
  // register `dispose` method to be closed on widget removal
  useEffect(() => animationController.dispose, [animationController]), 

   // synchronize the arguments
  useValueChanged(duration, (_, __) {
    animationController.duration = duration;
  });

  return animationController;
}

useAnimationController ๋Š” "ํ›„ํฌ" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ›„ํฌ์˜ ์ˆœ์ง„ํ•œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ ์ฝ”๋“œ๋Š” State ํด๋ž˜์Šค์— ์ต์ˆ™ํ•œ ๋ˆ„๊ตฐ๊ฐ€์™€ ์œ ์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ›„ํฌ๋Š” ์ƒ์„ฑ์—์„œ ํ๊ธฐ๊นŒ์ง€ AnimationController ๋ฅผ ์™„์ „ํžˆ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜ํ•œ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํŒจํ‚ค์ง€๋กœ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ initState AnimationController ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ํ•ซ ๋ฆฌ๋กœ๋“œ ์‹œ duration ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ›„ํฌ๋Š” ๋‹ค๋ฅธ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ 

ํ›„ํฌ์—๋Š” ๋น„์šฉ์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ’์— ๋Œ€ํ•œ ์•ก์„ธ์Šค์—๋Š” InheritedElement ์™€ ์œ ์‚ฌํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋กœ์ € ๋˜๋Š” "์œ„์ ฏ"๊ณผ ๊ฐ™์€ ์ˆ˜๋ช…์ด ์งง์€ ๊ฐ์ฒด์˜ ์ƒˆ๋กœ์šด ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด ์•„์ง ๋ฒค์น˜๋งˆํฌ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ


๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ํ•ซ ๋ฆฌ๋กœ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์œผ๋ฉด ๋ชฉ๋ก ๋์— ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ›„ํฌ๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ธฐ์กด ํ›„ํฌ ์ค‘๊ฐ„์— ํ›„ํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ถ€๋ถ„ ์ƒํƒœ ์žฌ์„ค์ •์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

A, B ์—์„œ A, C, B ๋กœ ์ด๋™ํ•˜๋ฉด B ์˜ ์ƒํƒœ๊ฐ€ ์žฌ์„ค์ •๋ฉ๋‹ˆ๋‹ค( dispose ๋ฐ initHook ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœ).

๊ฒฐ๋ก 

Hooks๋Š” ๋” ํฐ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜์—ฌ ์œ„์ ฏ ์„ธ๊ณ„๋ฅผ _๋งŽ์ด_ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ๊ธฐ, ๋ฉ”๋ชจ ์ž‘์„ฑ ๋ฐ ๊ฐ€์น˜ ๊ด€์ฐฐ๊ณผ ๊ฐ™์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ.

StatefulWidget์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งˆ์Œ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ์‹œ ๋ถ€๋ถ„ ์ƒํƒœ ์žฌ์„ค์ •์ด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Flutter ์™ธ๋ถ€์—์„œ ํ›„ํฌ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ›„ํฌ์˜ ํŠน์ˆ˜์„ฑ์œผ๋กœ ์ธํ•ด ๋งž์ถคํ˜• ๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด _๋งŽ์€_ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ํŒจํ‚ค์ง€.

๋ณด๋„ˆ์Šค

~์ง„ํ–‰ ์ค‘์ธ ๊ตฌํ˜„์€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/rrousselGit/flutter_hooks (์ตœ์‹  ๊ธฐ๋Šฅ์€ prod-ready ๋ถ„๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค).~

~๊ณง ์•ŒํŒŒ ๋ฒ„์ „์œผ๋กœ ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๊ตฌํ˜„์€ ์–ด๋Š ์ •๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.~

https://pub.dartlang.org/packages/flutter_hooks# -readme-tab-์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

framework new feature

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

Flutter ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Hooks์— ๋Œ€ํ•ด 1:1 ์ฑ„ํŒ…์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ React์—์„œ Hooks๋ฅผ ์ฑ„ํƒํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์—ญ์‚ฌ์ , ๊ธฐ์ˆ ์  ๋งฅ๋ฝ์„ ์„ค๋ช…ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด ์˜๊ฒฌ๋„ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/reactjs/rfcs/pull/68#issuecomment -439314884.

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

@Hixie @eseidelGoogle

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘” ๋ช‡ ๊ฐ€์ง€ ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ https://twitter.com/ericmander/status/1070024779015479302 ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜์ž…๋‹ˆ๋‹ค. Flutter ํŒ€์ด ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•ด ์ถ”๊ฐ€ ํˆฌ์ž๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ

์•ˆ๋…•ํ•˜์„ธ์š” @rrousselGit ์š” ์ „์— ๊ท€ํ•˜์˜ flutter_hooks ํŒจํ‚ค์ง€๋ฅผ ๋ณด๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Flutter์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์˜ต์…˜์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ HookContext๋ฅผ ํ†ตํ•ด ํ›„ํฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ˜๋ฉด React์—์„œ๋Š” ํ›„ํฌ๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ์ข…์˜ "์ƒํƒœ ๋ฏน์Šค์ธ"์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ flutter_hooks ๋Š” ๋ชจ๋“  ํ›„ํฌ ๋ฉ”์„œ๋“œ๋ฅผ ํŒจํ‚ค์ง€์— ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ React๋Š” ํ›„ํฌ ๋ฉ”์„œ๋“œ๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ React ์‚ฌ์–‘์„ ์ผ์น˜์‹œํ‚ค๋Š” ๋ฐ ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ฌ์„ฑ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ :

HookContext ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ ๋ชจ๋“  ํ›„ํฌ๋Š” ์ด์ œ ์ •์  ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ์€ ์ด์ œ ๊ตฌ์‹์ž…๋‹ˆ๋‹ค.


๋‚ด ํŒจํ‚ค์ง€๋Š” ์ž๋™ ์™„์„ฑ์„ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€๋งŒ ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€์‹ ์—

context.useSomeHook()

์šฐ๋ฆฌ๋Š” ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

useSomeHook(context)

์ด๊ฒƒ์€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ์€

T HookContext.use<T>(Hook);

๊ฑฐ๊ธฐ์—์„œ ์ž์‹ ์˜ ํ›„ํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋งŒ ์žˆ์œผ๋ฉด React๊ฐ€ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ›„ํฌ์˜ ํŠน์ˆ˜์„ฑ์œผ๋กœ ์ธํ•ด ๋งž์ถคํ˜• ๋ฆฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ๊ณตํ•  ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ํŒจํ‚ค์ง€.

๋‚˜๋Š” ๋‹น์‹ ์ด upvote๋ฅผ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค)
https://github.com/dart-lang/linter/issues/697. ํŒจํ‚ค์ง€๊ฐ€ ๊ณ ์œ ํ•œ ๋งž์ถค ๋ฆฐํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ํ•ซ ๋ฆฌ๋กœ๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ๊ฑฑ์ •์‹œํ‚จ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋“œ ๊ฒฝํ—˜์„ ์ €ํ•˜์‹œํ‚ค๋ฉด ์Šฌํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://pub.dartlang.org/packages/flutter_hooks ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ด๊ฒƒ์„ Flutter ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ตฝ๋Š” ๊ฒƒ์˜ ์žฅ์ ์ด ์™ธ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฌด์—‡์ธ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

ํ•ซ ๋ฆฌ๋กœ๋“œ์— ๋Œ€ํ•ด ํ†ตํ•ฉํ–ˆ๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋ถ€๋“œ๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ์ง„์งœ ๋ฌธ์ œ๋Š” #26503์ด๋ฉฐ, ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋„๊ตฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ๋Œ€์—ญํญ์ด ์—†์Šต๋‹ˆ๋‹ค.


ํ›„ํฌ๋ฅผ Flutter์— ํ†ตํ•ฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž‘์€ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • StatefulElement์— ์˜์กดํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์ผ๋ถ€ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • Analyzer_plugin์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๋งค์šฐ ์ œํ•œ์ ์ธ ๋ฆฌํŒฉํ† ๋ง/๋ถ„์„

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Hook์€ React์—์„œ ๋Œ€๊ทœ๋ชจ ์ž‘์—…์˜ ์ผ๋ถ€์ธ ๋น„๋™๊ธฐ ๋ Œ๋”๋ง์ž…๋‹ˆ๋‹ค.

Flutter๊ฐ€ Async Rendering ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ž˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ) ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ ๋ณ€๊ฒฝ
  • ํ›„ํฌ์™€ ๋น„์Šทํ•œ ๊ฒƒ

๋ช…๋ฐฑํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ธก๋ฉด๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ๊ด‘๊ณ ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ•œ ๋‹ฌ์— 270๊ฐœ์˜ ๋ณ„๊ณผ https://github.com/trending/dart?since=monthly ์— ํ•œ ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š” - ํ›„ํฌ๋Š” ํ™•์‹คํžˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ด€์‹ฌ์„ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ›„ํฌ์˜ ๋ชฉํ‘œ๋Š” ์œ„์ ฏ์˜ ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด ๋ผ์ดํ”„์‚ฌ์ดํด ํŠน์ • ๋กœ์ง์„ pub์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์ง€์›๋˜๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋…ธ๋ ฅ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ: ํ•ซ ๋ฆฌ๋กœ๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

reassemble ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ComponentElement ๋Œ€์‹  StatefulElement๋ฅผ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์Œ build ํ˜ธ์ถœ์ด ํ›„ํฌ ๋ชฉ๋ก์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋™์‹œ์— ์ •์ƒ์ ์ธ ์žฌ๊ตฌ์ถ•์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์ •๋œ ์ธ๋ฑ์Šค์—์„œ previousHook.runtimeType != newHook.runtimeType ์ด๋ฉด ์ด ํ›„ํฌ์™€ ๋‹ค์Œ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

"๋‹ค์Œ ๋ชจ๋‘" ๋ถ€๋ถ„์€ ํ›„ํฌ๊ฐ€ ๋‹ค๋ฅธ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜๋งŒ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•œ ๋‹ฌ ๋™์•ˆ ๊พธ์ค€ํžˆ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ฑฐ์˜ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋“œ ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด build ๋ฉ”์„œ๋“œ ๋‚ด์— ์žˆ์œผ๋ฏ€๋กœ ํ•ซ ๋ฆฌ๋กœ๋“œ๋Š” ํ•ญ์ƒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค( initState ์™€ ๋ฐ˜๋Œ€). ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” AnimationController ์ž…๋‹ˆ๋‹ค.

final animationController = useAnimationController(duration: const Duration(second: 1));

์ด ํ›„ํฌ๋Š” ์ง€์† ์‹œ๊ฐ„์˜ ๋ถ€๋“œ๋Ÿฌ์šด ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ซ ๋ฆฌ์Šคํƒ€ํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์ธ ์•ฑ์˜ ์ผ๋ถ€๋ฅผ ๋ฒˆ์—ญํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Hooks๋ฅผ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ์™„์ „ํ•œ ํŒจํ„ด์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋งŽ์€ ์ฃผ์ œ๋กœ ์ƒ์‚ฐ์„ฑ์€ ๋ฌผ๋ก  ์œ ์ง€ ๊ด€๋ฆฌ์—๋„ ํฐ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ œ๊ฑฐํ–ˆ์œผ๋ฉฐ Firebase์šฉ Hooks ๋˜๋Š” ๊ธฐํƒ€ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋“œ ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋นŒ๋“œ ๋ฉ”์†Œ๋“œ ๋‚ด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ซ ๋ฆฌ๋กœ๋“œ๋Š” ํ•ญ์ƒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค(initState์™€ ๋ฐ˜๋Œ€).

๐Ÿ‘ ๋‚˜๋„ ์ฒ˜์Œ ์„ธ๋ฐ”์Šค์ฐฌ์˜ ์ œ์•ˆ์„ ๋ณธ ์ง€ ๋ช‡ ์ฃผ ๋งŒ์— ๊นจ๋‹ฌ์•˜๋‹ค.

"๋‹ค์Œ ๋ชจ๋‘" ๋ถ€๋ถ„์€ ํ›„ํฌ๊ฐ€ ๋‹ค๋ฅธ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜๋งŒ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ JS์—์„œ๋Š” ํœด๋ฆฌ์Šคํ‹ฑ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ซ ๋ฆฌ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด render (Flutter์˜ build )๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด(์˜ˆ: ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์œผ๋กœ ์ธํ•ด) ๋ชจ๋“  Hooks ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹คํŒจํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ดํ•‘์ด ๊ฐ•ํ•ด์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ์š”? ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด. ๋ฌธ์ž์—ด ์ƒํƒœ Hook์œผ๋กœ ํŽธ์ง‘์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆซ์ž๋กœ ๊ฐ€์ •ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋ฌธ์ž์—ด ์ƒํƒœ Hook์œผ๋กœ ํŽธ์ง‘์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆซ์ž๋กœ ๊ฐ€์ •ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

๋‹ค์Œ์—์„œ ์ถœ๋ฐœํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

final counter = useState(0)

์—๊ฒŒ:

final name = useState('foo');

?

๊ทธ๋ ‡๋‹ค๋ฉด ์ž…๋ ฅ ์‹œ์Šคํ…œ์€ ์œ ํ˜•์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. useState ์˜ ์œ ํ˜•์ด ์‹ค์ œ๋กœ useState<int> ๋Œ€ useState<String> ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

JS๋Š” ์—ฌ๊ธฐ์„œ ๋” ํž˜๋“  ์‹œ๊ฐ„์„ ๋ณด๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์„ ์–ธ ํ•˜๋‚˜, initState์—์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ค„ ํ•˜๋‚˜, dispose์—์„œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ค„ ํ•˜๋‚˜๊ฐ€ ๋นŒ๋“œ ๋ฉ”์„œ๋“œ์—์„œ ๋œ ํšจ์œจ์ ์ด๊ณ  ์™„์ „ํžˆ ๋ถˆํˆฌ๋ช…ํ•œ ์ค„๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ์„ฑ๋Šฅ์€ ๋น„ํŒ์ ์ธ). ์ข‹์€ ๊ฑฐ๋ž˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

(์ฆ‰, https://pub.dartlang.org/packages/flutter_hooks๋Š” ์ด๋ฏธ ์—ฌ๊ธฐ์— ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ํ”Œ๋žซํผ์— ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

Hooks๋Š” React๊ฐ€ ์ˆ˜๋…„๊ฐ„ ์ง๋ฉดํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Flutter๊ฐ€ React์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ์–ป์œผ๋ฉด์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋งˆ์ผ€ํŒ…์— ์†Œ์งˆ์ด ์žˆ์œผ๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ React Team์˜ ์ด์•ผ๊ธฐ๋ฅผ ์‹œ์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์†Œ๊ฐœ๋Š” https://youtu.be/dpw9EHDh2bM์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

Dan Abramov์˜ ์ „ํ›„ ๋น„๊ต(์œ„์˜ ๋ช‡ ๊ฐ€์ง€ ์„ค๋ช…์— ๋Œ€ํ•œ ๋‹ต๋ณ€)๊ฐ€ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์š”์ ์€ ๊ทธ๋“ค์ด ๊ทธ ๋Œ€ํ™”์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด Flutter์—๋„ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(mixins๊ฐ€ ์œ ํ•ดํ•˜๋‹ค๋Š” ๋ธ”๋กœ๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html).


์ฆ‰, ํ›„ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ˆˆ์— ๋„๋Š” ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋” ๋งŽ์€ ๋น„์œจ์„ '๊ณต๊ฐœ'ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์ ฏ์—์„œ ํ›„ํฌ๋ฅผ ์™„์ „ํžˆ ์ถ”์ถœํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋…ผ๋ฆฌ๊ฐ€ State ์ˆ˜๋ช… ์ฃผ๊ธฐ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋กœ์„œ๋Š” StatefulWidget ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

ํ›„ํฌ์˜ ๋˜ ๋‹ค๋ฅธ ํšจ๊ณผ๋Š” ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ฃนํ™”๋˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

initState() {
  a = A(widget.foo);
  b = B(widget.bar);
}

didUpdateWidget(SomeWidget old) {
  if (old.foo != widget.foo) {
    a.foo = widget.foo;
  }
  if (old.bar != widget.bar) {
    b.bar = widget.bar;
  }
}

dispose() {
  a.dispose();
  b.dispose();
}

๋ชจ๋“  ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๋ผ์ดํ”„ ์‚ฌ์ดํด์— ๊ฑธ์ณ ํ˜ผํ•ฉ ๋ฐ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œ/์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

final a = useMemoized(() => A(foo));
useValueChanged(foo, () => a.foo = foo});
useEffect(() => a.dispose, [a]);

final b = useMemoized(() => B(bar));
useValueChanged(bar, () => b.bar = bar});
useEffect(() => b.dispose, [b]);

์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ์žฌํŽธ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œ/์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ ธ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ›จ์”ฌ ๋” ๋ถ„๋ช…ํ•ด์ง€๋ฉฐ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ •์  ํ•จ์ˆ˜๋กœ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” DRY์— ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ/ํ๊ธฐํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๋Œ€์‹  ๋ชจ๋“  ๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ์  ์˜ˆ(React์—์„œ):


์ „๋ฐ˜์ ์œผ๋กœ Flutter ์ €์žฅ์†Œ ์™ธ๋ถ€์—์„œ ํ›„ํฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Flutter๊ฐ€ Widget ๊ธฐ๋ณธ ํด๋ž˜์Šค๋งŒ ์ œ๊ณตํ•˜๊ณ  StatefulWidget ๋ฅผ ์™ธ๋ถ€ ์ข…์†์„ฑ์œผ๋กœ ๋งŒ๋“  ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Flutter๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ๋งŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋˜ํ•œ ๋‹ค์Œ์„ ์›ํ•  ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์—๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ณ  Flutter์—์„œ ์—ฌ๋Ÿฌ PR์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•œ ์‚ฌ๋žŒ์ด ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ž‘์€ ํŒจํ‚ค์ง€์˜ ๋ฒ”์œ„์™€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ‰๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” DRY์ด๋ฉฐ ์ฝ”๋“œ์˜ ๊นจ๋—ํ•œ ๊ณต๋™ ๋ฐฐ์น˜๋ฅผ ์ด‰์ง„ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง/์ƒํƒœ ๋ฏน์Šค์ธ์ž…๋‹ˆ๋‹ค. ๋Œ€์•ˆ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹จํŽธํ™”๋œ ๋ฐ˜๋ณต์ž…๋‹ˆ๋‹ค.

์ข…์ด์—์„œ๋Š” ๋” ๋ถˆํˆฌ๋ช…ํ•˜์ง€๋งŒ ํŒจํ„ด์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜๋ฉด ํˆฌ๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจํ„ด๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•  ๋•Œ๋Š” ๋ถˆํˆฌ๋ช…ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํˆฌ๋ช…ํ•˜์ง€๋งŒ Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „ํ™˜์ด ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ž…๋‹ˆ๋‹ค.

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

๋‚ด ์ˆœ์ง„ํ•œ ์งˆ๋ฌธ์€ ํ”Œ๋Ÿฌํ„ฐ์—์„œ ๊ธฐ๋Šฅ์  ์œ„์ ฏ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ธฐ๋Šฅํ•˜๋Š” ์œ„์ ฏ์€ ์ž์ฒด Element์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ์ž์ฒด BuildContext๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์œ„์ ฏ์ด ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ์ฒด ์•„๋ž˜์— ๋™์ผํ•œ ๊ฒƒ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”?

@ivenxu ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋„ ๋‚ด๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/rrousselGit/functional_widget

ํ•จ์ˆ˜(ํ‚ค ๋ฐ ๋ชจ๋“  ๊ฒƒ ํฌํ•จ)์—์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  HookWidget ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ›„ํฌ์™€ ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋‘˜์˜ ํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="11">@hwidget</strong>
Widget foo(BuildContext context, {Duration duration}) {
  final controller = useAninationController(duration: duration);
  useEffect(controller.forward, [controller]);

  final value = useAnination(controller);
  return Text(value.toString());
}

์ ์ง„์ ์œผ๋กœ 0์—์„œ 1๋กœ ๊ฐ€๋Š” ๋ฉ‹์ง„ ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
6์ค„์˜ ์ฝ”๋“œ๋กœ...
์ผ๋ฐ˜์ ์ธ ์œ„์ ฏ์—์„œ๋Š” 30์ค„ ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž๋™ ์ƒ์„ฑ๋œ debugFillProperties ๋ฐ operator== ์žฌ์ •์˜๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rrousselGit ๊ธฐ๋Šฅ์  ์œ„์ ฏ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ž‘์—…์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์—ˆ๊ณ , ์ข‹์€ ๋‚ด์šฉ๊ณผ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” flutter์˜ ๊ธฐ๋ณธ ์ง€์›์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ์ฒจ๋ถ€๋œ ๋””๋ฒ„๊ทธ๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์— ์–ด๋–ป๊ฒŒ ๊ฐ€๋‚˜์š”? foo()์—์„œ ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•˜๊ณ  ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฝœ์Šคํƒ์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

๋•Œ๋กœ๋Š” ์ปดํฌ๋„ŒํŠธ/์œ„์ ฏ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์  ํŒจ๋Ÿฌ๋‹ค์ž„์ด ํด๋ž˜์Šค์— ๋น„ํ•ด ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์› ๊ธฐ๋Šฅ ์œ„์ ฏ์ด ์–ด๋–ค ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์—ฌ๊ธฐ์˜ "before" ์‚ฌ์ง„์ด "after" ์‚ฌ์ง„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฃผ๊ด€์ ์ธ ์ƒ๊ฐ์ด๊ธด ํ•˜์ง€๋งŒ์š”.

Flutter๊ฐ€ Widget ๊ธฐ๋ณธ ํด๋ž˜์Šค๋งŒ ์ œ๊ณตํ•˜๊ณ  StatefulWidget์„ ์™ธ๋ถ€ ์ข…์†์„ฑ์œผ๋กœ ๋งŒ๋“  ๊ฒฝ์šฐ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ Flutter์˜ ๊ณ„์ธตํ™” ์ฒ ํ•™๊ณผ ๋งค์šฐ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. StatefulWidget์„ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์œ„์ ฏ ๋ ˆ์ด์–ด์˜ ํ•ต์‹ฌ ์ผ๊ธ‰ ๋ถ€๋ถ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ์—ฌ๊ธฐ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์˜ˆ: GlobalKey ). ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋Šฅํ•œ ํ•œ ํ•ต์‹ฌ์— ์žˆ์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ์„ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค์„ ์œ„ํ•ด ํŒจํ‚ค์ง€๋กœ ํ•ด๋‘๋Š” ๊ฒƒ๋„ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋” ๋‚˜์€ ๊ตฌํ˜„, ๋” ํšจ์œจ์ ์ธ ๊ตฌํ˜„ ๋“ฑ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ›Œ๋ฅญํ•œ ํ”„๋กœ์ ํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ํŒจํ‚ค์ง€๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

@rrousselGit ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด๊ฒƒ์„ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋กœ ๊ณ„์† ๊ฐœ๋ฐœํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋” ์„ฑ๊ณต์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋  ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ/PR์„ ์—ฌ๋Š” ๋ฐ ๋งŽ์€ ์„ฑ๊ณต์„ ๊ฑฐ๋‘˜ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋…ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ํ•ด๊ฒฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ์— ์ด ์ž‘์—…์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค!

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

๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.
ํ›„ํฌ๊ฐ€ Flutter์—์„œ ๊ตฌํ˜„๋œ๋‹ค๋ฉด ์ข‹์€ ํ›„๋ณด๋Š” ComponentElement์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์ƒˆ ์œ„์ ฏ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  StatelessWidget๊ณผ StatefulWidget์„ ํ›„ํฌ์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๊ตฌ๋ฌธ์ด ๊ณต์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ตฌ๋ฌธ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ง€๊ธˆ์€ Flutter ์™ธ๋ถ€์— ์žˆ๋Š” ํ›„ํฌ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ๋น„๊ณต์‹์ ์ด์–ด์„œ ์ „์ฒด ํ›„ํฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŽ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ›„ํฌ ์ˆ˜๋ฅผ ์ค„์ด์‹ญ์‹œ์˜ค.

ํ›„ํฌ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์˜ํ–ฅ(pub์— ๊ฒŒ์‹œ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ›„ํฌ)์ด๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ์œ ์šฉ์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

Flutter ํŒ€์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Hooks์— ๋Œ€ํ•ด 1:1 ์ฑ„ํŒ…์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ React์—์„œ Hooks๋ฅผ ์ฑ„ํƒํ•œ ์ด์œ ์— ๋Œ€ํ•œ ์—ญ์‚ฌ์ , ๊ธฐ์ˆ ์  ๋งฅ๋ฝ์„ ์„ค๋ช…ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ด ์˜๊ฒฌ๋„ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/reactjs/rfcs/pull/68#issuecomment -439314884.

@Hixie ๋˜๋Š” @dnfield ์—ฌ๋Ÿฌ๋ถ„ ์ค‘ @gaearon์—๊ฒŒ ์—ฐ๋ฝํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

React๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” Flutter ์‚ฌ์šฉ์ž๋กœ์„œ ํ›„ํฌ๋Š” React์˜ ์ง„์ •ํ•œ ๊ฒŒ์ž„ ์ฒด์ธ์ €๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋…์ ์ ์œผ๋กœ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ž‘์—…ํ•˜๋ฉด์„œ ๊ธฐ์กด ํด๋ž˜์Šค๋ฅผ ํ›„ํฌ๋กœ ์ด์‹ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์˜ ํŠน์ • ๋ถ€๋ถ„๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๊ฐ™์€ ์œ„์น˜์— ๋‘๋Š” ๊ฒƒ์˜ ์ด์ ์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค!

๊ทธ ํŒจ๋Ÿฌ๋‹ค์ž„์ด Flutter์— ๋งž๋Š”์ง€ ํ‰๊ฐ€ํ•˜๋Š” ๋…ธ๋ ฅ์ด ์žˆ์—ˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™์•„์š”โค๏ธ

๋‚ด๊ฐ€ ๊ทธ ๋Œ“๊ธ€์„ ๋†“์ณค์–ด! ๋‚˜๋Š” ๊ทธ๋“ค์—๊ฒŒ ์†์„ ๋‚ด๋ฐ€์—ˆ๋‹ค.

๋‚˜๋Š” Hooks๊ฐ€ Flutter์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ—˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฏธ Hooks ํŒจํ‚ค์ง€๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€๋Š” ์œ„์˜ ์ด ๋ฒ„๊ทธ์—์„œ ์–ธ๊ธ‰๋จ). ๊ทผ๋ณธ์ ์œผ๋กœ, ๋‚˜๋Š” ๊ทธ ๊ฐœ๋…์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‚ด ์ด์ „ ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://github.com/flutter/flutter/issues/25280#issuecomment -455846788, https://github.com/flutter/flutter/issues/25280#issuecomment - 455847134, https://github.com/flutter/flutter/issues/25280#issuecomment -456272076.

๊ทผ๋ณธ์ ์œผ๋กœ, ๋‚˜๋Š” ๊ทธ ๊ฐœ๋…์ด ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ์ƒํƒœ ๋ฏน์Šค์ธ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋ฏน์Šค์ธ์˜ ๊ณ ์œ ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ถฉ๋Œ์ด ์—†๊ณ  ๋‘ ๋ฒˆ ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Hooks๋Š” Flutter๊ฐ€ ํ˜„์žฌ ์ƒํƒœ ์ €์žฅ ์œ„์ ฏ์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ _ํ•ญ์ƒ_ ๊ตฌํ˜„๋˜๋Š” initState, didUpdateWidget ๋ฐ dispose๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์ด์ƒ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ํด๋ž˜์Šค/๋ฏน์Šค์ธ์œผ๋กœ ์ถ”์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋Œ€์‹ ์— ๋กœ์ง์„ ๋ชจ๋“  ๊ณณ์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋„ ๋ณ„๋กœ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. dispose ์žฌ์ •์˜์™€ ๊ฐ™์ด ๋‹จ๊ณ„๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.


ํ›„ํฌ์˜ ์‹ค์ œ ๋ฌธ์ œ๋Š” ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์œ ํ•œ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฆฐํ„ฐ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ๋„๊ตฌ์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ตœ์ ์˜ ๊ตฌํ˜„์„ ์œ„ํ•ด ํŠœํ”Œ/๊ตฌ์กฐ ๋ถ„ํ•ด์™€ ๊ฐ™์€ ์ผ๋ถ€ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์œ„์—์„œ ๋งํ•œ ์˜๊ฒฌ์„ ์‹ค์ œ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (https://github.com/flutter/flutter/issues/25280#issuecomment-455846788 ๋ฐ https://github.com/flutter/flutter/issues/25280# ํŠนํžˆ issuecomment-456272076).

ํ , @gaearon ์ด ์•„๋งˆ ์ €๋ณด๋‹ค ๋” ์ž˜ ์„ค๋ช…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ๊ด€์ ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€๋…์„ฑ ์ธ์ˆ˜๋Š” ์œ„์ ฏ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋” ํฐ ์œ„์ ฏ์—์„œ ํ›„ํฌ๋Š” ๋ชจ๋“  ๊ด€๋ จ ๋น„ํŠธ๊ฐ€ ์ˆ˜๋ช… ์ฃผ๊ธฐ์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋˜๋Š” ๋Œ€์‹  ํ•จ๊ป˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ _๋”_ ๋”_ ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฒ„๊ทธ๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์„ ์–ธ์  API๋Š” ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ/์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • "์™œ ํ•ต์‹ฌ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?"์— ๋Œ€ํ•ด Dan Abramov๊ฐ€ ์‚ฌ์šฉํ•œ ๋น„์œ ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
    ํ›„ํฌ๋Š” ์ „์ž๊ฐ€ ์›์ž์— ๋Œ€ํ•ด ์œ„์ ฏ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ๋” ํฐ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ์ธ ๊ฒฝ์šฐ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์€ ์ด์น˜์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ํ›„ํฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ˜œํƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์• ๋‹ˆ๋ฉ”์ด์…˜, ์–‘์‹ ๋“ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Hixie , Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด Hooks๋ฅผ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Flutter ํŒ€์˜ ์‹œ๊ฐ„ ์ค‘ ๋ช‡ %๊ฐ€ ๊ณ ๊ฐ์„ ์œ„ํ•œ ์•ฑ ์ž‘์„ฑ๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์„ฑ์— ์†Œ์š”๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณ ๊ฐ์šฉ ์•ฑ์„ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ์ž์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ์ด ์งˆ๋ฌธ์— ์ ‘๊ทผํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด ์†”๋ฃจ์…˜๊ณผ ๋™์ผํ•œ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ด๋–ป๊ฒŒ ์ด๊ฒƒ์ด ๋‚˜๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ณ ๊ฐ์—๊ฒŒ ๋” ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ตœ๊ทผ์— ์šฐ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ์ธ๊ธฐ ์•ฑ ์ค‘ ํ•˜๋‚˜์—์„œ functional_widget๊ณผ ํ•จ๊ป˜ flutter_hooks๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ํฌ๊ฒŒ ์ค„์˜€์œผ๋ฉฐ ๋ชจ๋“  ์ง€์ €๋ถ„ํ•œ ์ƒํƒœ ์ €์žฅ ์œ„์ ฏ์„ ํ›„ํฌ๊ฐ€ ์žˆ๋Š” ์ž‘์€ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•œ ํ›„ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์•ฝ 70% ์ถ•์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ณผ ๋•Œ ํ›„ํฌ ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ๊ธฐ๋Šฅ์  ์œ„์ ฏ์€ RX์—์„œ CombineLatest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๊ฒฐํ•ฉํ•˜๋Š” ํ•„์ˆ˜ ๋‹จ์ˆœํ™”์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋ฌธ์— ์žˆ๋Š” ๋ชจ๋“  ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๋Œ€์‹  ํ›„ํฌ๋Š” ๊ฐ’์ด ํ•„์š”ํ•œ ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๊ฐ ์œ„์ ฏ์€ RX ์ŠคํŠธ๋ฆผ์˜ ํ•œ ๋‹จ๊ณ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ flutter_hooks๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ(Flutter ํŒ€)๊ฐ€ ๋” ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ์ „์ž๊ฐ€ ์›์ž์— ๋Œ€ํ•ด ์œ„์ ฏ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” Flutter๋ฅผ ์ฟผํฌ ๋˜๋Š” ํ•˜๋“œ๋ก ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์€์œ ๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Hooks์˜ ์ „์ž๋Š” ์œ„์˜ ์ธต์ž…๋‹ˆ๋‹ค.

@Hixie , Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด Hooks๋ฅผ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Flutter ํŒ€์˜ ์‹œ๊ฐ„ ์ค‘ ๋ช‡ %๊ฐ€ ๊ณ ๊ฐ์„ ์œ„ํ•œ ์•ฑ ์ž‘์„ฑ๊ณผ ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์„ฑ์— ์†Œ์š”๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Hooks๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Flutter๋กœ ์•ฑ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ Hooks์™€ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Hooks๊ฐ€ ๋‚ด ๊ฐœ๋ฐœ ์Šคํƒ€์ผ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค). Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ์„œ Hooks๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ(Flutter ํŒ€)๊ฐ€ ๋” ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์ง„์ •์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋งž์ถคํ˜• ๋ฆฌํŒฉํ† ๋ง ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋“ค๋งŒ์ด ํ›„ํฌ๊ฐ€ ์ง„์ •์œผ๋กœ ๋น›๋‚ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ StatefulWidget์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์ •์  ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์œ„์ ฏ์˜ ๋กœ์ปฌ ์ƒํƒœ๋ฅผ ๋” ์•ˆ์ „ํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ๋Š” ๋ณด๋„ˆ์Šค์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ:

  • ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์˜ API์—๋Š” _๋งŽ์€ ์ž‘์—…_์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•ˆ์ •์ ์ด์ง€ ์•Š๊ณ  ๋ถ€์กฑํ•˜๊ณ  ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ํŒ€์—์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๋ถ„์„์ด ์ˆ˜ํ–‰๋จ).
  • flutter ์ž์ฒด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ‚ค์ง€๋กœ์„œ ํ›„ํฌ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๋„๊ตฌ๋ฅผ ๊ฐ€์งˆ ํ™•๋ฅ ์€ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” Flutter๋ฅผ ์ฟผํฌ ๋˜๋Š” ํ•˜๋“œ๋ก ์œผ๋กœ ๊ฐ„์ฃผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์€์œ ๋ฅผ ๋”ฐ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Hooks์˜ ์ „์ž๋Š” ์œ„์˜ ์ธต์ž…๋‹ˆ๋‹ค.

Flutter๊ฐ€ ์ฟผํฌ๋ผ๋ฉด ๊ทธ๊ฒƒ์€ ์€ํ•˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Layer ์™€ ๊ฐ™์€ ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Switch ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ํด๋ž˜์Šค๋„ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ „์ฒด Material ๋ฐ Cupertino ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœ๋œ ๋‹ค์Œ Navigator๋กœ ์ถ”์ถœ๋˜์–ด ๊ด€๋ จ ๊ฐ์ฒด๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ›„ํฌ๋Š” ์ด๊ฒƒ๋“ค๋ณด๋‹ค ์•„๋ž˜์— ์žˆ๋Š” ๋ช‡ ๊ฐœ์˜ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ์ด ์—†์ง€๋งŒ Material๊ณผ Cupertino๋Š” ์ดˆ์ €์ˆ˜์ค€ ๊ตฌ์„ฑ์š”์†Œ์™€ Material ๊ณ ๊ธ‰ ๊ตฌ์„ฑ์š”์†Œ ์‚ฌ์ด์— ์ข‹์€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ต์‹ฌ Flutter ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ๊ฐ•๋ ฅํžˆ ๋ฏฟ์Šต๋‹ˆ๋‹ค. Material ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์•ฑ์„ ๋งŒ๋“ค์–ด ๋ณธ ์ ์ด ์žˆ๋‹ค๋ฉด ์—„์ฒญ๋‚˜๊ฒŒ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ์‹ค์ œ๋กœ ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ๋งŒํผ ์ค‘์š”ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” ์ƒ์šฉ๊ตฌ๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋Š” ์ƒํƒœ ์ €์žฅ ๋…ผ๋ฆฌ๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const [value, setValue] = useState(0)
const debouncedValue = useDebounced(value, 1000)
const interpolatedValue = useSpring(debouncedValue, {
  friction: 10,
  mass: 20
})

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

ํ›„ํฌ๋ฅผ ์ง„์ •์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋งž์ถคํ˜• ๋ฆฌํŒฉํ† ๋ง ์˜ต์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋“ค๋งŒ์ด ํ›„ํฌ๊ฐ€ ์ง„์ •์œผ๋กœ ๋น›๋‚ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ Dart GitHub ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์ œ๊ธฐ๋œ ๋ฒ„๊ทธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ Dart ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ Flutter ๊ด€๋ จ ๋ฆฐํŠธ๋ฅผ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ „์ฒด Material ๋ฐ Cupertino ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒจํ‚ค์ง€๋กœ ์ถ”์ถœ๋œ ๋‹ค์Œ Navigator๋กœ ์ถ”์ถœ๋˜์–ด ๊ด€๋ จ ๊ฐ์ฒด๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์•„๋งˆ๋„ ์‚ฌ์‹ค์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๋Š” ์‹ค์งˆ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "Hello World"๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด Flutter ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๊ธฐ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ). ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ณ ๋ คํ•  ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ„๋„๋กœ ์ œ๊ธฐํ•ด์•ผ ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ€์น˜๋Š” ์ƒํƒœ ์ €์žฅ ๋…ผ๋ฆฌ๋ฅผ ์บก์Šํ™”ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ฐธ์œผ๋กœ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ฐธ์œผ๋กœ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋ถ€ ํ•ต์‹ฌ State ๋ฏน์Šค์ธ์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด AutomaticKeepAliveClientMixin ๋Š” ์ด์ƒํ•œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.
super.build ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  super.build ๋Š” nullable์ด ์•„๋‹Œ ์œ ํ˜•์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” null ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ›„ํฌ๋กœ์„œ ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ชจ๋‘ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ›„ํฌ๋Š” ์›ํ•˜๋Š” ๋งŒํผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SingleTickerProviderStateMixin ๋ฐ TickerProviderStateMixin ๋‘˜ ๋‹ค ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ›„ํฌ์—๋Š” ์ค‘์š”ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ํ›„ํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

IMHO๊ฐ€ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ›„ํฌ๋ฅผ _์‚ฌ์šฉ_ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จํ•˜๋ฉด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ›„ํฌ์—๋Š” ์ค‘์š”ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ํ›„ํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ์ข‹๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋“ค์ด Flutter ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์™”๋Š”์ง€ ์•„๋‹ˆ๋ฉด Hooks ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์™”๋Š”์ง€์— ์ƒ๊ด€์—†์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IMHO๊ฐ€ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ›„ํฌ๋ฅผ _์‚ฌ์šฉ_ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จํ•˜๋ฉด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ›„ํฌ์—๋Š” ์ค‘์š”ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ง€์ • ํ›„ํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ์ข‹๋‹ค๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋“ค์ด Flutter ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์™”๋Š”์ง€ ์•„๋‹ˆ๋ฉด Hooks ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์™”๋Š”์ง€์— ์ƒ๊ด€์—†์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์œ ์ƒ๊ฐ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Hooks๋Š” ๋ณ„๋„์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ํŒ€์€ hook ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? IMHO hook ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณต์„ ์œ„ํ•ด์„œ๋Š” ์ƒ๋‹นํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

"ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์š”๊ตฌ ์‚ฌํ•ญ"์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

"ํ•ต์‹ฌ ๋ณ€๊ฒฝ ์š”๊ตฌ ์‚ฌํ•ญ"์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฐ๋ธŒํˆด์ฆˆ.
์ฃผ๋กœ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ž ์žฌ์ ์œผ๋กœ flutter/devtools์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์—๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ•  ์ˆ˜ ์—†๋Š” ๋งŽ์€ ์ž‘์—…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

IMHO๊ฐ€ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ›„ํฌ๋ฅผ _์‚ฌ์šฉ_ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จํ•˜๋ฉด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์กด๊ฒฝ์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ๋ฌด์ง€ํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ •๋ง๋กœ ๊ทธ๋“ค์—๊ฒŒ ์‹œ๋„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค! ์ƒํƒœ์˜ ๊ฐ ๋‹จ์ผ ์ธก๋ฉด์— ๋Œ€ํ•ด initState/dispose/setState/build๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถค์„ ์ถ”๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Flutter๋Š” ๊ตฌ์„ฑ์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด๋ฉฐ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌ์„ฑ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๋ฐ˜๋ฉด์— mixin์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ตฌ์„ฑ์˜ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ถ„์„๊ธฐ๋ฅผ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ„์† ๊ณ ๋ คํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, ๊ธฐ๋ณธ์ ์ธ ์ฒซ ์‹œ๊ฐ„ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฒฝํ—˜ ๊ฐœ์„  ๋ฐ ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด ์•„๋‹Œ ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋„๊ตฌ ๊ตฌํ˜„๊ณผ ๊ฐ™์€ ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ Google ์ง์›์ด ์•„๋‹Œ ์‚ฌ๋žŒ์€ ์™œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Flutter์™€ Dart๋Š” ๋ชจ๋‘ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ๋งŽ์€ ๊ฒƒ๋“ค์ด Google ์ง์›์ด ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ Google ์ง์›์ด ์•„๋‹Œ ์‚ฌ๋žŒ์€ ์™œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Flutter์™€ Dart๋Š” ๋ชจ๋‘ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ๋งŽ์€ ๊ฒƒ๋“ค์ด Google ์ง์›์ด ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํŒ€์ด "๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„ ๊ธฐ๋Šฅ"์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋งŽ์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๊ณต๊ฐœ ๋ฌธ์„œ๊ฐ€ ๊ฑฐ์˜ ์—†๋Š” ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ํˆฌ์ž์™€ ๊ฑฐ์ ˆ์˜ ์œ„ํ—˜์ด / ์ค‘๊ฐ„์— ๊ฐ‡ํž ์œ„ํ—˜์ด ๋„ˆ๋ฌด ๋†’์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์šฐ๋ฆฌ๊ฐ€ ๋ˆ์„ ๋ฒŒ์ง€ ๋ชปํ•  ๋•Œ.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ์š”์ ์„ ์ดํ•ดํ•˜๋Š” ๋™์•ˆ, ๊ทธ๊ฒƒ์€ ๊ทนํžˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค

์ด์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ›„ํฌ๊ฐ€ ํ”Œ๋Ÿฌํ„ฐ์— ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ ๊ฐ€๋Šฅํ•œ์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

Flutter๊ฐ€ 1๋…„ ์•ˆ์— ์„ฑ๊ณตํ•˜๋ฉด(๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค) Flutter์— ์˜จ๋ณด๋”ฉํ•˜๋ ค๋Š” ๋ชจ๋“  React ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๊ธฐ์— ํ›„ํฌ์— ๋Œ€ํ•œ ์ผ๊ธ‰ ์ง€์›์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์„ ๋•Œ ๋น„๋ช…์„ ์ง€๋ฅด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Flutter ํŒ€์€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ React ๋ชจ๋ธ์„ ๋ณต์‚ฌํ•˜๋Š” ์ข‹์€ ๊ฒฐ์ •์„ ๋‚ด๋ ธ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ด์ œ ๊ณผ๊ฑฐ์˜ ์ผ์ด๊ณ  ๊ธฐ๋Šฅ์  ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ›„ํฌ๋Š” ๋ฏธ๋ž˜์ž…๋‹ˆ๋‹ค. Flutter ํŒ€์ด ๋™๋“ฑํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ด ์ƒˆ๋กœ์šด ํ˜„์‹ค์— ๊นจ์–ด๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค .

cgarciae๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด React ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์•ž์œผ๋กœ ํ›„ํฌ ๋ฐ ๊ธฐ๋Šฅ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๊ณผ ์ƒ์‚ฐ์„ฑ์ด ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ ์†”๋ฃจ์…˜๊ณผ ๋™๋“ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Flutter๊ฐ€ ๊ตฌ์‹์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋„๊ตฌ ์„ธํŠธ, ์ €์ˆ˜์ค€ ํ”„๋ ˆ์ž„์›Œํฌ ๊ตฌํ˜„, ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋ณ„๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์™„์ „ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด "๋ถˆํ•„์š”ํ•œ" ์ƒ์šฉ๊ตฌ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ํšจ๊ณผ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ํ›„ํฌ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์›Œ์•ผ ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์  ์œ„์ ฏ์€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Dart์—์„œ ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

'์œ„์ ฏ | ์œ„์ ฏ ๊ธฐ๋Šฅ(BuildContext)'.

๊ธฐ๋Šฅ์  ์œ„์ ฏ์€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. Dart์—์„œ ๊ณต์šฉ์ฒด ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•? ์นด๋ ˆ?
  • ์œ„์ ฏ ํŠธ๋ฆฌ์—์„œ ๋‘ ๊ฐœ์˜ ๊ธฐ๋Šฅ์  ์œ„์ ฏ์€ ๋‹ค๋ฅธ runtimeType์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • devtools๋กœ ์œ„์ ฏ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์œ„์ ฏ์˜ debugFillProperties ๋ฉ”์†Œ๋“œ)

๋‚˜๋Š” ๊ฝค ์˜ค๋žซ๋™์•ˆ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ์™”๋‹ค. ๊ธฐ๋Šฅ์  ์œ„์ ฏ์— ๋Œ€ํ•œ ์‰ฌ์šด ์†”๋ฃจ์…˜์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฐ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์กฐํ•ฉ(์ ์ ˆํ•œ ์ •์˜๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ)์ž…๋‹ˆ๋‹ค.

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

์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•  ๋•Œ ๋„ˆ๋ฌด ๋งŽ์€ ์ ํ”„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ธ๊ธ‰ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค๊ฐ€ ์„ ํ˜ธ๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.
  • ํด๋ž˜์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•จ์ˆ˜๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜๋„๋ก ์ ์ ˆํ•œ "์ •์˜๋กœ ์ด๋™"/"ํ”ผํฌ"/...๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” "ํ›„ํฌ์—๋Š” ์ ์ ˆํ•œ ๋ถ„์„๊ธฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"๋กœ ๋Œ์•„๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

functional ์œ„์ ฏ์„ ๋„์ž…ํ•  ํ•„์š”๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ ์‚ฌ์šฉ์ด StatelessWidget build ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ํ—ˆ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋ฏธ๋ž˜์— ๊ธฐ๋Šฅ์  ์œ„์ ฏ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊นจ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ์•ฑ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

StatelessWidget ๋‚ด๋ถ€์— ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ตฌ์„ฑ๊ณผ ๊ฐ™์€ ํ›„ํฌ ์‚ฌ์šฉ์˜ ์ด์ ์„ ์—†์• ๋Š” ๋ช…๋ฐฑํ•œ ๋ฌธ์ œ๋Š” ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Šฅ๋ ฅ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฐ˜์‘์˜ useCallback ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์™€ ๋น„๊ตํ•˜๋ฉด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"React ๊ฐœ๋ฐœ์ž๊ฐ€ ํ™”๋ฅผ ๋‚ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค" ์ธ์ˆ˜๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (500๊ฐœ ์ด์ƒ์˜ ์ฃผ์„ JSX ํ† ๋ก  ์ฐธ์กฐ).

Flutter๋Š” Flutter์ด๋ฉฐ ๊ณ ์œ ํ•œ ์–ธ์–ด์™€ ๋””์ž์ธ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
React ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ๋ก ์„ ์ฝ์—ˆ๊ณ  Flutter ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ์ž์ธ @Hixie ๋Š” ๋ฌธ์ œ์˜ ์ธก๋ฉด(๊ตฌํ˜„ ๋ฐ ... ํ•ญ๋ชฉ)์„ ๋ณด์•˜๊ณ  Flutter ์•ฑ ๊ฐœ๋ฐœ์ž(๊ทธ์˜ ๋Œ€์ƒ ๊ณ ๊ฐ)๊ฐ€ ์ƒ๊ฐํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ด€์ ์ด ์ ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๋ฐœ์ „.

๋‚˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ , ๋‚ด ์•ฑ ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด ์ถ”ํ•œ UI์™€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด UX๋ฅผ ๋ณผ ๋•Œ ์–ด๋–ป๊ฒŒ ๊ฒฝํ—˜ํ•  ๊ฒƒ์ธ์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ํ›Œ๋ฅญํ•œ ๋ฐฑ์—”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ „์— ๋งํ–ˆ๋“ฏ์ด ํ›„ํฌ๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๊ทธ๊ฒƒ์„ ์†Œ๊ฐœํ•˜๋“  ์ƒ๊ด€์—†์ด ์‚ฌ์•…ํ•œ FB ๋˜๋Š” Apple์ž…๋‹ˆ๋‹ค.
๊ทธ๋ƒฅ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๋…ผ๋ฆฌ์™€ ํ•ด๋‹น ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ฒƒ ์œ„์— ์œ ์šฉํ•œ ๋‹ค๋ฅธ ํ›„ํฌ๋ฅผ ๋งŒ๋“ค๊ณ , ์•ฑ ์ƒํƒœ์—์„œ ๋…๋ฆฝ์ ์ธ ์œ„์ ฏ, API, ๋„๊ตฌ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ , ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฏธ๋ฆฌ ์ œ์ž‘๋œ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  pubspec.yaml ์— ๋ฏธ๋ฆฌ import material์ด๋‚˜ cupertino๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ hello-word ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋ฉด!!! ์—ฌ๊ธฐ์—์„œ๋Š” ๋…ผ์˜ํ•  ๊ฒƒ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ StatefullWidget ๋Š” Flutter ์ƒํƒœ๊ณ„์— ๋งค์šฐ ์ค‘์š”ํ•˜๋ฏ€๋กœ hook๊ณผ ๊ด€๋ จ์„ฑ์€ Flutter์˜ ๋ฏธ๋ž˜์™€ ์ƒํƒœ๊ณ„ ๋ฐ Flutter ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด ์š”์ ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋ ค๋ฉด Java ๋ฐ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ Android ๊ฐœ๋ฐœ์ด ์–ผ๋งˆ๋‚˜ ๋”์ฐํ–ˆ๋Š”์ง€, Kotlin์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง€๊ณ  ๋‹ฌ์ฝคํ•œ์ง€ ์‚ดํŽด๋ณด์„ธ์š”.
Coroutines, Flow, AndroidX + Kotlin ์ง€์›, ์ƒˆ๋กœ์šด UI ์‹œ์Šคํ…œ(Compose)๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์ข‹์€ ๊ฒƒ๋“ค๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์‹ฌ์ง€์–ด ์ž๋ฐ” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์—์ฝ”์—์„œ kotlin futures๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ pls๋Š” ํ›„ํฌ์— ๋ชจ๋“  ๋ฒ„ํผ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฐ˜์‘ํ•˜๊ณ  ๊ทธ๋ƒฅ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ํ›„ํฌ ์ง€์›์˜ ๋ถ€์กฑ์€ ๋‚ด๊ฐ€ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ „ํ™˜ํ•˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ›„ํฌ๋Š” ์‚ถ์„ ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ๋‹ค์‹œ๋Š” ์˜ˆ์ „ ๋ฐฉ์‹์œผ๋กœ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"๋„ค์ดํ‹ฐ๋ธŒ ํ›„ํฌ"์˜ ๋†€๋ผ์šด ๋ถ€๋ถ„์€ ๋งŽ์€ ๋‚ด๋ถ€ StatefulWidget ๋˜๋Š” ...์„ ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ์ด์‹ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ Flutter ํŒ€์€ Flutter์™€ Dart๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Native Hooks๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์ด ์‚ฌ์‹ค์ด๊ณ  ๋” ๋‚˜์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  (initState/dispose/setState/build) ๋ฐฉ๋ฒ•์€ ์ด ๊ฒฝ๋กœ์— ์—†์Šต๋‹ˆ๋‹ค. (ํ”Œ๋žซํผ์˜ ๋ฐฑ์—”๋“œ์—์„œ๋Š” ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋‚˜ ์‹ฌ์ง€์–ด ์ž์‹ ์˜ ์•„์ด๋””์–ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋””์ž์ด๋„ˆ์—๊ฒŒ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ณต์žกํ•œ ๋…ผ๋ฆฌ๊ฐ€ ์•„๋‹˜)).

์ด ์Šค๋ ˆ๋“œ์—์„œ ์ฝ์€ ๋‚ด์šฉ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด Flutter์—์„œ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ํฅ๋ฏธ๋ฅผ ๋Š๋ผ๊ณ  ์žˆ์œผ๋ฉฐ ํ›„ํฌ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ณต๊ฐœ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์„ฑ๋Šฅ ์˜ํ–ฅ/์ธก์ • - ํŠนํžˆ ํ•ญ์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํšจ์œจ์„ฑ ๋Œ€ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ƒˆ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ „์—ญ ํ‚ค๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํŠธ๋ฆฌ ์ฃผ์œ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ(๋ฌด๋Šฅ๋ ฅ?)
  • ํ›„ํฌ์™€ ๊ด€๋ จ๋œ ๋ถ„์„๊ธฐ ์ง€์›/๋ฆฐํŠธ.
  • ์ผ๋ฐ˜ ์ด์ „ ์ƒํƒœ ์ €์žฅ/์ƒํƒœ ๋น„์ €์žฅ ์œ„์ ฏ์œผ๋กœ ํ•ซ ๋ฆฌ๋กœ๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ.
  • ์ถ”๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ API๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ, ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์šด ์ผ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” "ํ›„ํฌ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋ณ„๋„์˜ ํŒจํ‚ค์ง€์— ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋Š ์ •๋„ ๊ทธ ๊ฒฐ์ •์€ ์ด๋ฏธ ๋‚ด๋ ค์กŒ์Šต๋‹ˆ๋‹ค. flutter_hooks๋Š” pub.dev์—์„œ 1๋…„ ๋„˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ–ˆ์œผ๋ฉฐ ์ธ๊ธฐ ์žˆ๋Š” ํŒจํ‚ค์ง€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. flutter_hooks๋ฅผ ์ง„์ •์œผ๋กœ ์„ธ๋ จ๋œ ๊ฒฝํ—˜์œผ๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์ด๋ฏธ ์™„๋ฃŒ๋œ ๊ฒƒ ์™ธ์—๋„ ์ƒ๋‹นํ•œ ์ž‘์—…๊ณผ ํˆฌ์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋งŽ์€ ์ž‘์—…์ด ์ด๋ฏธ ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜์—ˆ์œผ๋ฉฐ _์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—”์ง€๋‹ˆ์–ด๋ง ํŒ€๊ณผ ์—ฌ๋Ÿฌ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ์—ฌ์ž๊ฐ€ ์žˆ๋Š” ์ง€์ ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ์ˆ˜๋…„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” "repo X์— ๋ณ‘ํ•ฉํ•˜๋ฉด ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ๊ฒƒ์ด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค!"๋ผ๋Š” ํ™˜์ƒ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฐฉ์‹์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํฅ๋ถ„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ตฌํ˜„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @rrousselGit ์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๊ธฐ์—ฌ์ž๋“ค๋„ ํ›„ํฌ ์ €์žฅ์†Œ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ํ›„ํฌ๋Š” Flutter ์ €์žฅ์†Œ์— ์žˆ์ง€ ์•Š์•„๋„ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ , Flutter ์ €์žฅ์†Œ์— ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๋ฅผ ๋” ๋นจ๋ฆฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ Hooks๊ฐ€ Flutter์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์™„์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ํ›„ํฌ๋Š” ๋Œ€์‹  sync /async ์ƒ์„ฑ๊ธฐ์™€ ์œ ์‚ฌํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ํ”Œ๋Ÿฌํ„ฐ์™€ ์ „ํ˜€ ๊ด€๋ จ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์„ ์–ธ์  ๋ฐ ๋ฐ˜์‘์  ์ƒํƒœ ๊ด€๋ฆฌ.
    State ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
  • DRY๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ƒํƒœ ๊ตฌ์„ฑ.
    ์ด๋Ÿฌํ•œ ๋ชจ๋“  XXController๋Š” ์ƒ์„ฑ+์—…๋ฐ์ดํŠธ+ํ๊ธฐ๋˜์–ด์•ผ ํ•˜๋ฉฐ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ์ธ์ˆ˜๋ถ„ํ•ดํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜/์œ„์ ฏ์˜ ๋์—†๋Š” ์ค‘์ฒฉ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—

๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์ฒด ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class MyWidget extends HookWidget {
  const MyWidget({Key key, this.title}): super(key: key);

  final String title;

  Hook<Widget> build() hook* {
    final (flag, setFlag) = yield false;
    final (animationController) = yield* useAnimationController(duration: const Duration(seconds: 2));

    // TODO: do something with animationController
    return CheckBox(
      value: flag,
      onChanged: setFlag,
    );  
  }
}

Hook<AnimationController> useAnimationController({required Duration duration}) hook* {
  final (tickerProvider) = yield* useTickerProvider();
  final (animationController) = yield AnimationController(duration: duration, vsync: tickerProvider);
  animationController.duration = duration;

  return animationController;
}

์ด๊ฒƒ์€ flutter_hook๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€๋งŒ flutter์™€ ๋…๋ฆฝ์ ์ด๋ฉฐ flutter_hook์ด ํ•  ์ˆ˜ ์—†๋Š” ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ _anything_์ด ์œ„์ ฏ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด๋„ค์š”. ๊ฑฐ๊ธฐ์— ์—ฌ๋Ÿฌ ์–ธ์–ด ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค(Go์˜ defer , C++์˜ ๊ฒฐ์ •์  ์†Œ๋ฉธ์ž, ์•”์‹œ์ ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ฐœ์ฒด๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ) - ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ˜„์žฌ ์ƒํƒœ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ • ์†”๋ฃจ์…˜์„ ๋‹ค๋ฃจ๋Š” ์ข‹์€ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ์†”๋ฃจ์…˜ ์ž์ฒด๋Š” ํ˜„์žฌ ์ƒํƒœ์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋ณ‘ํ•ฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ(์œ„์— ์„ค๋ช…๋œ ์ด์œ ๋กœ) ์†”๋ฃจ์…˜์ด ์‹ค์ œ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋ณ‘ํ•ฉ๋˜๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dnfield Hooks๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์˜ ๋ชจ๋“  ์ฃผ์š” ์˜์—ญ์„ ๋‹ค๋ฃฐ ๋•Œ๋งŒ '๊ฐ€์กฑ'์ฒ˜๋Ÿผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ๋ณ€๊ฒฝ ํ›„ ์–ด๋–ค ์ข…๋ฅ˜์˜ ํšจ๊ณผ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฒฝ์— ๋ถ€๋”ชํžˆ๋ฉด ์ƒํƒœ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์„ค๊ณ„์ƒ ๋ชจ๋“  ํ›„ํฌ๋Š” ๋ Œ๋”๋Ÿฌ์˜ ์ฝ”์–ด ๋‚ด๋ถ€์— ์ƒ๋‹นํ•œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ์ฝ”์–ด ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋ฌธ์ œ๊ฐ€ "๋‚˜๋Š” Flutter๊ฐ€ React์™€ ๊ฐ™์œผ๋ฉด์„œ๋„ Flutter์™€ ๊ฐ™๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GitHub ๋ฌธ์ œ๋Š” ์•„๋งˆ๋„ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๊ฒƒ์„ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ธ์ •ํ•˜๋”๋ผ๋„.

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

ํ›„ํฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ›„ํฌ๊ฐ€ ๋„์ž…๋˜๋ฉด ์ด์ƒํ•œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

"X๊ฐ€ React์™€ ๊ฐ™๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฐ˜์‘์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค"์™€ ๊ฐ™์€ ์‘๋‹ต์ด ์ž์ฃผ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— ํ›„ํฌ๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋งŽ์€ ํ”„๋ŸฐํŠธ์—”๋“œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ธฐ์ˆ ์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ด๋””์–ด์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ›„ํฌ๋Š” ๊ฐ’์ด ์™„์ „ํžˆ ํ‘œ์‹œ๋˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์ผ์ข…์˜ ์ „ํ™˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ›„ํฌ๋ฅผ "์š”์ฒญ"ํ•  ๋•Œ ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” React ํŒ€์ด hooks๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํ›Œ๋ฅญํ•œ ์ผ์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, hooks๊ฐ€ React์™€ ๊ฐ•ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์ €ํ•ญ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” React๊ฐ€ ๋‹ค์Œ ํ›…์ด ๋ฐœ๋ช…๋œ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์–ธ๊ธ‰๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. React๋Š” ๋˜ํ•œ (์ง€๊ธˆ๊นŒ์ง€) ํ›„ํฌ์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ์ •๋ณด ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ - Flutter์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ ๋…ผ๋ฆฌ์— ๊ตฌ์„ฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” "๊ณ ํ†ต์ "์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ์ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ํ›„ํฌ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์—„์ฒญ๋‚œ ์ž‘์—…์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ˆ˜ํ–‰ํ•  ์˜์‚ฌ๊ฐ€ ์—†๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ "์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค"๋Š” ์ฃผ์žฅ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ ์ˆ˜์ •์ด Google์—์„œ ๋” ์ž˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์˜ ํ‘œํ˜„์‹์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” null ๋ฅผ ์ง€์›ํ•˜๋„๋ก Row/Column/ListView/... ๋ฅผ ๋ถ„๊ธฐํ•˜์—ฌ "์ˆ˜์ •"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Google์€ ์–ธ์–ด๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Flutter ์ž์ฒด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค. Flutter๋Š” React์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Widget์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์˜ ํฐ ๋ถ€๋ถ„์ด ๊ธฐ๋ณธ์ ์œผ๋กœ React ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด Flutter๊ฐ€ React์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ์ง€๋งŒ Flutter ํŒ€์ด ์ตœ์†Œํ•œ React ์—…๋ฐ์ดํŠธ์™€ ์ƒํƒœ๊ณ„๋ฅผ ๋ฉด๋ฐ€ํžˆ ์‚ดํŽด๋ณด๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฃผ์žฅ ์™ธ์— "ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ›„ํฌ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”" ์ด์œ ์— ๋Œ€ํ•ด ์ตœ์†Œํ•œ ๋” ๋‚˜์€ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@rrousselGit @pie6k

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Hooks API๊ฐ€ React์—์„œ์™€ ๊ฐ™์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ฐฉ๋ฒ•๊ณผ ์„ค๋ช…์ด ํฌํ•จ๋œ ์ด๋ฆ„์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด "๋‚˜์˜ ๋ฌธ์ œ"๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋ฐ›์•„๋“ค์ด๊ณ  ์†”๋ฃจ์…˜์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” @dnfield ์˜๊ฒฌ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์œ„์ ฏ์ด ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ๊ฑฐ์˜ ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ด๊ฒƒ์ด Hooks์˜ ์ฃผ์š” ์ด์ ์œผ๋กœ ์ดํ•ดํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?)

Flutter๊ฐ€ React์—์„œ ์˜๊ฐ์„ ์–ป์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ชจ๋“  React ํŒจํ„ด๊ณผ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์˜์›ํžˆ ๋”ฐ๋ฅผ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ React์—์„œ ๊ฒช์—ˆ๋˜ ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋„ˆ๋ฌด ๋‹ค์–‘ํ•˜๊ณ  "๊ถŒ์žฅ ์‚ฌ๋ก€"๊ฐ€ ๋งค์ผ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์˜ ํŠน์„ฑ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ๊ธฐ์กด ๋ฐฉ์‹์— ๋‚˜์œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ฐœ์„ ์„ ์‹œ๋„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์Œ“๋Š” ๋Œ€์‹ โ€ฆ

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

Flutter ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๋Œ€ํ•ด ๊นŠ์€ ์กด๊ฒฝ์„ ํ‘œํ•ฉ๋‹ˆ๋‹ค.

์Šฌํ”„๊ฒŒ๋„ ์ด ๋ฌธ์ œ๋Š” ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Flutter ํŒ€์ด ํ›„ํฌ์— ๋Œ€ํ•ด ๋ฌด์ง€ํ•˜๊ฑฐ๋‚˜ ๋””์ž์ธ ํŒจํ„ด์˜ ํ˜„์žฌ ์ƒํƒœ์— ๊ด€์‹ฌ์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ์–ด๋–ค ๊ธฐ์ˆ ์—๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ๊ณ  ์ˆ˜์ค€์ด๊ณ  ๊ทธ์— ํ•„์ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์‹ถ์–ดํ•˜๋ฉฐ ํ˜„์žฌ ๊ฐ€์žฅ ์ƒ์‚ฐ์ ์ธ ํŒจํ„ด์€ ํ›„ํฌ์ด๊ณ  Flutter๋Š” ๋’ค์ณ์ ธ ์žˆ์ง€๋งŒ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์„ค๋“๋ ฅ ์žˆ๊ฒŒ ๋” ๋‚˜์€ ๋Œ€์•ˆ์„ ์œ„ํ•ด ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

@cgarciae ์•„๋ฌด๋„ ๋ฌด์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @dnfield ๋Š” ๋ถ„๋ช…ํžˆ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์†”๋ฃจ์…˜์„ ์งœ๋‚ด๋ ค๊ณ  ํ•˜๋Š” ๋Œ€์‹ , ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์„œ Flutter ํŒ€์ด ์ด๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ์•„๋งˆ๋„ Flutter์— ๋” ์ ํ•ฉํ•œ ์†”๋ฃจ์…˜์„ ์ œ์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์š”์ฒญํ•˜๊ณ  ์š”์ฒญํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ๋Šฅ ์š”์ฒญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@SpajicM ๋‚˜๋Š” ๋Œ€๋‹ต์œผ๋กœ "์•„๋‹ˆ์˜ค"๋กœ ์™„์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ํ˜„์žฌ์˜ ์ •๋‹น์„ฑ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • ํ›„ํฌ๋Š” Flutter์˜ ์•„๋ฒ„์ง€์ธ React์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฌธ์ œ๋Š” Flutter์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ํˆฌํ‘œ๋ฅผ ๋ฐ›์€ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  • flutter_hooks๋Š” ๊ฝค ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • React ํŒ€์˜ Dan Abramov๋Š” ํŒ€๊ณผ ๋…ผ์˜ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/flutter/flutter/issues/25280#issuecomment -456404333

์ด๊ฒƒ๋“ค์€ ํ›„ํฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ตœ์†Œํ•œ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์†Œํ†ต์˜ ๋ฌธ์ œ๋กœ ๊ท€๊ฒฐ๋œ๋‹ค.

  • Flutter ํŒ€์ด Dan Abramov๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ React ํŒ€์— ์—ฐ๋ฝํ–ˆ์Šต๋‹ˆ๊นŒ?
  • ํŒ€์ด React์—์„œ hook์„ ์‹คํ—˜ํ–ˆ๋‚˜์š”?
  • ํ›„ํฌ๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ€ React ํŒ€์ด Flutter ํŒ€์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์„ ๋•Œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ "ํ›…์ด ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ"๋กœ ๋‚˜๋ˆ„๋„๋ก ์ œ์•ˆ๋œ ๊ฒƒ์€ ์•„์ด๋Ÿฌ๋‹ˆ์ปฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@rrousselGit ๋‚˜๋Š” ๊ทธ ์ด๋ฉด์— ์žˆ๋Š” ์•„์ด๋””์–ด๊ฐ€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ง์ ‘ Flutter ๊ด€๋ จ ์ธก๋ฉด์˜ ๋ฌธ์ œ๋ฅผ ๋“ฃ๊ณ  React์˜ ์ถ”๋ก ์„ ์ทจํ•˜๋Š” ๋Œ€์‹  ์ถœ๋ฐœ์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ทธ๋“ค์˜ ์ž…๋ ฅ์ด ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—๋Š” ์œ„์ ฏ์˜ ๋…ผ๋ฆฌ์™€ ๋””์ž์ธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ฐ๋Š” ๋™์˜ ํ•˜์ง€๋งŒ React๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด ์ €์—๊ฒŒ ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  Flutter์˜ ๋ฏธ๋ž˜ ์†”๋ฃจ์…˜์ด ๋œ ๊ทน์ ์ธ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ณ€ํ™”/ํ•™์Šต ๊ณก์„ . ์ƒ๊ฐ์€ ์—†์ง€๋งŒ ์—ด๋ฆฐ ๋งˆ์Œ์„ ๊ฐ–๊ณ  ๊ธฐ์กด Hooks ๊ตฌํ˜„์— ๊ณ ์ •๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํŒ€์ด ํ•จ๊ป˜ ๋ญ”๊ฐ€๋ฅผ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_"Flutter๋Š” ์œ„์ ฏ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"_

๋‚˜๋Š” https://svelte.dev/ ๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ Flutter ํŒ€์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ํ•ด๊ฒฐ์ฑ…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ์ฒ˜์Œ์ด๊ณ  API์— ๋งŽ์€ ์ƒ์šฉ๊ตฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. Dart์—๋Š” ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ด๊ณ  ๋” ์‰ฌ์šด Go์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜์—ฌ NNDB๊ฐ€ ์ถœ์‹œ๋  ๋•Œ ์—„์ฒญ๋‚œ ๋ฆฌํŒฉํ† ๋ง์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ™•์žฅ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ†ตํ•œ ์ ์ง„์  API ์ถ”์ƒํ™”๋Š” ํƒ์ƒ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

IMHO, Flutter ํŒ€์€ "๋ชจ๋“  ๊ฒƒ์ด ์œ„์ ฏ์ด๋‹ค"๋ผ๋Š” ์•„์ด๋””์–ด์— ๋„ˆ๋ฌด ์—ด์ค‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์ ฏ์€ ์‹œ๊ฐ์  ํ•ญ๋ชฉ ๋ฐ ๋ ˆ์ด์•„์›ƒ์— ์ ํ•ฉํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ/์ฒ˜๋ฆฌ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กœ์šด FutureBuilder , StreamBuilder , TweenAnimationBuilder ๋“ฑ ๋Œ€์‹  ๊ธฐ๋Šฅ์  API๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

Widget build(BuildContext context) {
    final a = useFuture(someFuture);
    final b = useStream(someStream);
    if (a.value == null || b.value == null) {
        return CircularProgressIndicator();
    }

    final value = a.value + b.value;
    final smoothedValue = animate(value, duration: Duration(milliseconds: 100), curve: Curves.easeInOut);

    return Slider(
        value: smoothedValue
    );
}

์‚ฌ์‹ค Flutter๋Š” ์ด๋ฏธ ๋ช‡๋ช‡ ๊ณณ์—์„œ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "Fluttery"๋ณด๋‹ค

MediaQueryGetter {
    builder: (BuildContext context, MediaQueryData data) {
        ...
    }
}

๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”
final data = MediaQuery.of(context);

๋ถˆํ–‰ํžˆ๋„ ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜(๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ๊ตฌ๋…)์€ InheritedWidget๊ณผ ํ•จ๊ป˜๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์—์„œ ์–ผ๋งˆ๋‚˜ ๋” ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ณด๊ณ  ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋ง์”€๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  1. GitHub ๋ฌธ์ œ์—์„œ _problem_์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค _solution_์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์„ ์ œ์‹œํ•  ๋•Œ ์Šน์ธ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋„๋‹ฌํ•ด์•ผ ํ•˜๋Š” ํ›จ์”ฌ ๋” ๋†’์€ ๊ธฐ์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์ด ์ž˜ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๊ทธ์— ๋”ฐ๋ฅธ ๋…ธ๋ ฅ์˜ ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•„์š”ํ•œ ๋…ธ๋ ฅ ์ˆ˜์ค€์— ์ƒ์‘ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ดˆ๊ธฐ ํ”„๋กœํ† ํƒ€์ž… ์ œ์ž‘ ๋ฐ ๊ตฌํ˜„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ง€์†์ ์ธ ๊ด€๋ฆฌ ๋ฐ ํ’ˆ์งˆ ํฌํ•จ). . ๋‹ค์‹œ ๋งํ•ด, ๋ฐ์ดํ„ฐ ๋ฐ ์œ„์ ฏ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ํŠน์ • ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋งŽ์€ ์†”๋ฃจ์…˜์œผ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ์ฑ„ํƒ๋  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ถ€๋Š” ํƒ€์‚ฌ ํŒจํ‚ค์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ผ๋ถ€๋Š” ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์ข‹์ง€๋งŒ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

  2. Flutter ๋ฐ Dart์—์„œ ์ž‘์—…ํ•˜๋Š” Google ์—”์ง€๋‹ˆ์–ด๋Š” ํ•ญ์ƒ ๋” ๋‚˜์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ญ์ƒ ๋ถ„์ฃผํ•ฉ๋‹ˆ๋‹ค. Flutter์— ๊ธฐ์—ฌํ•˜๋Š” ๋งŽ์€ ๋น„ Google ์—”์ง€๋‹ˆ์–ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๊ฐ€ ๋‹ซํ˜”๋‹ค๊ณ  ํ•ด์„œ ์–ด๋–ค Google ์—”์ง€๋‹ˆ์–ด๋„ Flutter์—์„œ ํ›„ํฌ๊ฐ€ ๋” ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ›„ํฌ ํŒจํ‚ค์ง€๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์˜ ์†Œ์œ ๋ผ๋Š” ์‚ฌ์‹ค์€ ํŒจํ‚ค์ง€์˜ ํ’ˆ์งˆ์ด๋‚˜ ๊ทธ ๊ฐ€์น˜๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถ„์„/๋ฆฐํŒ…์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ง€์›๊ณผ ๊ฐ™์ด ์ด ๋ฒ„๊ทธ์—์„œ ์‹๋ณ„๋œ ์ผ๋ถ€ ๋‹จ์ ์„ ์ถฉ์กฑํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ์†Œ์‹œํ‚ค์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ๊ธฐ๋Šฅ์„ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋ฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธฐ๋Šฅ์ด ์ •๋ง ๋ฉ‹์ง€์ง€๋งŒ ์•„ํ‚คํ…์ฒ˜์™€ ์ž˜ ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธฐ๋Šฅ์ด ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธฐ๋Šฅ์ด ํ›Œ๋ฅญํ•˜๊ณ  ์ถฉ๋ถ„ํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๋ฉด ์ ํ•ฉํ•˜์ง€๋งŒ ๋น„์šฉ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์น˜๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ›จ์”ฌ ๋” ๊ฐ€์น˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ๋นผ์•—์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Flutter์˜ ๊ฒฝ์šฐ ๋•Œ๋กœ๋Š” ํƒ€์‚ฌ ํŒจํ‚ค์ง€๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๋„๋กœ ๊ณ„์ธตํ™”๋œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ ˆ์ž„์›Œํฌ์— ์ƒˆ๋กœ์šด ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐฐ์น˜๋ฅผ ์œ ์ง€ํ•˜๊ณ  ํƒ€์‚ฌ๊ฐ€ ํ›Œ๋ฅญํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. https://github.com/flutter/packages/tree/master/packages/animations์— ์žˆ๋Š” ์ƒˆ๋กœ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํŒจํ‚ค์ง€์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€์—์„œ ์ด ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋Š” ์ด๊ฒƒ์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ด๋ฉฐ ํŒจํ‚ค์ง€๋ฅผ ๋” ์‰ฝ๊ฒŒ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ์•ˆ์„ ๊ฑฐ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์œ ์ผํ•œ ์กฐ์–ธ์€ ๋งˆ์Œ์— ๋“œ๋Š” ํ›Œ๋ฅญํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์œผ๋ฉด ๊ณ„์† ์ž‘์—…ํ•˜๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ๋„์›€์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Android ์ƒˆ ComposeUI์—๋Š” ์ƒํƒœ์™€ ๊ฐ™์€ ํ›„ํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (preview2)

val state = remember { CardDesignerState() } // react: let state = useState(CardDesignerState())
val thing = stateFor<T?> { null } // react: let thing = useState()

๋˜ํ•œ iOS์˜ ์ƒˆ๋กœ์šด SwiftUI์—๋Š” ๋น„์Šทํ•œ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๋ถ€์ ์œผ๋กœ).

// from https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions
Image(systemName: "chevron.right.circle")
                        .imageScale(.large)
                        .rotationEffect(.degrees(showDetail ? 90 : 0))
                        .scaleEffect(showDetail ? 1.5 : 1)
                        .padding()
                        .animation(.easeInOut)

iOS์˜ swiftUI๊ฐ€ onCreate, onInit, onUpdate, onExit, ... ๐Ÿคข

๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ณ ์˜ ํ”„๋ ˆ์ž„์›Œํฌ(๋ฌผ๋ก  Flutter์ž„)๋Š” ์—ฌ์ „ํžˆ ํ›„ํฌ ์‚ฌ์šฉ ์•„์ด๋””์–ด์— ์ €ํ•ญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
React/ReactNative์ฒ˜๋Ÿผ ์ƒ๊ฒผ์œผ๋‹ˆ๊นŒ!!! ๋˜๋Š” ์œ ์ง€ ๊ด€๋ฆฌ์ž ํŒ€์˜ ๋†€๋ผ์šด ์ธ์šฉ๋ฌธ:

๋‚˜๋Š” ์ƒ์šฉ๊ตฌ๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค

๋ถ„๋ช…ํžˆ ์„ ์–ธ์  ๊ตฌ๋ฌธ ์œผ๋กœ UI๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ์•„์ด๋””์–ด์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ ๋ฏน์Šค ์ธ์ด ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๊ณณ์— ํ›„ํฌ๋ฅผ ๋‘๊ณ  ๊ตฌ์‹ ๊ฐœ๋ฐœ์ž ์ฝ”๋“œ์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ์•„์ด๋””์–ด์™€ ๋‹ค๋ฅธ ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด๋Š” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ผ๊ธ‰ ์ง€์›ํ•˜๋Š” ํ•ต์‹ฌ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ํ›„ํฌ ํ†ตํ•ฉ ์ดํ›„์˜ ๋ฏธ๋ž˜๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ตœ์ƒ์œ„ ํ”„๋ ˆ์ž„์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: ๋จธํ‹ฐ๋ฆฌ์–ผ)๊ฐ€ ํฌ๊ฒŒ ์ง€์›ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊นŒ์ง€ ํ•ฉ๋‹ˆ๋‹ค.

Flutter๊ฐ€ ๋” ์•„๋ฆ„๋‹ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// this is just scratch, not a complete and true use-case
build(context) {
    final angle = useAnimation(2*PI, 0, 5 /*seconds*/);
    return Image.from(myAwesomeImage)
        .padding(8)
        .scale(2.5)
        .rotate(angle);
}

@HKhademian ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ›„ํฌ์™€ ๊ฐ™์€ ๊ฒƒ(๋˜๋Š” ๋‹ค๋ฅธ ์šฉ์–ด๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์ ์ ˆํ•œ ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ์ผ๊ธ‰ ์ง€์›์˜ ๋ถ€์กฑ์€ ์‚ฌ์‹ค ์ œ๊ฐ€ ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ์—์„œ Flutter๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์€ ์œ ์ผํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

2. ํ›„ํฌ ํŒจํ‚ค์ง€๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›์˜ ์†Œ์œ ๋ผ๋Š” ์‚ฌ์‹ค์€ ํŒจํ‚ค์ง€์˜ ํ’ˆ์งˆ์ด๋‚˜ ๊ฐ€์น˜๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ๋–จ์–ด๋œจ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ถ„์„์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ง€์›๊ณผ ๊ฐ™์ด ์ด ๋ฒ„๊ทธ์—์„œ ์‹๋ณ„๋œ ์ผ๋ถ€ ๋‹จ์ ์„ ์ถฉ์กฑํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ์†Œ์‹œํ‚ค์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. /๋ฆฐํŒ…

์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์›์ด ํŒจํ‚ค์ง€๋ฅผ ๊ณ ์ŠคํŠธํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ. Google์€ ๊ณ ์ŠคํŠธ ์ฝ”์–ด Flutter๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ? ๊ธ€์Ž„์š”, ๋‹น์‹ ์˜ ์ž…์žฅ์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ Flutter๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€๋งŒํผ ์†Œ๋น„์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€... ๊ธฐ๊ปํ•ด์•ผ ์ž˜๋ชป๋˜๊ณ  ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ฑฐ์ง“๋ง์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์š”์ฒญ์„ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์ธ ์„ ํ˜ธ๋„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์นœํ™”์„ฑ์„ ์ž…์ฆํ•œ @Hixie ์˜ ๋™์˜๊ฐ€ ์—†์œผ๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด๋‚˜ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋งคํ•˜์ง€ ์•Š๊ณ ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋„ˆ๋ฌด ๋ถˆํˆฌ๋ช…ํ•˜์—ฌ ๋‹ฌ๋ฆฌ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ธฐ๋Šฅ์˜ ์กด์† ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ฒฝํ—˜์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€์ ์€ ํ•ญ์ƒ Flutter์— ํ˜ผํ•ฉํ•  ์„คํƒ•์— ๋Œ€ํ•œ ๊ฐ€์žฅ ํฐ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜์‚ฌ ๊ฒฐ์ • ํ”„๋กœ์„ธ์Šค์— ๊ธฐ์—ฌํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋” ๋งŽ์€ ๋น„์ค‘์„ ๋‘๋Š” Flutter์˜ ๊ธฐ๋Šฅ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์‹ํ™”๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ 100%๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ์€ ์•ฝ 5%, ๊ทธ ์ •๋„๋ฉด ์Šˆํผ ํ”Œ๋ ˆ์ดํ‚ค 5%์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. @timsneath

GitHub ๋ฌธ์ œ์—์„œ ๋ฌธ์ œ๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์†”๋ฃจ์…˜์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

React ํŒ€์€ ์ด ๋ฌธ์ œ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ Hooks์˜ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.
React ํŒ€๋ณด๋‹ค ํ›„ํฌ๋ฅผ ๋” ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ์ด์Šˆ(๋ฉ”ํƒ€) https://github.com/flutter/flutter/issues/28884

๋ฃจํฌ, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์—ด์ •์„ ์กด์ค‘ํ•˜๊ณ  ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ด‘๊ณ  ์ธ์‹ ๊ณต๊ฒฉ์€ ๊ทธ๋งŒํ•˜์„ธ์š”. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ๋ฆฌ์†Œ์Šค ์šฉ๋Ÿ‰, ์‚ฌ์šฉ์ž ์—ฐ๊ตฌ, ์ดํ•ด ๊ด€๊ณ„์ž ์ž…๋ ฅ, ๊ณ ๊ฐ ์š”๊ตฌ ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค์–ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ํ”Œ๋žซํผ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์นœ์ ˆํ•˜์„ธ์š”. https://github.com/flutter/flutter/blob/master/CODE_OF_CONDUCT.md

์ธ์‹ ๊ณต๊ฒฉ์€ ์˜๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. CoC์— ๋”ฐ๋ฅด๋ฉด ์šฐ๋ฆฌ๋Š” ํ•จ๊ป˜ ๋ชจ์—ฌ ๋‚ด๊ฐ€ ์ „๋‹ฌํ•˜๋ ค๋Š” ๋‚ด์šฉ์„ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜๊ฒฌ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ์„œ ์„œ๋กœ์˜ ๊ด€์ ์„ ์ดํ•ดํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์–ด๋””์—์„œ ์†”๋ฃจ์…˜์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ €๋Š” Flutter ํ”„๋กœ์ ํŠธ, ํŠนํžˆ Animations ๋ฐ Transitions์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ์ด initState ๋ฐ dispose ์ƒํƒœ๋ฅผ ๋‹จ์ผ ํ•จ์ˆ˜๋กœ ์บก์Šํ™”ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ์„ค์ •ํ•˜๋Š” ๋Œ€์‹  ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

Flutter Overlays(#50961)์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ๊ฐ™์ด ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ ์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ Flutter์˜ ์™ธ๋ถ€ ๊ด€์ฐฐ์ž/์‚ฌ์šฉ์ž์—๊ฒŒ ๋“ค๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€ ์•Š๋Š” ํ•ฉ๋ฒ•์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ), ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์ผ์ถ•๋œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๊ด€๋ฆฌ์ž์— ๋Œ€ํ•œ ๋ฌด๋ก€ํ•จ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ฌธ์ œ ์Šค๋ ˆ๋“œ๋ฅผ ์•„๋ฌด๋ ‡์ง€ ์•Š๊ฒŒ ์ฝ๋Š” ๋‚ด ์˜๊ฒฌ์ผ ๋ฟ์ด๋ฉฐ ๋‹ค๋ฅธ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ฉ๋ฒ•์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Rust๊ฐ€ ์ƒˆ๋กœ์šด ์†”๋ฃจ์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํฅ๋ฏธ๋กœ์šด RFC ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@satvikpendem ์—ฌ๊ธฐ์—์„œ RFC ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜๋ฉด ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ์„ค๋ช…๋œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์ด์ œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ ์†”๋ฃจ์…˜์„ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ํ›„ํฌ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฒ„๊ทธ๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๋ฉด # ๋ฌธ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ž์„ธํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@hixie https://github.com/flutter/flutter/issues/51752

๋˜ํ•œ Dan์˜ ์˜๊ฒฌ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/flutter/flutter/issues/25280#issuecomment -456404333
์ด ํ† ๋ก ์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์—‡์ด์—ˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…• Remi, ๋ฒ„๊ทธ #51752์— ๋Œ€ํ•ด ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด ๊ณต๊ฐ„์— ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ํˆฌ์žํ–ˆ๊ณ  ์—ฌ๊ธฐ์— ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. x1000 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@dnfield ์˜ ์˜๊ฒฌ ์„ ๋ฐ˜๋ณตํ•˜์ž๋ฉด, ์šฐ๋ฆฌ๋Š” ์•„์ง ๋ฌธ์ œ ์˜์—ญ๊ณผ ๊ทธ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ์กฐ์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ฒ„๊ทธ ๋Š” ํ•ด๋‹น ๋ชฉํ‘œ๋ฅผ ํ–ฅํ•œ ์œ ์šฉํ•œ ๋‹จ๊ณ„ ๋ฐ/๋˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ๋Š” ๊ท€ํ•˜์˜ ํ›„์† ์งˆ๋ฌธ์€ React ํŒ€๊ณผ์˜ ๋Œ€ํ™”๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ์•„์ง ๋ฌธ์ œ ์˜์—ญ์— ๋Œ€ํ•œ ์กฐ์ •์ด ์—†๋‹ค๋ฉด ์‹œ๊ธฐ์ƒ์กฐ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ํ›„ํฌ๋กœ ์ˆ˜์ •๋  ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์•ฑ์˜ ์ „์ฒด ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. @timsneath, ํ† ๋ก ์— ์ ํ•ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ ๊ณต๊ฐ„์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

:์›จ์ด๋ธŒ: @timsneath
์†”์งํžˆ ๋งํ•˜๋ฉด ์™œ React ํŒ€๊ณผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ธฐ์ƒ์กฐ์ธ์ง€ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์—†๋”๋ผ๋„ React ํŒ€๊ณผ์˜ ํ† ๋ก ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
React๋Š” Flutter์™€ ๋งŽ์€ ์œ ์‚ฌ์ ์„ ๊ณต์œ ํ•˜๋ฉฐ ์œ„์ ฏ๊ณผ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐ ๋ช‡ ๋…„์˜ ์ถ”๊ฐ€ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋“ค๊ณผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์–‘ ๋‹น์‚ฌ์ž์—๊ฒŒ๋งŒ ์ด์ต์„ ๊ฐ€์ ธ๋‹ค ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋กœ์„œ:
flutter_hooks๋ฅผ ๋งŒ๋“  ํ›„ Dan์œผ๋กœ๋ถ€ํ„ฐ ์—ฐ๋ฝ์„ ๋ฐ›์•„ ํ›„ํฌ์— ๋Œ€ํ•œ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๋Œ€๋‹ต์€ "Flutter๊ฐ€ ์œ ํ˜• ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ผ์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค"์˜€์Šต๋‹ˆ๋‹ค.
๋ช‡ ๊ฐœ์›” ํ›„ Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์ƒ์„ฑํ•˜์—ฌ React์˜ ํ•ซ ๋ฆฌ๋กœ๋“œ๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Flutter์™€ React ํŒ€์ด ๋…ผ์˜ํ–ˆ๋‹ค๋ฉด ๊ทธ๋Ÿฌํ•œ ์ƒํ˜ธ ์ž‘์šฉ์ด ๋งŽ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ณ  ๋‘ ๊ธฐ์ˆ  ๋ชจ๋‘ ๋ฐœ์ „ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๋ฌธ์ œ ์—†์ด ์งˆ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐœ๋ฐฉํ˜• ์งˆ๋ฌธ:

  • ์™œ ํ›„ํฌ?
  • ์™œ ์„œ์ŠคํŽœ์Šค/๋™์‹œ ๋ชจ๋“œ์ธ๊ฐ€?
  • ์™œ ํฌํ„ธ์ธ๊ฐ€?

@satvikpendem ์—ฌ๊ธฐ์—์„œ RFC ํ”„๋กœ์„ธ์Šค๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…๋˜๋ฉด ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํ† ๋ก ์ด ๋ฌด์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? RFC์˜ ๋ชฉ์ ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ด๋‚˜ ๋„๊ตฌ ์˜๋ฏธ์™€ ๊ฐ™์€ ๋ณด๋‹ค ์ฃผ๊ด€์ ์ธ ๊ฒƒ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ "ํ›„ํฌ๊ฐ€ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ด€์šฉ์ ์ด ๋˜๊ณ  ์žˆ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ฐœ์„ ๋œ ๊ฒฝํ—˜๊ณผ ์ƒ์‚ฐ์„ฑ์„ ๋ณด๊ณ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•œ๋‹ค๋ฉด ์ด๋Š” ์œ ํšจํ•œ ํ† ๋ก ์ด์ง€๋งŒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„๋ฌด๋„ "๋ฒ„๊ทธ๊ฐ€ ์•„๋‹Œ ํ† ๋ก ์€ ๋ฌด์‹œ๋  ๊ฒƒ์ด๋‹ค"๋ผ๊ณ  ๋งํ•œ ์‚ฌ๋žŒ์ด ์—†๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ž, ์„œ๋กœ๋ฅผ ์กด์ค‘ํ•˜๊ณ  ์˜ˆ์˜ ๋ฐ”๋ฅด๊ฒŒ ๋Œ€ํ•˜๋ฉด์„œ ์„ ์˜๋กœ ํ•จ๊ป˜ ์ผํ•ฉ์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์—ฌ๊ธฐ์—์„œ ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ์˜ ๊ด€์‹ฌ์„ ๋Œ๊ธฐ ์œ„ํ•ด ๊ฒฝ์Ÿํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋ฒ„๊ทธ, ๋””์ž์ธ ๋ฐ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@lukepighetti , ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ "๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ํ›„ํฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค"๋Š” ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ”ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋Œ€ํ™”์˜ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ •์˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์š”๊ตฌ์— ์ตœ์ ํ™”๋œ ๋””์ž์ธ์œผ๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Flutter์˜ ๋งฅ๋ฝ์—์„œ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ •๋ง ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋™์ผํ•œ์ง€ ์—ฌ๋ถ€, ์†”๋ฃจ์…˜์ด ๋™์ผํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ๋“ฑ์— ๋Œ€ํ•ด ๋ชจ๋‘ ๋™์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@rrousselGit -- ๋ฌผ๋ก , React ํŒ€๊ณผ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ œ์•ˆ์„ ํ™˜์˜ํ•˜๋ฉฐ, ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์–ธ์  ๊ฐ€๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ™•์‹คํžˆ ๊ทธ ํŒ€์— ๋งŽ์€ ์˜๋ฆฌํ•จ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ๋“ค์˜ ์ œ์•ˆ์€ ๋งค์šฐ ์€ํ˜œ๋กญ๊ณ  ์นœ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ์€ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์–ป์€ ํŠน์ • ์งˆ๋ฌธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๊ท€ํ•˜๊ฐ€ ์š”์ฒญํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ๊ทธ๋“ค๊ณผ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋˜ํ•œ, "Flutter ํŒ€"์€ Flutter์— ๊ธฐ์—ฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ผ ๋ฟ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ƒ๊ธฐ์‹œ์ผœ ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ์—ฌ์ž๋Š” Google์—์„œ ์ผํ•˜๊ณ  ์ผ๋ถ€ ๊ธฐ์—ฌ์ž๋Š” ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋” ๊ฐ•๋ ฅํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Flutter ํŒ€์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค. :)

์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ -- ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค -- ์ด ๋ฌธ์ œ๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ธ๋‚ด์‹ฌ์„ ๊ฐ–๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๊ณ , ์ด ๊ณต๊ฐ„์—์„œ ์ฐฝ์˜์ ์ธ ์•„์ด๋””์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ„์† ์ถ”์ง„ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ํ›„ํฌ๋กœ ์ˆ˜์ •๋  ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์•ฑ์˜ ์ „์ฒด ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@satvikpendem ๋ฌธ์ œ๊ฐ€ "๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค"๋ผ๋ฉด ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๋‹น์‹ ์ด ์‹ ๊ณ ํ•ด์•ผ ํ•˜๋Š” ๋ฒ„๊ทธ์ด๋ฉฐ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ฒ„๊ทธ #๋ฅผ ์–ธ๊ธ‰ํ•˜๋ฉด โ€‹โ€‹๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Hixie ๋Œ“๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๋Š” @rrousselGit ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฒ„๊ทธ(#51752)์— ์˜ํ•ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์ง€๋ฏ€๋กœ ํ•ด๋‹น ๋ฌธ์ œ์—์„œ ์ฝ์€ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@timsneath @lukepighetti ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ดํ•ดํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ, # 51752 ๋ฐ ๊ธฐํƒ€์™€ ๊ฐ™์ด Flutter์˜ ๋งฅ๋ฝ์—์„œ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๋” ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ์–ด๋–ป๊ฒŒ ๋„์™€๋“œ๋ฆด๊นŒ์š”? React ํŒ€์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ฉด ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์ •๋ณด์— ์ž…๊ฐํ•œ ์งˆ๋ฌธ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ง€์‹์„ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, React์— ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณต์‚ฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ ์ค‘๋ณต ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ๋ณด๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Vue์˜ ์„ค๋ฆฝ์ž @yyx990803 ์€ Vue์˜ RFC(https://www.github.com/vuejs/rfcs/tree/function-apis/active-rfcs%2F0000-function-api.md)์— ์ž์‹ ์˜ ์ƒ๊ฐ์„ ๊ฒŒ์‹œํ•˜์—ฌ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๋‚˜๊ฐ€ ๋‹ค. ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ API์— ๋Œ€ํ•ด ์ •์ค‘ํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์„น์…˜์„ ํŠน๋ณ„ํžˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Hixie ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” '๋ฒ„๊ทธ'์— ๋Œ€ํ•œ ๋” ๋„“์€(๋‚ด๋ถ€์ ์œผ๋กœ?) ์ •์˜๋ฅผ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•ต๋ฌด์ƒˆ ๊ธฐ๋Šฅ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ํ›„ํฌ์— ๋Œ€ํ•œ RFC๋Š” ์ •๋‹นํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๋Š” ์„ ํ–‰ ๊ธฐ์ˆ ์ด ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์„ ํ–‰ ๊ธฐ์ˆ ์€ ํ•ต์‹ฌ ๋ฐ˜์‘ ํŒ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์ œ์‹œํ•˜๋Š” ๋ชจ๋“  ์ •๋‹น์„ฑ์€ ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๊ณ  ์ „๋‹ฌํ•œ ๊ฒƒ์„ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @rrousselGit ์€ GitHub ๋ฌธ์ œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์˜๋ฅผ ์ฃผ์„ ํ•˜๋Š” ๊ฒƒ์„ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€ ๋ฌธ์ œ๋กœ์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ œ์‹œํ•œ flutter/flutter ๋กœ๋“œ๋งต์— ๊ด‘๋ฒ”์œ„ํ•œ RFC๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํž˜๋“ค๊ณ  ํ•„์š”ํ•œ ์ž‘์—…์„ ์›ํ•˜๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ์ดํ•ด๊ด€๊ณ„์ž๋ผ๋Š” ๋ง์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋“ค์„ ํฌํ•จํ•˜๊ณ  ์ง„์ง€ํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. flutter/flutter ์ปจํ…์ŠคํŠธ์—์„œ ์™ธ๋ถ€๋Š” ๋น„ ํŒ€, ๋น„ Google, ๋น„ GDE์ž…๋‹ˆ๋‹ค.

Wiki์— RFC ํ”„๋กœ์„ธ์Šค ๋ฅผ ๋ฌธ์„œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

Flutter/flutter์˜ ๋งฅ๋ฝ์—์„œ ์™ธ๋ถ€๋Š” ๋น„ ํŒ€, ๋น„ Google, ๋น„ GDE์ž…๋‹ˆ๋‹ค.

์ •์˜์— ๋”ฐ๋ฅด๋ฉด RFC๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒฝ์šฐ ํŒ€์˜ ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” @rrousselGit ์ด ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฒ„๊ทธ๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค(#51752).

๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ • ๋ฌธ์ œ๋Š” ๋‹ซํ˜€ ์žˆ์ง€๋งŒ ๊ทธ ๋ฌธ์ œ๋Š” ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ์•ˆ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์„ค๋ช…์ด ์žˆ์—ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. "ํ›„ํฌ"์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์„ค๋ช…์€ ์•„์ง ์—†์œผ๋ฉฐ ๊ทธ๋ƒฅ ์ง€๋‚˜์น  ์ •๋„๋กœ๋งŒ ์–ธ๊ธ‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ์™€ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์ด React์™€ Vue์— ์˜ํ•ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๋Š”๋ฐ ์™œ ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

ํ›„ํฌ์˜ RFC ์—๋Š” ๋งŽ์€ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์•ฝ 1400๊ฐœ์˜ ๋Œ“๊ธ€, ์†Œ๊ฐœ ๋™์˜์ƒ, ๋ฌธ์„œ ๋ฐ ๊ธฐ์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์— ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๋ฌธ์ œ๋Š” #51752์— ์„ค๋ช…๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฐ€์š”?

(์ด์œ : ๊ฐœ๋ฐœํŒ€์ด ๋‹ค๋ฅธ ์ œํ’ˆ์— ๋Œ€ํ•ด 1400๊ฐœ์˜ ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฐ RFC๋ฅผ ์ง€์‹œํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๊ฐœ๋ฐœํŒ€๊ณผ ํšจ๊ณผ์ ์ธ ์˜์‚ฌ ์†Œํ†ต ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋‘”๊ฐํ•˜๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.)

๋ฉ”๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ํ•‘ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. https://github.com/flutter/flutter/issues/51752#issuecomment -665380355์—์„œ React ๊ด€์ ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ๋” ๋‚จ๊ฒผ์œผ๋ฉฐ ๊ธฐ๊บผ์ด ๋‹ต๋ณ€ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๋ฉด ๋” ๋งŽ์€ ์งˆ๋ฌธ.

๋‚˜๋Š” ๋˜ํ•œ ์ด(๋ฐ ๊ด€๋ จ ์Šค๋ ˆ๋“œ)๊ฐ€ "React์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค"์™€ ๊ฐ™์€ ์ฃผ์žฅ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์••๋ ฅ์„ ๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ์ •์ค‘ํ•˜๊ฒŒ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ํฌ๋ง์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. React์™€ Flutter๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์—์„œ ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉฐ React Hooks๋Š” ํŠนํžˆ ์šฐ๋ฆฌ์˜ ์•ฝ๊ฐ„์˜ ๋‰˜์•™์Šค์— ์ƒ๋‹นํžˆ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋˜ํ•œ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ›„ํฌ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ํ™˜์ƒ์ ์ธ ํŒจํ„ด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋ฐฉ๊ธˆ React Native ๊ณ„์•ฝ์„ ๋งˆ์ณค๊ณ  ํ›„ํฌ๊ฐ€ (๋‚ด ์ƒ๊ฐ์—) ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์„ ๋”์ฐํ•˜๊ฒŒ ํŒŒํŽธํ™”ํ•˜์—ฌ ๊ฑฐ์˜ ์ด๋“์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Flutter๋Š” ํ˜„์žฌ React ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋œ ์ˆ˜๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ธฐ๋ณธ ์ƒํƒœ ๊ด€๋ฆฌ ์†”๋ฃจ์…˜์œผ๋กœ ํ›„ํฌ๋กœ ์ „ํ™˜๋˜๋Š” ๊ฒฝ์šฐ Flutter ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฑฐ์˜ ์ด๋“์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ์กด ์ž‘์—…๊ณผ ์ •์‹ ์  ํŒจํ„ด์„ ๋ชจ๋‘ ํŒŒ๊ดดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ›„ํฌ๊ฐ€ ์ƒ์‚ฐ์ ์ธ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์šฐ์ˆ˜ํ•œ ํŒจํ„ด์ด๋ผ๋Š” ์ฃผ์žฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ผ๊ด€์„ฑ์ด "๋” ๋‚˜์€" ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค๋Š” ๋” ์„ค๋“๋ ฅ ์žˆ๋Š” ์ฃผ์žฅ(dartfmt ํ•ต์‹ฌ ์ฃผ์žฅ๊ณผ ๊ฐ™์€)์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒˆ๋กœ์šด React ๊ฐœ๋ฐœ์ž๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ›„ํฌ๊ฐ€ ์žˆ๋Š” ์žฅ์• ๋ฌผ์— ์ž์ฃผ ๋ถ€๋”ชํžˆ๋ฉฐ ๋จผ์ € ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ€๋ฅด์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ข‹์€ ๋น„๊ต๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ map/reduce/filter/fold์™€ ๊ฐ™์€ ์ˆ˜์ง‘ ๋ฐฉ๋ฒ•์— ๋น„ํ•ด for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๊ฐ„์ด ๋” ์‰ฝ๋‹ค๋Š” ํ˜„์ƒ์ž…๋‹ˆ๋‹ค). ํ›„ํฌ๋Š” ๊ณ ๊ธ‰ ํŒจํ„ด์ด๋ฉฐ ๋•Œ๋•Œ๋กœ ์ด๋ฅผ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊น๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹ค๋ง์Šค๋Ÿฌ์šด ์ ์€ React ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํด๋ž˜์Šค ๊ตฌ์„ฑ ์š”์†Œ ํŒจํ„ด์— ๋Œ€ํ•œ ๋ฌธ์„œ ๋ฐ ์ง€์›์„ ์‹ ์†ํ•˜๊ฒŒ ๋‹จ๊ณ„์ ์œผ๋กœ ์ค‘๋‹จํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ด ๊ต์œก ๋˜๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ #51752์—์„œ ํ›„ํฌ ์ž์ฒด์— ๋‹จ ํ•œ๋ฒˆ์˜ ๋ Œ๋”๋ง์„ ์œ„ํ•œ useEffect(() => ..., [] ) ํŒจํ„ด๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” Flutter ์ „์šฉ ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. @Hixie ๋Š” ํ›„ํฌ์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋‹จ์ ์ด ์—†์„ ์ˆ˜ ์žˆ๋Š” Property ๋ฐ PropertyManager ํŒจํ„ด์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ๋ฒ„์ „์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ Flutter์˜ ๊ฒฝ์šฐ์—๋Š” React ์Šคํƒ€์ผ ํ›„ํฌ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๋ผ๊ธฐ ๋•Œ๋ฌธ์— ํ›„ํฌ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์„ ๋” ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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