/images/avatar.png

๐Ÿž๐Ÿฅ๐Ÿฅ– ๋ผ์ผ๋ฆฌ์˜ ์ฝ”๋“œ ๋ถ€์Šค๋Ÿฌ๊ธฐ ๐Ÿž๐Ÿฅ๐Ÿฅ–

[Flutter] Flutter ๊ฐœ๋… ๋ฐ ๋™์ž‘ ์›๋ฆฌ

ํ”Œ๋Ÿฌํ„ฐ ๊ตฌ๊ธ€์—์„œ ๊ฐœ๋ฐœํ•œ ๊ณต๊ฐœ ๋ชจ๋ฐ”์ผ SDK ์ด๋‹ค. ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ธฐ์กด ๋ฐฉ์‹์€ ์•ˆ๋“œ๋กœ์ด๋“œ์™€ IOS๋ฅผ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฐฐํฌํ•ด์•ผํ–ˆ๊ธฐ์— ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ  ์ŠคํŽ™๊ณผ ๋น„์šฉ์ด ์ปธ์œผ๋‚˜ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๋ฒˆ์˜ ๊ตฌํ˜„์œผ๋กœ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ”Œ๋Ÿฌํ„ฐ๋Š” ๋ Œํ„ฐ๋ง ์—”์ง„, UI ์ปดํฌ๋„ŒํŠธ, ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ, ๋„๊ตฌ, ๋ผ์šฐํ„ฐ ๋“ฑ ์•ฑ ์ œ์ž‘์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ์•ฑ ๊ตฌํ˜„์— ์ง‘์ค‘ํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ Dart ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ๋‹คํŠธ๋Š” JIT(just-in-time), AOT(ahead-of-time) ์ปดํŒŒ์ผ์„ ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค. AOT ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹คํŠธ ์ฝ”๋“œ๋ฅผ ํšจ์œจ์ ์ธ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ์–ด ๊ฐœ๋ฐœ์ž ๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋‘ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Graph Database ๋ฆฌ์„œ์น˜ - Follow, Tag ๊ธฐ๋Šฅ์„ ๊ณ ๋„ํ™” ํ•ด๋ณด์ž! (2)

๊ธฐ์กด Amazon Aurora(postgreSQL) ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœํ•˜์—ฌ ์˜ฎ๊ฒจ ๋ณด์ž. go ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ user, follow ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ถ”์ถœํ•˜์—ฌ AWS Neptune ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ธํŒ… gremlin-go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. https://github.com/apache/tinkerpop/tree/master/gremlin-go 2. Neptune ์—ฐ๊ฒฐ ์„ค์ • 1 2 3 4 5 6 7 8 9 10 // ์—ฐ๊ฒฐ ์„ค์ • remoteConn, err = gremlingo.NewDriverRemoteConnection(fmt.Sprintf("wss://%s:8182/gremlin", neptuneEndpoint), func(settings *gremlingo.DriverRemoteConnectionSettings) { settings.TraversalSource = "g" settings.TlsConfig = &tls.Config{InsecureSkipVerify: true} } ) // ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•œ ๋ฆฌ๋ชจํŠธ ์—ฐ๊ฒฐ g = gremlingo.

[Flutter Beginner] StatefulWidget

Widget Widget์€ ๋ชจ๋‘ ๋ถˆ๋ณ€์˜ ๋ฒ•์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์ ฏ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ์œ„์ ฏ์„ ์‚ญ์ œํ•ด๋ฒ„๋ฆฌ๊ณ  ์™„์ „ ์ƒˆ๋กœ์šด ์œ„์ ฏ์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. StatelessWidget Life Cycle Constructor๋กœ ์ƒ์„ฑ์ด๋˜๊ณ  ์ƒ์„ฑ์ด ๋˜์ž๋งˆ์ž build ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์œ„์ ฏ์„ ๋งŒ๋“ ๋‹ค. StatelessWidget์€ ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋™์•ˆ ๋‹จ ํ•œ๋ฒˆ๋งŒ build ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. StatefulWidget ์ƒ๋ช…์ฃผ๊ธฐ Construct createState : State๋ฅผ ์ƒ์„ฑ initState : State๋ฅผ ์ดˆ๊ธฐํ™”. State๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค. didChangeDependencies dirty ์ƒํƒœ : ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[iOS/Android] APP HTTP ์ ‘๊ทผ ํ—ˆ์šฉํ•˜๊ธฐ

APP HTTP ์ ‘๊ทผ ํ—ˆ์šฉ ์„ค์ •ํ•˜๊ธฐ iOS ios/Runner/Info.plist 1 2 3 4 5 6 7 8 9 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsLocalNetworking</key> <true/> <key>NSAllowsArbitraryLoadsInWebContent</key> <true/> </dict> </dict> </plist> Android android/app/src/main/AndroidManifest.xml 1 2 3 4 5 6 7 8 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.web_view"> <uses-permission android:name="android.permission.INTERNET"/> <!-- ์ถ”๊ฐ€ --> <application android:label="web_view" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:usesCleartextTraffic="true"> <!-- ์ถ”๊ฐ€ -->

[Dart] Dart ๋ฌธ๋ฒ• ์ •๋ฆฌ

๐Ÿ˜Š Dart ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์˜ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„๊ณผ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„ ์ •๋ฆฌ! ๐Ÿธ๐Ÿธ Final ๊ณผ const final๊ณผ const ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•˜๋ฉด ํ• ๋‹นํ•œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๋‘˜๋‹ค ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ฐจ์ด์ ์€ const๋Š” complie-time์— ์ƒ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋ฉฐ final์€ runtime์‹œ์— ๊ฒฐ์ •๋˜๋Š” ๊ฐ’๋„ ์ƒ์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 1 2 3 4 // error const DateTime now1 = DateTime.now(); // error! const๋Š” runtime์‹œ์— ๊ฐ’์ด ๊ฒฐ์ •๋˜๋Š” ๊ฐ’์€ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. final DateTime now2 = DateTime.now(); // final์€ runtime์‹œ์— ๊ฒฐ์ •๋˜๋Š” ๊ฐ’๋„ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

[buf] buf๋กœ protobuf ์‚ฌ์šฉํ•˜๊ธฐ

buf buf๋Š” IDL(Interface description language) ์ค‘ ํ•˜๋‚˜์ธ protobuf๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. protobuf๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. API ์„ค๊ณ„๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค. ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ์ค‘์•™์—์„œ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ  ์žˆ๋‹ค. protobuf์˜ ๋ฒ„์ „๊ด€๋ฆฌ๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค. protoc๋ฅผ ํ†ตํ•œ stub ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค mock ์„œ๋ฒ„ ์ƒ์„ฑ, fuzz testing, ๋ฌธ์„œํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ํˆด๋“ค์ด ๋งŽ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. buf์—์„œ ์ œ๊ณตํ•˜๋Š” ํˆด buf cli ๋ฐœ์ „๋œ protobuf ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ข‹์€ API ๋””์ž์ธ๊ณผ ๊ตฌ์กฐ๋ฅผ lint ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.