{"id":994,"date":"2023-12-18T14:05:57","date_gmt":"2023-12-18T05:05:57","guid":{"rendered":"https:\/\/skanto.co.kr\/?p=994"},"modified":"2023-12-18T14:30:40","modified_gmt":"2023-12-18T05:30:40","slug":"up-and-running-for-protobuf","status":"publish","type":"post","link":"https:\/\/skanto.co.kr\/?p=994","title":{"rendered":"Up and Running for Protobuf"},"content":{"rendered":"\n<p>\ub2e4\ub978 \uc2dc\uc2a4\ud15c\uacfc \ub370\uc774\ud130\ub97c \uc8fc\uace0 \ubc1b\ub294\ub2e4\uac70\ub098 \uc6a9\ub7c9\uc774 \ud070 \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc800\uc7a5\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub370\uc774\ud130\ub97c \uc555\ucd95\ud558\uac70\ub098 \ub2e4\ub978 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc774 \ud544\uc694\ud558\ub2e4. \uc778\ud130\ub137\uc744 \ud1b5\ud574 \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc8fc\uace0 \ubc1b\uae30 \uc704\ud574 \ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 \uace0\ubbfc\uc744 \ud574 \uc654\uace0 \uadf8 \uc911 \uc694\uc998 Defacto Standard\ub85c \uc0ac\uc6a9\ub418\ub294 \uac83\uc774 Google\uc5d0\uc11c \ub9cc\ub4e0 Protocol Buffer(a.k.a Protobuf)\ub77c\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p>Protocol Buffer\ub294 language \uc911\ub9bd\uc801\uc774\uace0 \ub370\uc774\ud130\ub97c Serialize\ud560 \ub54c \uc27d\uac8c \ud655\uc7a5 \uac00\ub2a5\ud55c \uad6c\uc870\ub97c \uc81c\uacf5\ud55c\ub2e4\ub294 \ud2b9\uc9d5\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. Protocol Buffer\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba87\uac00\uc9c0 \uc124\uce58\uac00 \ud544\uc694\ud558\ub2e4. <strong>\uba3c\uc800 Protocol Compiler(\ud655\uc7a5\uc790 .proto \ud30c\uc77c\uc744 \ucef4\ud30c\uc77c\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub428)\uc640 \uc0ac\uc6a9\ud558\uace0\uc790 \ud558\ub294 language\uc5d0 \ub9de\ub294 Protobuf Runtime\uc744 \uba3c\uc800 \uc124\uce58<\/strong>\ud574\uc57c \ud55c\ub2e4. \uc5ec\uae30\uc11c\ub294 Java Runtime\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud55c\ub2e4.<\/p>\n\n\n\n<p>\ucc98\uc74c \uc2dc\uc791\ud560 \ub54c \ubd80\ub2f4\uc5c6\uc774 \ub530\ub77c\ud560 \uc218 \uc788\ub294 \uc790\ub8cc\ub85c <a href=\"https:\/\/github.com\/protocolbuffers\/protobuf\">Protocol Buffer Github<\/a> \ud398\uc774\uc9c0\ub97c \ucd94\ucc9c\ud55c\ub2e4. \uc5ec\uae30\uc5d0\uc11c \ud544\uc694\ud55c \uc124\uce58\uc640 Quick Start\uc640 \uad00\ub828\ub41c Reference\ub97c \ub9cc\ub0a0 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Protocol Compiler \uc124\uce58<\/h2>\n\n\n\n<p>Protobuf Compiler\ub294 C++\ub85c \uc791\uc131\ub418\uc5b4 \uc788\uc5b4 \uc9c1\uc811 Compile\ud574\uc11c \uc124\uce58\ud560 \uac83\uc774 \uc544\ub2c8\ub77c\uba74 \uac04\ub2e8\ud558\uac8c \uc544\ub798\uc758 \ub9c1\ud06c\uc5d0\uc11c \uc124\uce58\ubc84\uc804\uc744 \ubc1b\uc544 \uc124\uce58\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> https:\/\/github.com\/protocolbuffers\/protobuf\/releases<\/li>\n<\/ul>\n\n\n\n<p>Linux Ubuntu(20.04)\uc758 \uacbd\uc6b0\ub294 <a href=\"https:\/\/github.com\/protocolbuffers\/protobuf\/releases\/download\/v25.1\/protoc-25.1-linux-x86_64.zip\">protoc-25.1-linux-x86_64.zip<\/a> \ubc84\uc804\uc744 \ub2e4\uc6b4\ubc1b\uc73c \uadf8\ub0e5 \ud480\uae30\ub9cc \ud558\uba74 \uc124\uce58\uac00 \ub05d\ub09c\ub2e4. \uc774 \uae00\uc744 \uc791\uc131\ud558\ub294 \uc2dc\uc810(2023.12.18)\uc5d0\uc11c\uc758 \ubc84\uc804\uc774 25.1\uc774\ub2c8 \uc774\ud6c4 \ubc84\uc804\uc744 \uc124\uce58\ud558\uba74 \ubb38\uc81c\uc5c6\uc774 \ub3d9\uc791\ud560 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p>\uc124\uce58 \ud6c4 \uc815\uc0c1 \ub3d9\uc791\uc5ec\ubd80\ub97c \ud655\uc778\ud574 \ubcf4\ub824\uba74 \uc544\ub798\uc640 \uac19\uc774 \ucf58\uc194\uc5d0\uc11c \ubc84\uc804\uc815\ubcf4(libprotoc 25.1)\ub97c \ud655\uc778\ud574 \ubcf4\uae30 \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>skanto:~\/protoc-25.1-linux-x86_64$ pwd\n\/home\/skanto\/protoc-25.1-linux-x86_64\nskanto:~\/protoc-25.1-linux-x86_64$ ls\nbin  include  readme.txt  sample\nskanto:~\/protoc-25.1-linux-x86_64$ bin\/protoc --version\nlibprotoc 25.1<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ProtoBuf Runtime \uc124\uce58<\/h2>\n\n\n\n<p>Protobuf\ub294 \ub2e4\uc591\ud55c \uc5b8\uc5b4\ub97c Runtim\uc73c\ub85c \uc9c0\uc6d0\ud558\uc9c0\ub9cc \uc5ec\uae30\uc11c\ub294 Java\uc5b8\uc5b4\ub85c \ub41c Runtime\uc124\uce58\ub97c \uc124\uba85\ud55c\ub2e4. Java Runtime \uc124\uce58\ub294 \uc544\ub798 \ub9c1\ud06c\ub97c \ucc38\uc870\ud558\uba74 \ub418\uace0 Maven \ub610\ub294 Gradle\uc744 \uc774\uc6a9\ud558\uc5ec \ub3d9\uc801\uc73c\ub85c Library\ub97c Include\ud558\uba74 \uc27d\uac8c \uc124\uce58 \uac00\ub2a5\ud558\ub2e4(\uc778\ud130\ub137 \uc5f0\uacb0 \ud544\uc218).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>https:\/\/github.com\/protocolbuffers\/protobuf\/tree\/main\/java<\/li>\n<\/ul>\n\n\n\n<p>\uc704 \ub9c1\ud06c\ub85c \ub4e4\uc5b4\uac00\uba74 Maven\uacfc Gradle\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc124\uba85\ud558\uba70 Gradle\uc758 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 build.gradle \ud30c\uc77c\uc758 dependency \ube14\ub7ed\uc5d0 <em>implementation &#8216;com.google.protobuf:protobuf-java:3.25.0&#8217;<\/em> \uc744 \ucd94\uac00\ud574 \uc8fc\uba74 \ub05d\ub09c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\ndependencies {\n    \/\/ Use JUnit Jupiter for testing.\n    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'\n    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'\n    implementation 'com.google.guava:guava:31.1-jre'\n\n    \/\/ https:\/\/github.com\/protocolbuffers\/protobuf\/tree\/main\/java\n    <strong>implementation 'com.google.protobuf:protobuf-java:3.25.0'<\/strong>\t    \n}\n...<\/code><\/pre>\n\n\n\n<p>\uc774\ub807\uac8c \ud558\uba74 Protocol Buffer\ub97c \ud65c\uc6a9\ud558\uae30 \uc704\ud55c \uae30\ubcf8\uc801\uc778 \uc124\uce58\uc791\uc5c5\uc740 \ub9c8\ubb34\ub9ac \ub41c\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uac04\ub2e8\ud55c Sample\ub85c \ubc30\uc6cc\ubcf4\uae30<\/h2>\n\n\n\n<p>Protobuf\ub294 \ud55c \ubc88\ub9cc \uc0ac\uc6a9\ud574\ubcf4\uba74 \uc804\uccb4 \uadf8\ub9bc\uc774 \uba38\ub9ac\uc5d0 \ub4e4\uc5b4\uc62c \uac83\uc774\ub2e4. \uc5ec\uae30\uc11c\ub294 Quick Start\ub85c \uac04\ub2e8\ud55c \uc608\uc81c\ub97c \ud1b5\ud574 \uadf8 \uacfc\uc815\uc744 \uc124\uba85\ud55c\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/protobuf.dev\/getting-started\/javatutorial\/#builders-messages\">Protocol Buffer Basics: Java<\/a>\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<p>Protocol Buffer\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \uc544\ub798\uc758 \uae30\ubcf8\uc801\uc778 \ub2e8\uacc4\ub97c \uac70\uce5c\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>.proto \ud30c\uc77c\uc744 \ud1b5\ud574 \uba54\uc2dc\uc9c0 \ud3ec\ub9f7\uc744 \uc815\uc758\ud55c\ub2e4.<\/li>\n\n\n\n<li>Protocol Buffer Compiler\ub97c \uc774\uc6a9\ud558\uc5ec .proto\ud30c\uc77c\uc744 \ucef4\ud30c\uc77c \ud55c\ub2e4.<\/li>\n\n\n\n<li>Protocol Buffer API\ub97c \uc774\uc6a9\ud558\uc5ec \uba54\uc2dc\uc9c0\ub97c Read, Write\ud55c\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p>\uc0d8\ud50c \uc18c\uc2a4\ucf54\ub4dc\ub97c \uc9c1\uc811 \ubc1b\uc73c\ub824\uba74 <a href=\"https:\/\/github.com\/protocolbuffers\/protobuf\/tree\/main\/examples\">Github\ud398\uc774\uc9c0<\/a>\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4. \ud558\uc9c0\ub9cc \uc0d8\ud50c\uc774 \uadf8\ub9ac \uae38\uc9c0 \uc54a\uc73c\ub2c8 \ud0c0\uc774\ud551\ud574\uc11c \uc9c1\uc811 \uc190\uc73c\ub85c \uc791\uc131\ud574\ubcf4\uae38 \ucd94\ucc9c\ud55c\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \ud3ec\ub9f7 \uc815\uc758<\/h3>\n\n\n\n<p>.proto  \ud655\uc7a5\uc790\ub97c \uac00\uc9c4 \ube48 \ud30c\uc77c\uc744 \ud558\ub098 \ub9cc\ub4e4\uace0 \uc544\ub798\uc758 \ub0b4\uc6a9\uc744 \ucd94\uac00\ud55c\ub2e4. \uc5ec\uae30\uc11c\ub294 addressbook.proto \ub77c\ub294 \ud30c\uc77c\ub85c \ub9cc\ub4e0\ub2e4. \ub0b4\uc6a9\uc744 \ubcf4\uba74 \ub300\ucda9 \uc54c\uaca0\uc9c0\ub9cc Serialize\ud558\ub824\ub294 \uc790\ub8cc\uc758 \uad6c\uc870\ub97c \uc815\uc758\ud558\ub294 message\ub97c \ucd94\uac00\ud558\uace0 \uc774 message\uc5d0\uc11c \ud544\uc694\ub85c \ud558\ub294 \ud544\ub4dc\ub97c name\uacfc type\uc744 \ud65c\uc6a9\ud558\uc5ec \uc815\uc758\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>syntax = \"proto2\";\n\npackage tutorial;\n\noption java_multiple_files = true;\noption java_package = \"com.example.tutorial.protos\";\noption java_outer_classname = \"AddressBookProtos\";\n\nmessage Person {\n  optional string name = 1;\n  optional int32 id = 2;\n  optional string email = 3;\n\n  enum PhoneType {\n    PHONE_TYPE_UNSPECIFIED = 0;\n    PHONE_TYPE_MOBILE = 1;\n    PHONE_TYPE_HOME = 2;\n    PHONE_TYPE_WORK = 3;\n  }\n\n  message PhoneNumber {\n    optional string number = 1;\n    optional PhoneType type = 2 &#91;default = PHONE_TYPE_HOME];\n  }\n\n  repeated PhoneNumber phones = 4;\n}\n\nmessage AddressBook {\n  repeated Person people = 1;\n}<\/code><\/pre>\n\n\n\n<p>\uc704 \uc815\uc758 \ub0b4\uc6a9 \uc911 \uc54c\uc544\ub450\uba74 \ub3c4\uc6c0\uc774 \ub418\ub294 \ud544\ub4dc \uba87 \uac1c\ub97c \uc18c\uac1c\ud558\uc790\uba74&#8230;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>package<\/strong> \uc120\uc5b8\uc740 \ud504\ub85c\uc81d\ud2b8\uac04 \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ud558\uba70 Java\uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud560 \uacbd\uc6b0 \uc544\ub798\uc5d0 \uc788\ub294 java_package \uc635\uc158\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uae30\uc220\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0 \uc774 package \uc774\ub984\uc744 \uc0ac\uc6a9\ud568. Java\uc5b8\uc5b4\uac00 \uc544\ub2c8\ub354\ub77c\ub3c4 Protocol Buffer \ub0b4\uc5d0\uc11c\uc758 namespace \ucda9\ub3cc\ubc29\uc9c0 \ubfd0\ub9cc \uc544\ub2c8\ub77c Java \uc774\uc678\uc758 \uc5b8\uc5b4\uc5d0\uc11c\ub3c4 \ud65c\uc6a9\ub420 \uc218 \uc788\uc73c\ubbc0\ub85c package \ub294 \uacc4\uc18d \uc720\uc9c0\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.<\/li>\n\n\n\n<li> <strong>java_outer_classname<\/strong> \uc635\uc158\uc740 wrapper \ud074\ub798\uc2a4\uc758 \uc774\ub984\uc744 \uc9c0\uc815\ud55c\ub2e4.  \uc774 \uc635\uc158\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0 \ud30c\uc77c\uba85\uc744 CamelCase\ub85c \ud574\uc11c Wrapper\ud074\ub798\uc2a4 \uc774\ub984\uc73c\ub85c \uc9c0\uc815\ud55c\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \ud30c\uc77c\uc774\ub984\uc774 &#8220;my_proto.proto\u201d\uc77c \uacbd\uc6b0 wrapper \ud074\ub798\uc2a4 \uc774\ub984\uc740 MyProto\uac00 \ub41c\ub2e4.<\/li>\n\n\n\n<li><strong>java_multiple_files<\/strong> \uc635\uc158\uc774 true\uc77c \uacbd\uc6b0 \uba54\uc2dc\uc9c0 \uac01\uac01\uc758 .java \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\ub3c4\ub85d \ud55c\ub2e4. (false\uc77c \uacbd\uc6b0 \uacfc\uac70 \ubc29\uc2dd\ucc98\ub7fc Wrapper \ud074\ub798\uc2a4\uc758 inner class\ub85c \uac01\uac01\uc758 class\uac00 \uc0dd\uc131\ub428)<\/li>\n\n\n\n<li>\ub370\uc774\ud130 \ud0c0\uc785\uc73c\ub85c <strong><code>bool<\/code>,\u00a0<code>int32<\/code>,\u00a0<code>float<\/code>,\u00a0<code>double<\/code>,\u00a0<code>string<\/code><\/strong>\ub4f1\uc774 \uc9c0\uc6d0\ud568, \ub2e4\ub978 message \ud0c0\uc785\uc744 \uc774\uc6a9\ud574\uc11c \uad6c\uc870\ub97c \uc815\uc758\ud558\ub294 \uac83\ub3c4 \uac00\ub2a5\ud568<\/li>\n\n\n\n<li>&#8221; = 1&#8243;, &#8221; = 2&#8243;\uc640 \uac19\uc774 \ud45c\uc2dc\ub41c \uac83\uc740 \ud544\ub4dc\ub97c binary \uc778\ucf54\ub529 \ud560 \ub54c unique\ud55c tag\ub85c \ud65c\uc6a9\ud55c\ub2e4. \ucc38\uace0\ub85c tag\ubc88\ud638\uac00 1~15\uae4c\uc9c0\ub294 \uadf8 \uc774\uc0c1(16\uc774\uc0c1) \uc778\ucf54\ub529\ud560 \ub54c \ubcf4\ub2e4 1\ubc14\uc774\ud2b8 \uc801\uac8c \uc0ac\uc6a9\ud558\ubbc0\ub85c \ud6a8\uc728\uc801\uc774\ub2e4. <\/li>\n\n\n\n<li>\ud544\ub4dc Modifiers\n<ul class=\"wp-block-list\">\n<li><strong>optional<\/strong> \ud544\ub4dc \uac12\uc744 \ubc18\ub4dc\uc2dc \uc124\uc815\ud574\uc57c \ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4, \ub9cc\uc57d \uc0dd\ub7b5\ud558\uba74 default\uac12\uc774 \uc0ac\uc6a9\ub428(\uc22b\uc790\uc77c \uacbd\uc6b0 0, String\uc77c \uacbd\uc6b0 \uacf5\ubc31, boolean\uc77c \uacbd\uc6b0 false) <\/li>\n\n\n\n<li><strong>repeated<\/strong> \uc21c\uc11c\uac00 \ubcf4\uc7a5\ub418\uba70 \uac00\ubcc0 \ud69f\uc218\ub9cc\ud07c \ubc18\ubcf5\ub428(0\ub3c4 \uac00\ub2a5)<\/li>\n\n\n\n<li><strong>required<\/strong> \ud544\uc218\ub85c \uac12\uc744 \uc9c0\uc815\ud574\uc57c \ud568. \ub9cc\uc57d \uac12\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc744 \uacbd\uc6b0 Runtime\uc2dc \uba54\uc2dc\uc9c0\ub97c \ub9cc\ub4e4\ub824\uace0 \ud560 \ub54c &#8220;RuntimeException&#8221;\uc774 \ubc1c\uc0dd\ud558\uba70, binary\ub97c \ud30c\uc2f1\ud560 \uacbd\uc6b0\uc5d0\ub294 &#8220;IOException&#8221;\uc774 \ubc1c\uc0dd\ud568<br>\uc911\uc694: required\ub85c \uc9c0\uc815\ud558\uba74 \uc774\ud6c4 \ubcc0\uacbd\uc774 \uc5b4\ub824\uc6b0\ubbc0\ub85c \ub370\uc774\ud130\uc758 \ubcc0\uacbd \uac00\ub2a5\uc131, \ud655\uc7a5\uc131\uc744 \uc798 \uace0\ub824\ud574\uc11c \uc124\uc815\ud574\uc57c \ud568<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"> Protocol Buffer \ucef4\ud30c\uc77c<\/h3>\n\n\n\n<p>\uc774\uc81c .proto\ud30c\uc77c\uc744 \uc815\uc758 \ud588\uc73c\ubbc0\ub85c \uc774 \ud30c\uc77c\uc744 \uc774\uc6a9\ud558\uc5ec Compile\ud558\uba74 java\ud30c\uc77c\uc774 \uac01\uac01 \uc0dd\uc131\ub41c\ub2e4. \uc774\ub807\uac8c \uc0dd\uc131\ub41c java\ud074\ub798\uc2a4\ub85c  AddressBook \uba54\uc2dc\uc9c0\ub97c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4. \ucef4\ud30c\uc77c\uc740 \uc544\ub798\uc640 \uac19\uc774 \uc2e4\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR\/addressbook.proto<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>-I=$SRC_DIR<\/strong>: .proto\ud30c\uc77c\uc774 \uc788\ub294 \ub514\ub809\ud130\ub9ac\ub97c \uc9c0\uc815\ud55c\ub2e4($SRC_DIR). \ubcf5\uc218\uac1c\uc758 \ub514\ub809\ud130\ub9ac\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li><strong>-java_out=$DST_DIR<\/strong>: \uc0dd\uc131\ub420 java\ud30c\uc77c\uc774 \uc704\uce58\ud560 \ub514\ub809\ud130\ub9ac\ub97c \uc9c0\uc815\ud55c\ub2e4. \ud574\ub2f9 \ub514\ub809\ud130\ub9ac \ud558\uc704\uc5d0 \ud328\ud0a4\uc9c0 \ud3f4\ub354\uac00 \uc0dd\uc131\ub41c\ub2e4.<\/li>\n\n\n\n<li><strong>$SRC_DIR\/addressbook.proto<\/strong>: \ucef4\ud30c\uc77c \ud560 .proto\ud30c\uc77c\uc744 \uc9c0\uc815\ud55c\ub2e4. -I \uc635\uc158\uc73c\ub85c \ub514\ub809\ud130\ub9ac\ub97c \uc124\uc815\ud558\uace0 \ud574\ub2f9 \ub9ac\ud14d\ud130\ub9ac\uc5d0 .proto\ud30c\uc77c \uc788\ub2e4\uba74 .proto\ud30c\uc77c \uc774\ub984\ub9cc \uba85\uc2dc\ud558\uba74 \ub41c\ub2e4.(\ub514\ub809\ud130\ub9ac\uba85 \uc0dd\ub7b5)<\/li>\n<\/ul>\n\n\n\n<p>Protocol Buffer API\ub97c \ud65c\uc6a9\ud55c \uba54\uc2dc\uc9c0 \uc0dd\uc131\uacfc \uad00\ub828 API\uc5d0 \ub300\ud55c \uc880 \ub354 \uc0c1\uc138\ud55c \uc124\uba85\uc740 <a href=\"https:\/\/protobuf.dev\/getting-started\/javatutorial\/#protobuf-api\"><strong>\uc5ec\uae30<\/strong><\/a>\ub97c \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Message \uc791\uc131<\/h2>\n\n\n\n<p>\uc774\uc81c \ucef4\ud30c\uc77c\uc744 \ud1b5\ud574 \uc0dd\uc131\ub41c Java \ud074\ub798\uc2a4\ub97c \ud65c\uc6a9\ud558\uc5ec \uba54\uc2dc\uc9c0\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uc790.  \uc804\uccb4 \uacfc\uc815\uc740 \ud06c\uac8c \ub450 \ub2e8\uacc4\ub85c \ub098\ub20c \uc218 \uc788\ub2e4. \uba3c\uc800, \uc0dd\uc131\ub41c \ud074\ub798\uc2a4\ub97c \uc774\uc6a9\ud558\uc5ec \uba54\uc2dc\uc9c0 \uac1d\uccb4\ub97c \ub9cc\ub4dc\ub294 \ubd80\ubd84\uc774\uace0, \ub2e4\uc74c\uc73c\ub85c \uc0dd\uc131\ub41c \uba54\uc9c0\uc9c0\ub97c OutputStream\uc73c\ub85c write\ud558\ub294 \ubd80\ubd84\uc73c\ub85c \ub098\ub208\ub2e4.<\/p>\n\n\n\n<p>\uc544\ub798 \uc608\uc81c\ub294 \ud30c\uc77c\uc5d0\uc11c binary stream\uc744 \uc77d\uc5b4\uc640 Protobuf Message\uac1d\uccb4\ub97c \ub9cc\ub4e4\uace0 \uc0c8\ub85c\uc6b4 \uac1d\uccb4\ub97c \ucd94\uac00\ud55c \ud6c4 \ub2e4\uc2dc \ud30c\uc77c\ub85c write\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.example.tutorial.protos.AddressBook;\nimport com.example.tutorial.protos.Person;\nimport java.io.BufferedReader;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.InputStreamReader;\nimport java.io.IOException;\nimport java.io.PrintStream;\n\nclass AddPerson {\n  \/\/ This function fills in a Person message based on user input.\n  static Person PromptForAddress(BufferedReader stdin,\n                                 PrintStream stdout) throws IOException {\n    Person.Builder person = Person.newBuilder();\n\n    stdout.print(\"Enter person ID: \");\n    person.setId(Integer.valueOf(stdin.readLine()));\n\n    stdout.print(\"Enter name: \");\n    person.setName(stdin.readLine());\n\n    stdout.print(\"Enter email address (blank for none): \");\n    String email = stdin.readLine();\n    if (email.length() &gt; 0) {\n      person.setEmail(email);\n    }\n\n    while (true) {\n      stdout.print(\"Enter a phone number (or leave blank to finish): \");\n      String number = stdin.readLine();\n      if (number.length() == 0) {\n        break;\n      }\n\n      Person.PhoneNumber.Builder phoneNumber =\n        Person.PhoneNumber.newBuilder().setNumber(number);\n\n      stdout.print(\"Is this a mobile, home, or work phone? \");\n      String type = stdin.readLine();\n      if (type.equals(\"mobile\")) {\n        phoneNumber.setType(Person.PhoneType.PHONE_TYPE_MOBILE);\n      } else if (type.equals(\"home\")) {\n        phoneNumber.setType(Person.PhoneType.PHONE_TYPE_HOME);\n      } else if (type.equals(\"work\")) {\n        phoneNumber.setType(Person.PhoneType.PHONE_TYPE_WORK);\n      } else {\n        stdout.println(\"Unknown phone type.  Using default.\");\n      }\n\n      person.addPhones(phoneNumber);\n    }\n\n    return person.build();\n  }\n\n  \/\/ Main function:  Reads the entire address book from a file,\n  \/\/   adds one person based on user input, then writes it back out to the same\n  \/\/   file.\n  public static void main(String&#91;] args) throws Exception {\n    if (args.length != 1) {\n      System.err.println(\"Usage:  AddPerson ADDRESS_BOOK_FILE\");\n      System.exit(-1);\n    }\n\n    AddressBook.Builder addressBook = AddressBook.newBuilder();\n\n    \/\/ Read the existing address book.\n    try {\n      addressBook.mergeFrom(new FileInputStream(args&#91;0]));\n    } catch (FileNotFoundException e) {\n      System.out.println(args&#91;0] + \": File not found.  Creating a new file.\");\n    }\n\n    \/\/ Add an address.\n    addressBook.addPerson(\n      PromptForAddress(new BufferedReader(new InputStreamReader(System.in)),\n                       System.out));\n\n    \/\/ Write the new address book back to disk.\n    FileOutputStream output = new FileOutputStream(args&#91;0]);\n    addressBook.build().writeTo(output);\n    output.close();\n  }\n} <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Message \uc77d\uae30<\/h2>\n\n\n\n<p>\uc544\ub798 \uc608\uc81c\ub294 \uc704\uc5d0\uc11c \uc791\uc131\ud588\ub358 Message\ub97c \ud30c\uc77c\ub85c \ubd80\ud130 \uc77d\uc5b4 \ud654\uba74\uc73c\ub85c \uadf8 \ub0b4\uc6a9\uc744 \ucd9c\ub825\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.example.tutorial.protos.AddressBook;\nimport com.example.tutorial.protos.Person;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.PrintStream;\n\nclass ListPeople {\n  \/\/ Iterates though all people in the AddressBook and prints info about them.\n  static void Print(AddressBook addressBook) {\n    for (Person person: addressBook.getPeopleList()) {\n      System.out.println(\"Person ID: \" + person.getId());\n      System.out.println(\"  Name: \" + person.getName());\n      if (person.hasEmail()) {\n        System.out.println(\"  E-mail address: \" + person.getEmail());\n      }\n\n      for (Person.PhoneNumber phoneNumber : person.getPhonesList()) {\n        switch (phoneNumber.getType()) {\n          case PHONE_TYPE_MOBILE:\n            System.out.print(\"  Mobile phone #: \");\n            break;\n          case PHONE_TYPE_HOME:\n            System.out.print(\"  Home phone #: \");\n            break;\n          case PHONE_TYPE_WORK:\n            System.out.print(\"  Work phone #: \");\n            break;\n        }\n        System.out.println(phoneNumber.getNumber());\n      }\n    }\n  }\n\n  \/\/ Main function:  Reads the entire address book from a file and prints all\n  \/\/   the information inside.\n  public static void main(String&#91;] args) throws Exception {\n    if (args.length != 1) {\n      System.err.println(\"Usage:  ListPeople ADDRESS_BOOK_FILE\");\n      System.exit(-1);\n    }\n\n    \/\/ Read the existing address book.\n    AddressBook addressBook =\n      AddressBook.parseFrom(new FileInputStream(args&#91;0]));\n\n    Print(addressBook);\n  }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Eclipse\uc5d0\uc11c \uc678\ubd80 \ud234\ub85c Compiler \uba85\ub839 \ud65c\uc6a9 \ud558\uae30<\/h2>\n\n\n\n<p>\ucf58\uc194\uc744 \ud1b5\ud574 \ub9e4\ubc88 Proto Buffer Compiler \uba85\ub839\uc744 \uc0ac\uc6a9\ud558\uba74 \ubc88\uac70\ub85c\uc6b8 \uc218 \uc788\ub2e4. \uac1c\ubc1c\ud234\ub85c Eclipse\ub97c \uc0ac\uc6a9\ud560 \uacbd\uc6b0 \uc544\ub798\uc640 \uac19\uc774 \uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \uba85\ub839\uc5b4\ub97c \uc678\ubd80 \uba85\ub839\uc5b4\ub85c \ub4f1\ub85d\ud574 \ub450\uba74 \ud5a5\ud6c4 \ud65c\uc6a9\ud558\uae30\uac00 \ud3b8\ub9ac\ud558\ub2e4<\/p>\n\n\n\n<p>Run &gt; External Tools &gt; External Tools Configurations&#8230; \uba54\ub274\ub97c \uc120\ud0dd\ud558\uba74 \uc544\ub798\uc640 \uac19\uc740 \ud654\uba74\uc744 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"917\" height=\"703\" src=\"https:\/\/skanto.co.kr\/wp-content\/uploads\/2023\/12\/Screenshot-from-2023-12-18-13-59-29.png\" alt=\"\" class=\"wp-image-1010\" srcset=\"https:\/\/skanto.co.kr\/wp-content\/uploads\/2023\/12\/Screenshot-from-2023-12-18-13-59-29.png 917w, https:\/\/skanto.co.kr\/wp-content\/uploads\/2023\/12\/Screenshot-from-2023-12-18-13-59-29-300x230.png 300w, https:\/\/skanto.co.kr\/wp-content\/uploads\/2023\/12\/Screenshot-from-2023-12-18-13-59-29-768x589.png 768w, https:\/\/skanto.co.kr\/wp-content\/uploads\/2023\/12\/Screenshot-from-2023-12-18-13-59-29-352x270.png 352w\" sizes=\"auto, (max-width: 917px) 100vw, 917px\" \/><\/figure>\n\n\n\n<p>\uc5ec\uae30\uc11c Compiler\uba85\ub839\uc5b4(Locations) \uc704\uce58\uc640 \ud604\uc7ac \ub514\ub809\ud130\ub9ac(Working Directory) \uadf8\ub9ac\uace0 \uc704\uc5d0\uc11c \uc124\uba85\ud588\ub358 Compiler \uc635\uc158\uc744 Arguments \ub780\uc5d0 \ub4f1\ub85d\ud574 \uc8fc\uba74 \ub41c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ub2e4\ub978 \uc2dc\uc2a4\ud15c\uacfc \ub370\uc774\ud130\ub97c \uc8fc\uace0 \ubc1b\ub294\ub2e4\uac70\ub098 \uc6a9\ub7c9\uc774 \ud070 \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc800\uc7a5\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub370\uc774\ud130\ub97c \uc555\ucd95\ud558\uac70\ub098 \ub2e4\ub978 \ud6a8\uc728\uc801\uc778 \ubc29\ubc95\uc774 \ud544\uc694\ud558\ub2e4. \uc778\ud130\ub137\uc744 \ud1b5\ud574 \ub370\uc774\ud130\ub97c \ud6a8\uc728\uc801\uc73c\ub85c \uc8fc\uace0 \ubc1b\uae30 \uc704\ud574 \ub9ce\uc740 \uc0ac\ub78c\ub4e4\uc774 \uace0\ubbfc\uc744 \ud574 \uc654\uace0 \uadf8 \uc911 \uc694\uc998 Defacto Standard\ub85c \uc0ac\uc6a9\ub418\ub294 \uac83\uc774 Google\uc5d0\uc11c \ub9cc\ub4e0 Protocol Buffer(a.k.a Protobuf)\ub77c\ub294 \uac83\uc774\ub2e4. Protocol Buffer\ub294 language \uc911\ub9bd\uc801\uc774\uace0 \ub370\uc774\ud130\ub97c Serialize\ud560 \ub54c \uc27d\uac8c \ud655\uc7a5 \uac00\ub2a5\ud55c \uad6c\uc870\ub97c \uc81c\uacf5\ud55c\ub2e4\ub294 \ud2b9\uc9d5\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4. Protocol Buffer\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574\uc11c\ub294 \uba87\uac00\uc9c0 \uc124\uce58\uac00 \ud544\uc694\ud558\ub2e4. \uba3c\uc800 Protocol Compiler(\ud655\uc7a5\uc790 .proto \ud30c\uc77c\uc744 \ucef4\ud30c\uc77c\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\ub428)\uc640 \uc0ac\uc6a9\ud558\uace0\uc790 \ud558\ub294 language\uc5d0 \ub9de\ub294 Protobuf Runtime\uc744 \uba3c\uc800 \uc124\uce58\ud574\uc57c&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/skanto.co.kr\/?p=994\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[14],"tags":[93],"class_list":["post-994","post","type-post","status-publish","format-standard","hentry","category-sw-development","tag-protobuf"],"_links":{"self":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/994","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=994"}],"version-history":[{"count":21,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/994\/revisions"}],"predecessor-version":[{"id":1017,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/994\/revisions\/1017"}],"wp:attachment":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=994"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=994"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=994"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}