๐๐ฅ๐ฅ ๋ผ์ผ๋ฆฌ์ ์ฝ๋ ๋ถ์ค๋ฌ๊ธฐ ๐๐ฅ๐ฅ
ํ๋ฌํฐ ๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ๊ณต๊ฐ ๋ชจ๋ฐ์ผ SDK ์ด๋ค. ๋ชจ๋ฐ์ผ ์ฑ์ ๋ง๋ค๊ธฐ ์ํ ๊ธฐ์กด ๋ฐฉ์์ ์๋๋ก์ด๋์ IOS๋ฅผ ๋ณ๋๋ก ๊ตฌํํ์ฌ ๋ฐฐํฌํด์ผํ๊ธฐ์ ์๊ตฌ๋๋ ๊ธฐ์ ์คํ๊ณผ ๋น์ฉ์ด ์ปธ์ผ๋ ํ๋ฌํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฒ์ ๊ตฌํ์ผ๋ก ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ๋ค. ํ๋ฌํฐ๋ ๋ ํฐ๋ง ์์ง, UI ์ปดํฌ๋ํธ, ํ
์คํธ ํ๋ ์์ํฌ, ๋๊ตฌ, ๋ผ์ฐํฐ ๋ฑ ์ฑ ์ ์์ ํ์ํ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ณตํ๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ฑ ๊ตฌํ์ ์ง์คํ์ฌ ์์ฐ์ฑ์ ๋์ผ ์ ์๋ค.
ํ๋ฌํฐ๊ฐ Dart ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋คํธ๋ JIT(just-in-time), AOT(ahead-of-time) ์ปดํ์ผ์ ๋ชจ๋ ์ง์ํ๋ค. AOT ์ปดํ์ผ๋ฌ๋ ๋คํธ ์ฝ๋๋ฅผ ํจ์จ์ ์ธ ๋ค์ดํฐ๋ธ ์ฝ๋๋ก ๋ฐ๊พธ์ด ๊ฐ๋ฐ์ ๋ฐ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ๋น ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๊ธฐ์กด 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.
Widget Widget์ ๋ชจ๋ ๋ถ๋ณ์ ๋ฒ์น์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ฌ๋ ์์ ฏ์ ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ๊ธฐ์กด ์์ ฏ์ ์ญ์ ํด๋ฒ๋ฆฌ๊ณ ์์ ์๋ก์ด ์์ ฏ์ผ๋ก ๋์ฒดํ๋ค.
StatelessWidget Life Cycle Constructor๋ก ์์ฑ์ด๋๊ณ ์์ฑ์ด ๋์๋ง์ build ํจ์๊ฐ ์คํ๋๋ค. ๋ณ๊ฒฝ์ด ํ์ํ๋ฉด ์๋ก์ด ์์ ฏ์ ๋ง๋ ๋ค. StatelessWidget์ ๋ผ์ดํ ์ฌ์ดํด ๋์ ๋จ ํ๋ฒ๋ง build ํจ์๋ฅผ ์คํํ๋ค. StatefulWidget ์๋ช
์ฃผ๊ธฐ Construct createState : State๋ฅผ ์์ฑ initState : State๋ฅผ ์ด๊ธฐํ. State๊ฐ ์์ฑ๋ ๋ ๋จ ํ๋ฒ๋ง ํธ์ถ๋๋ค. didChangeDependencies dirty ์ํ : ๋ณ๊ฒฝ์ด ํ์ํ ์ํ๋ฅผ ์๋ฏธํ๋ค.
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 ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ๊ณผ ๋ชฐ๋๋ ๋ถ๋ถ ์ ๋ฆฌ! ๐ธ๐ธ 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์์ ๊ฒฐ์ ๋๋ ๊ฐ๋ ์ค์ ๊ฐ๋ฅํ๋ค.
riley published on included in Etc buf buf๋ IDL(Interface description language) ์ค ํ๋์ธ protobuf๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค. protobuf๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
API ์ค๊ณ๊ฐ ์ผ๊ด์ฑ์ด ์๋ค. ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ์ค์์์ ์ด๋ฃจ์ด์ง์ง ์๊ณ ์๋ค. protobuf์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ ์ด๋ฃจ์ด์ง์ง ์๋๋ค. protoc๋ฅผ ํตํ stub ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค mock ์๋ฒ ์์ฑ, fuzz testing, ๋ฌธ์ํ ํ ์ ์๋ ํด๋ค์ด ๋ง์ด ์กด์ฌํ์ง ์๋๋ค. buf์์ ์ ๊ณตํ๋ ํด buf cli ๋ฐ์ ๋ protobuf ์ปดํ์ผ๋ฌ๋ฅผ ์ ๊ณตํ๋ค. ์ข์ API ๋์์ธ๊ณผ ๊ตฌ์กฐ๋ฅผ lint ๊ธฐ๋ฅ์ ํตํด ์ ํํ ์ ์๋ค.