Flutter 공부중. 리엑트보다 100배 낫다.

친한 친구의 추천으로 요즘 개발에 있어서 Flutter를 보고 있다. 처음에는 ‘웹’개발용으로 친구의 추천으로 시작한 Flutter프레임워크와 Dart라는 언어가 어느정도 익숙해진 지금에선 꽤나 괜찮게 느껴진다. 기본적으로 내가 불편하다고 생각하던 혹은 버전이 업그레이드 되면서 바뀌던, 리엑트에 있던 패러다임이 전부 들어있다. 그리고 역시 구글에서 만든 언어답게(?) 문법이 꽤나 엄격하다. 그 말인 즉, 컴파일 타임 에러 체크가 있다는 것이다. 타입도 그렇고.. 물론 다이나믹 타입이 있긴 하지만, 기본적으로 타입을 잘 정의하면 적어도 문법에서 오는 에러자체는 없다는 것은 자바스크립트 개발과 비교하면 큰 장점인 것은 사실이다.

일단 웹의 근간이 되는 html과 css, js가 없어지니 이건 일종의 패러다임의 전환이나 마찬가지다. 정확히 말하면 아에 없어진다기 보다는 JSX처럼 컴파일 해서 js로 파싱하는 듯 하지만, 어쨌건간에 기본적인 문법이 약간의 자바스크립트 꽈베기인 JSX보다는 개인적으로는 뭔가 잘 짜여진, 언어의 느낌인 Dart가 훨씬 나은 것 같다.

Flutter architectural overview - Flutter

물론 아직 웹개발을 하지 않아서 모르겠지만, 전체적으로 보면 어쨌건 dart to js로 파싱하는게 있고, 내가 듣기론 WebAssembly나 Canvas중 택해서 컴파일을 한다고 한다. 개개마다 차이는 있겠지만.. 어쨌든 중요한 것은, Dart라는 언어가 주는 장점과, 기본적으로 위젯 위주의 개발을 하는 패러다임은 리엑트가 발전하면서 가진 속성과도 비슷한 것 같다. 자원관리, 컴포넌트 관리(Pure Component니.. ) 컴포넌트 라이프 사이클이니 이런 개념들이 난 리엑트를 하면서 처음에는 괜찮다고 생각했는데 가면 갈수록 무거워지고, 컴파일러에서 딱히 지원하는게 없어서 어디서 나는 버그인지도 모르고 계속해서 만지고, 딱히 네이티브 앱에 대한 욕심은 없었지만 아무리 생각해도 리엑트는 갈수록 복잡해지고 알아야 할께 너무나도 많아졌다고 본다.

가장 큰 문제는 앱이 커질수록 복잡해지는 그 코드다. 요즘엔 솔직히 리엑트로 개발하기가 두렵다. 글쎄, Next.js (지금의 vercel)을 기반으로 SSR로 개발하던 부분은 그렇게 어렵진 않았지만, 그냥 일반적인 웹사이트는 모를까 SAAS같은 앱을 만든다면 리엑트는 갈수록 복잡해지고, 코드가 모듈화 되거나 그런 기대를 하기가 힘들다. 컴포넌트 기반의 그것을 내가 제대로 배우지 못해서 그런진 모르겠지만, 버전이 올라가면서 추가되는 뭐 2~3년전 추가된 Hook같은 기능들. 기능적으론 좋지만, 그게 어쩌면 리엑트를 더 무겁게 하는건 아닐까.

그래서 난 유라임을 플러터 기반으로 가되, ‘앱’기반으로 가기로 마음먹었다. 어차피 대부분의 것들이 ‘모듈’이고, 어디선가 관리만 잘 되면 된다. 위젯으로 만들되, 그 전체적인 틀을 제대로 설계하고 싶은 것이다. 가장 중요한 것은 유지보수가 용이한 것. 특히, 혼자서 하는 개발이기 때문에 이젠 백엔드가 복잡해서도 안되는 것 같다. 그냥 있는것들 잘 써서 잘 조합해서 만드는게 낫지, 백엔드를 뭐 스프링이나 플레이로 a-z만들 필요가 있나. 내가 복잡한 SaaS를 만드는것도 아닌데.. 그래서 백엔드는 또 Firebase로 다시 가기로 마음먹었다.

모바일이 베이스가 되면, 확실히 소규모 개발이 가능한 것 같다. 웹은 정말로, 너무나도 기술발전이 빠르다. 이걸 따라잡기가 난 너무 힘들다. 이젠 좀 지친감도 없지않아 있다. 하지만 생각해보면 그 근원적인 패러다임은 변하지 않았다. 기술이 막 이렇게 발전한다고 해서, 대세라고 해서 그걸 수용하다간 반드시 피해를 보게 된다. 지금의 유라임 코드는 ReactJS와 Play Framework로 나름대로 잘 짰다고 생각했지만 개발에서 조금만 손놓고 있어도 뭔가 새로운 feature를 개발하는게 너무나도 힘드니깐.

뭐 어쨌건, 이제는 Dart+Flutter를 개인 스택으로 사용하고자 한다. 물론 마이크로 서비스는 Python, Node를 쓰겠지만.. 적어도 내 개인 웹에 대한 근간은, 이제는 바뀌는 것 같다.