PageSourceSearch

https://clud.me/assets/js/f81c1134.88f03347.js

js clud.me collected 2026-10-09 04:16:32 UTC 415,376 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkclud_blog=self.webpackChunkclud_blog||[]).push([["6607"],{7735(n){n.exports=JSON.parse('{"archive":{"blogPosts":[{"id":"mikro-orm","metadata":{"permalink":"/blog/mikro-orm","source":"@site/blog/2025-04-20-mikro-orm/index.md","title":"mikro-orm \uC54C\uC544\uBCF4\uAE30","description":"MikroORM\uC740 Node.js \uD658\uACBD\uC5D0\uC11C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0C1\uD638\uC791\uC6A9\uC744 \uAC04\uC18C\uD654\uD558\uB294 TypeScript ORM \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC785\uB2C8\uB2E4.","date":"2025-04-20T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":8.54,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"mikro-orm \uC54C\uC544\uBCF4\uAE30","slug":"mikro-orm","date":"2025-04-20T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"MikroORM\uC740 Node.js \uD658\uACBD\uC5D0\uC11C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0C1\uD638\uC791\uC6A9\uC744 \uAC04\uC18C\uD654\uD558\uB294 TypeScript ORM \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC785\uB2C8\uB2E4."},"unlisted":false,"nextItem":{"title":"\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38","permalink":"/blog/ddd-introduction"}},"content":"\x3c!-- truncate --\x3e\\n\\n## 1. MikroORM \uAC1C\uC694\\n\\nMikroORM\uC740 Node.js \uD658\uACBD\uC5D0\uC11C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0C1\uD638\uC791\uC6A9\uC744 \uAC04\uC18C\uD654\uD558\uB294 TypeScript ORM \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC785\uB2C8\uB2E4.\\n\\n\uB370\uC774\uD130 \uB9E4\uD37C, Unit of Work, Identity Map \uD328\uD134\uC744 \uAE30\uBC18\uC73C\uB85C \uC124\uACC4\uB418\uC5C8\uC73C\uBA70, MongoDB, MySQL, MariaDB, PostgreSQL, SQLite \uB4F1 \uB2E4\uC591\uD55C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uB97C \uC9C0\uC6D0\uD569\uB2C8\uB2E4.\\n\\n### \uC8FC\uC694 \uAE30\uB2A5\\n\\n- \uAE54\uB054\uD55C \uC5D4\uD2F0\uD2F0 \uC815\uC758\\n- Identity Map\uACFC \uC5D4\uD2F0\uD2F0 \uCC38\uC870\\n- \uC5D4\uD2F0\uD2F0 \uC0DD\uC131\uC790 \uD65C\uC6A9\\n- \uAD00\uACC4 \uBAA8\uB378\uB9C1\uACFC \uCEEC\uB809\uC158\\n- Unit of Work\\n- \uD2B8\uB79C\uC7AD\uC158 \uC9C0\uC6D0\\n- \uCE90\uC2A4\uCF00\uC774\uB529 \uC601\uC18D\uC131\uACFC \uC0AD\uC81C\\n- \uD544\uD130\uC640 \uCFFC\uB9AC \uBE4C\uB354\\n- populate\uB97C \uD1B5\uD55C \uC911\uCCA9 \uAD6C\uC870 \uB85C\uB529\\n- \uC2A4\uD0A4\uB9C8\uC640 \uC5D4\uD2F0\uD2F0 \uC0DD\uC131\uAE30\\n\\n## 2. Unit of Work \uD328\uD134\\n\\n:::info\\n\\n[Unit of Work pattern in MikroORM - TypeScript Data Management with MikroORM and ORM Patterns](https://app.studyraid.com/en/read/11519/361845/unit-of-work-pattern-in-mikroorm)\\n\\n:::\\n\\nUnit of Work \uD328\uD134\uC740 MikroORM\uC758 \uD575\uC2EC \uC124\uACC4 \uD328\uD134\uC73C\uB85C\uC11C, \uC5D4\uD2F0\uD2F0\uC758 \uBCC0\uACBD\uC0AC\uD56D(\uC0BD\uC785, \uC218\uC815, \uC0AD\uC81C)\uC744 \uAD00\uB9AC\uD558\uACE0 \uB2E8\uC77C \uD2B8\uB79C\uC7AD\uC158\uC5D0\uC11C \uC601\uC18D\uD654\uB97C \uC870\uC815\uD569\uB2C8\uB2E4.\\n\\n### \uD575\uC2EC \uAC1C\uB150\\n\\n- Unit of Work\uB294 \uB2E4\uC74C \uC138 \uAC00\uC9C0 \uC8FC\uC694 \uC5D4\uD2F0\uD2F0 \uC0C1\uD0DC\uB97C \uCD94\uC801\\n  - \uC0C8\uB85C\uC6B4 \uC5D4\uD2F0\uD2F0 (\uC0BD\uC785 \uC608\uC815)\\n  - \uC218\uC815\uB41C \uC5D4\uD2F0\uD2F0 (\uC5C5\uB370\uC774\uD2B8 \uC608\uC815)\\n  - \uC81C\uAC70\uB41C \uC5D4\uD2F0\uD2F0 (\uC0AD\uC81C \uC608\uC815)\\n\\n\uC774\uB7EC\uD55C \uBCC0\uACBD\uC0AC\uD56D\uC740 \uBE44\uC988\uB2C8\uC2A4 \uD2B8\uB79C\uC7AD\uC158 \uC911\uC5D0 \uC218\uC9D1\uB418\uBA70, Unit of Work \uCEE4\uBC0B \uC2DC \uC6D0\uC790\uC801\uC73C\uB85C \uC601\uC18D\uD654\uB429\uB2C8\uB2E4. \uC774\uB294 \uB370\uC774\uD130 \uC77C\uAD00\uC131\uC744 \uBCF4\uC7A5\uD558\uACE0 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC791\uC5C5\uC744 \uCD5C\uC18C\uD654\uD569\uB2C8\uB2E4.\\n\\n### \uBCC0\uACBD \uAC10\uC9C0 \uBA54\uCEE4\uB2C8\uC998\\n\\n:::info\\n\\n[Unit of Work and Transactions](https://mikro-orm.github.io/docs/v3/unit-of-work/)\\n\\n:::\\n\\nMikroORM\uC740 \uC815\uAD50\uD55C \uBCC0\uACBD \uAC10\uC9C0 \uBA54\uCEE4\uB2C8\uC998\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uC5D4\uD2F0\uD2F0\uB97C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uB85C\uB4DC\uD560 \uB54C \uD574\uB2F9 \uC2DC\uC810\uC758 \uC2A4\uB0C5\uC0F7\uC744 \uC800\uC7A5\uD558\uACE0, flush() \uD638\uCD9C \uC2DC \uD604\uC7AC \uC0C1\uD0DC\uC640 \uBE44\uAD50\uD558\uC5EC \uBCC0\uACBD\uC0AC\uD56D\uC744 \uD30C\uC545\uD569\uB2C8\uB2E4.\\n\\n```ts\\n// \uBCC0\uACBD \uAC10\uC9C0 \uC608\uC2DC\\nconst article = await em.findOne(Article, 1);\\narticle.content = \'\uC5C5\uB370\uC774\uD2B8\uB41C \uB0B4\uC6A9\';\\nawait em.flush(); // \uBCC0\uACBD\uB41C \uD544\uB4DC\uB9CC \uC5C5\uB370\uC774\uD2B8\\n```\\n\\n## 3. \uC601\uC18D\uD654(Persist) \uC774\uD574\uD558\uAE30\\n\\n:::info\\n\\n[Are entities created with em.create managed and persisted?](https://stackoverflow.com/questions/66386900/are-entities-created-with-em-create-managed-and-persisted)\\n\\n:::\\n\\n\uC601\uC18D\uD654(persist)\uB294 \uC5D4\uD2F0\uD2F0\uB97C EntityManager\uC5D0 \uC758\uD574 \uAD00\uB9AC\uB418\uB3C4\uB85D \uB4F1\uB85D\uD558\uB294 \uACFC\uC815\uC785\uB2C8\uB2E4. persist \uD638\uCD9C\uC740 \uC989\uC2DC \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC4F0\uAE30\uB97C \uC218\uD589\uD558\uC9C0 \uC54A\uC73C\uBA70, \uB300\uC2E0 \uC5D4\uD2F0\uD2F0\uB97C \uCD94\uC801\uD558\uACE0 \uD6C4\uC18D flush \uD638\uCD9C \uC2DC \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uD558\uB3C4\uB85D \uD45C\uC2DC\uD569\uB2C8\uB2E4\\n\\n```ts\\nconst user = new User(\'John Doe\');\\nem.persist(user); // \uAD00\uB9AC \uC0C1\uD0DC\uB85C \uD45C\uC2DC\uB428\\n```\\n\\npersist \uBA54\uC11C\uB4DC\uB294 \uC5D4\uD2F0\uD2F0\uAC00 \uAD00\uB9AC \uC0C1\uD0DC\uB85C \uB4E4\uC5B4\uAC00\uB294 \uAC83\uC744 \uC758\uBBF8\uD558\uBA70, \uC774 \uC0C1\uD0DC\uC5D0\uC11C MikroORM\uC740 \uC5D4\uD2F0\uD2F0\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uCD94\uC801\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n\\n## 4. Flush \uC791\uC5C5 \uC774\uD574\uD558\uAE30\\n\\nflush\uB294 \uAD00\uB9AC\uB418\uB294 \uBAA8\uB4E0 \uC5D4\uD2F0\uD2F0\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uACC4\uC0B0\uD558\uACE0 \uC774\uB97C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC801\uC6A9\uD558\uB294 \uACFC\uC815\uC785\uB2C8\uB2E4. em.flush()\uB97C \uD638\uCD9C\uD558\uBA74 \uBAA8\uB4E0 \uACC4\uC0B0\uB41C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uCFFC\uB9AC\uB429\uB2C8\uB2E4(\uD574\uB2F9 \uB4DC\uB77C\uC774\uBC84\uAC00 \uC9C0\uC6D0\uD558\uB294 \uACBD\uC6B0)\\n\\n```ts\\nconst user = await em.findOne(User, 1);\\nuser.email = \'[email protected]\';\\nconst car = new Car();\\nuser.cars.add(car);\\n// \uC591\uBC29\uD5A5 \uCE90\uC2A4\uCF00\uC774\uB529 \uB355\uBD84\uC5D0 user \uC5D4\uD2F0\uD2F0\uB9CC \uC601\uC18D\uD654\uD558\uBA74 \uB428\\n// flush\uB294 \uD2B8\uB79C\uC7AD\uC158\uC744 \uC0DD\uC131\uD558\uACE0, \uC0C8 car\uB97C \uC0BD\uC785\uD558\uACE0, user\uC758 \uC774\uBA54\uC77C\uC744 \uC5C5\uB370\uC774\uD2B8\uD568\\nawait em.flush();\\n```\\n\\nflush\uB294 \uBCC0\uACBD\uB41C \uC5D4\uD2F0\uD2F0\uC640 \uC18D\uC131\uB9CC\uC744 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uCFFC\uB9AC\uD558\uC5EC \uC131\uB2A5\uC744 \uCD5C\uC801\uD654\uD569\uB2C8\uB2E4. \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uD2B8\uB79C\uC7AD\uC158\uB3C4 \uC2DC\uC791\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4\\n\\n## 5. Persist \uC640 Flush \uC0AC\uC6A9 \uC2DC\uC810\\n\\n### Persist \uC0AC\uC6A9 \uC2DC\uC810\\n\\n- \uC0D
1D\uC131\uC790\uB85C \uC0C8 \uC5D4\uD2F0\uD2F0\uB97C \uC0DD\uC131\uD588\uC744 \uB54C\\n\\n  ```ts\\n  const entity = new Entity();\\n  Object.assign(entity, {});\\n  em.persiste(entity); // \uC218\uB3D9 \uD638\uCD9C \uD544\uC694\\n  ```\\n- \uC5D4\uD2F0\uD2F0\uB97C EntityManager\uC5D0 \uC758\uD574 \uAD00\uB9AC\uB418\uB3C4\uB85D \uD45C\uC2DC\uD558\uACE0 \uC2F6\uC744 \uB54C\\n  - persist()\uB294 \uC0C8\uB85C\uC6B4 \uC5D4\uD2F0\uD2F0\uB97C Identity Map\uC5D0 \uB4F1\uB85D\uD558\uAE30 \uC704\uD55C \uBA54\uC11C\uB4DC\uC785\uB2C8\uB2E4.\\n  - DB\uC5D0\uC11C \uC870\uD68C\uB41C \uAE30\uC874 \uC5D4\uD2F0\uD2F0\uB294 \uC774\uBBF8 Managed \uC0C1\uD0DC\uC774\uBBC0\uB85C persist() \uD638\uCD9C\uC774 \uD544\uC694 \uC5C6\uC2B5\uB2C8\uB2E4.\\n- \uC5EC\uB7EC \uC5D4\uD2F0\uD2F0\uB97C \uC218\uC815\uD558\uACE0 \uC774\uD6C4\uC5D0 \uD55C \uBC88\uC5D0 \uD50C\uB7EC\uC2DC\uD558\uACE0 \uC2F6\uC744 \uB54C\\n\\n### Flush \uC0AC\uC6A9 \uC2DC\uC810\\n\\n- \uBAA8\uB4E0 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC801\uC6A9\uD558\uACE0 \uC2F6\uC744 \uB54C\\n- \uD2B8\uB79C\uC7AD\uC158 \uACBD\uACC4\uB97C \uC81C\uC5B4\uD558\uACE0 \uC2F6\uC744 \uB54C\\n- \uBCC0\uACBD\uC0AC\uD56D\uB4E4\uC774 \uC900\uBE44\uB418\uC5B4 \uB2E8\uC77C \uD2B8\uB79C\uC7AD\uC158\uC73C\uB85C \uC2E4\uD589\uD558\uACE0 \uC2F6\uC744 \uB54C\\n\\n```ts\\n// \uC5EC\uB7EC \uC5D4\uD2F0\uD2F0 \uCC98\uB9AC\uB97C \uC704\uD55C \uD328\uD134\\nconst users = [];\\nfor (let i = 0; i < 1000; i++) {\\n  const user = new User(`user${i}@example.com`);\\n  users.push(user);\\n  em.persist(user);\\n}\\n// \uBAA8\uB4E0 1000\uBA85\uC758 \uC0AC\uC6A9\uC790\uAC00 \uD6A8\uC728\uC801\uC778 \uBC30\uCE58\uB85C \uC0BD\uC785\uB428\\nawait em.flush();\\n```\\n\\n\uC774 \uD328\uD134\uC740 \uD2B8\uB79C\uC7AD\uC158 \uACBD\uACC4\uB97C \uC81C\uC5B4\uD558\uB294 \uB370 \uC720\uC6A9\uD558\uBA70, em.persist()\uB97C \uD638\uCD9C\uD558\uC5EC \uBCC0\uACBD\uC0AC\uD56D\uC744 \uD45C\uC2DC\uD558\uACE0 \uC900\uBE44\uAC00 \uB418\uBA74 flush()\uB97C \uD638\uCD9C\uD558\uC5EC \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC2E4\uD589\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n\\n## 6. EntityManager.create \uC0AC\uC6A9 \uC2DC\uC810\\n\\n:::info\\n\\n[EntityManager \\\\| API \\\\| MikroORM](https://mikro-orm.io/api/knex/class/EntityManager#create)\\n\\n[Using Entity Constructors \\\\| MikroORM](https://mikro-orm.io/docs/entity-constructors)\\n\\n- v5.5\uBD80\uD130 persistOnCreate \uC635\uC158\uC758 \uAE30\uBCF8\uAC12\uC774 true\uB85C \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\\n- em.create()\uB85C \uC0DD\uC131\uB41C \uC5D4\uD2F0\uD2F0\uB294 \uBCC4\uB3C4\uC758 em.persist() \uD638\uCD9C \uC5C6\uC774 \uC790\uB3D9\uC73C\uB85C \uAD00\uB9AC \uC0C1\uD0DC\uAC00 \uB418\uACE0 persist \uC608\uC57D(INSERT \uC608\uC815)\uB429\uB2C8\uB2E4.\\n- \uC6D0\uCE58 \uC54A\uB294 \uACBD\uC6B0, \uC635\uC158\uC73C\uB85C { persist: false }\uB97C \uC124\uC815\uD558\uAC70\uB098 \uC804\uC5ED \uC124\uC815\uC73C\uB85C persistOnCreate: false\uB97C \uBA85\uC2DC\uD574\uC57C \uD569\uB2C8\uB2E4\\n\\n:::\\n\\n> Creates new instance of given entity and populates it with given data. The entity constructor will be used unless you provide { managed: true } in the options parameter. The constructor will be given parameters based on the defined constructor of the entity. If the constructor parameter matches a property name, its value will be extracted from data. If no matching property exists, the whole data parameter will be passed. This means we can also define constructor(data: Partial&lt;T&gt;) and em.create() will pass the data into it (unless we have a property named data too).\\n>\\n> The parameters are strictly checked, you need to provide all required properties. You can use OptionalProps symbol to omit some properties from this check without making them optional. Alternatively, use partial: true in the options to disable the strict checks for required properties. This option has no effect on runtime.\\n>\\n> The newly created entity will be automatically marked for persistence via em.persist unless you disable this behavior, either locally via persist: false option, or globally via persistOnCreate ORM config option.\\n\\nEntityManager.create \uBA54\uC11C\uB4DC\uB294 \uC0C8 \uC5D4\uD2F0\uD2F0 \uC778\uC2A4\uD134\uC2A4\uB97C \uC0D
1D\uC131\uD558\uB294 \uC720\uD2F8\uB9AC\uD2F0 \uBA54\uC11C\uB4DC\uC785\uB2C8\uB2E4. \uC774\uB294 EntityFactory\uC758 \uB2E8\uCD95\uD615\uC73C\uB85C, \u2018new\u2019 \uC5F0\uC0B0\uC790\uB97C \uD1B5\uD574 \uC218\uB3D9\uC73C\uB85C \uD074\uB798\uC2A4\uB97C \uC778\uC2A4\uD134\uC2A4\uD654\uD558\uB294 \uAC83\uACFC \uC720\uC0AC\uD569\uB2C8\uB2E4\\n\\n```ts\\n// \uAE30\uBCF8 \uC778\uC2A4\uD134\uC2A4\uD654\\nconst user = new User(\'John Doe\');\\n\\n// em.create\uB97C \uD1B5\uD55C \uC778\uC2A4\uD134\uC2A4\uD654\\nconst user = em.create(User, { name: \'John Doe\', email: \'[email protected]\' });\\n\\nawait em.flush();\\n```\\n\\nem.create\uC758 \uC8FC\uC694 \uC774\uC810\uC740 \uC5D4\uD2F0\uD2F0 \uC0DD\uC131\uC790\uC640 \uD30C\uB77C\uBBF8\uD130\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD558\uACE0 \uC874\uC911\uD55C\uB2E4\uB294 \uAC83\uC785\uB2C8\uB2E4. \uC5D4\uD2F0\uD2F0 \uC18D\uC131 \uC774\uB984\uACFC \uB3D9\uC77C\uD55C \uC774\uB984\uC758 \uD30C\uB77C\uBBF8\uD130\uB97C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4\\n\\n## 7. AsyncLocalStorage\uC640 MikroORM\uC5D0\uC11C\uC758 \uB3D9\uC791\\n\\n:::info\\n\\n[Asynchronous context tracking \\\\| Node.js v23.11.0 Documentation](https://nodejs.org/api/async_context.html)\\n\\n[Identity Map and Request Context \\\\| MikroORM](https://mikro-orm.io/docs/identity-map#how-does-requestcontext-helper-work)\\n\\n[Node.js - async\\\\_hooks \uC18C\uAC1C](https://remocon33.tistory.com/707)\\n\\n:::\\n\\nAsyncLocalStorage\uB294 Node.js\uC758 \uCF54\uC5B4 \uAE30\uB2A5\uC73C\uB85C, \uBE44\uB3D9\uAE30 \uD638\uCD9C \uC804\uBC18\uC5D0 \uAC78\uCCD0 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uCD94\uC801\uD569\uB2C8\uB2E4. \uC6F9 \uC694\uCCAD\uC774\uB098 \uAE30\uD0C0 \uBE44\uB3D9\uAE30 \uC2E4\uD589 \uAE30\uAC04 \uB3D9\uC548 \uB370\uC774\uD130\uB97C \uC800\uC7A5\uD560 \uC218 \uC788\uAC8C \uD574\uC8FC\uBA70, \uB2E4\uB978 \uC5B8\uC5B4\uC758 \uC2A4\uB808\uB4DC-\uB85C\uCEEC \uC2A4\uD1A0\uB9AC\uC9C0\uC640 \uC720\uC0AC\uD569\uB2C8\uB2E4\\n\\n```ts\\nconst { AsyncLocalStorage } = require(\'node:async_hooks\');\\nconst asyncLocalStorage = new AsyncLocalStorage();\\n\\nfunction logWithId(msg) {\\n  const id = asyncLocalStorage.getStore();\\n  console.log(`${id !== undefined ? id : \'-\'}:`, msg);\\n}\\n\\n// \uC694\uCCAD \uCC98\uB9AC \uC911 ID \uC720\uC9C0\\nasyncLocalStorage.run(requestId, () => {\\n  logWithId(\'\uC2DC\uC791\');\\n  // \uBE44\uB3D9\uAE30 \uC791\uC5C5...\\n  setImmediate(() => {\\n    logWithId(\'\uC885\uB8CC\'); // \uC5EC\uC804\uD788 \uAC19\uC740 ID\uC5D0 \uC811\uADFC \uAC00\uB2A5\\n  });\\n});\\n```\\n\\nMikroORM\uC5D0\uC11C AsyncLocalStorage\uB294 RequestContext \uD5EC\uD37C\uB97C \uD1B5\uD574 \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uC774 \uD5EC\uD37C\uB294 \uC694\uCCAD \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uACA9\uB9AC\uD558\uC5EC \uAC01 \uC694\uCCAD\uB9C8\uB2E4 \uACE0\uC720\uD55C EntityManager \uC778\uC2A4\uD134\uC2A4(fork)\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uAC8C \uD569\uB2C8\uB2E4\\n\\n```ts\\n// \uBBF8\uB4E4\uC6E8\uC5B4\uC5D0\uC11C \uC694\uCCAD \uCEE8\uD14D\uC2A4\uD2B8 \uC0DD\uC131\\napp.use((req, res, next) => {\\n  RequestContext.create(orm.em, next);\\n});\\n\\napp.get(\'/\', async (req, res) => {\\n  // \uBE44\uB3D9\uAE30 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC790\uB3D9\uC73C\uB85C fork \uC0AC\uC6A9\\n  const authors = await orm.em.find(Book, {});\\n  res.json(authors);\\n});\\n```\\n\\n\uB0B4\uBD80\uC801\uC73C\uB85C EntityManager\uC758 \uBAA8\uB4E0 \uBA54\uC11C\uB4DC\uB294 \uBA3C\uC800 em.getContext()\uB97C \uD638\uCD9C\uD558\uC5EC \uD604\uC7AC \uCEE8\uD14D\uC2A4\uD2B8\uC758 EntityManager\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4. \uC774\uB85C\uC368 \uC694\uCCAD\uBCC4\uB85C \uB3C5\uB9BD\uB41C Identity Map\uC744 \uC720\uC9C0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n\\n## 8. MongoDB \uD2B8\uB79C\uC7AD\uC158 \uC0AC\uC6A9 \uC2DC \uC8FC\uC758\uC0AC\uD56D\\n\\n:::info\\n\\n[MongoDB Transaction Management - RastaLion.dev](https://rastalion.dev/mongodb-transaction-management/)\\n\\n[Performance Best Practices: Transactions and Read / Write Concerns \\\\| MongoDB Blog](https://www.mongodb.com/blog/post/performance-best-practices-transactions-and-read-write-concerns)\\n\\n[MongoDB Transaction](https://velog.io/@sonar0/MongoDB-Transaction)\\n\\n:::\\n\\nMongoDB\uC640 \uD568\uAED8 MikroORM\uC758 \uD2B8\uB79C\uC7AD\uC158 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD560 \uB54C\uB294 \uC5EC\uB7EC \uC81C\uC57D\uC0AC\uD56D\uC744 \uACE0\uB824\uD574\uC57C \uD569\uB2C8\uB2E4\\n\\n### \uC8FC\uC694 \uC81C\uC57D\uC0AC\uD56D\\n\\n1. \uB808\uD50C\uB9AC\uCE74 \uC14B \uD544\uC694: MongoDB\uC5D0\uC11C \uD2B8\uB79C\uC7AD\uC158\uC744 \uC0AC\uC6A9\uD558\uB824\uBA74 \uB808\uD50C\uB9AC\uCE74 \uC14B \uAD6C\uC131\uC774 \uD544\uC694\uD569\uB2C8\uB2E4\\n\\n   ```ts\\n   const orm = await MikroORM.init({\\n     entities: [Author, Book, ...],\\n     clientUrl: \'mongodb://localhost:27017,localhost:27018,localhost:27019/my-db-name?replicaSet=rs0\',\\n     implicitTransactions: true, // \uAE30\uBCF8\uAC12\uC740 false\\n   });\\n   ```\\n1. \uC2DC\uAC04 \uC81C\uD55C: MongoDB\uC758 \uAE30\uBCF8 \uD2B8\uB79C\uC7AD\uC158 \uC81C\uD55C\uC740 60\uCD08\uC774\uBA70, \uC774\uB97C \uCD08\uACFC\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC911\uB2E8\uB429\uB2C8\uB2E4\\n1. \uBB38\uC11C \uC218\uC815 \uC81C\uD55C: \uBAA8\uBC94 \uC0AC\uB840\uB85C, \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C 1,000\uAC1C \uC774\uC0C1\uC758 \uBB38\uC11C\uB97C \uC218\uC815\uD558\uC9C0 \uC54A\uB294 \uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4\\n1. \uCE90\uC2DC \uC555\uB825: \uC7A5\uC2DC\uAC04 \uC2E4\uD589\uB418\uB294 \uD2B8\uB79C\uC7AD\uC158\uC740 WiredTiger \uC2A4\uD1A0\uB9AC\uC9C0 \uC5D4\uC9C4 \uCE90\uC2DC\uC5D0 \uB192\uC740 \uC555\uB825\uC744 \uC904 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n1. \uB2E4\uC911 \uC0E4\uB4DC \uD2B8\uB79C\uC7AD\uC158: \uC5EC\uB7EC \uC0E4\uB4DC\uC5D0 \uC601\uD5A5\uC744 \uBBF8\uCE58\uB294 \uD2B8\uB79C\uC7AD\uC158\uC740 \uB124\uD2B8\uC6CC\uD06C\uB97C \uD1B5\uD574 \uC791\uC5C5\uC774 \uC870\uC815\uB418\uC5B4\uC57C \uD558\uBBC0\uB85C \uB354 \uB9CE\uC740 \uC131\uB2A5 \uBE44\uC6A9\uC774 \uBC1C\uC0DD\uD569\uB2C8\uB2E4\\n\\n### \uAD8C\uC7A5\uC0AC\uD56D\\n\\n- \uD2B8\uB79C\uC7AD\uC158\uC744 \uB354 \uC791\uC740 \uBD80\uBD84\uC73C\uB85C \uB098\uB204\uC5B4 \uC2DC\uAC04 \uC81C\uD55C \uB0B4\uC5D0 \uC2E4\uD589\uB418\uB3C4\uB85D \uD569\uB2C8\uB2E4.\\n- \uC801\uC808\uD55C \uC778\uB371\uC2F1\uC744 \uD1B5\uD574 \uCFFC\uB9AC \uC131\uB2A5\uC744 \uCD5C\uC801\uD654\uD569\uB2C8\uB2E4.\\n- \uD2B8\uB79C\uC7AD\uC158 \uC0AC\uC6A9\uC744 \uCD5C\uC18C\uD654\uD558\uAE30 \uC704\uD574 \uB370\uC774\uD130 \uC2A4\uD0A4\uB9C8 \uC124\uACC4\uB97C \uACE0\uB824\uD569\uB2C8\uB2E4.\\n- \uC2E4\uD328\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uC7AC\uC2DC\uB3C4\uD558\uB294 \uB85C\uC9C1\uC744 \uAD6C\uD604\uD569\uB2C8\uB2E4.\\n\\n## 9. Identity Map\uACFC Request Context \uC790\uC138\uD55C \uC18C\uAC1C\\n\\n:::info\\n\\n[Introducing MikroORM, TypeScript data-mapper ORM with Identity Map \\\\| MikroORM](https://mikro-orm.io/blog/introducing-mikroorm-typescript-data-mapper-orm-with-identity-map)\\n\\n:::\\n\\n### Identity Map\\n\\nIdentity Map\uC740 MikroORM\uC774 \uAC1D\uCCB4\uB97C \uCD94\uC801\uD558\uB294 \uD328\uD134\uC785\uB2C8\uB2E4. \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uC5D4\uD2F0\uD2F0\uB97C \uAC00\uC838\uC62C \uB54C\uB9C8\uB2E4, MikroORM\uC740 \uD574\uB2F9 \uC5D4\uD2F0\uD2F0\uC758 \uCC38\uC870\uB97C UnitOfWork \uB0B4\uC5D0 \uC720\uC9C0\uD569\uB2C8\uB2E4\\n\\n### \uC8FC\uC694 \uC774\uC810\\n\\n- \uC5D4\uD2F0\uD2F0 \uC720\uC77C\uC131: \uB3D9\uC77C\uD55C ID\uB97C \uAC00\uC9C4 \uC5D4\uD2F0\uD2F0\uB97C \uC5EC\uB7EC \uBC88 \uC694\uCCAD\uD574\uB3C4 \uD56D\uC0C1 \uAC19\uC740 \uC778\uC2A4\uD134\uC2A4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4\\n\\n  ```ts\\n  const jon1 = await authorRepository.findOne(1);\\n  const jon2 = await authorRepository.findOne(1);\\n  console.log(jon1 === jon2); // true\\n  ```\\n- \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD638\uCD9C \uCD5C\uC801\uD654: \uC774\uBBF8 \uB85C\uB4DC\uB41C \uC5D4\uD2F0\uD2F0\uB97C \uB2E4\uC2DC \uC694\uCCAD\uD560 \uACBD\uC6B0, MikroORM\uC740 Identity Map\uC744 \uBA3C\uC800 \uD655\uC778\uD558\uACE0 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC811\uADFC\uC744 \uAC74\uB108\uB701\uB2C8\uB2E4\\n- \uBCC0\uACBD \uAC10\uC9C0: em.flush() \uD638\uCD9C \uC2DC, MikroORM\uC740 Identity Map\uC744 \uD1B5\uD574 \uD604\uC7AC \uAD00\uB9AC\uB418\uB294 \uBAA8\uB4E0 \uC5D4\uD2F0\uD2F0\uB97C \uD655\uC778\uD558\uACE0 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uACC4\uC0B0\uD569\uB2C8\uB2E4\\n\\n### Identity Map \uBCD1\uD569 \uBA54\uCEE4\uB2C8\uC998\\n\\n1. DB\uC5D0\uC11C \uC870\uD68C\uD55C \uB370\uC774\uD130\uC640 Identity Map\uC758 \uC5D4\uD2F0\uD2F0\uB97C \uBE44\uAD50\\n1. \uB3D9\uC77C PK\uAC00 \uC874\uC7AC\uD560 \uACBD\uC6B0:\\n   1. Identity Map\uC758 \uBCC0\uACBD \uC0AC\uD56D \uC6B0\uC120 \uC801\uC6A9\\n   1. DB \uB370\uC774\uD130\uB294 \uBB34\uC2DC (\uB2E8, refresh: true \uC635\uC158 \uC0AC\uC6A9 \uC2DC \uB36E\uC5B4\uC500)\\n      1. \uB3D9\uC77C PK\uC758 \uC5D4\uD2F0\uD2F0\uAC00 \uC774\uBBF8 Identity Map\uC5D0 \uC874\uC7AC\uD560 \uACBD\uC6B0, \uD574\uB2F9 \uC5D4\uD2F0\uD2F0\uB294 DB \uC870\uD68C \uB370\uC774\uD130\uB97C \uD1B5\uD574 \uB36E\uC5B4\uC50C\uC6CC\uC9C0\uC9C0 \uC54A\uC74C\\n      1. \uC774\uBBF8 \uBA54\uBAA8\uB9AC \uB0B4\uC5D0 \uC874\uC7AC\uD558\uB294 \uC5D4\uD2F0\uD2F0\uB97C \uCD5C\uC2E0 \uC0C1\uD0DC\uB85C \uAC04\uC8FC\uD558\uC5EC, DB \uC870\uD68C\uB85C \uC778\uD574 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC790\uB3D9\uC73C\uB85C \uC0AC\uB77C\uC9C0\uC9C0 \uC54A\uB3C4\uB85D \uBCF4\uD638\uD568\\n      1. refresh: true \uC635\uC158\uC744 \uD1B5\uD574 DB\uC5D0\uC11C \uAC00\uC838\uC628 \uB370\uC774\uD130\uB97C \uAC15\uC81C\uB85C \uBC18\uC601\uD560 \uC218 \uC788\uC74C\\n1. \uBCD1\uD569 \uACFC\uC815\uC5D0\uC11C flush\uAC00 \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uC74C\\n\\n```ts\\n// 1. \uC5D4\uD2F0\uD2F0 \uC218\uC815 (flush \uBBF8\uC2E4\uD589)\\nconst author = await em.findOne(Author, 1);\\nauthor.name = \'Dirty Data\';\\n\\n// 2. \uBE44-PK \uC870\uD68C \uC2E4\uD589\\nconst authors = await em.find(Author, { email: \'[email protected]\' });
1\\n\\n// 3. \uACB0\uACFC \uBD84\uC11D\\nconsole.log(em.getUnitOfWork().getScheduledCollections());\\n// \u25B6\uFE0F \uC2A4\uCF00\uC904\uB9C1\uB41C flush \uC791\uC5C5 \uC874\uC7AC \uD655\uC778 (flush\uAC00 \uC544\uC9C1 \uC548 \uB41C \uC0C1\uD0DC)\\n```\\n\\n### Request Context\\n\\nRequestContext\uB294 \uC6F9 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uAC01 \uC694\uCCAD\uB9C8\uB2E4 \uB3C5\uB9BD\uB41C Identity Map\uC744 \uC720\uC9C0\uD558\uAE30 \uC704\uD55C \uD5EC\uD37C\uC785\uB2C8\uB2E4\\n\\n```ts\\n// \uBBF8\uB4E4\uC6E8\uC5B4\uB85C \uC694\uCCAD \uCEE8\uD14D\uC2A4\uD2B8 \uC124\uC815\\napp.addHook(\'onRequest\', (request, reply, done) => {\\n  RequestContext.create(orm.em, done);\\n});\\n\\n// \uAC01 \uC694\uCCAD\uC740 \uC790\uCCB4 Identity Map\uC744 \uAC00\uC9D0\\napp.get(\'/article\', async request => {\\n  const { limit, offset } = request.query as { limit?: number; offset?: number };\\n  const [items, total] = await db.article.findAndCount({}, {\\n    limit, offset,\\n  });\\n  return { items, total };\\n});\\n```\\n\\nRequestContext\uB294 Node.js\uC758 AsyncLocalStorage API\uB97C \uC0AC\uC6A9\uD558\uC5EC \uBE44\uB3D9\uAE30 \uD638\uCD9C \uC804\uBC18\uC5D0 \uAC78\uCCD0 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4\\n\\nHTTP \uC694\uCCAD \uC678\uC5D0\uB3C4, \uD050 \uD578\uB4E4\uB7EC\uB098 \uC2A4\uCF00\uC904\uB41C \uC791\uC5C5\uACFC \uAC19\uC740 \uC0C1\uD669\uC5D0\uC11C\uB294 @CreateRequestContext() \uB370\uCF54\uB808\uC774\uD130\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n\\n```ts\\n@Injectable()\\nexport class MyService {\\n  constructor(private readonly orm: MikroORM) { }\\n\\n  @CreateRequestContext()\\n  async doSomething() {\\n    // \uBCC4\uB3C4\uC758 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC2E4\uD589\uB428\\n    // ...\\n  }\\n}\\n```\\n\\n## 10. \uC911\uCCA9\uB41C \uCEE8\uD14D\uC2A4\uD2B8 \uCC98\uB9AC\\n\\n:::info\\n\\n[Using MikroORM with NestJS framework \\\\| MikroORM](https://mikro-orm.io/docs/usage-with-nestjs)\\n\\n<https://github.com/mikro-orm/mikro-orm/issues/3338>\\n\\n:::\\n\\nMikroORM\uC5D0\uC11C \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uC911\uCCA9\uB420 \uB54C \uBC1C\uC0DD\uD560 \uC218 \uC788\uB294 \uBA87 \uAC00\uC9C0 \uC911\uC694\uD55C \uACE0\uB824\uC0AC\uD56D\uC774 \uC788\uC2B5\uB2C8\uB2E4\\n\\n### \uC8FC\uC694 \uC81C\uC57D\uC0AC\uD56D\\n\\n- \uB370\uCF54\uB808\uC774\uD130 \uC911\uCCA9 \uAE08\uC9C0: @CreateRequestContext() \uB370\uCF54\uB808\uC774\uD130\uB294 \uCD5C\uC0C1\uC704 \uBA54\uC11C\uB4DC\uC5D0\uB9CC \uC0AC\uC6A9\uD574\uC57C \uD558\uBA70, \uC911\uCCA9\uD574\uC11C \uC0AC\uC6A9\uD558\uBA74 \uC548 \uB429\uB2C8\uB2E4\\n- \uBB34\uD55C \uC7AC\uADC0 \uC704\uD5D8: \uAE30\uC874 \uCEE8\uD14D\uC2A4\uD2B8 \uB0B4\uC5D0\uC11C fork\uB97C \uC0DD\uC131\uD558\uBA74 Maximum call stack size exceeded \uC624\uB958\uAC00 \uBC1C\uC0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uB294 fork \uD568\uC218\uAC00 \uB0B4\uBD80\uC801\uC73C\uB85C getContext\uB97C \uD638\uCD9C\uD558\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4\\n\\n  ```ts\\n  // \uC774\uB7F0 \uD328\uD134\uC740 \uBB38\uC81C\uB97C \uC77C\uC73C\uD0AC \uC218 \uC788\uC74C\\n  const context = () => storage.getStore();\\n  // \uCEE8\uD14D\uC2A4\uD2B8 \uB0B4\uC5D0\uC11C fork\uB97C \uC0DD\uC131\uD558\uBA74 \uBB34\uD55C \uB8E8\uD504\uAC00 \uBC1C\uC0DD\uD560 \uC218 \uC788\uC74C\\n  ```\\n- \uBCF5\uC7A1\uD55C \uC560\uD50C\uB9AC\uCF00\uC774\uC158: \uBCF5\uC7A1\uD55C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uC5EC\uB7EC \uCEE8\uD14D\uC2A4\uD2B8\uB098 MikroORM \uC778\uC2A4\uD134\uC2A4\uAC00 \uD544\uC694\uD55C \uACBD\uC6B0, \uAE30\uBCF8 RequestContext \uC124\uC815\uC73C\uB85C \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4\\n\\n### \uD574\uACB0 \uBC29\uBC95\\n\\n- \uCEE8\uD14D\uC2A4\uD2B8 \uC678\uBD80\uC5D0\uC11C fork \uC0DD\uC131: \uCEE8\uD14D\uC2A4\uD2B8 \uC678\uBD80\uC5D0\uC11C fork\uB97C \uC0DD\uC131\uD558\uACE0 \uC800\uC7A5\uD558\uB294 \uBC29\uC2DD\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4\\n- \uCEE4\uC2A4\uD140 AsyncLocalStorage \uC778\uC2A4\uD134\uC2A4: \uC790\uCCB4 AsyncLocalStorage \uC778\uC2A4\uD134\uC2A4\uB97C \uC0D
1D\uC131\uD558\uACE0 \uCEE8\uD14D\uC2A4\uD2B8 \uC635\uC158\uC744 \uD1B5\uD574 MikroORM\uC5D0 \uC81C\uACF5\uD569\uB2C8\uB2E4\\n\\n  ```ts\\n  const storage = new AsyncLocalStorage<EntityManager>();\\n  const orm = await MikroORM.init({\\n    context: () => storage.getStore(),\\n    // ...\\n  });\\n\\n  app.use((req, res, next) => {\\n    storage.run(orm.em.fork({ useContext: true }), next);\\n  });\\n  ```\\n- \uC791\uC5C5 \uBD84\uD560: \uC11C\uB85C \uB2E4\uB978 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uD544\uC694\uB85C \uD558\uB294 \uC791\uC5C5\uC744 \uBCC4\uB3C4\uC758 \uBA54\uC11C\uB4DC\uB098 \uC11C\uBE44\uC2A4\uB85C \uBD84\uB9AC\uD569\uB2C8\uB2E4\\n\\n## \uC608\uC2DC \uCF00\uC774\uC2A4\\n\\n### \uB3D9\uC77C \uC5D4\uD2F0\uD2F0\uB97C \uD2B8\uB79C\uC7AD\uC158\uC5D0\uC11C \uCC98\uB9AC\uD55C \uACBD\uC6B0\\n\\n```ts\\n// 1. \uCD08\uAE30 \uC870\uD68C \uBC0F \uBCC0\uACBD\\nconst author1 = await authorRepository.findOne(1); // DB\uC5D0\uC11C \'\uC6D0\uBCF8\' \uAC12 \uB85C\uB4DC\\nauthor1.name = \'Wow\';  // \uBCC0\uACBD \uC0AC\uD56D \uAE30\uB85D (\uC544\uC9C1 DB \uBC18\uC601 X)\\n\\n// 2. \uD2B8\uB79C\uC7AD\uC158 \uBE14\uB85D\\nem.transactional(async () => {\\n  const author = await authorRepository.findOne(1); // Identity Map\uC5D0\uC11C \uB3D9\uC77C \uC778\uC2A4\uD134\uC2A4 \uD68D\uB4DD\\n  author.name = \'Hello\';  // \uC989\uC2DC author1\uC5D0\uB3C4 \uBC18\uC601\uB428\\n}); // \uD2B8\uB79C\uC7AD\uC158 \uC885\uB8CC \uC2DC \uC554\uC2DC\uC801 flush \uBC1C\uC0DD \u2192 DB\uC5D0 \'Hello\' \uC800\uC7A5\\n\\n// 3. \uCD9C\uB825 \uC2DC\uC810\\nconsole.log(author1.name); // \'Hello\' \uCD9C\uB825\\n\\n// 4. \uCD94\uAC00 \uBCC0\uACBD \uBC0F \uBA85\uC2DC\uC801 flush\\nauthor1.name = \'Good\';\\nawait em.flush();  // \uCD5C\uC885\uC801\uC73C\uB85C \'Good\'\uC774 DB\uC5D0 \uC800\uC7A5\\n```\\n\\n### Identity Map \uC744 fork \uD55C \uACBD\uC6B0\\n\\n```ts\\n// 1. \uCD08\uAE30 \uC5D4\uD2F0\uD2F0 \uB85C\uB4DC\\nconst author1 = await authorRepository.findOne(1);  // \uC6D0\uBCF8 Identity Map\uC5D0 \uC800\uC7A5\\nauthor1.name = \'Wow\';  // \uBCC0\uACBD \uC0AC\uD56D \uCD94\uC801 \uC2DC\uC791\\n\\n// 2. fork()\uB85C \uC0DD\uC131\uB41C \uC0C8 EntityManager\uC5D0\uC11C \uC791\uC5C5\\nem.fork().transactional(async (forkedEm) => {\\n  const author = await forkedEm.findOne(Author, 1);  // \uBD84\uB9AC\uB41C Identity Map\uC5D0\uC11C \uC0C8 \uC778\uC2A4\uD134\uC2A4 \uB85C\uB4DC\\n  author.name = \'Hello\';  // fork\uB41C \uC778\uC2A4\uD134\uC2A4\uB9CC \uC218\uC815\\n}); // \uD2B8\uB79C\uC7AD\uC158 \uC885\uB8CC \uC2DC fork\uB41C \uC778\uC2A4\uD134\uC2A4\uC758 \uBCC0\uACBD\uC0AC\uD56D(\'Hello\') DB \uBC18\uC601\\n\\n// 3. \uCD9C\uB825 \uC2DC\uC810\\nconsole.log(author1.name); // \'Wow\' \uCD9C\uB825 \u2192 \uC6D0\uBCF8 \uC778\uC2A4\uD134\uC2A4 \uC601\uD5A5 \uC5C6\uC74C\\
1n\\n// 4. \uC6D0\uBCF8 \uC778\uC2A4\uD134\uC2A4 \uCD94\uAC00 \uC218\uC815\\nauthor1.name = \'Good\';\\nawait em.flush();  // \uC6D0\uBCF8 \uC778\uC2A4\uD134\uC2A4\uC758 \'Good\'\uC774 \uCD5C\uC885 \uC800\uC7A5\\n```\\n\\n### Auto Flush (false \uC778 \uACBD\uC6B0)\\n\\n- \uAE30\uBCF8 \uB3D9\uC791\\n  - PK \uC870\uD68C: Identity Map \uC758 \uC5D4\uD2F0\uD2F0 \uC989\uC2DC \uBC18\uD658\\n  - \uBE44-PK \uC870\uD68C: DB \uCFFC\uB9AC \uC2E4\uD589 \u2192 \uACB0\uACFC\uB97C Identity Map \uACFC \uBCD1\uD569\\n\\n```ts\\nconst author = await em.findOne(Author, 1); // PK \uC870\uD68C \u2192 Identity Map \uC0AC\uC6A9\\nauthor.name = \'Changed\'; // \uBCC0\uACBD \uC0AC\uD56D \uAE30\uB85D (\uC544\uC9C1 flush \uC548 \uB428)\\n\\n// \uBE44-PK \uC870\uAC74\uC73C\uB85C \uC870\uD68C\\nconst authors = await em.find(Author, { name: \'Changed\' });\\n// 1. DB \uCFFC\uB9AC \uC2E4\uD589 (\uBCC0\uACBD \uC804 \uB370\uC774\uD130 \uC870\uD68C)\\n// 2. Identity Map\uACFC \uBCD1\uD569 \u2192 author \uC778\uC2A4\uD134\uC2A4\uC758 \uBCC0\uACBD \uC0AC\uD56D(\'Changed\')\uC774 \uC6B0\uC120 \uC801\uC6A9\\n// 3. flush \uBC1C\uC0DD \u274C (\uB2E8\uC21C \uBCD1\uD569\uB9CC \uC218\uD589)\\n```\\n\\n### Auto Flush (true \uC778 \uACBD\uC6B0)\\n\\n```ts\\nconst orm = await MikroORM.init({\\n  autoFlush: true, // \uBAA8\uB4E0 \uCFFC\uB9AC \uC804 \uC790\uB3D9 flush\\n});\\n\\n// \uBCC0\uACBD \uC0AC\uD56D\uC774 \uC788\uC744 \uACBD\uC6B0 \uBAA8\uB4E0 \uC870\uD68C \uC804 \uC790\uB3D9 flush\\nauthor.name = \'New Value\';\\nconst result = await em.find(Author, { name: \'New Value\' }); // \uC790\uB3D9 flush \uBC1C\uC0DD \u2192 \uBCC0\uACBD \uC0AC\uD56D DB \uBC18\uC601\\n```\\n\\n### FlushMode: Auto\\n\\nMikro-ORM v5\uC5D0\uC11C FlushMode.AUTO\uAC00 \uAE30\uBCF8\uAC12\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uC5B4, \uCEEC\uB809\uC158 \uC870\uD68C \uC2DC \uC790\uB3D9 flush\uAC00 \uBC1C\uC0DD\uD558\uB294 \uD604\uC0C1\uC785\uB2C8\uB2E4. \uC774\uB294 ORM\uC774 \uCFFC\uB9AC \uACB0\uACFC\uC758 \uC815\uD569\uC131\uC744 \uBCF4\uC7A5\uD558\uAE30 \uC704\uD574 \uC124\uACC4\uB41C \uB3D9\uC791\uC785\uB2C8\uB2E4\\n\\n- FlushMode.AUTO \uAE30\uBCF8 \uB3D9\uC791\\n  - v5\uC5D0\uC11C\uB294 FlushMode.AUTO\uAC00 \uAE30\uBCF8\uAC12\uC73C\uB85C, \uCFFC\uB9AC\uC640 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uACB9\uCE60 \uACBD\uC6B0 \uC790\uB3D9 flush\uB97C \uD2B8\uB9AC\uAC70\uD569\uB2C8\uB2E4.\\n\\n    ```ts\\n    // \uC0C8\uB85C\uC6B4 \uC5D4\uD2F0\uD2F0 \uC0DD\uC131 \uBC0F \uC5F0\uACB0\\n    const parent = new Parent();\\n    parent.children.add(new Child()); // \uBCC0\uACBD \uC0AC\uD56D \uAE30\uB85D (flush \uC804)\\n\\n    // \uCEEC\uB809\uC158 \uC870\uD68C \uC2DC \uC790\uB3D9 flush \uBC1C\uC0DD\\n    const children = await em.find(Child, { parent }); // \uC790\uB3D9 flush!\\n    ```\\n- \uCFFC\uB9AC\uC640 \uBCC0\uACBD \uC0AC\uD56D\uC758 \uACB9\uCE68(Overlap) \uAC80\uCD9C\\n  - \uAD00\uACC4 \uD544\uB4DC \uC870\uD68C: parent.children \uCEEC\uB809\uC158\uC744 \uC870\uD68C\uD558\uBA74 \uD574\uB2F9 \uAD00\uACC4\uC640 \uC5F0\uACB0\uB41C \uBAA8\uB4E0 \uBCC0\uACBD \uC0AC\uD56D\uC774 \uAC80\uCD9C\uB429\uB2C8\uB2E4\\n  - Identity Map \uB3D9\uAE30\uD654: \uCFFC\uB9AC \uC2E4\uD589 \uC804 \uBCC0\uACBD \uC0AC\uD56D\uC774 DB\uC5D0 \uBC18\uC601\uB418\uC9C0 \uC54A\uC73C\uBA74 \uB370\uC774\uD130 \uBD88\uC77C\uCE58 \uBC1C\uC0DD \uAC00\uB2A5\uC131\uC774 \uC788\uC73C\uBBC0\uB85C ORM\uC774 \uC790\uB3D9\uC73C\uB85C flush\uB97C \uC218\uD589\uD569\uB2C8\uB2E4\\n- \uC0C1\uC138 \uB3D9\uC791 \uBA54\uCEE4\uB2C8\uC998\\n\\n  ```ts\\n  // 1. \uC2E0\uADDC \uC5D4\uD2F0\uD2F0 \uC0DD\uC131\\n  const child = new Child();\\n  parent.children.add(child); // Unit of Work\uC5D0 \uBCC0\uACBD \uC0AC\uD56D \uB4F1\uB85D\\n  // 2. \uCEEC\uB809\uC158 \uC870\uD68C \uC2DC Mikro-ORM \uB0B4\uBD80 \uB85C\uC9C1\\n  await em.find(Child, { parent: parent.id });\\n  /*\\n  - \uBCC0\uACBD \uC0AC\uD56D \uD655\uC778: parent.children\uC5D0 \uC0C8\uB85C\uC6B4 child \uC874\uC7AC\\n  - Flush \uD544\uC694\uC131 \uD310\uB2E8: \uCFFC\uB9AC \uC870\uAC74(parent.id)\uACFC \uBCC0\uACBD \uC0AC\uD56D(child.parent_id)\uC774 \uACB9\uCE68\\n  - \uC790\uB3D9 flush \uC2E4\uD589: child INSERT \uCFFC\uB9AC \uBC1C\uC0DD\\
1n  */\\n  ```\\n- \uD574\uACB0 \uBC29\uBC95\\n  - Flush Mode \uBCC0\uACBD\\n\\n    ```ts\\n    // COMMIT \uBAA8\uB4DC\uB85C \uC124\uC815 (\uD2B8\uB79C\uC7AD\uC158 \uCEE4\uBC0B \uC2DC\uC5D0\uB9CC flush)\\n    em.setFlushMode(FlushMode.COMMIT);\\n    ```\\n  - \uBA85\uC2DC\uC801 \uD2B8\uB79C\uC7AD\uC158 \uC0AC\uC6A9\\n\\n    ```text\\n    await em.transactional(async () => {\\n      parent.children.add(new Child());\\n      // \uD2B8\uB79C\uC7AD\uC158 \uB0B4 \uC870\uD68C \uC2DC flush \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uC74C\\n      const children = await em.find(Child, { parent });\\n    });\\n    ```\\n  - EntityManager \uBD84\uB9AC\\n\\n    ```ts\\n    const forkedEm = em.fork(); // \uC0C8\uB85C\uC6B4 \uCEE8\uD14D\uC2A4\uD2B8 \uC0DD\uC131\\n    forkedEm.persist(parent);\\n    parent.children.add(new Child());\\n    // fork\uB41C \uC778\uC2A4\uD134\uC2A4\uC5D0\uC11C \uC870\uD68C (\uAE30\uC874 \uBCC0\uACBD \uC0AC\uD56D\uACFC \uACA9\uB9AC)\\n    const children = await forkedEm.find(Child, { parent });\\n    ```\\n  - Cascade \uC124\uC815 \uC870\uC815\\n\\n    ```ts\\n    @OneToMany(() => Child, child => child.parent, {\\n      cascade: [], // Cascade.PERSIST \uBE44\uD65C\uC131\uD654\\n    })\\n    children = new Collection<Child>(this);\\n    ```\\n- \uC608\uBC29 \uD328\uD134\\n\\n  ```ts\\n  // 1. Flush Mode \uBA85\uC2DC\uC801 \uC124\uC815\\n  const orm = await MikroORM.init({\\n    flushMode: FlushMode.COMMIT, // \uAE30\uBCF8\uAC12 \uBCC0\uACBD\\n  });\\n\\n  // 2. \uD2B8\uB79C\uC7AD\uC158 \uBC94\uC704 \uC81C\uD55C\\n  await em.transactional(async () => {\\n    // \uC791\uC5C5 \uC218\uD589\\n  }, { flushMode: FlushMode.COMMIT });\\n\\n  // 3. \uBC30\uCE58 \uC791\uC5C5 \uC2DC \uC218\uB3D9 \uC81C\uC5B4\\n  parent.children.add(new Child());\\n  await em.flush(); // \uBA85\uC2DC\uC801 \uC2E4\uD589 \uD6C4 \uC870\uD68C\\n  const children = await em.find(Child, { parent });\\n  ```\\n\\n### em.create \uC635\uC158\\n\\n| **\uAD6C\uBD84** | **managed: true** | **persist: true** |\\n| --- | --- | --- |\\n| \uBAA9\uC801 | Identity Map \uB4F1\uB85D (\uBCC0\uACBD \uCD94\uC801) | DB \uC800\uC7A5 \uC608\uC57D (INSERT) |\\n| flush \uC601\uD5A5 | \uBCC0\uACBD \uAC10\uC9C0 O | \uBCC0\uACBD \uAC10\uC9C0 + |\\n| \uC0AC\uC6A9 \uC2DC\uB098\uB9AC\uC624 | \uAE30\uC874 \uC5D4\uD2F0\uD2F0 \uC218\uC815 \uCD94\uC801 | \uC2E0\uADDC \uC5D4\uD2F0\uD2F0 \uC0BD\uC785 |\\n| \uC8FC\uC758 |  | mikro-orm v5.5 \uC774\uC0C1\uBD80\uD130\uB294 global persistOnCreate \uC635\uC158\uC744 \uB530\uB77C\uAC00\uAE30 \uB54C\uBB38\uC5D0 \uC0AC\uC6A9\uD560 \uC77C\uC774 \uAC70\uC758 \uC5C6\uC74C |\\n\\n- managed: true \u2794 \uC0DD\uC131\uD55C \uC5D4\uD2F0\uD2F0\uB294 \uC989\uC2DC \uAD00\uB9AC \uC0C1\uD0DC\uAC00 \uB418\uC5B4 \uBCC0\uACBD\uC0AC\uD56D \uCD94\uC801\uC774 \uAC00\uB2A5\uD558\uC9C0\uB9CC, \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 INSERT \uC608\uC57D\uC740 \uD558\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC2E0\uADDC \uC5D4\uD2F0\uD2F0\uC758 \uACBD\uC6B0 \uBCC4\uB3C4\uB85C em.persist() \uD638\uCD9C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4\\n- persist: true \u2794 \uC2E0\uADDC \uC5D4\uD2F0\uD2F0 INSERT \uC608\uC57D\\n  - persist: true \uB294 \uC790\uB3D9\uC73C\uB85C managed \uC0C1\uD0DC\uB85C \uC804\uD658\\n\\n## \uACB0\uB860\\n\\nMikroORM\uC740 Node.js\uC640 TypeScript\uB97C \uC704\uD55C \uAC15\uB825\uD55C ORM\uC73C\uB85C, \uD2B9\uD788 Unit of Work\uC640 Identity Map \uD328\uD134\uC744 \uD1B5\uD574 \uC5D4\uD2F0\uD2F0 \uC0C1\uD0DC \uAD00\uB9AC\uC640 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0C1\uD638\uC791\uC6A9\uC744 \uD6A8\uC728\uC801\uC73C\uB85C \uCC98\uB9AC\uD569\uB2C8\uB2E4.\\n\\nMongoDB\uC640\uC758 \uD1B5\uD569\uC5D0\uC11C\uB3C4 \uD2B8\uB79C\uC7AD\uC158 \uC9C0\uC6D0\uC744 \uD1B5\uD574 \uB370\uC774\uD130 \uC77C\uAD00\uC131\uC744 \uC720\uC9C0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\\npersist\uC640 flush \uBA54\uCEE4\uB2C8\uC998\uC744 \uC774\uD574\uD558\uACE0 \uC801\uC808\uD788 \uD65C\uC6A9\uD558\uBA74 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC131\uB2A5\uC744 \uCD5C\uC801\uD654\uD558\uACE0 \uBCF5\uC7A1\uD55C \uBE44\uC988\uB2C8\uC2A4 \uB85C\uC9C1\uB3C4 \uD6A8\uACFC\uC801\uC73C\uB85C \uAD6C\uD604\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\\nRequestContext\uC640 AsyncLocalStorage\uB97C \uD1B5\uD55C \uCEE8\uD14D\uC2A4\uD2B8 \uAD00\uB9AC\uB294 \uC6F9 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uC694\uCCAD\uBCC4\uB85C \uB3C5\uB9BD\uB41C \uC5D4\uD2F0\uD2F0 \uAD00\uB9AC\uB97C \uAC00\uB2A5\uD558\uAC8C \uD558\uBA70, \uC774\uB97C \uD1B5\uD574 \uC548\uC815\uC801\uC774\uACE0 \uD655\uC7A5 \uAC00\uB2A5\uD55C \uC2DC\uC2A4\uD15C\uC744 \uAD6C\uCD95\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\\n\\nMongoDB \uD2B8\uB79C\uC7AD\uC158\uC758 \uC81C\uC57D\uC0AC\uD56D\uC744 \uC774\uD574\uD558\uACE0 \uC801\uC808\uD788 \uB300\uC751\uD568\uC73C\uB85C\uC368, MikroORM\uACFC MongoDB\uC758 \uC870\uD569\uC774 \uC81C\uACF5\uD558\uB294 \uBAA8\uB4E0 \uC7A5\uC810\uC744 \uCD5C\uB300\uD55C \uD65C\uC6A9\uD560 \uC218 \uC788\uC744 \uAC83\uC785\uB2C8\uB2E4."},{"id":"ddd-introduction","metadata":{"permalink":"/blog/ddd-introduction","source":"@site/blog/2022-10-01-ddd-introduction/index.md","title":"\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38","description":"\uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uAD6C\uC131\uD558\uB294 \uD328\uD134","date":"2022-10-01T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4","permalink":"/blog/tags/ddd"}],"readingTime":4.64,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38","slug":"ddd-introduction","date":"2022-10-01T00:00:00.000Z","authors":["dongmyeong"],"tags":["ddd"],"description":"\uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uAD6C\uC131\uD558\uB294 \uD328\uD134"},"unlisted":false,"prevItem":{"title":"mikro-orm \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/mikro-orm"},"nextItem":{"title":"\uC6A9\uC5B4 \uC815\uB9AC","permalink":"/blog/kotlin-glossary"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38\\n\\n:::info\\n\\n[\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38](https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=252622256) \uC744 \uBCF4\uACE0 \uAC04\uB2E8\uD558\uAC8C \uC815\uB9AC\uD55C \uB0B4\uC6A9\uC774\uB2E4.\\\\\\n\uC774 \uCC45\uC744 \uC77D\uC5B4\uBCF4\uB294\uAC83\uC744 \uCD94\uCC9C\uD55C\uB2E4.\\n\\n:::\\n\\n- \uC9C0\uC2DD \uD45C\uD604\uC744 \uC704\uD55C \uD328\uD134\\n  - \uAC12 \uAC1D\uCCB4\\n  - \uC5D4\uD2F0\uD2F0\\n  - \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uAD6C\uC131\uD558\uB294 \uD328\uD134\\n  - \uB9AC\uD3
1EC\uC9C0\uD130\uB9AC\\n  - \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\\n  - \uD329\uD1A0\uB9AC\\n- \uC9C0\uC2DD \uD45C\uD604\uC744 \uC704\uD55C \uACE0\uAE09 \uD328\uD134\\n  - \uC560\uADF8\uB9AC\uAC8C\uC774\uD2B8\\n  - \uBA85\uC138\\n\\n### \uAC12 \uAC1D\uCCB4 (Value Object)\\n\\n- \uD504\uB85C\uADF8\uB798\uBC0D \uC5B8\uC5B4\uC5D0\uB294 \uC6D0\uC2DC \uB370\uC774\uD130 \uD0C0\uC785(Primitive Type) \uC774 \uC788\uACE0, \uC774 \uD0C0\uC785\uB9CC \uC0AC\uC6A9\uD574\uC11C \uAC1C\uBC1C\uC774 \uAC00\uB2A5\uD558\uC9C0\uB9CC, \uD544\uC694\uC5D0 \uB530\uB77C\uC11C \uC9C1\uC811 \uD0C0\uC785\uC744 \uC815\uC758\uD574\uC57C \uD560 \uB54C\uAC00 \uC788\uB2E4\\n- DDD \uC5D0\uC11C\uB294 \uC6D0\uC2DC \uD0C0\uC785\uB9CC\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uACE0, \uB3C4\uBA54\uC778\uC5D0 \uB9DE\uB294 \uAC1D\uCCB4\uB85C \uC815\uC758\uD574\uC11C \uC0AC\uC6A9\uD55C\uB2E4\\n- \uAC1D\uCCB4 \uC790\uCCB4\uB97C \uD558\uB098\uC758 \uAC12\uC73C\uB85C\uC368 \uCDE8\uAE09\uD558\uAE30 \uB54C\uBB38\uC5D0 `\uAC12 \uAC1D\uCCB4` \uB77C\uACE0 \uBD80\uB978\uB2E4.\\n- \uC608\uC2DC\\n\\n  ```ts\\n  class FullName {\\n  \\tprivate firstName: string;\\n  \\tprivate lastName: string\\n\\n  \\tconstructor(firstName: string, lastName: string) {\\n  \\t\\tthis.firstName = firstName;\\n  \\t\\tthis.lastName = lastName;\\n  \\t} \\n  }\\n  ```\\n\\n#### \uC131\uC9C8\\n\\n- \uBD88\uBCC0\uC774\uB2E4\\n- \uAD50\uD658 \uAC00\uB2A5\uD558\uB2E4\\n- \uB4F1\uAC00\uC131\uC744 \uBE44\uAD50\uD560 \uC218 \uC788\uB2E4\\n\\n#### \uC7A5\uC810\\n\\n- \uD45C\uD604\uB825\uC774 \uC99D\uAC00\uB41C\uB2E4\\n- \uBB34\uACB0\uC131\uC774 \uC720\uC9C0\uB41C\uB2E4\\n- \uC798\uBABB\uB41C \uB300\uC785\uC744 \uBC29\uC9C0\uD55C\uB2E4\\n- \uB85C\uC9C1\uC774 \uD769\uC5B4\uC9C0\uB294\uAC78 \uBC29\uC9C0\uD55C\uB2E4\\n\\n#### \uC815\uB9AC\\n\\n- \uC6D0\uC2DC \uD0C0\uC785\uB9CC\uC73C\uB85C \uAC1C\uBC1C\uC744 \uD560 \uC218 \uC788\uC9C0\uB9CC, \uBC94\uC6A9\uC801\uC774\uAE30 \uB54C\uBB38\uC5D0 \uB3C4\uBA54\uC778\uC5D0 \uB9DE\uAC8C \uD45C\uD604\uD558\uAE30 \uC5B4\uB835\uB2E4\\n  - \uAC12 \uAC1D\uCCB4\uB97C \uC0AC\uC6A9\uD558\uBA74 \uC880 \uB354 \uBA85\uD655\uD558\uAC8C \uD45C\uD604\uD560 \uC218 \uC788\uB2E4\\n- \uC911\uBCF5 \uCF54\uB4DC\uB97C \uBC29\uC9C0\uD560 \uC218 \uC788\uACE0, \uC911\uC694\uD55C \uB85C\uC9C1\uC744 \uAC12 \uAC1D\uCCB4\uC5D0 \uBAA8\uC544\uB458 \uC218 \uC788\uB2E4\\n\\n---\\n\\n### \uC5D4\uD2F0\uD2F0 (Entity)\\n\\n- \uC5D4\uD2F0\uD2F0\uB294 \uB3C4\uBA54\uC778 \uBAA8\uB378\uC744 \uAD6C\uD604\uD55C \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uB97C \uC758\uBBF8\uD55C\uB2E4.\\n  - \uAC12 \uAC1D\uCCB4\uC640 \uB2EC\uB9AC \uC0DD\uC560\uC8FC\uAE30\uB97C \uAC00\uC9C0\uACE0 \uC788\uACE0, \uC2DD\uBCC4\uC790\uB97C \uAC00\uC9C0\uACE0 \uC788\uB2E4\\n  - \uC0DD\uC560\uC8FC\uAE30\uB97C \uAC16\uACE0 \uC788\uC9C0 \uC54A\uAC70\uB098, \uC0DD\uC560\uC8FC\uAE30\uAC00 \uBB34\uC758\uBBF8\uD558\uBA74 \uAC12 \uAC1D\uCCB4\uB85C \uB2E4\uB8E8\uB294\uAC83\uC774 \uC88B\uB2E4\\n- \uAC12 \uAC1D\uCCB4\uB294 \uAC12\uB9CC \uAC19\uC73C\uBA74 \uB3D9\uC77C\uD55C \uB370\uC774\uD130\uB85C \uCDE8\uAE09\uD558\uC9C0\uB9CC, \uC5D4\uD2F0\uD2F0\uB294 \uC2DD\uBCC4\uC790\uAC00 \uAC19\uC544\uC57C \uAC19\uC740 \uB370\uC774\uD130\uB85C \uCDE8\uAE09\uD55C\uB2E4\\n- \uC608\uC2DC\\n\\n  ```ts\\n  class UserId {\\n  \\tpublic value: string;\\n\\n  \\tconstructor(value: string) {\\n  \\t\\tthis.value = value;\\n  \\t}\\n  }\\n\\n  class User {\\n  \\tprivate readonly id: UserId;\\n  \\tprivate name: string;\\n\\n  \\tconstructor(id: UserId, name: string) {\\n  \\t\\tthis.id = id;\\n  \\t\\tthis.name = name;\\n  \\t}\\n  }\\n  ```\\n\\n#### \uC131\uC9C8\\n\\n- \uAC00\uBCC0\uC774\uB2E4\\n- \uC18D\uC131\uC774 \uAC19\uC544\uB3C4 \uAD6C\uBD84\uD560 \uC218 \uC788\uB2E4\\n- \uB3D9\uC77C\uC131\uC744 \uD1B5\uD574 \uAD6C\uBCC4\uB41C\uB2E4\\n\\n#### \uC815\uB9AC\\n\\n- \uB3C4\uBA54\uC778\uC5D0 \uB300\uD55C \uB0B4\uC6A9\uC774 \uD55C \uACF3\uC5D0 \uBAA8\uC5EC\uC788\uAE30 \uB54C\uBB38\uC5D0 \uB3C4\uBA54\uC778\uC744 \uC774\uD574\uD558\uB294\uB370 \uB3C4\uC6C0\uC774 \uB41C\uB2E4\\n- \uB3C4\uBA54\uC778 \uC694\uAD6C \uC0AC\uD56D\uC774 \uBCC0\uACBD\uB41C \uACBD\uC6B0 \uBC18\uC601\uD558\uAE30 \uC27D\uB2E4\\n\\n---\\n\\n### \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4 (Domain Service)\\n\\n- \uAC12 \uAC1D\uCCB4\uB098 \uC5D4\uD2F0\uD2F0\uB294 \uB3C4\uBA54\uC778\uC758 \uD589\uB3D9\uC744 \uC815\uC758\uD560 \uC218 \uC788\uC9C0\uB9CC, \uB3C4\uBA54\uC778 \uBAA8\uB378\uC774 \uC2A4\uC2A4\uB85C \uD574\uACB0\uD558\uAE30 \uBD80\uC790\uC5F0\uC2A4\uB7EC\uC6B4 \uACBD\uC6B0 \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD574\uC11C \uD574\uACB0\uD55C\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n- \uC911\uBCF5\uB41C \uC774\uBA54\uC77C\uC740 \uB4F1\uB85D\uD560 \uC218 \uC5C6\uB2E4\uB294 \uB3C4\uBA54\uC778 \uADDC\uCE59\uC774 \uC788\uC744 \uACBD\uC6B0 \uC774 \uD589\uC704 \uC790\uCCB4\uB97C \uB3C4\uBA54\uC778 \uBAA8\uB378\uC5D0 \uB2F4\uAE30\uC5D0\uB294 \uBD80\uC790\uC5F0\uC2A4\uB7FD\uB2E4\\n\\n  ```ts\\n  class User {\\n  \\texists(user: User): boolean {\\n  \\t\\t// ...\\n  \\t}\\n  }\\n\\n  const user = new User()\\n  user.exists(user)\\n  ```\\n- \uC774\uB7F0 \uACBD\uC6B0 \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB97C \uC774\uC6A9\uD558\uBA74 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uD574\uACB0\uD560 \uC218 \uC788\uB2E4\\n\\n  ```ts\\n  class UserDomainService {\\n  \\texists(user: User): boolean {\\n  \\t\\t// ...\\n  \\t}\\n  }\\n\\n  const userDomainService = new UserDomainService()\\n  const user = new User()\\n  userDomainService.exists(user);\\n  ```\\n\\n#### \uC8FC\uC758\uC0AC\uD56D\\n\\n- \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB85C \uB300\uB2E4\uC218\uC758 \uB85C\uC9C1\uB4E4\uC744 \uC791\uC131\uD560 \uC218 \uC788\uC9C0\uB9CC, \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB294 \uB3C4\uBA54\uC778 \uBAA8\uB378\uC5D0\uC11C \uCC98\uB9AC\uD558\uAE30 \uBD80\uC790\uC5F0\uC2A4\uB7EC\uC6B4 \uCC98\uB9AC\uB85C\uB9CC \uC81C\uD55C\uD574\uC11C \uC791\uC131\uD574\uC57C \uD55C\uB2E4\\n- \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB97C \uB0A8\uC6A9\uD558\uBA74 \uB370\uC774\uD130\uC640 \uD589\uC704\uAC00 \uC5EC\uB7EC\uAD70\uB370\uB85C \uD769\uC5B4\uC9C0\uAE30 \uB54C\uBB38\uC5D0 \uB3C4\uBA54\uC778 \uBAA8\uB378\uC758 \uC720\uC5F0\uC131\uC5D0 \uBB38\uC81C\uAC00 \uC0D
1D\uAE38 \uC218 \uC788\uB2E4\\n\\n  ```ts\\n  class UserDomainService {\\n  \\tchangeEmail(user: User, email: string): void {\\n  \\t\\tif (email.length <= 0) {\\n  \\t\\t\\tthrow new Error(\'\uC774\uBA54\uC77C\uC740 \uCD5C\uC18C 1\uAE00\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD55C\uB2E4.\');\\n  \\t\\t}\\n\\n  \\t\\tuser.email = email;\\n  \\t}\\n  }\\n  ```\\n- **\uAC00\uB2A5\uD55C \uB3C4\uBA54\uC778 \uBAA8\uB378\uC5D0 \uD589\uC704\uB97C \uC815\uC758\uD558\uACE0 \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4\uB294 \uD53C\uD558\uB294\uAC83\uC774 \uC88B\uB2E4**\\n\\n---\\n\\n### \uB9AC\uD3EC\uC9C0\uD130\uB9AC (Repository)\\n\\n- \uB9AC\uD3EC\uC9C0\uD130\uB9AC\uB294 \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uB97C \uC800\uC7A5\uD558\uACE0 \uBCF5\uC6D0\uD558\uB294 \uC5ED\uD560\uC744 \uB2F4\uB2F9\uD55C\uB2E4\\n- \uB9AC\uD3EC\uC9C0\uD1A0\uB9AC\uC758 \uCC45\uC784\uC740 \uAC1D\uCCB4\uC758 \uD37C\uC2DC\uC2A4\uD134\uC2DC\uAE4C\uC9C0\uC774\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n```ts\\nclass UserRepository {\\n\\tfindOne(id: UserId): User | null {\\n\\t\\t// ...\\n\\t}\\n\\n\\tfindOneByEmail(email: string): User | null {\\n\\t\\t// ...\\n\\t}\\n\\n\\tsave(user: User): void {\\n\\t\\t // ...\\n\\t}\\n}\\n\\nclass ApplicationService {\\n\\tcreateUser(email: string): User {\\n\\t\\tconst userRepository = new UserRepository()\\n\\t\\tconst user = new User(email)\\n\\t\\tif (userService.exists(user)) {\\n\\t\\t\\t// ...\\n\\t\\t}\\n\\t\\t\\n\\t\\tuserRepository.save(user)\\n\\t\\t// ...\\n\\t}\\n}\\n```\\n\\n```ts\\ninterface UserRepository {\\n\\tfind(name: UserName): User | null;\\n\\tsave(user: User): void;\\n}\\n```\\n\\n#### \uC815\uB9AC\\n\\n- ORM \uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uC5D4\uD2F0\uD2F0\uC640 \uB3C4\uBA54\uC778\uC5D0\uC11C \uC598\uAE30\uD558\uB294 \uC5D4\uD2F0\uD2F0\uB294 \uC644\uC804 \uB2E4\uB978 \uAC1D\uCCB4\uC774\uB2E4\\n  - \uB3C4\uBA54\uC778\uC758 \uC5D4\uD2F0\uD2F0\uC640 ORM \uC5D0\uC11C \uC598\uAE30\uD558\uB294 \uC5D4\uD2F0\uD2F0\uB97C \uBD84\uB9AC\uD558\uC9C0 \uC54A\uC744 \uACBD\uC6B0 \uD2B9\uC815 \uAE30\uC220\uC5D0 \uC885\uC18D\uB418\uAC70\uB098 DB \uC640 \uCF54\uB4DC\uAC00 \uACB0\uD569\uB418\uC5B4 \uC218\uC815\uD558\uAE30 \uC5B4\uB824\uC6CC\uC9C4\uB2E4\\n- \uB9AC\uD3EC\uC9C0\uD130\uB9AC\uB294 \uAC1D\uCCB4\uC758 \uC800\uC7A5, \uBCF5\uC6D0\uB9CC \uB2F4\uB2F9\uD558\uAE30 \uB54C\uBB38\uC5D0 \uADF8 \uC774\uC0C1\uC758 \uC5ED\uD560\uC744 \uB2F4\uC544\uC11C\uB294 \uC548\uB41C\uB2E4\\n  - \uAD6C\uCCB4\uC801\uC778 \uAD6C\uD604\uBCF4\uB2E4\uB294 \uC778\uD130\uD398\uC774\uC2A4\uB85C \uC791\uC131\uD574\uB450\uBA74 \uD2B9\uC815 \uC778\uD504\uB77C\uC2A4\uD2B8\uB7ED\uCC98\uC5D0 \uC758\uC874\uD558\uC9C0 \uC54A\uAC8C \uC791\uC131\uD560 \uC218 \uC788\uB2E4\\n\\n---\\n\\n### \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\\n\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\uB294 \uC720\uC2A4\uCF00\uC774\uC2A4\uB97C \uAD6C\uD604\uD55C\uB2E4\\n  - \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC740 \uC774\uC6A9\uC790\uC758 \uBAA9\uC801\uC744 \uD574\uACB0\uD558\uAE30 \uC704\uD55C \uD504\uB85C\uADF8\uB7A8\uC744 \uC758\uBBF8\uD55C\uB2E4\\n  - \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\uB294 \uC0AC\uC6A9\uC790\uAC00 \uC6D0\uD558\uB294 \uAE30\uB2A5\uC744 \uAD6C\uD604\uD558\uAE30\uC704\uD574 \uB3C4\uBA54\uC778 \uC11C\uBE44\uC2A4, \uB9AC\uD3EC\uC9C0\uD130\uB9AC, \uB3C4\uBA54\uC778 \uAC1D\uCCB4 \uB4F1\uC744 \uC870\uD569\uD574\uC11C \uC218\uD589\uD55C\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n- \uC720\uC2A4\uCF00\uC774\uC2A4 \uC608\uC2DC\\n  - \uC0AC\uC6A9\uC790 \uB4F1\uB85D\uD558\uAE30\\n  - \uC0AC\uC6A9\uC790 \uC815\uBCF4 \uC218\uC815\uD558\uAE30\\n\\n```ts\\nclass GetUserDto {\\n\\tconstructor(\\n\\t\\tpublic readonly id: UserId,\\n\\t\\tpublic readonly email: string\\n\\t)\\n}\\n\\nclass UserApplicationService {\\n\\tconstructor(\\n\\t\\tprivate readonly userRepository: UserRepository,\\n\\t\\tprivate readonly userDomainService: UserDomainService,\\n\\t)\\n\\n\\tregister(email: string) {\\n\\t\\tconst user = new User(email);\\n\\t\\tif (this.userDomainService.exists(user)) {\\n\\t\\t\\tthrow new Error(\'\uC774\uBBF8 \uAC00\uC785\uB41C \uC0AC\uC6A9\uC790\uC785\uB2C8\uB2E4\');\\n\\t\\t}\\n\\n\\t\\tthis.userRepository.save(user);\\n\\t}\\n\\n\\tget(email: string): User | null {\\n\\t\\tconst user = this.userRepository.findOneByEmail(email);\\n\\t\\tif (!user) {\\n\\t\\t\\tthrow new Error(\'\uC720\uC800 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4\');\\n\\t\\t}\\n\\n\\t\\treturn GetUserDto(user.id, user.email)\\n\\t}\\n}
1\\n```\\n\\n#### \uC815\uB9AC\\n\\n- \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uB97C \uC9C1\uC811 \uACF5\uAC1C\uD558\uB294 \uACBD\uC6B0 \uC678\uBD80\uC5D0\uC11C \uB370\uC774\uD130\uB97C \uC870\uC791\uD560 \uC218 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uC9C1\uC811 \uB178\uCD9C\uD558\uC9C0 \uC54A\uACE0 DTO (Data Transfer Object) \uB97C \uB9CC\uB4E4\uC5B4\uC11C \uC804\uB2EC\uD558\uB294\uAC83\uC744 \uAD8C\uC7A5\uD55C\uB2E4\\n- \uB370\uC774\uD130\uB97C \uBCC0\uACBD\uD558\uB294 \uACBD\uC6B0 \uD30C\uB77C\uBBF8\uD130\uB85C \uC9C1\uC811 \uB2E4 \uBC1B\uB294\uAC83\uBCF4\uB2E4\uB294 \uCEE4\uB9E8\uB4DC \uAC1D\uCCB4\uB97C \uB9CC\uB4E4\uC5B4\uC11C \uBC1B\uB294\uAC83\uC774 \uC88B\uB2E4\\n\\n  ```ts\\n  class UpdateUserCommand {\\n  \\tconstructor(\\n  \\t\\tpublic readonly email: string\\n  \\t)\\n  }\\n\\n  class UserApplicationService {\\n  \\tupdate(command: UpdateUserCommand): void {\\n  \\t\\t// ...\\n  \\t}\\n  }\\n  ```\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\uB294 \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uAC00 \uC218\uD589\uD558\uB294 \uC791\uC5C5\uB4E4\uC744 \uC870\uC728\uD558\uAE30\uB9CC \uD574\uC57C \uD558\uBA70, \uB3C4\uBA54\uC778 \uADDC\uCE59\uC774 \uB178\uCD9C\uB418\uC9C0 \uC54A\uAC8C \uD574\uC57C\uD55C\uB2E4\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC11C\uBE44\uC2A4\uB97C \uC791\uC131\uD560 \uB54C\uB294 \uC751\uC9D1\uB3C4\uC5D0 \uC2E0\uACBD\uC744 \uC4F0\uB294\uAC83\uC774 \uBC14\uB78C\uC9C1\uD558\uB2E4\\n  - \uC0AC\uC6A9\uC790\uC640 \uAD00\uB828\uB41C \uC720\uC2A4\uCF00\uC774\uC2A4\uB77C\uACE0 \uD574\uC11C \uAF2D \uD55C \uD074\uB798\uC2A4\uC5D0 \uBAA8\uC544\uB458 \uD544\uC694\uB294 \uC5C6\uB2E4\\n  - \uC720\uC2A4\uCF00\uC774\uC2A4\uB9C8\uB2E4 \uD074\uB798\uC2A4\uB97C \uBC18\uB4DC\uC2DC \uBD84\uB9AC\uD560 \uD544\uC694\uB3C4 \uC5C6\uC9C0\uB9CC, \uD074\uB798\uC2A4\uB97C \uAD6C\uC131\uD558\uB294 \uBCC0\uC218\uC640 \uBA54\uC18C\uB4DC\uAC00 \uC801\uC808\uD788 \uB300\uC751\uB418\uC5B4 \uC788\uB294\uC9C0 \uAC80\uD1A0\uD574\uBCF4\uBA74 \uC88B\uB2E4\\n\\n  ```ts\\n  class UserRegisterService {\\n  \\t// ...\\n  }\\n\\n  class UserDeleteService {\\n  \\t// ...\\n  }\\n  ```\\n- \uC11C\uBE44\uC2A4\uB294 \uC5B4\uB5A0\uD55C \uC601\uC5ED\uC5D0\uB3C4 \uC874\uC7AC\uD560 \uC218 \uC788\uC73C\uBA70 \uC0C1\uD0DC\uB97C \uAC00\uC9C0\uACE0 \uC788\uC73C\uBA74 \uC548\uB41C\uB2E4\\n  - \uC0C1\uD0DC\uB97C \uAC00\uC9C0\uACE0 \uC788\uC744 \uACBD\uC6B0 \uBCF5\uC7A1\uC131\uC774 \uC99D\uAC00\uD558\uACE0 \uD63C\uB780\uC2A4\uB7FD\uAC8C \uB9CC\uB4E4 \uC218 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uBB34\uC0C1\uD0DC\uB97C \uC720\uC9C0\uD560 \uC218 \uC788\uB294 \uBC29\uBC95\uC744 \uCC3E\uC544\uBCF4\uB294\uAC83\uC774 \uC88B\uB2E4\\n\\n---\\n\\n### \uD329\uD1A0\uB9AC \uD328\uD134 (Factory Pattern)\\n\\n- \uD329\uD1A0\uB9AC\uB294 \uAC1D\uCCB4\uB97C \uB9CC\uB4DC\uB294 \uC9C0\uC2DD\uC5D0 \uD2B9\uD654\uB41C \uAC1D\uCCB4\uC774\uB2E4\\n\\n  ```ts\\n  class User {\\n  \\tprivate readonly id: UserId;\\n  \\tprivate name: UserName;\\n\\n  \\tconstructor(id: UserId, name: UserName) {\\n  \\t\\t// ...\\n  \\t}\\n  }\\n\\n  class UserFactory {\\n  \\tcreate(name: UserName): User {\\n  \\t\\tconst id = new UserId(// ...);\\n  \\t\\treturn new User(id, name);\\n  \\t}\\n  }\\n  ```\\n- \uAC1D\uCCB4\uC758 \uC0DD\uC131 \uACFC\uC815\uC774 \uBCF5\uC7A1\uD558\uAC70\uB098, \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC758 \uC2DD\uBCC4\uD0A4 (Primary key) \uB97C \uC5F0\uB3D9\uD574\uC11C ID \uC5D0 \uBD80\uC5EC\uD574\uC57C\uD560 \uB54C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n- \uD329\uD1A0\uB9AC\uB294 \uD074\uB798\uC2A4 \uC790\uCCB4\uAC00 \uC544\uB2C8\uB77C \uBA54\uC11C\uB4DC\uAC00 \uC5ED\uD560\uC744 \uD558\uB294 \uACBD\uC6B0\uB3C4 \uC788\uB2E4\\n\\n  ```ts\\n  class Circle {\\n  \\tconstructor(\\n  \\t\\tpublic userId: UserId,\\n  \\t\\tpublic name: CircleName\\n  \\t);\\n  }\\n\\n  class User {\\n  \\tprivate id: UserId;\\n\\n  \\tcreateCircle(circleName: CircleName): Circle {\\n  \\t\\treturn new Circle(this.id, circleName);\\n  \\t}\\n  }\\n  ```\\n- \uAC1D\uCCB4\uC758 \uC0DD\uC131 \uC808\uCC28\uAC00 \uAC04\uB2E8\uD558\uB2E4\uBA74 \uC0DD\uC131\uC790\uB97C \uD1B5\uD574\uC11C \uB9CC\uB4DC\uB294\uAC83\uC774 \uB354 \uB0AB\uB2E4\\n- \uD329\uD1A0\uB9AC\uB97C \uC774\uC6A9\uD574 \uAC1D\uCCB4 \uC0DD\uC131 \uC808\uCC28\uB97C \uCEA1\uC290\uD654\uD558\uB294 \uAC83\uB3C4 \uB85C\uC9C1\uC758 \uC758\uB3C4\uB97C \uB354 \uBA85\uD655\uD788 \uB4DC\uB7EC\uB0B4\uBA74\uC11C \uC720\uC5F0\uC131\uC744 \uD655\uBCF4\uD560 \uC218 \uC788\uB294 \uC88B\uC740 \uBC29\uBC95\uC774\uB2E4\\n\\n---\\n\\n### \uB370\uC774\uD130 \uBB34\uACB0\uC131 \uBCF4\uC7A5\\n\\n- \uB370\uC774\uD130\uC758 \uBB34\uACB0\uC131\uC744 \uBCF4\uC7A5\uD558\uAE30 \uC704\uD574\uC11C\uB294 \uC5EC\uB7EC\uAC00\uC9C0 \uBC29\uBC95\uB4E4\uC774 \uC788\uB2E4\\n- \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC720\uB2C8\uD06C \uC778\uB371\uC2A4 \uC81C\uC57D\uC870\uAC74(Unique Index Constraint)\\n  - \uAC15\uB825\uD558\uAC8C \uC81C\uD55C\uD560 \uC218 \uC774\uC53E\uB9CC, \uCF54\uB4DC\uC5D0 \uAD00\uB828\uB41C \uB0B4\uC6A9\uC774 \uC5C6\uAE30 \uB54C\uBB38\uC5D0 \uC54C \uC218 \uC5C6\uB2E4\\n  - \uC720\uC77C \uD0A4 \uC81C\uC57D \uAE30\uB2A5\uC740 \uD2B9\uC815 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC758 \uAE30\uC220\uC774\uAE30 \uB54C\uBB38\uC5D0 \uC758\uC874\uC131\uC774 \uC0DD\uAE34\uB2E4\\n- \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD2B8\uB79C\uC7AD\uC158\\n  - \uD2B8\uB79C\uC7AD\uC158\uC740 \uC11C\uB85C \uC758\uC874\uC801\uC778 \uC870\uC791\uC744 \uD55C\uAEBC\uBC88\uC5D0 \uC644\uB8CC\uD558\uAC70\uB098 \uCDE8\uC18C\uD558\uB294 \uBC29\uBC95\uC73C\uB85C \uBB34\uACB0\uC131\uC744 \uC9C0\uD0A8\uB2E4\\n  - \uAD00\uC810 \uC9C0\uD5A5 \uD504\uB85C\uADF8\uB798\uBC0D (AOP, Aspect Oriented Programming)\\n  - \uC720\uB2DB \uC624\uBE0C \uC6CC\uD06C (UOW, Unit Of Work)\\n    - \uC5B4\uB5A4 \uAC1D\uCCB4\uC758 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uAE30\uB85D\uD558\uB294 \uAC1D\uCCB4\uC774\uB2E4\\n    - \uD37C\uC2DC\uC2A4\uD134\uC2DC \uB300\uC0C1\uC774 \uB418\uB294 \uAC1D\uCCB4\uC758 \uC0DD\uC131, \uBCC0\uACBD, \uC0AD\uC81C \uB4F1\uC758 \uBAA8\uB4E0 \uB3D9\uC791\uC774 \uBAA8\uB450 \uC720\uB2DB\uC624\uBE0C\uC6CC\uD06C\uB97C \uD1B5\uD558\uAC8C \uB41C\uB2E4\\n\\n---\\n\\n### \uC560\uAD
1F8\uB9AC\uAC70\uD2B8 (Aggregate)\\n\\n- \uC5EC\uB7EC \uAC1C\uC758 \uAC1D\uCCB4\uAC00 \uBAA8\uC5EC \uD55C \uAC00\uC9C0 \uC758\uBBF8\uB97C \uAC16\uB294 \uD558\uB098\uC758 \uAC1D\uCCB4\uAC00 \uB418\uB294\uB370, \uC774 \uAC1D\uCCB4\uB4E4\uC744 \uBB36\uC5B4\uC11C \uD45C\uD604\uD558\uB294\uAC83\uC744 **\uC560\uADF8\uB9AC\uAC70\uD2B8(Aggregate)** \uB77C\uACE0 \uD55C\uB2E4\\n  - \uC560\uADF8\uB9AC\uAC70\uD2B8\uC758 \uC911\uC810\uC774 \uB418\uB294 \uAC1D\uCCB4\uB97C **\uC560\uADF8\uB9AC\uAC70\uD2B8 \uB8E8\uD2B8 (Aggregate Root)** \uB77C\uACE0 \uD55C\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n```ts\\nclass UserId {\\n\\tconsturctor (public readonly value: number) {}\\n}\\n\\nclass UserName {\\n\\tconstructor (public readonly value: string) {}\\n}\\n\\nclass User {\\n\\tpublic id: UserId;\\n\\tpublic name: UserName;\\n}\\n```\\n\\n- \uC704\uC758 \uC608\uC2DC\uC5D0\uC11C `User` \uAC00 \uC560\uADF8\uB9AC\uAC70\uD2B8 \uB8E8\uD2B8 (Aggregate Root) \uAC00 \uB41C\uB2E4\\n\\n#### \uADDC\uCE59\\n\\n- \uC560\uADF8\uB9AC\uAC70\uD2B8\uC5D0 \uD3EC\uD568\uB41C \uAC1D\uCCB4\uB97C \uC870\uC791\uD560 \uB54C\uB294 \uD56D\uC0C1 \uC560\uADF8\uB9AC\uAC70\uD2B8 \uB8E8\uD2B8\uB97C \uD1B5\uD574\uC11C \uC218\uC815\uD574\uC57C \uD55C\uB2E4\\n\\n  ```ts\\n  const userName = new UserName(\\"Claude\\")\\n\\n  user.Name = userName; // \uC774\uB807\uAC8C \uC0AC\uC6A9\uD558\uBA74 \uC548\uB41C\uB2E4\\n\\n  user.changeName(userName); // \uC774\uB807\uAC8C \uC0AC\uC6A9\uD574\uC57C \uD55C\uB2E4\\n  ```\\n- \uB370\uBA54\uD14C\uB974 \uBC95\uCE59\\n  - \uAC1D\uCCB4 \uAC04\uC758 \uBA54\uC18C\uB4DC \uD638\uCD9C\uC5D0 \uC9C8\uC11C\uB97C \uBD80\uC5EC\uD558\uAE30 \uC704\uD55C \uAC00\uC774\uB4DC\uB77C\uC778\uC774\uB2E4.\\n  - \uC5B4\uB5A4 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C \uB2E4\uC74C \uAC1D\uCCB4\uC758 \uBA54\uC11C\uB4DC\uB9CC\uC744 \uD638\uCD9C\uD560 \uC218 \uC788\uAC8C \uC81C\uD55C\uD55C\uB2E4\\n    - \uAC1D\uCCB4 \uC790\uC2E0\\n    - \uC778\uC790\uB85C \uC804\uB2EC\uBC1B\uC740 \uAC1D\uCCB4\\n    - \uC778\uC2A4\uD134\uC2A4 \uBCC0\uC218\\n    - \uD574\uB2F9 \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C \uC9C1\uC811 \uC0DD\uC131\uD55C \uAC1D\uCCB4\\n- \uAC1D\uCCB4 \uB0B4\uBD80\uC758 \uB370\uC774\uD130\uB294 \uD568\uBD80\uB85C \uC678\uBD80\uC5D0 \uACF5\uAC1C\uD574\uC11C\uB294 \uC548\uB41C\uB2E4\\n  - \uC77C\uBC18\uC801\uC73C\uB85C\uB294 \uB9AC\uD3EC\uB9AC\uC800\uD2F0 \uAC1D\uCCB4 \uC678\uC5D0\uB294 \uC560\uADF8\uB9AC\uAC70\uD2B8 \uB0B4\uBD80 \uB370\uC774\uD130\uC5D0 \uC811\uADFC\uD558\uC9C0 \uC54A\uB294 \uCF54\uB4DC\uB97C \uADDC\uCE59\uC73C\uB85C \uB9CC\uB4E4\uC5B4 \uD611\uC758\uD574\uC11C \uD55C\uB2E4\\n  - \uAC15\uC81C\uC131\uC744 \uB450\uAE30 \uC704\uD574\uC11C\uB294 \uB178\uD2F0\uD53C\uCF00\uC774\uC158 \uAC1D\uCCB4 (Notification Object) \uB97C \uC774\uC6A9\uD55C\uB2E4\\n\\n### \uC560\uADF8\uB9AC\uAC70\uD2B8 \uACBD\uACC4\\n\\n- \uC560\uADF8\uB9AC\uAC70\uD2B8\uC758 \uACBD\uACC4\uB97C \uC815\uD558\uB294 \uC6D0\uCE59 \uC911 \uAC00\uC7A5 \uD754\uD788 \uC4F0\uC774\uB294 \uBC29\uBC95\uC740 **\uBCC0\uACBD\uC758 \uB2E8\uC704**\uC774\uB2E4.\\n  - \uC560\uADF8\uB9AC\uAC70\uD2B8\uC5D0 \uB300\uD55C \uBCC0\uACBD\uC740 \uD574\uB2F9 \uC560\uADF8\uB9AC\uAC70\uD2B8\uC5D0 \uB9E1\uAE30\uACE0, \uD37C\uC2DC\uC2A4\uD134\uC2DC \uC694\uCCAD\uB3C4 \uC560\uADF8\uB9AC\uAC70\uD2B8 \uB2E8\uC704\uB85C \uD574\uC57C \uD55C\uB2E4\\n- \uACBD\uACC4\uB97C \uD655\uC2E4\uD558\uAC8C \uD558\uAE30 \uC704\uD574\uC11C\uB294 \uAC1D\uCCB4 \uC778\uC2A4\uD134\uC2A4 \uB300\uC2E0 \uC2DD\uBCC4\uC790(id) \uB97C \uB4E4\uACE0 \uC788\uC73C\uBA74 \uB41C\uB2E4\\n  - \uC774 \uBC29\uBC95\uC740 \uBA54\uBAA8\uB9AC\uB97C \uC808\uC57D\uD558\uB294 \uBD80\uC218\uC801\uC778 \uD6A8\uACFC\uAC00 \uC788\uB2E4\\n- \uC560\uADF8\uB9AC\uAC70\uD2B8 (Aggregate) \uB2F9 \uB9AC\uD3EC\uC9C0\uD130\uB9AC (Repository) \uB97C 1\uAC1C\uC529 \uB9CC\uB4E0\uB2E4\\n  - \uC560\uADF8\uB9AC\uAC70\uD2B8 \uD06C\uAE30\uB294 \uAC00\uB2A5\uD55C \uC791\uAC8C \uC815\uD558\uB294\uAC8C \uC88B\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n```ts\\nclass Circle {\\n\\tusers: User[];\\t\\n}\\n\\nconst user1 = new User();\\nconst user2 = new User();\\n\\nuserRepository.save(user1);\\nuserRepository.save(user2);\\n\\nconst circle = new Circle();\\ncircle.join(user1)\\ncircle.join(user2);\\ncircleRepository.save(circle);\\n\\nuser2.name = new UserName(\'New Name\');\\nuserRepository.save(user2);\\n```\\n\\n- \uC704 \uCF54\uB4DC\uB85C \uC778\uD574 circle \uC548\uC5D0 \uC788\uB294 user2 \uC758 \uB370\uC774\uD130\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC73C\uB098, circle \uC548\uC5D0\uB294 user2 \uAC00 \uBCC0\uACBD\uB41C \uC0C1\uD0DC\uB85C \uC800\uC7A5\uB418\uC5B4 \uC788\uC9C0 \uC54A\uAE30 \uB54C\uBB38\uC5D0 \uBCF5\uC6D0\uD560 \uACBD\uC6B0 \uC774\uC804 \uB370\uC774\uD130\uB85C \uBD88\uB7EC\uC628\uB2E4\\n\\n---\\n\\n### \uBA85\uC138 (Specification)\\n\\n- \uBA85\uC138\uB294 \uC5B4\uB5A4 \uAC1D\uCCB4\uAC00 \uADF8 \uAC1D\uCCB4\uC758 \uD3C9\uAC00 \uAE30\uC900\uC744 \uB9CC\uC871\uD558\uB294\uC9C0 \uD310\uC815\uD558\uAE30 \uC704\uD55C \uAC1D\uCCB4\uC774\uB2E4\\n  - \uBA85\uC138\uB294 \uC5D4\uD2F0\uD2F0\uB098 \uAC12 \uAC1D\uCCB4\uAC00 \uB9AC\uD3
1EC\uC9C0\uD130\uB9AC\uB97C \uB2E4\uB8E8\uC9C0 \uC54A\uC73C\uBA74\uC11C\uB3C4 \uBB38\uC81C\uB97C \uD574\uACB0\uD560 \uC218 \uC788\uB2E4\\n  - \uB3C4\uBA54\uC778 \uADDC\uCE59\uC740 \uB3C4\uBA54\uC778 \uAC1D\uCCB4 \uC548\uC5D0 \uC815\uC758\uB418\uC5B4\uC57C \uD55C\uB2E4\\n- \uBA85\uC138\uB294 \uB2E8\uB3C5\uC73C\uB85C \uC0AC\uC6A9\uB418\uAE30\uB3C4 \uD558\uC9C0\uB9CC \uB9AC\uD3EC\uC9C0\uD130\uB9AC\uC640 \uC870\uD569\uD574 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n  - \uB9AC\uD3EC\uC9C0\uD130\uB9AC\uC5D0\uC11C \uBA85\uC138\uB97C \uD544\uD130\uB85C \uC0AC\uC6A9\uD560 \uACBD\uC6B0 \uD56D\uC0C1 \uC131\uB2A5\uC5D0 \uC5FC\uB450\uB97C \uB46C\uC57C \uD55C\uB2E4\\n\\n#### \uC608\uC2DC\\n\\n```ts\\nclass CircleFullSepcification {\\n\\tconstructor(private readonly userRepository: UserRepository) {}\\n\\n\\tisSatisfiedBy(circle: Circle): boolean {\\n\\t\\tconst users = this.userRepository.find(circle.members);\\n\\t\\treturn users.filter(user => user.isPremium).length > 10\\n\\t}\\n}\\n```\\n\\n#### \uBCF5\uC7A1\uD55C \uCFFC\uB9AC\uB294 \uC77D\uAE30 \uBAA8\uB378\uB85C \uCC98\uB9AC\\n\\n- \uC2DC\uC2A4\uD15C\uC758 \uC560\uCD08 \uC874\uC7AC \uC758\uC758\uB294 \uC0AC\uC6A9\uC790\uC758 \uBB38\uC81C\uB97C \uD574\uACB0\uD558\uB294\uAC83\uC774\uB2E4\\n  - \uADF8 \uC5B4\uB5A4 \uC870\uAC74\uBCF4\uB2E4 \uC774 \uC870\uAC74\uC774 \uCD5C\uC6B0\uC120\uC774\uB2E4\\n- \uBCF5\uC7A1\uD55C \uC77D\uAE30 \uC791\uC5C5\uC5D0\uC11C \uC131\uB2A5 \uBB38\uC81C\uAC00 \uC6B0\uB824\uB41C\uB2E4\uBA74 \uC774\uB7EC\uD55C \uBD80\uBD84\uC5D0 \uD55C\uD574 \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uC758 \uC81C\uC57D\uC744 \uBC97\uC5B4\uB098\uB3C4 \uB41C\uB2E4\\n  - \uD398\uC774\uC9C0\uB124\uC774\uC158, \uBCF5\uC7A1\uD55C JOIN \uCFFC\uB9AC \uB4F1\\n- \uC4F0\uAE30 \uC791\uC5C5 (Command) \uC5D0\uC11C\uB294 \uB3C4\uBA54\uC778 \uAC1D\uCCB4 \uB4F1\uC744 \uC801\uADF9\uC801\uC73C\uB85C \uD65C\uC6A9\uD558\uC9C0\uB9CC, \uC77D\uAE30 \uC791\uC5C5 (Query) \uC5D0\uC11C\uB294 \uADF8\uB807\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uAC00 \uB9CE\uB2E4\\n  - CQS (Command-Query Separation), CQRS (Command-Query Responsibility Segregation) \uB4F1 \uC774 \uC788\uB2E4\\n- \uC9C0\uC5F0 \uC2E4\uD589 (Lazy Execution) \uC744 \uD1B5\uD574 \uB9AC\uD3EC\uC9C0\uD130\uB9AC\uB294 \uADF8\uB300\uB85C \uC0AC\uC6A9\uD558\uBA74\uC11C \uC131\uB2A5 \uBB38\uC81C\uB97C \uD574\uACB0\uD560 \uC218 \uC788\uB294 \uBC29\uBC95\uB3C4 \uC788\uB2E4\\n\\n```ts\\nclass CircleSummaryService {\\n\\tgetSummaries(query: GetCircleSummary): GetCircleSummariesResult {}\\n}\\n```"},{"id":"kotlin-glossary","metadata":{"permalink":"/blog/kotlin-glossary","source":"@site/blog/2022-03-19-kotlin-glossary/index.md","title":"\uC6A9\uC5B4 \uC815\uB9AC","description":"\uCF54\uD2C0\uB9B0\uC758 \uAE30\uBCF8\uC801\uC778 \uD568\uC218(function) \uC740 fun \uD0A4\uC6CC\uB4DC\uB97C \uC0AC\uC6A9\uD55C\uB2E4","date":"2022-03-19T00:00:00.000Z","tags":[{"inline":false,"label":"Kotlin","permalink":"/blog/tags/kotlin"}],"readingTime":1.68,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"\uC6A9\uC5B4 \uC815\uB9AC","slug":"kotlin-glossary","date":"2022-03-19T00:00:00.000Z","authors":["dongmyeong"],"tags":["kotlin"],"description":"\uCF54\uD2C0\uB9B0\uC758 \uAE30\uBCF8\uC801\uC778 \uD568\uC218(function) \uC740 fun \uD0A4\uC6CC\uB4DC\uB97C \uC0AC\uC6A9\uD55C\uB2E4"},"unlisted":false,"prevItem":{"title":"\uB3C4\uBA54\uC778 \uC8FC\uB3C4 \uC124\uACC4 \uCCA0\uC800 \uC785\uBB38","permalink":"/blog/ddd-introduction"},"nextItem":{"title":"Kafka Connect (1)","permalink":"/blog/kafka-connect-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC6A9\uC5B4 \uC815\uB9AC\\n\\n### \uD568\uC218 vs \uBA54\uC11C\uB4DC\\n\\n- \uCF54\uD2C0\uB9B0\uC758 \uAE30\uBCF8\uC801\uC778 \uD568\uC218(function) \uC740 `fun` \uD0A4\uC6CC\uB4DC\uB97C \uC0AC\uC6A9\uD55C\uB2E4\\n  - \uD1B1\uB808\uBCA8 \uD568\uC218\\n  - \uD074\uB798\uC2A4\uC758 \uBA64\uBC84 \uD568\uC218\\n  - \uD568\uC218 \uB0B4\uBD80\uC758 \uC9C0\uC5ED \uD568\uC218\\n\\n  <details>
1\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  - \uAE30\uBCF8\uC801\uC778 \uC608\uC2DC\\n\\n    ```kotlin\\n    fun double(i: Int) = i * 2 // \uD1B1\uB808\uBCA8 \uD568\uC218\\n\\n    class A {\\n        fun triple(i: Int) = i * 3 // \uBA64\uBC84 \uD568\uC218\\n        \\n        fun twelveTimes(i: Int): Int { // \uBA64\uBC84 \uD568\uC218\\n            fun fourTimes() = double(double(i)) // \uC9C0\uC5ED \uD568\uC218\\n            return triple(fourTimes())\\n        }\\n    }\\n    ```\\n  - \uC775\uBA85 \uD568\uC218\\n\\n    ```kotlin\\n    val double = fun(i: Int) = i * 2 // \uC775\uBA85 \uD568\uC218\\n    val triple = { i: int -> i * 3 } // \uB78C\uB2E4 \uD45C\uD604\uC2DD\\n    // \uB78C\uB2E4 \uD45C\uD604\uC2DD\uC740 \uC775\uBA85 \uD568\uC218\uB97C \uB354 \uC9E7\uAC8C \uD45C\uD604\uD55C\uAC83\\n    ```\\n\\n  </details>\\n- **\uBA54\uC11C\uB4DC(method)** \uB294 \uD074\uB798\uC2A4\uC640 \uC5F0\uACB0\uB41C \uD568\uC218\uC774\uB2E4\\n  - \uBA64\uBC84 \uD568\uC218\uB294 \uD574\uB2F9 \uD074\uB798\uC2A4\uC640 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC73C\uBBC0\uB85C, \uBA54\uC11C\uB4DC\uC774\uB2E4\\n  - \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD558\uB824\uBA74 \uD074\uB798\uC2A4 \uC778\uC2A4\uD134\uC2A4\uAC00 \uC788\uC5B4\uC57C \uD558\uBA70, \uC774\uB97C \uD65C\uC6A9\uD574\uC11C \uCC38\uC870\uD574\uC57C \uD55C\uB2E4\\n  - \uBAA8\uB4E0 \uBA54\uC11C\uB4DC\uB294 \uD568\uC218\uC774\uB2E4\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  class IntWrapper(val i: Int) {\\n      fun doubled(): IntWrapper = IntWrapper(i * 2) // \uBA64\uBC84 \uC774\uBA74\uC11C \uBA54\uC11C\uB4DC\\n  }\\n\\n  val wrapper = IntWrapper(10)\\n  val doubledWrapper = wrapper.doubled()\\n  val doubledReference = IntWrapper::doubled\\n  ```\\n\\n  </details>\\n- \uD655\uC7A5 \uD568\uC218\uB97C \uBA54\uC11C\uB4DC\uB85C \uBD88\uB7EC\uB3C4 \uB418\uB294\uC9C0\uC5D0 \uB300\uD574\uC11C\uB294 \uB17C\uB780\uC758 \uC5EC\uC9C0\uAC00 \uC788\uC9C0\uB9CC, \uD655\uC7A5 \uD568\uC218\uB3C4 \uD638\uCD9C\uC744 \uD560 \uB54C \uC778\uC2A4\uD134\uC2A4\uAC00 \uD544\uC694\uD558\uBBC0\uB85C \uC774 \uCC45\uC5D0\uC11C\uB294 \uBA54\uC11C\uB4DC\uB85C \uBCF8\uB2E4.\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  fun IntWrapper.tripled() = IntWrapper(i * 3)\\n\\n  val wrapper = IntWrapper(10)\\n  val tripledWrapper = wrapper.tripled()package\\n  val tripledReference = IntWrapper::tripled\\n  ```\\n\\n  </details>\\n\\n---\\n\\n### \uBA64\uBC84 vs \uD655\uC7A5\\n\\n- **\uBA64\uBC84(member)** \uB294 \uD074\uB798\uC2A4 \uB0B4\uBD80\uC5D0 \uC815\uC758\uB41C \uC694\uC18C\uB97C \uC758\uBBF8\uD55C\uB2E4\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  class User(\\n  \\tval name: String,\\n      val surname: String\\n  ) {\\n      val fullName: String\\n      \\tget() = \\"$name $surname\\"\\n      \\n      val withSurname(surname: String) =\\n      \\tUser(this.name, surname)\\n  }\\n  ```\\n\\n  </details>\\n- **\uD655\uC7A5 (extension)** \uC740 \uC774\uBBF8 \uC874\uC7AC\uD558\uB294 \uD074\uB798\uC2A4\uC5D0 \uCD94\uAC00\uD558\uB294 \uAC00\uC9DC \uBA64\uBC84 \uAC19\uC740\uAC83\uC774\uB2E4\\n  - \uD655\uC7A5\uC740 \uD074\uB798\uC2A4 \uC678\uBD80\uC5D0\uC11C \uC815\uC758\uD558\uC9C0\uB9CC, \uC77C\uBC18\uC801\uC778 \uBA64\uBC84\uCC98\uB7FC \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC </summary>\\n\\n  ```kotlin\\n  val User.officialFullName: String\\n  \\tget() = \\"$surname, $name\\"\\n\\n  fun User.withName(name: String) =\\n      User(name, this.surname)\\n  ```\\n\\n  </details>\\n\\n---\\n\\n### \uD30C\uB77C\uBBF8\uD130\uC640 \uC640\uADDC\uBA3C\uD2B8\\n\\n- **\uD30C\uB77C\uBBF8\uD130 (parameter)** \uB294 \uD568\uC218 \uC120\uC5B8\uC5D0 \uC815\uC758\uB418\uC5B4 \uC788\uB294 \uBCC0\uC218\uB97C \uC758\uBBF8\uD55C\uB2E4\\n- **\uC544\uADDC\uBA3C\uD2B8(argument)** \uB294 \uD568\uC218\uB85C \uC804\uB2EC\uB418\uB294 \uC2E4\uC9C8\uC801\uC778 \uAC12\uC744 \uC758\uBBF8\uD55C\uB2E4\\n- \uC81C\uB124\uB9AD\uC73C\uB85C \uC120\uC5B8\uB41C \uBCC0\uD560 \uC218 \uC788\uB294 \uBD80\uBD84\uC774 **\uD0C0\uC785 \uD30C\uB77C\uBBF8\uD130** \uC774\uB2E4\\n  - \uADF8\uB9AC\uA
1CE0 \uC2E4\uC9C8\uC801\uC778 \uD0C0\uC785\uC774 **\uD0C0\uC785 \uC544\uADDC\uBA3C\uD2B8** \uC774\uB2E4\\n\\n<details>\\n<summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n```kotlin\\nfun randomString(length: Int): String { // \uD30C\uB77C\uBBF8\uD130\\n    \\n}\\n\\nrandomString(10) // \uC544\uADDC\uBA3C\uD2B8\\n\\ninline fun <reified T> printName() { // \uD0C0\uC785 \uD30C\uB77C\uBBF8\uD130\\n    print(T::class.simpleName)\\n}\\n\\nfun main() {\\n    printName<String>() // \uD0C0\uC785 \uC544\uADDC\uBA3C\uD2B8\\n}\\n```\\n\\n</details>\\n\\n---\\n\\n### \uAE30\uBCF8 \uC0DD\uC131\uC790\uC640 \uCD94\uAC00\uC801\uC778 \uC0DD\uC131\uC790\\n\\n- \uC0DD\uC131\uC790\uB294 \uAC1D\uCCB4\uB97C \uB9CC\uB4E4 \uB54C \uD638\uCD9C\uB418\uB294 \uD2B9\uBCC4\uD55C \uD0C0\uC785\uC758 \uD568\uC218\uC774\uB2E4.\\n  - \uCF54\uD2C0\uB9B0\uC774 \uC0DD\uC131\uC790\uB97C \uD568\uC218\uCC98\uB7FC \uB2E4\uB8E8\uACE0, \uC0DD\uC131\uC790 \uB808\uD37C\uB7F0\uC2A4\uB3C4 \uD568\uC218 \uD0C0\uC785\uC774\uC9C0\uB9CC, \uACF5\uC2DD\uC801\uC73C\uB85C\uB294 \uC11C\uBE0C\uB8E8\uD2F4\uC774\uB2E4\\n- \uC0DD\uC131\uC790\uB294 \uC77C\uBC18\uC801\uC73C\uB85C \uAC1D\uCCB4\uB97C \uC124\uC815\uD560 \uB54C \uC0AC\uC6A9\uB418\uB294\uB370, \uC774\uB7EC\uD55C \uC0DD\uC131\uC790\uB97C **\uAE30\uBCF8 \uC0DD\uC131\uC790 (primary constructor)** \uB77C\uACE0 \uD55C\uB2E4\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  class SomeObject(val text: String) {\\n      init {\\n          print(\\"Creating Object\\")\\n      }\\n  }\\n  ```\\n\\n  </details>\\n- \uCD94\uAC00\uB85C \uB2E4\uB978 \uC0DD\uC131\uC790\uB97C \uB9CC\uB4E4\uC5B4\uC57C \uD558\uB294 \uACBD\uC6B0\uAC00 \uC788\uB294\uB370, \uC774\uB97C **\uCD94\uAC00\uC801\uC778 \uC0DD\uC131\uC790 (secondary constructor)** \uB77C\uACE0 \uD55C\uB2E4\\n  - \uCD94\uAC00\uC801\uC778 \uC0DD\uC131\uC790\uB294 \uC77C\uBC18\uC801\uC73C\uB85C this \uD0A4\uC6CC\uB4DC\uB97C \uD65C\uC6A9\uD574\uC11C \uAE30\uBCF8 \uC0DD\uC131\uC790\uB97C \uD638\uCD9C\uD55C\uB2E4\\\\\\\\\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  class SomeObject(val text: String) {\\n      constructor(date: Date): this(date.toString())\\n      \\n      init {\\n          print(\\"Creating Object\\")\\n      }\\n  }\\n  ```\\n\\n  </details>\\n- \uC77C\uBC18\uC801\uC73C\uB85C \uCF54\uD2C0\uB9B0\uC5D0\uC11C\uB294 \uCD94\uAC00\uC801\uC778 \uC0DD\uC131\uC790\uB97C \uC0AC\uC6AF\uC54C \uC77C\uC774 \uAC70\uC758 \uC5C6\uB2E4\\n  - \uAE30\uBCF8 \uC0DD\uC131\uC790 \uC544\uADDC\uBA3C\uD2B8\uC758 \uB2E4\uB978 \uC11C\uBE0C\uC14B\uC744 \uB9CC\uB4E4 \uB54C\uB294 \uB514\uD3F4\uD2B8 \uC544\uADDC\uBA3C\uD2B8\uB97C \uD65C\uC6A9\uD560 \uC218 \uC788\uB2E4\\n  - \uB2E4\uB978 \uC885\uB958\uC758 \uAC1D\uCCB4\uB97C \uB9CC\uB4E4\uC5B4\uC57C \uD560 \uB54C\uB294 \uD329\uD1A0\uB9AC \uBA54\uC11C\uB4DC\uB97C \uC0AC\uC6A9\uD55C\uB2E4\\n- \uC790\uBC14\uC5D0\uC11C \uC0AC\uC6A9\uD558\uAE30 \uC704\uD574\uC11C \uAE30\uBCF8 \uC0DD\uC131\uC790 \uC544\uADDC\uBA3C\uD2B8\uC758 \uC5EC\uB7EC \uC11C\uBE0C\uC14B\uC744 \uB9CC\uB4E4\uC5B4\uC57C \uD55C\uB2E4\uBA74, `@JvmOverloads` \uC640 \uAC19\uC740 \uC5B4\uB178\uD14C\uC774\uC158\uC744 \uD65C\uC6A9\uD574\uC11C \uD568\uC218\uC5D0 \uB300\uD55C \uC624\uBC84\uB85C\uB4DC\uB97C \uAC04\uB2E8\uD558\uAC8C \uB9CC\uB4E4 \uC218 \uC788\uB2E4\\n\\n  <details>\\n  <summary>\uC608\uC2DC \uCF54\uB4DC</summary>\\n\\n  ```kotlin\\n  class SomeObject @JvmOverloads constructor(\\n      val text: String = \\"\\"\\n  ) {\\n      init {\\n          print(\\"Creating Object\\")\\n      }\\n  }\\n  ```\\n\\n  </details>"},{"id":"kafka-connect-1","metadata":{"permalink":"/blog/kafka-connect-1","source":"@site/blog/2022-02-18-kafka-connect-1/index.md","title":"Kafka Connect (1)","description":"Kafka Connect \uB294 \uC678\uBD80 \uC2DC\uC2A4\uD15C\uC5D0 \uC5F0\uACB0\uD558\uAE30 \uC704\uD55C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uC81C\uACF5\uD558\uB294 KAFKA \uC758 \uC624\uD508 \uC18C\uC2A4 \uAD6C\uC131 \uC694\uC18C\uC774\uB2E4.","date":"2022-02-18T00:00:00.000Z","tags":[{"inline":false,"label":"Kafka","permalink":"/blog/tags/kafka"}],"readingTime":3.03,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}
1],"frontMatter":{"title":"Kafka Connect (1)","slug":"kafka-connect-1","date":"2022-02-18T00:00:00.000Z","authors":["dongmyeong"],"tags":["kafka"],"description":"Kafka Connect \uB294 \uC678\uBD80 \uC2DC\uC2A4\uD15C\uC5D0 \uC5F0\uACB0\uD558\uAE30 \uC704\uD55C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uC81C\uACF5\uD558\uB294 KAFKA \uC758 \uC624\uD508 \uC18C\uC2A4 \uAD6C\uC131 \uC694\uC18C\uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"\uC6A9\uC5B4 \uC815\uB9AC","permalink":"/blog/kotlin-glossary"},"nextItem":{"title":"CloudFront \uB85C Dynamic Contents \uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720","permalink":"/blog/cloudfront-dynamic-contents"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Kafka Connect\\n\\n- Kafka Connect \uB294 \uC678\uBD80 \uC2DC\uC2A4\uD15C\uC5D0 \uC5F0\uACB0\uD558\uAE30 \uC704\uD55C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uC81C\uACF5\uD558\uB294 KAFKA \uC758 \uC624\uD508 \uC18C\uC2A4 \uAD6C\uC131 \uC694\uC18C\uC774\uB2E4.\\n- Kafka Connect \uB97C \uC0AC\uC6A9\uD558\uAE30 \uC704\uD574\uC11C\uB294 \uD074\uB7EC\uC2A4\uD130\uB97C \uACC4\uD68D\uD558\uACE0 \uD504\uB85C\uBE44\uC800\uB2DD\uD558\uACE0, \uC791\uC5C5\uC744 \uCC98\uB9AC\uD558\uACE0 \uBD80\uD558\uC5D0 \uB530\uB77C \uC2A4\uCF00\uC77C\uB9C1\uC744 \uACE0\uB824\uD574\uC57C \uD55C\uB2E4.\\n\\n### \uC6A9\uC5B4\\n\\n- **Connect**: Connector \uB97C \uB3D9\uC791\uD558\uAC8C \uD558\uB294 \uD504\uB85C\uC138\uC2A4 (\uC11C\uBC84)\\n- **Connector**: Data Source(DB) \uC758 \uB370\uC774\uD130\uB97C \uCC98\uB9AC\uD558\uB294 \uC18C\uC2A4\uAC00 \uB4E4\uC5B4\uC788\uB294 jar \uD30C\uC77C\\n- **Source Connector**: Producer \uC5ED\uD560\uC744 \uB2F4\uB2F9\\n- **Sink Connector**: Consumer \uC5ED\uD560\uC744 \uB2F4\uB2F9\\n- **Standalone \uBAA8\uB4DC**: \uD558\uB098\uC758 Connect \uB9CC \uC0AC\uC6A9\uD558\uB294 \uBAA8\uB4DC\\n- **Distributed \uBAA8\uB4DC**: \uC5EC\uB7EC\uAC1C\uC758 Connect \uB97C \uD55C\uAC1C\uC758 \uD074\uB7EC\uC2A4\uD130\uB85C \uBB36\uC5B4\uC11C \uC0AC\uC6A9\uD558\uB294 \uBAA8\uB4DC\\n  - Connect \uC911 \uD55C\uAC1C\uAC00 \uC7A5\uC560\uB098\uB3C4 \uB098\uBA38\uC9C0 Connect \uB4E4\uC774 \uC774\uC5B4\uC11C \uCC98\uB9AC\uD560 \uC218 \uC788\uC74C\\n\\n### \uC124\uCE58 \uBC29\uBC95\\n\\n- \uC9C1\uC811 \uC124\uCE58\uD558\uB294 \uBC29\uBC95\uB3C4 \uC788\uACA0\uC9C0\uB9CC, \uB85C\uCEEC\uC5D0\uC11C \uD14C\uC2A4\uD2B8\uB85C \uD544\uC694\uD558\uBA74 docker \uB85C \uB744\uC6B8 \uC218 \uC788\uB2E4\\n- **docker hub**: [https://hub.docker.com/r/confluentinc/cp-kafka-connect](https://hub.docker.com/r/confluentinc/cp-kafka-connect)\\n- **Guide**\\n  - [https://github.com/confluentinc/demo-scene/blob/master/kafka-connect-zero-to-hero/docker-compose.yml#L89-L101](https://github.com/confluentinc/demo-scene/blob/master/kafka-connect-zero-to-hero/docker-compose.yml#L89-L101)\\n  - [https://docs.confluent.io/platform/current/installation/docker/development.html#add-connectors-or-software](https://docs.confluent.io/platform/current/installation/docker/development.html#add-connectors-or-software)\\n  - [https://docs.confluent.io/5.0.0/installation/docker/docs/installation/connect-avro-jdbc.html#](https://docs.confluent.io/5.0.0/installation/docker/docs/installation/connect-avro-jdbc.html#)\\n\\n```bash\\ndocker run -d \\\\\\n\\t--name=kafka-connect \\\\\\n\\t-e CONNECT_BOOTSTRAP_SERVERS=localhost:29092 \\\\\\n\\t-e CONNECT_REST_PORT=28083 \\\\\\n\\t-e CONNECT_GROUP_ID=\\"quickstart-avro\\" \\\\\\n  -e CONNECT_CONFIG_STORAGE_TOPIC=\\"quickstart-config\\" \\\\\\n  -e CONNECT_OFFSET_STORAGE_TOPIC=\\"quickstart-offsets\\" \\\\\\n  -e CONNECT_STATUS_STORAGE_TOPIC=\\"quickstart-status\\" \\\\\\n  -e CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR=1 \\\\\\n  -e CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR=1 \\\\\\n  -e CONNECT_STATUS_STORAGE_REPLICATION_FACTOR=1 \\\\\\n\\t-e CONNECT_KEY_CONVERTER=\\"org.apache.kafka.connect.json.JsonConverter\\" \\\\\\n  -e CONNECT_VALUE_CONVERTER=\\"org.apache.kafka.connect.json.JsonConverter\\" \\\\\\n  -e CONNECT_INTERNAL_KEY_CONVERTER=\\"org.apache.kafka.connect.json.JsonConverter\\" \\\\\\n  -e CONNECT_INTERNAL_VALUE_CONVERTER=\\"org.apache.kafka.connect.json.JsonConverter\\" \\\\\\n  -e CONNECT_REST_ADVERTISED_HOST_NAME=\\"localhost\\" \\\\\\n  -e CONNECT_LOG4J_ROOT_LOGLEVEL=DEBUG \\\\\\n  -e CONNECT_PLUGIN_PATH=/usr/share/java,/etc/kafka-connect/jars \\\\\\n  -v /tmp/quickstart/file:/tmp/quickstart \\\\\\n\\tconfluentinc/cp-kafka-connect:latest\\n```\\n\\n### REST API\\n\\n- Kafka Connect \uB294 REST API \uB97C \uC0AC\uC6A9\uD574\uC11C Connector \uB97C \uB9CC\uB4E4 \uC218 \uC788\uB294 \uBC29\uBC95\uC744 \uC81C\uACF5\uD55C\uB2E4\\n- `GET /connectors` : \uCEE4\uB125\uD130 \uBAA9\uB85D \uC870\uD68C\\n- `GET /connectors/{name}` : `{name}` \uCEE4\uB125\uD130 \uC815\uBCF4 \uC870\uD68C\\n- `GET /connectors/{name}/status` : \uCEE4\uB125\uD130 \uC0C1\uD0DC \uC870\uD68C \\n- `POST /connectors` : \uCEE4\uB125\uD130 \uC0DD\uC131\\n- `DELETE /connectors/{name}` : `{name}` \uCEE4\uB125\uD130 \uC0AD\uC81C\\n- `GET /connector-plugins` : \uC124\uCE58\uB41C \uD50C\uB7EC\uAD
1F8\uC778 \uBAA9\uB85D \uC870\uD68C\\n\\n## Debezium\\n\\n- \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC758 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uCEA1\uCC98\uD558\uC5EC \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uD574\uC8FC\uB294 \uBD84\uC0B0 \uC11C\uBE44\uC2A4 \uC9D1\uD569\uC774\uB2E4.\\n- CDC ( Change Data Capture ) \uC744 \uC0AC\uC6A9\uD558\uC5EC \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC758 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uC218\uC9D1\uD55C\uB2E4\\n- \uBAA8\uB4E0 Low Level \uBCC0\uACBD\uC744 Changed Event Stream \uC5D0 \uAE30\uB85D\uD55C\uB2E4.\\n  - \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC740 \uC774 \uC2A4\uD2B8\uB9BC\uC744 \uD1B5\uD574 \uBCC0\uACBD \uC774\uBCA4\uD2B8\uB4E4\uC744 \uC21C\uC11C\uB300\uB85C \uC77D\uB294\uB2E4\\n- Debezium \uC758 \uBAA9\uD45C\uB294 \uB2E4\uC591\uD55C DBMS \uB4E4\uC758 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uCEA1\uCC98\uD558\uACE0 \uBE44\uC2B7\uD55C \uAD6C\uC870\uC758 \uBCC0\uACBD \uC774\uBCA4\uD2B8\uB4E4\uC744 Producing \uD558\uB294 Connector \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uAD6C\uCD95\uD558\uB294\uAC83\uC774\uB2E4.\\n\\n### \uC9C0\uC6D0\uD558\uB294 \uCEE4\uB125\uD130\\n\\n- MySQL\\n- MongoDB\\n- PostgreSQL\\n- Orcal\\n- SQL Server\\n- DB2\\n- Cassandra\\n- Vitess\\n\\n### \uD2B9\uC9D5\\n\\
1n- Debezium \uC740 Log Based CDC \uC774\uB2E4.\\n- \uBAA8\uB4E0 \uB370\uC774\uD130 \uBCC0\uACBD\uC774 \uCEA1\uCC98\uB41C\uB2E4\\n- Data Model \uBCC0\uACBD\uC774 \uD544\uC694 \uC5C6\uB2E4\\n- \uBCC0\uACBD \uBFD0\uB9CC \uC544\uB2C8\uB77C \uC0AD\uC81C\uB3C4 \uCEA1\uCC98\uD55C\uB2E4\\n- \uB808\uCF54\uB4DC\uC758 \uACFC\uAC70 \uC0C1\uD0DC\uB3C4 \uCEA1\uCC98\uAC00 \uAC00\uB2A5\uD558\uB2E4.\\n\\n### \uAE30\uB2A5\\n\\n- Snapshots: \uCEE4\uB125\uD130\uAC00 \uC2DC\uC791\uB420 \uB54C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC758 \uD604\uC7AC \uC0C1\uD0DC\uC5D0 \uB300\uD55C \uCD08\uAE30 \uC2A4\uB0C5\uC0F7\uC744 \uC0DD\uC131\uD560 \uC218 \uC788\uB2E4.\\n- Filters: \uD2B9\uC815 \uD14C\uC774\uBE14\uC774\uB098 \uCEEC\uB7FC\uC758 \uBCC0\uACBD\uB9CC \uCEA1\uCC98\uD560 \uC218 \uC788\uB2E4\\n- Masking: \uBBFC\uAC10\uD55C \uC815\uBCF4\uC758 \uACBD\uC6B0 \uD2B9\uC815 \uCEEC\uB7FC\uC744 \uB9C8\uC2A4\uD0B9\uCC98\uB9AC \uD560 \uC218 \uC788\uB2E4\\n- Message Transformation\\n  - Topic Routing\\n    - \uC774 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uBA74 \uD1A0\uD53D\uC758 \uC774\uB984\uC744 \uBCC0\uACBD\uD558\uAC70\uB098, \uC5EC\uB7EC\uAC1C\uC758 \uD14C\uC774\uBE14\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uD558\uB098\uC758 \uD1A0\uD53D\uC73C\uB85C \uC804\uB2EC\uD560 \uC218 \uC788\uB2E4\\n  - New Record State Extraction\\n  - Outbox Event Router\\n  - Message Filtering\\n  - Content-Based Routing\\n\\n### \uC544\uD0A4\uD14D\uCC98\\n\\n#### Kafka Connect\\n\\n![Kafka Connect (1)](./image-1.png)\\n\\n- Kafka Connect \uB294 Kafka Broker \uC640 \uBCC4\uB3C4\uC758 \uC11C\uBE44\uC2A4\uB85C \uC6B4\uC601\uB41C\uB2E4\\n- \uAE30\uBCF8\uC801\uC73C\uB85C \uD55C \uD14C\uC774\uBE14\uC758 \uBCC0\uACBD \uC0AC\uD56D\uC740 \uD558\uB098\uC758 \uD1A0\uD53D\uC73C\uB85C \uC804\uB2EC\uB41C\uB2E4\\n- MySQL \uC758 \uACBD\uC6B0 binlog \uC5D0 \uC811\uADFC\uD558\uC5EC \uB370\uC774\uD130\uB97C \uAC00\uC838\uC628\uB2E4\\n- PostgreSQL \uC758 \uACBD\uC6B0 Logical Replication Stream \uC5D0\uC11C \uB370\uC774\uD130\uB97C \uAC00\uC838\uC628\uB2E4\\n- Source Connector \uC5D0\uC11C \uAC00\uC838\uC628 \uC815\uBCF4\uB4E4\uC744 Sink Connector \uB97C \uD1B5\uD574\uC11C ElasticSearch, Redis, Data Warehouse \uB4F1\uC5D0 \uBC18\uC601\uD560 \uC218 \uC788\uB2E4.\\n\\n#### Debezium Server\\n\\n![Kafka Connect (1)](./image-2.png)\\n\\n- Kafka Connector \uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uACE0 [Debezium Server](https://debezium.io/documentation/reference/stable/operations/debezium-server.html) \uB97C \uC774\uC6A9\uD574\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4.\\n- Debezium Server \uB294 Source Connector \uC911 \uD558\uB098\uB97C \uC0AC\uC6A9\uD558\uC5EC Source Database \uC758 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uCEA1\uCC98\uD558\uB3C4\uB85D \uAD6C\uC131\uD55C\uB2E4.\\n- \uBCC0\uACBD\uB41C \uC774\uBCA4\uD2B8\uB294 JSON, Apache Avro \uC640 \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC9C1\uB82C\uD654 \uD560 \uC218 \uC788\uC73C\uBA70 Kinesis, Google Pub/Sub, Redis \uB4F1\uC5D0 \uBA54\uC2DC\uC9C0\uB97C \uC804\uB2EC\uD560 \uC218 \uC788\uB2E4\\n\\n#### Embedded Engine\\n\\n- Kafka Connect \uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uACE0 Embedded Engine \uC744 \uC0AC\uC6A9\uD558\uC5EC \uC790\uBC14 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB85C\uB3C4 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4.\\n  - [Embedded Engine](https://debezium.io/documentation/reference/stable/development/engine.html) \uC740 \uBCC0\uACBD \uC774\uBCA4\uD2B8\uB97C \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uBC14\uB85C Consuming \uD558\uAC70\uB098 \uBCC0\uACBD \uB0B4\uC5ED\uC744 \uBCC4\uB3C4\uC758 \uBA54\uC2DC\uC9C0 \uBE0C\uB85C\uCEE4(e.g Amazon Kinesis) \uC5D0 \uC804\uB2EC\uD560 \uB54C \uC720\uC6A9\uD558\uB2E4.\\n\\n### \uB85C\uADF8 \uAE30\uBC18\uC758 CDC \uC758 \uC7A5\uC810\\n\\n1. \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uCEA1\uCC98\uD560 \uC218 \uC788\uB2E4\\n   - \uB85C\uADF8 \uAE30\uBC18\uC73C\uB85C \uB370\uC774\uD130\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC624\uAC8C\uB418\uBA74 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C\uB294 \uC815\uD655\uD55C \uC21C\uC11C\uB300\uB85C \uB370\uC774\uD130\uC758 \uBCC0\uD654\uB97C \uAC10\uC9C0\uD560 \uC218 \uC788\uB2E4.\\n   - \uD3F4\uB9C1 \uAE30\uBC18\uC758 \uB370\uC774\uD130 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uAC00\uC838\uC624\uAC8C \uB420 \uACBD\uC6B0 \uCD5C\uC2E0 \uB370\uC774\uD130\uB9CC \uAC00\uC838\uC624\uAC8C \uB418\uBA70, \uB2E4\uC6B4\uD0C0\uC784\uC774 \uBC1C\uC0DD \uD588\uC744 \uB54C\uB294 \uB370\uC774\uD130\uB97C \uBABB\uAC00\uC838\uC628\uB2E4.\\n1. CPU \uBD80\uD558\uAC00 \uC801\uACE0, \uC9C0\uC5F0 \uC2DC\uAC04\uC774 \uC801\uB2E4\\n   - \uCFFC\uB9AC\uB97C \uC8FC\uAE30\uC801\uC73C\uB85C \uC694\uCCAD\uD558\uC9C0 \uC54A\uC544\uB3C4 \uB418\uAE30 \uB54C\uBB38\uC5D0 CPU\uB97C \uAC70\uC758 \uC0AC\uC6A9\uD558\uC9C0 \uD558\uC9C0 \uC54A\uC73C\uBA70, \uC2E4\uC2DC\uAC04\uC5D0 \uAC00\uAE4C\uC6B4 \uB370\uC774\uD130 \uBCC0\uACBD\uC5D0 \uB300\uC751\uD560 \uC218 \uC788\uB2E4.\\n1. \uB370\uC774\uD130 \uBAA8\uB378\uC5D0 \uC601\uD5A5\uC774 \uC5C6\uB2E4\\n   - \uD3F4\uB9C1 \uAE30\uBC18\uC758 CDC \uB294 \uB9C8\uC9C0\uB9C9 \uD3F4\uB9C1 \uC774\uD6C4 \uBCC0\uACBD\uB41C \uB808\uCF54\uB4DC\uB97C \uC2DD\uBCC4\uD558\uAE30 \uC704\uD574 `LAST_UPDATE_TIMESTAMP` \uC640 \uAC19\uC740 \uC815\uBCF4\uB4E4\uC744 \uCD94\uAC00\uD574\uC57C\uB418\uC9C0\uB9CC, \uB85C\uADF8 \uAE30\uBC18\uC758 CDC \uB294 \uADF8\uB7F0\uAC8C \uD544\uC694 \uC5C6\uB2E4.\\n1. \uC0AD\uC81C\uB41C \uB370\uC774\uD130\uB97C \uCEA1\uCC98\uD560 \uC218 \uC788\uB2E4.\\n1. \uC774\uC804 \uB808\uCF54\uB4DC\uC758 \uC0C1\uD0DC\uC640 \uBA54\uD0C0 \uB370\uC774\uD130\uB97C \uCEA1\uCC98\uD560 \uC218 \uC788\uB2E4\\n   - \uB370\uC774\uD130\uAC00 \uC5C5\uB370\uC774\uD2B8 \uB418\uC5C8\uC744 \uB54C, \uC774\uC804 \uC0C1\uD0DC\uC758 \uB808\uCF54\uB4DC \uC0C1\uD0DC\uB97C \uAC00\uC838\uC62C \uC218 \uC788\uB2E4\\n   - \uB85C\uADF8 \uAE30\uBC18 CDC \uB294 Schema Change Stream \uC744 \uC81C\uACF5\uD558\uACE0 Transaction ID \uB610\uB294 \uC0AC\uC6A9\uC790\uAC00 \uD2B9\uC815 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uC801\uC6A9\uD55C \uAC83\uACFC \uAC19\uC740 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uAC00\uC838\uC62C \uC218 \uC788\uB2E4.\\n\\n### \uC0AC\uC6A9 \uBC29\uBC95\\n\\n- [Debezium c
1onnector for MySQL](https://debezium.io/documentation/reference/stable/connectors/mysql.html)\\n\\n## MSK Connector\\n\\n- MSK Connector \uB294 Kafka Connect \uB97C \uC880 \uB354 \uC27D\uAC8C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4.\\n- `21.02.18` \uAE30\uC900\uC73C\uB85C Kafka Connect 2.7.1 \uBC84\uC804\uC744 \uC0AC\uC6A9\uD558\uACE0 \uC788\uB2E4\\n\\n### \uC81C\uACF5\uD558\uB294 \uAE30\uB2A5\\n\\n- \uCEE4\uB125\uD130\uC758 \uC804\uC1A1 \uC0C1\uD0DC \uBAA8\uB2C8\uD130\uB9C1\\n- \uD558\uB4DC\uC6E8\uC5B4 \uD328\uCE58\\n- \uCC98\uB7C9 \uBCC0\uD654\uC5D0 \uB9DE\uCD98 \uC624\uD1A0 \uC2A4\uCF00\uC77C\uB9C1\\n- Kafka Connect \uC640 \uC644\uBCBD\uD55C \uD638\uD658 \uC81C\uACF5\\n- MSK \uC678\uC5D0 On-Demand Kafka Cluster \uC9C0\uC6D0\\n- \uADF8 \uC678 \uC0AC\uC6A9\uD558\uAE30 \uC190\uC27D\uAC8C \uB9CC\uB4E4\uC5B4\uC8FC\uB294 \uC644\uC804 \uAD00\uB9AC\uD615 \uC11C\uBE44\uC2A4\\n\\n### MSK Connector \uC544\uD0A4\uD14D\uCC98\\n\\n![Kafka Connect (1)](./image-3.webp)\\n\\n### \uC0AC\uC6A9 \uBC29\uBC95\\n\\n- [Amazon MSK Connect - Apache Kafka \uD074\uB7EC\uC2A4\uD130\uB85C \uB370\uC774\uD130 \uC804\uB2EC \uC11C\uBE44\uC2A4 \uCD9C\uC2DC \\\\| Amazon Web Services](https://aws.amazon.com/ko/blogs/korea/introducing-amazon-msk-connect-stream-data-to-and-from-your-apache-kafka-clusters-using-managed-connectors/)"},{"id":"cloudfront-dynamic-contents","metadata":{"permalink":"/blog/cloudfront-dynamic-contents","source":"@site/blog/2021-10-21-cloudfront-dynamic-contents/index.md","title":"CloudFront \uB85C Dynamic Contents \uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720","description":"URL Pattern \uC744 \uC774\uC6A9\uD574\uC11C \uAE30\uBCF8 \uBAA8\uB4E0 Request \uB294 Dynamic Content ( API \uC11C\uBC84 ) \uCABD\uC73C\uB85C \uD638\uCD9C\uB418\uAC8C \uD55C\uB2E4","date":"2021-10-21T00:00:00.000Z","tags":[{"inline":false,"label":"AWS","permalink":"/blog/tags/aws"}],"readingTime":1.11,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"CloudFront \uB85C Dynamic Contents \uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720","slug":"cloudfront-dynamic-contents","date":"2021-10-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["aws"],"description":"URL Pattern \uC744 \uC774\uC6A9\uD574\uC11C \uAE30\uBCF8 \uBAA8\uB4E0 Request \uB294 Dynamic Content ( API \uC11C\uBC84 ) \uCABD\uC73C\uB85C \uD638\uCD9C\uB418\uAC8C \uD55C\uB2E4"},"unlisted":false,"prevItem":{"title":"Kafka Connect (1)","permalink":"/blog/kafka-connect-1"},"nextItem":{"title":"KAFKA \uBB34\uC791\uC815 \uB530\uB77C\uD558\uAE30 (1)","permalink":"/blog/kafka-getting-started-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## CloudFront \uB85C \uB3D9\uC801 \uCEE8\uD150\uCE20\uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720\\n\\n### 1. \uAC04\uD3B8\uD55C \uC124\uC815 ( Simple Configuration )\\n\\n- URL Pattern \uC744 \uC774\uC6A9\uD574\uC11C \uAE30\uBCF8 \uBAA8\uB4E0 Request \uB294 Dynamic Content ( API \uC11C\uBC84 ) \uCABD\uC73C\uB85C \uD638\uCD9C\uB418\uAC8C \uD55C\uB2E4\\n- \uD2B9\uC815 \uD328\uD134 (e.g `/error/*`, `/assets/*` ) \uC758 URL \uB4E4\uC740 Static Content ( S3 ) \uCABD\uC73C\uB85C \uD638\uCD9C\uB418\uAC8C \uD55C\uB2E4.\\n- \uC774 \uBAA8\uB4E0 \uC124\uC815\uB4E4\uC740 CloudFront Behaviros \uC5D0\uC11C \uAC04\uB2E8\uD558\uAC8C \uC124\uC815\uB9CC \uD558\uBA74 \uB41C\uB2E4\\n\\n### 2. DDoS Mitigation + WAF\\n\\n- CDN \uC744 \uC0AC\uC6A9\uD558\uAC8C \uB418\uBA74 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uC5BB\uC744 \uC218 \uC788\uB294 \uC7A5\uC810\uC73C\uB85C Attacker \uAC00 Attack \uD558\uAE30 \uC5B4\uB835\uB2E4\\n  - \uACF5\uACA9\uD558\uB294 \uC9C0\uC5ED\uC758 Edge \uC5D0 \uB300\uD574 \uACF5\uACA9\uC774 \uAC00\uAC8C \uB418\uAE30 \uB54C\uBB38\uC774\uB2E4\\n- \uD2B9\uC815 \uC0AC\uC774\uD2B8\uC5D0\uC11C \uC870\uC0AC\uD588\uC744 \uB54C 80% \uC758 \uD2B8\uB798\uD53D\uC740 L3, L4 \uC758 Flood Attack, 20% \uC758 \uD2B8\uB798\uD53D\uC740 L7 \uC758 Valid HTTP Request \uC774\uB2E4.\\n  - CloudFront \uB97C \uC124\uC815\uD558\uBA74 \uC57D 80% \uC815\uB3C4\uC758 \uACF5\uACA9\uC740 Origin \uC11C\uBC84\uAE4C\u
1C9C0 \uC694\uCCAD\uC774 \uB418\uC9C0 \uC54A\uAE30 \uB54C\uBB38\uC5D0 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uBC29\uC5B4\uAC00 \uB41C\uB2E4\\n- WAF ( Web Application Firewall )\\n  - CloudFront \uC640 WAF \uB97C \uC0AC\uC6A9\uD558\uC5EC 20% \uD2B8\uB798\uD53D \uC911 \uACF5\uACA9\uB4E4\uC744 \uD0D0\uC9C0\uD558\uACE0 \uBC29\uC5B4\uD560 \uC218 \uC788\uB2E4\\n\\n### 3. Cost Saving\\n\\n- AWS \uB294 InBound \uB294 Free, OutBound \uB294 \uBE44\uC6A9\uC774 \uC11C\uBE44\uC2A4\uB9C8\uB2E4 \uB2E4 \uB2E4\uB984\\n- S3, ELB \uC5D0\uC11C CloudFront Edge \uB85C \uAC00\uB294 OutBound \uB294 \uBB34\uB8CC\\n- \uAE30\uBCF8\uC801\uC73C\uB85C \uACC4\uC57D\uC5D0 \uB530\uB77C \uB2E4\uB97C \uC218 \uC788\uC9C0\uB9CC, CloudFront OutBound \uBE44\uC6A9\uC740 \uC800\uB834\uD574\uC9C4\uB2E4 ( DataTrasnferOut Pricing )\\n\\n### 4. Speed Up\\n\\n- \uAC01 \uC9C0\uC5ED\uC5D0 \uC788\uB294 \uC0AC\uC6A9\uC790\uB4E4\uC740 Edge \uB85C \uC694\uCCAD\uC744 \uD558\uAC8C\uB418\uB294\uB370, Edge \uD558\uACE0 AWS Region \uAC04\uC758 \uB124\uD2B8\uC6CC\uD06C\uB294 Optimize \uB418\uC5B4 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uD37C\uBE14\uB9AD\uB9DD\uC744 \uC774\uC6A9\uD558\uB294\uAC83\uBCF4\uB2E4 \uD6E8\uC52C \uBE60\uB974\uB2E4\\n- AWS CDN Edge, AWS Network \uB294 \uB0B4\uBD80\uC801\uC73C\uB85C \uCD5C\uC801\uD654\uB41C \uBC31\uBCF8\uB9DD\uC744 \uC774\uC6A9\uD558\uAE30 \uB54C\uBB38\uC5D0 Public Network \uB97C \uC0AC\uC6A9\uD558\uB294\uAC83\uBCF4\uB2E4 \uD6E8\uC52C \uBE60\uB978 \uC131\uB2A5\uC744 \uC5BB\uC744 \uC218 \uC788\uB2E4\\n- CloudFront \uB791 Origin \uC740 Keep Alive Connection \uC744 \uC720\uC9C0\uD558\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uC131\uB2A5\uC0C1 \uC774\uC810\uC744 \uAC00\uC9C8 \uC218 \uC788\uB2E4\\n\\n  ![CloudFront \uB85C Dynamic Contents \uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720](./image-1.webp)\\n\\n### 5. Shield Origin Contents\\n\\n- Amazon S3\\n  - Object Access Identify ( OAI )\\n  - S3 \uC5D0 \uC9C1\uC811 \uB2E4\uC6B4\uB85C\uB4DC \uD558\uB294 \uD2B8\uB798\uD53D\uC744 \uCC28\uB2E8\uD560 \uC218 \uC788\uC74C\\n- Custom Origin\\n  - Block by IP Address\\n  - ELB \uB85C \uC9C1\uC811 \uC694\uCCAD\uD558\uB294 \uD2B8\uB798\uD53D\uC740 \uCC28\uB2E8\uD560 \uC218 \uC788\uC74C\\n  - CloudFront \uC758 IP Range \uB294 Public \uD558\uAC8C \uACF5\uAC1C\uD558\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 Security Group \uC73C\uB85C CloudFront IP Range \uB9CC \uD5C8\uC6A9\uD558\uBA74\uB428\\n  - CloudFront \uC544\uC774\uD53C \uB300\uC5ED\uD3ED\uC774 \uBCC0\uACBD\uB41C \uACBD\uC6B0 Amazon SNS \uB85C \uC804\uB2EC\uD558\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 AWS Lambda \uC640 \uC5F0\uB3D9\uD558\uC5EC \uC790\uB3D9\uC73C\uB85C \uC5C5\uB370\uC774\uD2B8\uD560 \uC218 \uC788\uB3C4\uB85D \uAD6C\uC131\uD560 \uC218 \uC788\uC74C\\n\\n## \uCC38\uACE0\\n\\n- [AWS CLOUD Gaming 2. CloudFront\uB85C \uB3D9\uC801 \uCEE8\uD150\uCE20\uB97C \uC804\uC1A1\uD558\uB294 \uB124\uAC00\uC9C0 \uC774\uC720\uC640 Aurora\uB294 \uC5B4\uB5BB\uAC8C \uB2E4\uB978\uAC00](https://www.youtube.com/watch?v=pGnLH7C8dYk)"},{"id":"kafka-getting-started-1","metadata":{"permalink":"/blog/kafka-getting-started-1","source":"@site/blog/2021-04-20-kafka-getting-started-1/index.md","title":"KAFKA \uBB34\uC791\uC815 \uB530\uB77C\uD558\uAE30 (1)","de
1scription":"\uCD5C\uADFC\uC5D0 \uD50C\uB7AB\uD3FC\uC744 \uAD6C\uCD95\uD558\uB2E4\uAC00 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uBCC0\uACBD\uB41C \uB370\uC774\uD130\uB97C \uAC00\uC838\uC640\uC57C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uCC3E\uC544\uBCF4\uB2E4\uAC00 Kafka + MongoDB Change Stream\uC744 \uD65C\uC6A9\uD558\uBA74 \uB418\uACA0\uB2E4\uB294 \uC0DD\uAC01\uC774 \uB4E4\uC5B4 \uCC3E\uC544\uBCF4\uAC8C \uB418\uC5C8\uB2E4.","date":"2021-04-20T00:00:00.000Z","tags":[{"inline":false,"label":"Kafka","permalink":"/blog/tags/kafka"}],"readingTime":2.57,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"KAFKA \uBB34\uC791\uC815 \uB530\uB77C\uD558\uAE30 (1)","slug":"kafka-getting-started-1","date":"2021-04-20T00:00:00.000Z","authors":["dongmyeong"],"tags":["kafka"],"description":"\uCD5C\uADFC\uC5D0 \uD50C\uB7AB\uD3FC\uC744 \uAD6C\uCD95\uD558\uB2E4\uAC00 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uBCC0\uACBD\uB41C \uB370\uC774\uD130\uB97C \uAC00\uC838\uC640\uC57C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uCC3E\uC544\uBCF4\uB2E4\uAC00 Kafka + MongoDB Change Stream\uC744 \uD65C\uC6A9\uD558\uBA74 \uB418\uACA0\uB2E4\uB294 \uC0DD\uAC01\uC774 \uB4E4\uC5B4 \uCC3E\uC544\uBCF4\uAC8C \uB418\uC5C8\uB2E4."},"unlisted":false,"prevItem":{"title":"CloudFront \uB85C Dynamic Contents \uB97C \uC804\uC1A1\uD558\uB294 \uC774\uC720","permalink":"/blog/cloudfront-dynamic-contents"},"nextItem":{"title":"Data Lake \uB780?","permalink":"/blog/what-is-data-lake"}},"content":"\x3c!-- truncate --\x3e\\n\\n\uCD5C\uADFC\uC5D0 \uD50C\uB7AB\uD3FC\uC744 \uAD6C\uCD95\uD558\uB2E4\uAC00 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uBCC0\uACBD\uB41C \uB370\uC774\uD130\uB97C \uAC00\uC838\uC640\uC57C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uCC3E\uC544\uBCF4\uB2E4\uAC00 Kafka + MongoDB Change Stream\uC744 \uD65C\uC6A9\uD558\uBA74 \uB418\uACA0\uB2E4\uB294 \uC0DD\uAC01\uC774 \uB4E4\uC5B4 \uCC3E\uC544\uBCF4\uAC8C \uB418\uC5C8\uB2E4.\\n\\nKafka\uB294 \uAE30\uC874\uBD80\uD130 \uAD00\uC2EC\uC774 \uB9CE\uC558\uC5C8\uC9C0\uB9CC, \uC0AC\uB840\uB4E4\uC744 \uCC3E\uB2E4 \uBCF4\uB2C8 \uB354 \uC88B\uC744\uAC70 \uAC19\uB2E4\uB294 \uD310\uB2E8\uC774 \uB4E4\uC5B4 \uD074\uB7EC\uC2A4\uD130\uB97C \uB744\uC6CC\uBCF4\uAE30\uB85C \uD588\uB2E4.\\n\\n\uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C\uB294 docker-compose\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC190\uC27D\uAC8C \uB744\uC6E0\uC9C0\uB9CC, \uC2E4\uC81C AWS EC2 \uC704\uC5D0\uC11C docker\uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uACE0 \uB744\uC6B0\uB824\uACE0 \uD558\uB2E4 \uBCF4\uB2C8 \uC0BD\uC9C8\uD558\uB294 \uC0C1\uD669\uC774 \uB9CE\uC774 \uC0DD\uACA8\uC11C \uC815\uB9AC\uD574\uB450\uB824\uACE0 \uD55C\uB2E4.\\n\\nConfluent Community License\uC5D0 \uD3EC\uD568\uB41C **REST Proxy**, **ksqldB**, **Schema Registry** \uAE4C\uC9C0 \uC801\uC6A9\uD574\uBCF4\uB824\uACE0 \uD55C\uB2E4.\\n\\n## kafka \uBB34\uC791\uC815 \uB530\uB77C\uD558\uAE30\\n\\n### \uAE30\uBCF8 \uC124\uCE58\\n\\n#### openjdk \uC124\uCE58\\n\\n```text\\n$ cd /opt\\n$ wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz\\n$ tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz\\n$ sudo ln -s /opt/jdk-11 /usr/local/java\\n```\\n\\n#### confluent community \uC124\uCE58\\n\\n```text\\n$ curl -O http://packages.confluent.io/archive/6.1/confluent-community-6.1.1.tar.gz\\n$ tar -zxvf confluent-community-6.1.1.tar.gz\\n$ mv confluent-6.1.1/ confluent\\n$ sudo ln -s /opt/confluent /usr/local/confluent\\n```\\n\\n#### PATH \uC124\uC815\\n\\n```text\\n$ sudo vim /etc/profile\\nexport JAVA_HOME=/usr/local/java\\nexport PATH=$PATH:$JAVA_HOME/bin:/usr/local/confluent/bin\\n```\\n\\n### \uC124\uC815 \uD30C\uC77C\\n\\n#### /var/lib/zookeeper/myid\\n\\n```text\\n1\\n```\\n\\n- `sudo sh -c \\"echo 1 > /var/lib/zookeeper/myid\\"`\\n- `1` \uBD80\uBD84\uC740 \uAC01 zookeeper \uC11C\uBC84\uB9C8\uB2E4 \uB2E4\uB974\uAC8C \uC124\uC815\uD574\uC57C \uD55C\uB2E4\\n\\n#### /etc/hosts\\n\\n```text\\n0.
10.0.0 zookeeper-1\\n{PRIVATE-IP-1} zookeeper-2\\n{PRIVATE-IP-2} zookeeper-3\\n\\n0.0.0.0 broker-1\\n{PRIVATE-IP-2} broker-2\\n{PRIVATE-IP-3} broker-3\\n```\\n\\n- `sudo vim /etc/hosts` \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uD55C \uD6C4 \uB9E8 \uC544\uB798\uC5D0 \uB0B4\uC6A9\uC744 \uCD94\uAC00\uD55C\uB2E4\\n\\n#### /usr/local/confluent/etc/kafka/zookeeper.properties\\n\\n```text\\ndataDir=/var/lib/zookeeper\\nmaxClientCnxns=0\\nadmin.enableServer=false\\ninitLimit=5\\nsyncLimit=2\\nserver.1=zookeeper-1:2888:3888\\nserver.2=zookeeper-2:2888:3888\\nserver.3=zookeeper-3:2888:3888\\n```\\n\\n#### /usr/local/confluent/etc/kafka/server.properties\\n\\n```text\\n######### \uAC01 \uC11C\uBC84\uB9C8\uB2E4 \uACE0\uC720\uD55C ID \uAC12\uC744 \uC124\uC815\uD574\uC57C\uD55C\uB2E4. #########\\nbroker.id=0\\n###################################################\\n\\nlisteners=INTERNAL://0.0.0.0:19092,EXTERNAL://0.0.0.0:9092\\n\\n# EC2 \uC758 Public IP \uB97C \uC124\uC815\uD574\uC57C \uD55C\uB2E4.\\nadvertised.listeners=INTERNAL://:19092,EXTERNAL://{MY-PUBLIC-IP}:9092\\n\\nlistener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT\\ninter.broker.listener.name=INTERNAL\\n\\n# \uD1A0\uD53D \uC790\uB3D9 \uC0DD\uC131 \uC635\uC158\uC740 \uAEBC\uB450\uB294\uAC8C \uC88B\uB2E4\\nauto.create.topics.enable=false\\n\\n# \uD1A0\uD53D \uC0AD\uC81C \uD65C\uC131\uD654\\ndelete.topic.enable=true\\n\\nzookeeper.connect=zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181\\n```\\n\\n#### /usr/local/confluent/etc/kafka-rest/kafka-rest.properties\\n\\n```text\\nzookeeper.connect=zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181\\n```\\n\\n#### /usr/local/confluent/etc/schema-registry/schema-registry.properties\\n\\n```text\\nlisteners=http://0.0.0.0:8081\\nkafkastore.connection.url=zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181\\nkafkastore.topic=_schemas\\n```\\n\\n#### /usr/local/confluent/etc/kafka/connect-distributed.properties\\n\\n```text\\nbootstrap.servers=broker-1:9092,broker-2:9092,broker-3:9092\\ngroup.id=connect-connect-group\\n\\nkey.converter=org.apache.kafka.connect.storage.StringConverter\\nkey.converter.schemas.enable=true\\n\\nvalue.converter=io.confluent.connect.avro.AvroConverter\\nvalue.converter.schemas.enable=true\\nvalue.converter.schema.registry.url=http://kafka.private.ddocdoc.kr:8081\\n\\nrest.host.name=0.0.0.0\\nrest.port=8083\\n```\\n\\n### \uC2E4\uD589\uD558\uAE30\\n\\n#### zookeeper\\n\\n- \uC2E4\uD589\uD558\uAE30\\n\\n  ```text\\n  $ zookeeper-server-start -daemon /usr/local/confluent/etc/kafka/zookeeper.properties\\n  ```\\n- \uC885\uB8CC\uD558\uAE30\\n\\n  ```text\\n  $ zookeeper-server-stop\\n  ```\\n\\n#### kafka\\n\\n- \uC2E4\uD589\uD558\uAE30\\n\\n  ```text\\n  $ kafka-server-start -daemon /usr/local/confluent/etc/kafka/server.properties\\n  ```\\n- \uC885\uB8CC\uD558\uAE30\\n\\n  ```text\\n  $ kafka-server-stop\\n  ```\\n\\n#### schema-registry\\n\\n- \uC2E4\uD589\uD558\uAE30\\n\\n  ```text\\n  $ schema-registry-start -daemon /usr/local/confluent/etc/schema-registry/schema-registry.properties\\n  ```\\n- \uC885\uB8CC\uD558\uAE30\\n\\n  ```text\\n  $ schema-registry-stop\\n  ```\\n\\n#### kafka-rest\\n\\n- \uC2E4\uD589\uD558\uAE30\\n\\n  ```text\\n  $ kafka-rest-start -daemon /usr/local/confluent/etc/kafka-rest/kafka-rest.properties\\n  ```\\n- \uC885\uB8CC\uD558\uAE30\\n\\n  ```text\\n  $ kafka-rest-stop\\n  ```\\n\\n#### kafka-connect\\n\\n- \uC2E4\uD589\uD558\uAE30\\n\\n  ```text\\n  $ connect-distributed -daemon /usr/local/confluent/etc/kafka/connect-distributed.properties\\n  ```\\n\\n### \uC8FC\uC758\uC0AC\uD56D\\n\\n~~confluent \uAC00\uC774\uB4DC\uB9CC \uBCF4\uACE0 \uB530\uB77C\uD558\uB2E4\uAC00 \uBC29\uD654\uBCBD \uB4F1\uC744 \uC0DD\uAC01\uD558\uC9C0 \uC54A\uC544\uC11C \uD558\uB8E8\uC815\uB3C4 \uC0BD\uC9C8\uC744 \uD588\uB2E4\uACE0 \uD55C\uB2E4.~~\\n\\n\uC11C\uBC84\uB97C \uC2E4\uD589\uD560 \uB54C -daemon \uC635\uC158\uC744 \uC81C\uAC70\uD558\uACE0 \uC2E4\uD589\uD574\uBCF8 \uD6C4, \uC815\uC0C1 \uB3D9\uC791\uC744 \uD655\uC778\uD55C \uD6C4 `-daemon` \uC635\uC158\uC744 \uC124\uC815\uD558\uB294 \uAC83\uC774 \uD3B8\uD558\uB2E4.\\n\\n#### Security Group\\n\\nAWS EC2 \uC704\uC5D0 \uC124\uCE58\uB97C \uC644\uB8CC\uD588\uB2E4\uBA74, \uC2E4\uD589\uD558\uAE30 \uC804\uC5D0 \uBC18\uB4DC\uC2DC Security Group\uC744 \uD655\uC778\uD574\uC918\uC57C \uD558\uBA70, \uC544\uB798\uC758 \uD3EC\uD2B8\uB4E4\uC774 \uC5F4\uB824\uC788\uC5B4\uC57C \uD55C\uB2E4.\\n\\n\uC5F0\uACB0\uC740 \uB418\uB294\uB370 console-consumer \uD639\uC740 console-producer\uB97C \uC0AC\uC6A9\uD560 \uB54C `LEADER_NOT_AVAILABLE` \uC5D0\uB7EC\uB97C \uBC1C\uACAC\uD558\uAC8C \uB418\uBA74 \uC544\uB798 \uD3EC\uD2B8\uB4E4\uB85C \uC815\uC0C1 \uD1B5\uC2E0\uC774 \uAC00\uB2A5\uD55C\uC9C0 \uD655\uC778\uD574\uBD10\uC57C \uD55C\uB2E4.\\n\\n- `TCP 2888`: zookeeper sync\\n- `TCP 3888`: zookeeper leader\\n- `TCP 2181`: zookeeper client\\n- `TCP 9092`: kafka broker\\n- `TCP 8082`: kafka-rest\\n- `TCP 8083`: kafka-connect\\n- `TCP 8081`: schema-registry\\n\\
1n### cli \uBA85\uB839\uC5B4\\n\\n#### kafka-topics\\n\\n```text\\n// \uD1A0\uD53D \uC0DD\uC131\\n$ kafka-topics --create --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181 --topic test-1 --partitions 1 --replication-factor 3\\n\\n// \uD1A0\uD53D \uBAA9\uB85D \uC870\uD68C\\n$ kafka-topics --list --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181\\n\\n// \uD1A0\uD53D \uC870\uD68C\\n$ kafka-topics --describe --zookeeper zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181 --topic test-1\\n\\n// \uD1A0\uD53D \uC0AD\uC81C\\n$ kafka-topics --delete --zookeeper {IP}:2181 --topic test-1\\n```\\n\\n#### kafka-console-consumer\\n\\n```text\\n$ kafka-console-consumer --bootstrap-server {IP}:9092 --topic test-1\\n```\\n\\n#### kafka-console-producer\\n\\n```text\\n$ kafka-console-producer --bootstrap-server {IP}:9092 --topic test-1\\n> Hello\\n> World\\n```\\n\\n#### kafka-connector topic \uB9CC\uB4E4\uAE30\\n\\n```text\\n$ kafka-topics --create --bootstrap-server {IP}:9092 --topic connect-configs --replication-factor 3 --partitions 1 --config cleanup.policy=compact\\n\\n$ kafka-topics --create --bootstrap-server {IP}:9092 --topic connect-offsets --replication-factor 3 --partitions 50 --config cleanup.policy=compact\\n\\n$ kafka-topics --create --bootstrap-server {IP}:9092 --topic connect-status --replication-factor 3 --partitions 10 --config cleanup.policy=compact\\n```"},{"id":"what-is-data-lake","metadata":{"permalink":"/blog/what-is-data-lake","source":"@site/blog/2021-03-15-what-is-data-lake/index.md","title":"Data Lake \uB780?","description":"\uB370\uC774\uD130 \uB808\uC774\uD06C\uB294 \uC815\uD615 \uB370\uC774\uD130, \uBC18\uC815\uD615 \uB370\uC774\uD130, \uBE44\uC815\uD615 \uB370\uC774\uD130 \uB4E4\uC744 \uAD6C\uBD84\uD558\uC9C0 \uC54A\uACE0 \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uC800\uC7A5\uD55C\uB2E4","date":"2021-03-15T00:00:00.000Z","tags":[{"inline":false,"label":"\uC778\uD504\uB77C","permalink":"/blog/tags/infra"}],"readingTime":1.11,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Data Lake \uB780?","slug":"what-is-data-lake","date":"2021-03-15T00:00:00.000Z","authors":["dongmyeong"],"tags":["infra"],"description":"\uB370\uC774\uD130 \uB808\uC774\uD06C\uB294 \uC815\uD615 \uB370\uC774\uD130, \uBC18\uC815\uD615 \uB370\uC774\uD130, \uBE44\uC815\uD615 \uB370\uC774\uD130 \uB4E4\uC744 \uAD6C\uBD84\uD558\uC9C0 \uC54A\uACE0 \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uC800\uC7A5\uD55C\uB2E4"},"unlisted":false,"prevItem":{"title":"KAFKA \uBB34\uC791\uC815 \uB530\uB77C\uD558\uAE30 (1)","permalink":"/blog/kafka-getting-started-1"},"nextItem":{"title":"AWS Glue \uB85C\uCEEC\uC5D0\uC11C \uC2E4\uD589","permalink":"/blog/aws-glue-local"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Data Lake \uB780?\\n\\n### Data Lake \uB780 \uBB34\uC5C7\uC778\uAC00?\\n\\n:::info\\n\\n\uC5D4\uD130\uD504\uB77C\uC774\uC988 \uD658\uACBD \uB0B4\uC758 \uB2E4\uC591\uD55C \uC18C\uC2A4\uB85C\uBD80\uD130 \uC6D0\uBCF8 \uB370\uC774\uD130\uB97C \uD76D\uB4DD, \uCC98\uB9AC, \uBD84\uC11D \uBC0F \uC81C\uACF5\uC744 \uD558\uB294 \uAC70\uB300\uD55C \uADDC\uBAA8\uC758 \uB370\uC774\uD130 \uC800\uC7A5\uC18C\\n\\n:::\\n\\n- \uB370\uC774\uD130 \uB808\uC774\uD06C\uB294 **\uC815\uD615 \uB370\uC774\uD130**, **\uBC18\uC815\uD615 \uB370\uC774\uD130**, **\uBE44\uC815\uD615 \uB370\uC774\uD130** \uB4E4\uC744 \uAD6C\uBD84\uD558\uC9C0 \uC54A\uACE0 \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uC800\uC7A5\uD55C\uB2E4\\n- \uB370\uC774\uD130 \uB808\uC774\uD06C\uB294 \uC628\uD504\uB808\uBBF8\uC2A4 \uB610\uB294 \uD074\uB77C\uC6B0\uB4DC \uC5D0 \uAD6C\uCD95\uB420 \uC218 \uC788\uB2E4.\\n- AWS \uC758 \uACBD\uC6B0 Amazon S3 \uB97C \uC8FC\uB85C \uC0AC\uC6A9\uD55C\uB2E4.\\n\\n### \uB370\uC774\uD130 \uB808\uC774\uD06C \uC7A5\uC810\\n\\n- \uC815\uBCF4 \uAE30\uBC18\uC758 \uC758\uC0AC \uACB0\uC815\uC5D0 \uB3C4\uC6C0\uC744 \uC904 \uC218 \uC788\uB2E4.\\n- \uB370\uC774\uD130 \uD3EC\uB9F7\uACFC \uAD00\uACC4\uC5C6\uC774 \uD55C\uACF3\uC758 \uB370\uC774\uD130 \uC800\uC7A5\uC18C\uC5D0\uC11C \uC218\uC9D1 & \uAD00\uB9AC\uB97C \uD560 \uC218 \uC788\uB2E4\\n- \uB370\uC774\uD130\uC758 \uC0AC\uC77C\uB85C \uBB38\uC81C\uB97C \uD574\uACB0\uD560 \uC218 \uC788\uB2E4.\\n\\n### \uB370\uC774\uD130 \uB808\uC774\uD06C\uC758 \uD750\uB984\\n\\n#### 1. \uB370\uC774\uD130 \uC218\uC9D1\\n\\n- \uB2E4\uC591\uD55C \uC18C\uC2A4\uB85C\uBD80\uD130 \uC6D0\uBCF8 \uB370\uC774\uD130 \uADF8\uB300\uB85C ( \uD639\uC740 \uCD5C\uC18C\uD55C\uC758 \uBCC0\uACBD\uC73C\uB85C ) \uB370\uC774\uD130\uB8F0 \uC218\uC9D1\uD55C\uB2E4.\\n\\n#### 2. \uB370\uC774\uD130 \uCC98\uB9AC\\n\\
1n- \uC218\uC9D1\uD55C \uB370\uC774\uD130\uB97C \uC694\uAD6C\uC0AC\uD56D\uC5D0 \uB9DE\uCDB0 \uAC00\uACF5\uD558\uC5EC \uBCC4\uB3C4\uC758 \uBAA8\uB378\uB85C \uCC98\uB9AC\uD55C\uB2E4\\n\\n#### 3. \uB370\uC774\uD130 \uCC98\uB9AC\\n\\n- \uB370\uC774\uD130 \uC694\uAD6C\uC0AC\uD56D\uC5D0 \uB9DE\uAC8C \uD544\uC694\uD55C \uD615\uD0DC\uB85C \uBD84\uC11D\uD55C\uB2E4\\n\\n#### 4. \uB370\uC774\uD130 \uC800\uC7A5\\n\\n- \uBD84\uC11D\uB41C \uB370\uC774\uD130\uB97C \uC801\uD569\uD55C \uB370\uC774\uD130 \uC800\uC7A5\uC18C\uC5D0 \uC800\uC7A5\uD55C\uB2E4.\\n\\n### \uB370\uC774\uD130 \uB808\uC774\uD06C \uC694\uAD6C\uC0AC\uD56D\\n\\n1. \uC218\uC9D1 \uB370\uC774\uD130\uB294 \uD55C \uACF3\uC5D0 \uC800\uC7A5\uD574\uC57C \uD55C\uB2E4.\\n1. \uC800\uC7A5 & \uCC98\uB9AC \uACF5\uAC04\uC774 \uC720\uC5F0 ( Scalable ) \uD574\uC57C \uD55C\uB2E4.\\n1. \uB370\uC774\uD130 \uC0DD\uC560 \uC8FC\uAE30 ( Data life Cycle ) \uC815\uC758\uAC00 \uAC00\uB2A5\uD574\uC57C \uD55C\uB2E4.\\n1. \uC548\uC815\uC801\uC73C\uB85C \uC11C\uBE44\uC2A4\uAC00 \uC6B4\uC601\uB418\uC5B4\uC57C \uD55C\uB2E4.\\n   - \uC6B4\uC601\uC6A9, \uD1B5\uACC4\uC6A9 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uBD84\uB9AC\uB418\uC5B4\uC57C \uD55C\uB2E4.\\n1. \uB370\uC774\uD130 \uAD00\uB828 \uB2E4\uC591\uD55C \uC194\uB8E8\uC158\uB4E4\uACFC \uD638\uD658\uC774 \uC26C\uC6CC\uC57C \uD55C\uB2E4.\\n\\n**\uB370\uC774\uD130 \uC6E8\uC5B4\uD558\uC6B0\uC2A4 vs \uB370\uC774\uD130 \uB808\uC774\uD06C**\\n\\n| \uC774\uB984 | \uB370\uC774\uD130 \uC6E8\uC5B4\uD558\uC6B0\uC2A4 | \uB370\uC774\uD130 \uB808\uC774\uD06C |\\n| --- | --- | --- |\\n| \uB370\uC774\uD130 | \uAD00\uACC4\uD615 \uB370\uC774\uD130 | \uAD00\uACC4\uD615 \uBC0F \uBE44\uAD00\uACC4\uD615 \uB370\uC774\uD130 |\\n| \uC2A4\uD0A4\uB9C8 | \uB370\uC774\uD130 \uC6E8\uC5B4\uD558\uC6B0\uC2A4 \uAD6C\uD604 \uC804 \uC124\uACC4\uB428 ( Schema on Write ) | \uBD84\uC11D \uC2DC \uC0AC\uC6A9\uB428 ( Schema on Read ) |\\n| \uAC00\uACA9 / \uC131\uB2A5 | \uACE0\uBE44\uC6A9 \uC2A4\uD1A0\uB9AC\uC9C0\uB97C \uC0AC\uC6A9\uD558\uC5EC \uBE60\uB978 \uACB0\uACFC\uBB3C\uC744 \uC5BB\uC74C | \uC800\uBE44\uC6A9 \uC2A4\uD1A0\uB9AC\uC9C0\uB97C \uC0AC\uC6A9\uD558\uC5EC \uCFFC\uB9AC \uACB0\uACFC\uC758 \uC18D\uB3C4\uAC00 \uBE60\uB984 |\\n| \uBD84\uC11D | \uBC30\uCE58 \uBCF4\uACE0, \uC2DC\uAC01\uD654 ( BI ) | \uAE30\uACC4 \uD559\uC2B5, \uC608\uCE21 \uBD84\uC11D, \uD504\uB85C\uD30C\uC77C\uB9C1 \uB4F1  |\\n\\n### \uB370\uC774\uD130 \uB808\uC774\uD06C - S3 \uC124\uACC4 \uAC1C\uB150\\n\\n#### Tier-1. \uC6D0\uBCF8 \uB370\uC774\uD130\\n\\n- \uC6D0\uBCF8 \uB370\uC774\uD130\uC758 \uC800\uC7A5\uACFC \uBCF4\uAD00\\n- \uCD5C\uC18C\uD55C\uC758 \uB370\uC774\uD130 \uBCC0\uD658 \uC791\uC5C5\uB9CC \uC9C4\uD589\\n- S3 \uC758 Life Cycle \uAE30\uB2A5\uC744 \uD65C\uC6A9\uD558\uC5EC S3-IA \uD639\uC740 Glacier \uB85C \uC800\uC7A5\uD558\uC5EC \uC800\uC7A5 \uBE44\uC6A9 \uAC10\uC18C\\n\\n#### Tier-2. \uBD84\uC11D\uC6A9 \uB370\uC774\uD130\\n\\n- Parquet / ORC \uAC19\uC740 Columnar \uD3EC\uB9F7 \uC0AC\uC6A9\\n- \uD30C\uD2F0\uC158 \uC815\uCC45\uC5D0 \uB530\uB77C \uB370\uC774\uD130 \uBD84\uC0B0 \uBC0F \uC720\uC9C0 \uAD00\uB9AC\\n- \uBD84\uC11D\uC744 \uC704\uD55C \uCD5C\uC801\uD654\\n\\n#### Tier-3. \uD2B9\uC815 \uBD84\uC11D \uBAA9\uC801 \uB370\uC774\uD130 ( Optional )\\n\\n- \uB3C4\uBA54\uC778 \uB808\uBCA8\uB85C \uB370\uC774\uD130 \uB9C8\uD2B8 \uBD84\uB9AC\\n- Use Case \uC5D0 \uC801\uD569\uD55C \uAD6C\uC131\\n- \uD2B9\uC815 \uBD84\uC11D \uBC29\uC2DD\uC5D0 \uC801\uD569\uD55C \uB370\uC774\uD130 \uBCC0\uACBD ( Machine Learning, AI )\\n\\n### \uCC38\uACE0\\n\\n- [https://aws.amazon.com/ko/nosql/columnar/](https://aws.amazon.com/ko/nosql/columnar/)\\n- [https://en.wikipedia.org/wiki/Data\\\\_lake](https://en.wikipedia.org/wiki/Data_lake)"},{"id":"aws-glue-local","metadata":{"permalink":"/blog/aws-glue-local","source":"@site/blog/2021-02-24-aws-glue-local/index.md","title":"AWS Glue \uB85C\uCEEC\uC5D0\uC11C \uC2E4\uD589","description":"AWS Glue \uB97C \uD14C\uC2A4\uD2B8\uD574\uBCF4\uB294\uB370 AWS Console \uC5D0\uC11C \uD558\uAE30\uC5D0\uB294 \uBE44\uC6A9\uC774 \uBC1C\uC0DD\uD558\uACE0, \uD654\uBA74\uC774 \uC880 \uBD88\uD3B8\uD574\uC11C \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uB744\uC6CC\uC11C \uC0AC\uC6A9\uD558\uB824\uACE0 \uD55C\uB2E4.","date":"2021-02-24T00:00:00.000Z","tags":[{"inline":false,"label":"AWS","permalink":"/blog/tags/aws"}],"readingTime":0.52,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"AWS Glue \uB85C\uCEEC\uC5D0\uC11C \uC2E4\uD589","slug":"aws-glue-local","date":"2021-02-24T00:00:00.000Z","authors":["dongmyeong"],"tags":["aws"],"description":"AWS Glue \uB97C \uD14C\uC2A4\uD2B8\uD574\uBCF4\uB294\uB370 AWS Console \uC5D0\uC11C \uD558\uAE30\uC5D0\uB294 \uBE44\uC6A9\uC774 \uBC1C\uC0DD\uD558\uACE0, \uD654\uBA74\uC774 \uC880 \uBD88\uD3B8\uD574\uC11C \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uB744\uC6CC\uC11C \uC0AC\uC6A9\uD558\uB824\uACE0 \uD55C\uB2E4."},"unlisted":false,"prevItem":{"title":"Data Lake \uB780?","permalink":"/blog/what-is-data-lake"},"nextItem":{"title":"Metabase \uC124\uCE58","permalink":"/blog/metabase-install"}},"content":"\x3c!-- truncate --\x3e\\n\\n## AWS Glue \uB85C\uCEEC\uC5D0\uC11C \uC2E4\uD589\\n\\nAWS Glue \uB97C \uD14C\uC2A4\uD2B8\uD574\uBCF4\uB294\uB370 AWS Console \uC5D0\uC11C \uD558\uAE30\uC5D0\uB294 \uBE44\uC6A9\uC774 \uBC1C\uC0DD\uD558\uACE0, \uD654\uBA74\uC774 \uC880 \uBD88\uD3B8\uD574\uC11C \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uB744\uC6CC\uC11C \uC0AC\uC6A9\uD558\uB824\uACE0 \uD55C\uB2E4.\\n\\n202
10\uB144 09\uC6D4 08\uC77C\uC5D0 Glue ETL Job \uC744 \uB85C\uCEEC\uD658\uACBD\uC5D0\uC11C \uD14C\uC2A4\uD2B8\uD560 \uC218 \uC788\uB294 \uBC29\uBC95\uC774 \uACF5\uAC1C\uB418\uC5C8\uACE0, Docker \uB85C \uC9C0\uC6D0\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC190\uC27D\uAC8C \uC124\uCE58\uD560 \uC218 \uC788\uC5C8\uB2E4.\\n\\n### \uC124\uCE58\\n\\n1. Docker Image \uB97C \uB0B4\uB824\uBC1B\uB294\uB2E4 ( Docker Hub \uB97C \uD655\uC778\uD574 \uCD5C\uC2E0 \uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4 \uBC1B\uB294\uB2E4 )\\n\\n   ```text\\n   $ docker pull amazon/aws-glue-libs:glue_libs_1.0.0_image_01\\n   ```\\n1. Container \uB97C \uC2E4\uD589\uC2DC\uD0A8\uB2E4\\n\\n   ```text\\n   $ docker run -itd \\\\\\n   \\t-e AWS_REGION=ap-northeast-2 \\\\\\n   \\t-e AWS_PROFILE=default \\\\\\n   \\t-p 8080:8080 \\\\\\n   \\t-p 4040:4040 \\\\\\n   \\t-v ~/.aws:/root/.aws:ro \\\\\\n   \\t--name glue_zeppelin \\\\\\n   \\tamazon/aws-glue-libs:glue_libs_1.0.0_image_01 /home/zeppelin/bin/zeppelin.sh\\n   ```\\n1. \uC6F9\uD398\uC774\uC9C0\uC5D0 \uC811\uC18D\uD55C\uB2E4.\\n\\n   ```text\\n   http://127.0.0.1:8080\\n   ```\\n\\n### \uCC38\uACE0\\n\\n- [https://aws.amazon.com/ko/blogs/big-data/developing-aws-glue-etl-jobs-locally-using-a-container/](https://aws.amazon.com/ko/blogs/big-data/developing-aws-glue-etl-jobs-locally-using-a-container/)\\n- [https://hub.docker.com/r/amazon/aws-glue-libs](https://hub.docker.com/r/amazon/aws-glue-libs)"},{"id":"metabase-install","metadata":{"permalink":"/blog/metabase-install","source":"@site/blog/2021-02-19-metabase-install/index.md","title":"Metabase \uC124\uCE58","description":"\uB370\uC774\uD130\uB97C \uC77D\uAE30 \uC27D\uAC8C \uC2DC\uAC01\uD654\uB97C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uC5EC\uB7EC\uAC00\uC9C0 BI \uB3C4\uAD6C\uB4E4\uC744 \uCC3E\uC544\uBD24\uB2E4.","date":"2021-02-19T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130","permalink":"/blog/tags/data"}],"readingTime":0.89,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Metabase \uC124\uCE58","slug":"metabase-install","date":"2021-02-19T00:00:00.000Z","authors":["dongmyeong"],"tags":["data"],"description":"\uB370\uC774\uD130\uB97C \uC77D\uAE30 \uC27D\uAC8C \uC2DC\uAC01\uD654\uB97C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uC5EC\uB7EC\uAC00\uC9C0 BI \uB3C4\uAD6C\uB4E4\uC744 \uCC3E\uC544\uBD24\uB2E4."},"unlisted":false,"prevItem":{"title":"AWS Glue \uB85C\uCEEC\uC5D0\uC11C \uC2E4\uD589","permalink":"/blog/aws-glue-local"},"nextItem":{"title":"OpenVPN \uC11C\uBC84 \uAD6C\uCD95","permalink":"/blog/openvpn-server"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Metabase\\n\\n\uB370\uC774\uD130\uB97C \uC77D\uAE30 \uC27D\uAC8C \uC2DC\uAC01\uD654\uB97C \uD560 \uD544\uC694\uAC00 \uC0DD\uACA8\uC11C \uC5EC\uB7EC\uAC00\uC9C0 BI \uB3C4\uAD6C\uB4E4\uC744 \uCC3E\uC544\uBD24\uB2E4.\\n\\n\uC81C\uD50C\uB9B0, \uD0C0\uBE14\uB85C, \uD30C\uC6CCBI \uB4F1 \uB2E4\uC591\uD55C \uB3C4\uAD6C\uB4E4\uC774 \uC788\uC9C0\uB9CC \uADF8 \uC911\uC5D0\uC11C\uB3C4 \uC624\uD508\uC18C\uC2A4\uC774\uBA74\uC11C \uC0AC\uC6A9\uD558\uAE30 \uAC04\uB2E8\uD558\uACE0, \uC124\uCE58\uC870\uCC28 \uB108\uBB34\uB098 \uAC04\uB2E8\uD55C Metabase \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC124\uCE58\uBC95\uC744 \uAC04\uB2E8\uD558\uAC8C \uC815\uB9AC\uD574\uB454\uB2E4.\\n\\n### \uC124\uCE58\\n\\n- \uAC1C\uC778 \uC11C\uBC84\uC5D0\uB2E4\uAC00 \uC124\uCE58\uD558\uAE30 \uB54C\uBB38\uC5D0 SSL \uC778\uC99D\uC11C \uB4F1 \uB2E4\uC591\uD55C \uCC98\uB9AC\uB97C \uC790\uB3D9\uC73C\uB85C \uD558\uAE30 \uC704\uD574 `bunkerized-nginx` \uB97C \uC0AC\uC6A9\uD588\uB2E4.\\n- \uC124\uC815\uC744 \uAC04\uC18C\uD654 \uD558\uAE30 \uC704\uD574 `docker-compose` \uB97C \uC0AC\uC6A9\uD588\uB2E4.\\n\\n#### docker-compose.yml\\n\\n```docker\\nversion: \'3\'\\nservices:\\n  nginx:\\n    image: bunkerity/bunkerized-nginx\\n    restart: always\\n    ports:\\n      - target: 8080\\n        published: 80\\
1n      - target: 8443\\n        published: 443\\n    volumes:\\n      - ./letsencrypt:/etc/letsencrypt\\n      - ./modsec-crs-confs:/modsec-crs-confs\\n    environment:\\n      - SERVER_NAME=clud.me\\n      - SERVE_FILES=no\\n      - DISABLE_DEFAULT_SERVER=yes\\n      - REDIRECT_HTTP_TO_HTTPS=yes\\n      - AUTO_LETS_ENCRYPT=yes\\n      - ALLOWED_METHODS=GET|POST|HEAD|PUT|DELETE|FETCH\\n      - USE_REVERSE_PROXY=yes\\n      - USE_GZIP=yes\\n      - USE_BROTLI=yes\\n      - USE_FAIL2BAN=no\\n      - USE_MODSECURITY=false\\n      - USE_MODSECURITY_CRS=false\\n      - REVERSE_PROXY_URL_1=/\\n      - REVERSE_PROXY_HOST_1=http://metabase:3000/\\n      - CONTENT_SECURITY_POLICY=CONTENT_SECURITY_POLICY-object-src \'none\'; frame-ancestors \'self\'; form-action \'self\'; block-all-mixed-content; sandbox allow-forms allow-same-origin allow-scripts allow-popups allow-downloads; base-uri \'self\';\\n\\n  metabase:\\n    image: metabase/metabase\\n    restart: always\\n    ports:\\n      - target: 3000\\n        published: 3000\\n    volumes:\\n      - /home/ubuntu/metabase:/metabase-data\\n    environment:\\n      - MB_DB_FILE=/metabase-data/metabase.db\\n```\\n\\n#### modsec-crs-confs\\n\\n```text\\nSecAction \\\\\\n \\"id:900200,\\\\\\n  phase:1,\\\\\\n  nolog,\\\\\\n  pass,\\\\\\n  t:none,\\\\\\n  setvar:\'tx.allowed_methods=GET HEAD POST PROPFIND DELETE PUT MKCOL MOVE COPY PROPPATCH REPORT\'\\"\\n```\\n\\n### Athena \uC5F0\uB3D9\\n\\n- Metabase \uC5D0\uC11C Athena \uB97C \uC0AC\uC6A9\uD558\uAE30 \uC704\uD574\uC11C\uB294 JDBC \uB4DC\uB77C\uC774\uBC84\uB97C \uCD94\uAC00\uD574\uC918\uC57C\uD55C\uB2E4.\\n\\n```docker\\nFROM metabase/metabase:v0.37.3\\n\\nADD --chown=2000:2000 \\\\\\n    https://github.com/dacort/metabase-athena-driver/releases/do\\n```\\n\\n- `Dockerfile` \uC744 \uC791\uC131\uD55C \uD6C4 \uBE4C\uB4DC\uD558\uACE0 \uC2E4\uD589\uD55C\uB2E4.\\n\\n### \uB808\uD37C\uB7F0\uC2A4\\n\\n- [https://github.com/dacort/metabase-athena-driver](https://github.com/dacort/metabase-athena-driver)\\n- [https://github.com/bunkerity/bunkerized-nginx](https://github.com/bunkerity/bunkerized-nginx)\\n- [https://github.com/metabase/metabase](https://github.com/metabase/metabase)"},{"id":"openvpn-server","metadata":{"permalink":"/blog/openvpn-server","source":"@site/blog/2020-12-08-openvpn-server/index.md","title":"OpenVPN \uC11C\uBC84 \uAD6C\uCD95","description":"C19 \uAC00 \uC2EC\uAC01\uD574\uC9C0\uBA74\uC11C \uC804\uC0AC \uC7AC\uD0DD \uADFC\uBB34\uB85C \uC804\uD658\uB418\uC5C8\uB2E4.","date":"2020-12-08T00:00:00.000Z","tags":[{"inline":false,"label":"\uC778\uD504\uB77C","permalink":"/blog/tags/infra"}],"readingTime":1.13,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"OpenVPN \uC11C\uBC84 \uAD6C\uCD95","slug":"openvpn-server","date":"2020-12-08T00:00:00.000Z","authors":["dongmyeong"],"tags":["infra"],"description":"C19 \uAC00 \uC2EC\uAC01\uD574\uC9C0\uBA74\uC11C \uC804\uC0AC \uC7AC\uD0DD \uADFC\uBB34\uB85C \uC804\uD658\uB418\uC5C8\uB2E4."},"unlisted":false,"prevItem":{"title":"Metabase \uC124\uCE58","permalink":"/blog/metabase-install"},"nextItem":{"title":"[EKS] istio + NLB \uC0BD\uC9C8\uAE30","permalink":"/blog/eks-istio-nlb"}},"content":"\x3c!-- truncate --\x3e\\n\\n## OpenVPN \uC11C\uBC84 \uAD6C\uCD95\\n\\nC19 \uAC00 \uC2EC\uAC01\uD574\uC9C0\uBA74\uC11C \uC804\uC0AC \uC7AC\uD0DD \uADFC\uBB34\uB85C \uC804\uD658\uB418\uC5C8\uB2E4.\\n\\n\uC7AC\uD0DD\uADFC\uBB34\uB85C \uC804\uD658\uD558\uAC8C \uB418\uBA74\uC11C \uB0B4\uBD80 \uAD00\uB9AC\uC790 \uB3C4\uAD6C\uC5D0 \uC811\uC18D\uD560 \uC218 \uC5C6\uB294 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD558\uAC8C \uB418\uC5C8\uB294\uB370, \uC774\uB97C \uD574\uACB0\uD558\uAE30 \uC704\uD574 VPN \uC11C\uBC84\uB97C \uAD6C\uCD95\uD558\uAE30\uB85C \uD588\uB2E4.\\n\\nVPN \uC744 \uAD6C\uCD95\uD558\uB294\uB370 \uD070 \uC2DC\uAC04\uC744 \uC3DF\uC744 \uC218 \uC5C6\uB294 \uC0C1\uD669\uC774\uAE30 \uB54C\uBB38\uC5D0 `OpenVPN` \uC744 \uC0AC\uC6A9\uD558\uAE30\uB85C \uD588\uACE0, \uC774 \uC124\uCE58 \uC870\uCC28 \uAC04\uB2E8\uD558\uAC8C \uD558\uAE30 \uC704\uD574 `OpenVPN for Docker` \uC744 \uC0AC\uC6A9\uD588\uB2E4.\\n\\n### Step\\n\\n1. AWS \uC5D0 EC2 Instance \uB97C 1\uAC1C \uC0D
1D\uC131\uD55C\uB2E4. ( `t3.micro` \uD639\uC740 `t3.small` \uC774\uBA74 \uCDA9\uBD84\uD558\uB2E4. )\\n   - Public Subnet \uC5D0 Ubuntu 20.04 \uB97C \uC124\uCE58\\n   - ElasticIP \uD560\uB2F9\\n1. Docker \uB97C \uC124\uCE58\uD55C\uB2E4.\\n   - \uC124\uCE58 \uBA54\uB274\uC5BC: [https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script](https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script)\\n1. Docker \uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uB294\uB2E4\\n\\n   ```bash\\n   $ docker pull kylemanna/openvpn\\n   ```\\n1. OpenVPN \uCD08\uAE30 \uC124\uC815\uC744 \uC9C4\uD589\uD55C\uB2E4.\\n\\n   ```bash\\n   $ docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://{{ FIXME }} -N -d\\n   ```\\n\\n   - `{{ FIXME }}` \uB77C\uACE0 \uC801\uD78C \uBD80\uBD84\uC744 \uC2E4 \uB3C4\uBA54\uC778\uC73C\uB85C \uC124\uC815\uD55C\uB2E4.\\n   - \uB9CC\uC57D \uAC1C\uC778 \uB3C4\uBA54\uC778\uC774 \uC5C6\uB294 \uACBD\uC6B0, EC2 Public DNS \uB97C \uC0AC\uC6A9\uD574\uB3C4 \uB41C\uB2E4.\\n1. OpenVPN CA Certificate \uC640 \uBE44\uBC00\uD0A4\uB97C \uC0DD\uC131\uD55C\uB2E4.\\n\\n   ```bash\\n   $ docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki\\n   ```\\n\\n   - \uBA85\uB839\uC5B4\uB97C \uC785\uB825\uD558\uBA74 `Passphrase` \uB97C \uC785\uB825\uD55C\uB2E4.\\n   - `comman name` \uC740 \uAE30\uBCF8\uAC12\uC73C\uB85C \uC0AC\uC6A9\uD55C\uB2E4.\\n1. OpenVPN \uC11C\uBC84\uB97C \uC2E4\uD589\uD55C\uB2E4.\\n\\n   ```bash\\n   $ docker run -v $OVPN_DATA:/etc/openvpn -d -p 1194:1194/udp --name=\\"ovpn\\" --restart=\\"always\\" --cap-add=NET_ADMIN kylemanna/openvpn\\n   ```\\n1. \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 \uC811\uC18D \uC815\uBCF4\uB97C \uC0DD\uC131\uD55C\uB2E4.\\n\\n   ```bash\\n   $ docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full {{ FIXME }} nopass\\n   ```\\n\\n   - `{{ FIXME }}` \uB77C\uACE0 \uC801\uD78C \uBD80\uBD84\uC744 \uC0AC\uC6A9\uC790 \uC774\uB984\uC73C\uB85C \uBCC0\uACBD\uD55C\uB2E4.\\n1. \uD074\uB77C\uC774\uC5B8\uD2B8\uC758 \uC811\uC18D \uC815\uBCF4\uB97C \uAC00\uC838\uC628\uB2E4.\\n\\n   ```bash\\n   $ docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_getclient {{ FIXME }} > {{ FIXME }}.ovpn\\n   ```\\n\\n   - `{{ FIXME }}` \uB77C\uACE0 \uC801\uD78C \uBD80\uBD84\uC744 7\uBC88\uC5D0\uC11C \uC9C0\uC815\uD55C \uC0AC\uC6A9\uC790 \uC774\uB984\uC73C\uB85C \uBCC0\uACBD\uD55C\uB2E4.\\n1. EC2 \uBCF4\uC548 \uADF8\uB8F9\uC744 \uC124\uC815\uD55C\uB2E4.\\n   - `UDP`  `1194` \uD3EC\uD2B8\uB97C \uC5F4\uC5B4\uB46C\uC57C \uD55C\uB2E4.\\n1. OpenVPN \uD074\uB77C\uC774\uC5B8\uD2B8\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uACE0 \uC811\uC18D\uD55C\uB2E4.\\n   - MAC OS X \uC5D0\uC11C\uB294 `Tunnelblick` \uC744 \uC0AC\uC6A9\uD55C\uB2E4.\\n\\n### \uBA85\uB839\uC5B4 \uD301\\n\\n- \uD074\uB77C\uC774\uC5B8\uD2B8 \uC81C\uAC70\\n\\n  ```bash\\n  $ docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_revokeclient {{ FIXME }} remove\\n  ```\\n- \\n\\n### \uACB0\uB860\\n\\nOpenVPN for Docker \uB97C \uC0AC\uC6A9\uD558\uBA74 5\uBD84\uB9CC\uC5D0 VPN \uC11C\uBC84\uB97C \uAD6C\uCD95\uD560 \uC218 \uC788\uB2E4.\\n\\n\uAC04\uB2E8\uD558\uAC8C VPN \uC11C\uBC84\uB97C \uB744\uC6CC\uC11C \uC0AC\uC6A9\uD560 \uB550 \uC88B\uC9C0\uB9CC, \uC81C\uB300\uB85C \uC0AC\uC6A9\uD558\uB824\uBA74 AWS Client VPN \uC744 \uC0AC\uC6A9\uD558\uB294\uAC8C \uC88B\uC9C0 \uC54A\uC744\uAE4C \uC2F6\uB2E4."},{"id":"eks-istio-nlb","metadata":{"permalink":"/blog/eks-istio-nlb","source":"@site/blog/2020-11-12-eks-istio-nlb/index.md","title":"[EKS] istio + NLB \uC0BD\uC9C8\uAE30","description":"\uD68C\uC0AC\uC5D0\uC11C Kubernetes \uB97C \uC801\uC6A9\uD558\uAE30\uB85C \uACB0\uC815\uD588\uACE0, \uBAA8\uB4E0 \uC778\uD504\uB77C\uB97C AWS \uC704\uC5D0\uC11C \uAD6C\uCD95\uD558\uAE30 \uC704\uD574 EKS \uB97C \uC0AC\uC6A9\uD558\uAE30\uB85C \uD588\uB2E4.","date":"2020-11-12T00:00:00.000Z","tags":[{"inline":false,"label":"Kubernetes","permalink":"/blog/tags/kubernetes"}],"readingTime":1.7,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"[EKS] istio + NLB \uC0BD\uC9C8\uAE30","slug":"eks-istio-nlb","date":"2020-11-12T00:00:00.000Z","authors":["dongmyeong"],"tags":["kubernetes"],"description":"\uD68C\uC0AC\uC5D0\uC11C Kubernetes \uB97C \uC801\uC6A9\uD558\uAE30\uB85C \uACB0\uC815\uD588\uACE0, \uBAA8\uB4E0 \uC778\uD504\uB77C\uB97C AWS \uC704\uC5D0\uC11C \uAD6C\uCD95\uD558\uAE30 \uC704\uD574 EKS \uB97C \uC0AC\uC6A9\uD558\uAE30\uB85C \uD588\uB2E4."},"unlisted":false,"prevItem":{"title":"OpenVPN \uC11C\uBC84 \uAD6C\uCD95","permalink":"/blog/openvpn-server"},"nextItem":{"title":"Scope","permalink":"/blog/javascript-scope"}},"content":"\x3c!-- truncate --\x3e\\n\\n## istio + NLB \uC0BD\uC9C8\uAE30\\n\\n\uD68C\uC0AC\uC5D0\uC11C `Kubernetes` \uB97C \uC801\uC6A9\uD558\uAE30\uB85C \uACB0\uC815\uD588\uACE0, \uBAA8\uB4E0 \uC778\uD504\uB77C\uB97C AWS \uC704\uC5D0\uC11C \uAD6C\uCD95\uD558\uAE30 \uC704\uD574 `EKS` \uB97C \uC0AC\uC6A9\uD558\uAE30\uB85C \uD588\uB2E4.\\n\\n`EKS` \uB97C \uC801\uC6A9\uD558\uBA74\uC11C `istio` \uC640 `NLB` \uB97C \uC801\uC6A9\uD558\uB294\uB370 \uC5B4\uB824\uC6CC\uC11C \uD5E4\uB9F8\uB358 \uB0B4\uC6A9\uC744 \uB300\uB7B5\uC801\uC73C\uB85C\uB9CC \uC815\uB9AC\uD55C\uB2E4.\\n\\n`istio`, `NLB` \uC5D0 \uB300\uD55C \uC0C1\uC138\uD55C \uB0B4\uC6A9\uC740 \uB2E4\uB978 \uD3EC\uC2A4\uD2B8\uC5D0\uC11C \uC815\uB9AC\uD560 \uC608\uC815\uC774\uBBC0\uB85C \uC5EC\uAE30\uC11C\uB294 \uAC00\uC7A5 \uC0BD\uC9C8 \uD588\uB358 \uBD80\uBD84\uB9CC \uB2E4\uB8F0 \uC608\uC815\uC774\uB2E4.\\n\\n### EKS \uC5D0\uC11C ELB \uB97C \uC0AC\uC6A9\uD558\uB294 \uBC29\uBC95\\n\\n#### CLB, NLB \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4 \uB178\uCD9C\\n\\n`EKS` \uC5D0\uC11C\uB294 `ELB` \uB97C \uC0AC\uC6A9\uD558\uB824\uBA74 `Service` \uB97C `LoadBalancer` \uB85C \uC9C0\uC815\uD558\uBA74 \uB41C\uB2E4.\\n\\n```yaml\\napiVersion: v1\\nkind: Service\\nmetadata:\\n\\tname: sample-svc\\nspec:\\n\\tselector:\\n\\t\\tapp: sample\\n\\tports:\\n\\t\\t- port: 8080\\n\\t\\t\\ttargetPort: 8080\\n\\ttype: LoadBalancer\\n```\\n\\n\uC774\uB807\uAC8C \uAC04\uB2E8\uD558\uAC8C \uC124\uC815\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C `CLB` \uAC00 \uC0D
1D\uC131\uB41C\uB2E4.\\n\\n\uD558\uC9C0\uB9CC, \uC6D0\uD588\uB358\uAC74 `CLB` \uAC00 \uC544\uB2CC `NLB` \uC774\uAE30 \uB54C\uBB38\uC5D0 \uC124\uC815\uC744 \uC870\uAE08 \uC218\uC815\uD588\uB2E4\\n\\n```yaml\\napiVersion: v1\\nkind: Service\\nmetadata:\\n\\tname: sample-svc\\n\\tannotations:\\n\\t\\tservice.beta.kubernetes.io/aws-load-balancer-type: nlb\\nspec:\\n\\tselector:\\n\\t\\tapp: sample\\n\\tports:\\n\\t\\t- port: 8080\\n\\t\\t\\ttargetPort: 8080\\n\\ttype: LoadBalancer\\n```\\n\\n`Service` \uC5D0 `annotation` \uC744 \uCD94\uAC00\uD558\uBA74 `NLB` \uAC00 Instance Target \uC73C\uB85C \uC790\uB3D9\uC73C\uB85C \uC0DD\uC131\uB41C\uB2E4.\\n\\n#### ALB \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4 \uB178\uCD9C\\n\\n`CLB` \uC640 `NLB` \uB294 \uBCC4\uB2E4\uB978 \uC124\uC815 \uC5C6\uC774 \uAC00\uB2A5\uD588\uC9C0\uB9CC ALB \uB294 `aws-load-balancer-controller` (\uAD6C AWS ALB Ingress Controller) \uB97C \uC0AC\uC6A9\uD574\uC57C \uD55C\uB2E4.\\n\\n```yaml\\napiVersion: v1\\nkind: Service\\nmetadata:\\n\\tname: sample-svc\\nspec:\\n\\tselector:\\n\\t\\tapp: sample\\n\\tports:\\n\\t\\t- port: 8080\\n\\t\\t\\ttargetPort: 8080\\n\\n---\\n\\napiVersion: extensions/v1beta1\\nkind: Ingress\\nmetadata:\\n\\tname: sample-ing\\n\\tannotations:\\n\\t\\tkubernetes.io/ingress.class: alb\\n    alb.ingress.kubernetes.io/scheme: internet-facing\\nspec:\\n\\trules:\\n\\t\\t- http:\\n\\t\\t\\t\\tpaths: /*\\n\\t\\t\\t\\tbackend:\\n\\t\\t\\t\\t\\tserviceName: service-svc\\n\\t\\t\\t\\t\\tservicePort: 80\\n```\\n\\n### NLB \uC640 istio \uB97C \uC801\uC6A9\uD558\uB294 \uBC29\uBC95\\n\\n`AWS ALB Ingress Controller` \uAC00 `AWS Load Balancer Controller` \uB85C \uBCC0\uACBD\uB418\uBA74\uC11C `nlb-ip` \uBAA8\uB4DC\uB97C \uC9C0\uC6D0\uD558\uAE30 \uC2DC\uC791\uD588\uB2E4.\\n\\n`Target Group` \uC5D0 \uBAA8\uB4E0 \uB178\uB4DC\uB97C \uB123\uB294\uAC83\uBCF4\uB2E4\uB294 Ingress Gateway IP \uB9CC \uB300\uC0C1 \uADF8\uB8F9\uC5D0 \uC801\uC6A9\uB418\uC5B4 \uC788\uB294\uAC8C \uB354 \uD6A8\uC728\uC801\uC774\uC9C0 \uC54A\uC744\uAE4C \uB77C\uB294 \uC0DD\uAC01\uC774 \uB4E4\uC5B4\uC11C \uC801\uC6A9\uD588\uB2E4.\\n\\n```yaml\\napiVersion: install.istio.io/v1alpha1\\nkind: IstioOperator\\nmetadata:\\n  name: istiocontrolplane\\n  namespace: istio-system\\nspec:\\n  profile: default\\n  components:\\n    ingressGateways:\\n      - name: istio-ingressgateway\\n        enabled: true \\n      - name: simple-ingressgateway\\n        enabled: true\\n        label:\\n          service.istio.io/canonical-name: simple-ingressgateway\\n        k8s:\\n          service:\\n            externalTrafficPolicy: Local\\n          hpaSpec:\\n            minReplicas: 2\\n            maxReplicas: 10\\n          service:\\n            ports:\\n              - name: http\\n                port: 80\\n                targetPort: 8080\\n              - name: https\\n                port: 443\\n                targetPort: 8080\\n              - name: helath\\n                port: 15020\\n                targetPort: 15020\\n            type: NodePort \\n          serviceAnnotations:\\n            service.beta.kubernetes.io/aws-load-balancer-type: \'nlb-ip\'\\n            service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http\\n            service.beta.kubernetes.io/aws-load-balancer-ssl-ports: \\"443\\"\\n            service.beta.kubernetes.io/aws-load-balancer-ssl-cert: \\"{REDACTED}\\"\\n  values:\\n    sidecarInjectorWebhook:\\n      rewriteAppHTTPProbe: true\\n    gateways:\\n      istio-ingressgateway:\\n        type: ClusterIP\\n```\\n\\n`istio-operator.yaml`  \uD30C\uC77C\uC744 \uC815\uC758\uD55C \uC544\uB798\uC758 \uBA85\uB839\uC5B4\uB97C \uC218\uD589\uD558\uBA74 istio-ingressgateway \uC640 simple-ingressgateway \uAC00 \uC0DD\uC131\uB418\uBA74\uC11C `nlb-ip` \uAC00 \uC0DD\uC131\uB41C\uB2E4.\\n\\n```bash\\n$ istioctl install -f istio-operator.yaml\\n```\\n\\n#### SOURCE IP\\n\\n`nlb-ip` \uBAA8\uB4DC\uB97C \uC0AC\uC6A9\uD558\uAC8C \uB420 \uACBD\uC6B0 \uB0B4\uBD80 POD \uC5D0\uC11C\uB294 Source IP \uB97C \uC5BB\uC744 \uC218 \uC5C6\uACE0, POD \uC758 IP \uC815\uBCF4\uAC00 \uB118\uC5B4\uC628\uB2E4.\\n\\n\uC0AC\uC6A9\uC790\uC758 IP \uB97C \uC11C\uBE44\uC2A4\uC5D0\uC11C \uC54C\uC544\uC57C \uD560 \uACBD\uC6B0\uAC00 \uC0D
1D\uAE38 \uC218 \uC788\uB294 \uC774\uB7F0 \uACBD\uC6B0 `envoy-filter` \uB9CC \uCD94\uAC00\uD558\uBA74 \uB41C\uB2E4\\n\\n```yaml\\napiVersion: networking.istio.io/v1alpha3\\nkind: EnvoyFilter\\nmetadata:\\n  name: proxy-protocol\\n  namespace: istio-system\\nspec:\\n  workloadSelector:\\n    labels:\\n      istio: ingressgateway\\n  configPatches:\\n  - applyTo: LISTENER\\n    patch:\\n      operation: MERGE\\n      value:\\n        listener_filters:\\n        - name: envoy.filters.listener.proxy_protocol\\n        - name: envoy.filters.listener.tls_inspector\\n```\\n\\n## \uCC38\uACE0\\n\\n- [kubernetes-sigs/aws-load-balancer-controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller)\\n- [aws/eks-charts](https://github.com/aws/eks-charts/tree/master/stable/aws-load-balancer-controller)\\n- [Istio Operator Install](https://istio.io/latest/docs/setup/install/operator/)\\n- [Using Source IP](https://kubernetes.io/docs/tutorials/services/source-ip/)"},{"id":"javascript-scope","metadata":{"permalink":"/blog/javascript-scope","source":"@site/blog/2020-07-21-javascript-scope/index.md","title":"Scope","description":"C, C++, Java, JavaScript \uC640 \uAC19\uC774 \uB300\uBD80\uBD84\uC758 \uD504\uB85C\uADF8\uB7A8 \uC5B8\uC5B4\uB4E4\uC740 Lexical Scope ( \uB610\uB294 Static Scope ) \uB97C \uC0AC\uC6A9\uD558\uACE0 \uC788\uB2E4. Lexical Scope \uC758 \uBC18\uB300 \uBC29\uC2DD\uC740 Dynamic Scope \uAC00 \uC788\uC73C\uBA70 Perl, B\u2026","date":"2020-07-21T00:00:00.000Z","tags":[{"inline":false,"label":"JavaScript","permalink":"/blog/tags/javascript"}],"readingTime":1.22,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Scope","slug":"javascript-scope","date":"2020-07-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["javascript"],"description":"C, C++, Java, JavaScript \uC640 \uAC19\uC774 \uB300\uBD80\uBD84\uC758 \uD504\uB85C\uADF8\uB7A8 \uC5B8\uC5B4\uB4E4\uC740 Lexical Scope ( \uB610\uB294 Static Scope ) \uB97C \uC0AC\uC6A9\uD558\uACE0 \uC788\uB2E4. Lexical Scope \uC758 \uBC18\uB300 \uBC29\uC2DD\uC740 Dynamic Scope \uAC00 \uC788\uC73C\uBA70 Perl, B\u2026"},"unlisted":false,"prevItem":{"title":"[EKS] istio + NLB \uC0BD\uC9C8\uAE30","permalink":"/blog/eks-istio-nlb"},"nextItem":{"title":"\uC774\uBCA4\uD2B8 \uB8E8\uD504","permalink":"/blog/event-loop"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uAC1C\uC694\\n\\n`C`, `C++`, `Java`, `JavaScript` \uC640 \uAC19\uC774 \uB300\uBD80\uBD84\uC758 \uD504\uB85C\uADF8\uB7A8 \uC5B8\uC5B4\uB4E4\uC740 Lexical Scope ( \uB610\uB294 Static Scope ) \uB97C \uC0AC\uC6A9\uD558\uACE0 \uC788\uB2E4. Lexical Scope \uC758 \uBC18\uB300 \uBC29\uC2DD\uC740 Dynamic Scope \uAC00 \uC788\uC73C\uBA70 `Perl`, `Bash Shell` \uB4F1\uC774 \uC0AC\uC6A9\uD55C\uB2E4.\\n\\n### \uC2DC\uC791\uD558\uAE30 \uC804\uC5D0\\n\\n\uC544\uB798\uC758 \uCF54\uB4DC\uB97C \uC2E4\uD589\uD558\uBA74 \uACB0\uACFC\uAC00 \uC5B4\uB5BB\uAC8C \uCD9C\uB825\uB420 \uC9C0 \uC0DD\uAC01\uD574\uBCF4\uC790.\\n\\n```js\\nvar age = 10;\\n\\nfunction echo() {\\n\\tconsole.log(age);\\n}\\n\\nfunction wrap() {\\n\\tvar age = 30;\\n\\tconsole.log(age);\\n\\techo();\\n}\\n\\nwrap();\\n```\\n\\n### Lexical Scope\\n\\n:::info\\n\\nLexical Scope: use environment where function is defined.\\\\\\nDynamic Scope: use environment where function is called.\\n\\n:::\\n\\nLexical Scope\uB294 \uBCC0\uC218\uB098 \uD568\uC218\uAC00 **\uC815\uC758**\uB41C \uACF3\uC5D0 \uB530\uB77C \uC0C1\uC704 \uC2A4\uCF54\uD504\uB97C \uACB0\uC815\uD55C\uB2E4.\\n\\n\uC774 \uB9D0\uC744 \uC870\uAE08 \uB354 \uC27D\uAC8C \uD480\uC5B4\uC11C \uC124\uBA85\uD558\uBA74, \uD568\uC218\uAC00 \uCC98\uC74C \uC120\uC5B8\uB41C \uC21C\uAC04 \uD568\uC218 \uB0B4\uBD80\uC758 \uBCC0\uC218\uB294 \uC2A4\uCF54\uD504\uB97C \uAE30\uC900\uC73C\uB85C \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uACF3\uC5D0 \uC788\uB294 \uBCC0\uC218\uB97C \uCC38\uC870\uD558\uAC8C \uB41C\uB2E4.\\n\\n\uC704\uC758 \uCF54\uB4DC\uB97C \uC608\uB85C \uB4E4\uC5B4\uC11C \uC124\uBA85\uD558\uBA74 `echo` \uD568\uC218 \uC548\uC5D0 `age` \uBCC0\uC218\uB294 \uC120\uC5B8 \uC2DC \uAC00\uC7A5 \uAC00\uAE4C\uC6B4 \uACF3\uC5D0 \uC788\uB294 \uC804\uC5ED \uBCC0\uC218 `age`\uB97C \uCC38\uC870\uD55C\uB2E4.\\n\\n`wrap` \uD568\uC218 \uC548\uC5D0\uC11C `age` \uBCC0\uC218\uB97C \uC120\uC5B8\uD574\uB3C4 `echo` \uD568\uC218\uB294 \uC804\uC5ED \uBCC0\uC218\uC778 `age`\uB97C \uBC14\uB77C\uBCF4\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uC804\uC5ED \uBCC0\uC218 \uAC12\uC778 `10` \uC774 \uCD9C\uB825\uB41C\uB2E4.\\n\\n\uC704\uC758 \uCF54\uB4DC\uC758 \uACB0\uACFC\uB294 \uC544\uB798\uC640 \uAC19\uB2E4.\\n\\n```js\\n30\\n10\\n```\\n\\n#### Function Scope\\n\\n\uD568\uC218 \uB0B4\uBD80\uC5D0\uC11C \uC120\uC5B8\uD55C \uBCC0\uC218\uB294 \uD568\uC218 \uB0B4\uC5D0\uC11C \uACC4\uC18D \uC720\uD6A8\uD558\uBA70, \uD568\uC218 \uC678\uBD80\uC5D0\uC11C\uB294 \uCC38\uC870\uD560 \uC218 \uC5C6\uB2E4.\\n\\n```js\\nfunction echo() {\\n\\tvar age = 10;\\n\\tconsole.log(age);\\n\\n\\tif (true) {\\n\\t\\tvar age = 20;\\n\\t\\tconsole.log(age);\\n\\t}\\n\\n\\tconsole.log(age);\\n}\\n\\necho();\\nconsole.log(age); // ReferenceError: age is not defined\\n```\\n\\n```js\\n// \uACB0\uACFC \uAC12\\n10\\n20\\
1n20\\n```\\n\\n#### Block Scope\\n\\n\uCF54\uB4DC \uBE14\uB85D ( `{}` ) \uB0B4\uC5D00\uC11C \uC120\uC5B8\uB41C \uBCC0\uC218\uB294 \uD574\uB2F9 \uBE14\uB85D\uC5D0\uC11C\uB9CC \uC720\uD6A8\uD558\uBA70, \uC678\uBD80 \uBE14\uB85D\uC5D0\uC11C \uCC38\uC870\uD560 \uC218 \uC5C6\uB2E4.\\n\\n```js\\nfunction echo() {\\n\\tlet age = 10;\\n\\tconsole.log(age);\\n\\n\\tif (true) {\\n\\t\\tlet age = 20;\\n\\t\\tconsole.log(age);\\n\\t}\\n\\n\\tconsole.log(age);\\n}\\necho();\\n```\\n\\n```js\\n// \uACB0\uACFC \uAC12\\n10\\n20\\n10\\n```\\n\\n#### var vs let\\n\\nES6 \uC5D0\uC11C `let, const` keyword \uAC00 \uCD94\uAC00\uB418\uC5C8\uB2E4. `var` , `let` \uC740 \uBCC0\uC218\uB97C \uC120\uC5B8\uD558\uB294 keyword \uC774\uC9C0\uB9CC, \uB9CE\uC740 \uBD80\uBD84\uC5D0\uC11C \uCC28\uC774\uAC00 \uBC1C\uC0DD\uD55C\uB2E4.\\n\\n- `var`\\n  - Function Scope\\n  - Hositing\\n  - \uC911\uBCF5 \uC120\uC5B8 \uAC00\uB2A5\\n\\n  ```js\\n  function echo() {\\n    var age = 10;\\n    console.log(age);\\n    var age = 20;\\n    console.log(age);\\n  }\\n\\n  echo();\\n  ```\\n- `let`\\n  - Blcok Scope\\n  - No Hoisting\\n  - \uC911\uBCF5 \uC120\uC5B8 \uBD88\uAC00\uB2A5\\n\\n    ```js\\n    function echo() {\\n      let age = 10;\\n      console.log(age);\\n      let age = 20; // SyntaxError: Identifier \'age\' has already been declared\\n      console.log(age);\\n    }\\n\\n    echo();\\n    ```\\n\\n## \uCC38\uACE0\\n\\n- [let](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let)\\n- [JavaScript: Introduction to Scope (function scope, block scope)](https://dev.to/sandy8111112004/javascript-introduction-to-scope-function-scope-block-scope-d11)\\n- [\u26A1\uFE0F\u26D3JavaScript Visualized: Scope (Chain)](https://dev.to/lydiahallie/javascript-visualized-scope-chain-13pd)"},{"id":"event-loop","metadata":{"permalink":"/blog/event-loop","source":"@site/blog/2020-03-17-event-loop/index.md","title":"\uC774\uBCA4\uD2B8 \uB8E8\uD504","description":"JavaScript\uB97C \uC0AC\uC6A9\uD558\uB2E4 \uBCF4\uBA74 Single-Threaded \uB098 Event Loop \uC5D0 \uB300\uD55C \uB0B4\uC6A9\uC744 \uC790\uC8FC \uC811\uD558\uAC8C \uB41C\uB2E4.","date":"2020-03-17T00:00:00.000Z","tags":[{"inline":false,"label":"JavaScript","permalink":"/blog/tags/javascript"}],"readingTime":1.97,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"\uC774\uBCA4\uD2B8 \uB8E8\uD504","slug":"event-loop","date":"2020-03-17T00:00:00.000Z","authors":["dongmyeong"],"tags":["javascript"],"description":"JavaScript\uB97C \uC0AC\uC6A9\uD558\uB2E4 \uBCF4\uBA74 Single-Threaded \uB098 Event Loop \uC5D0 \uB300\uD55C \uB0B4\uC6A9\uC744 \uC790\uC8FC \uC811\uD558\uAC8C \uB41C\uB2E4."},"unlisted":false,"prevItem":{"title":"Scope","permalink":"/blog/javascript-scope"},"nextItem":{"title":"\uD63C\uC790 \uC0DD\uAC01\uD574 \uBCF8 \uAC1C\uBC1C \uBB38\uD654","permalink":"/blog/thoughts-on-dev-culture"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uAC1C\uC694\\n\\nJavaScript\uB97C \uC0AC\uC6A9\uD558\uB2E4 \uBCF4\uBA74 `Single-Threaded` \uB098 `Event Loop` \uC5D0 \uB300\uD55C \uB0B4\uC6A9\uC744 \uC790\uC8FC \uC811\uD558\uAC8C \uB41C\uB2E4.\\n\\n\uC5EC\uB7EC \uAE00\uC744 \uC77D\uB2E4\uAC00 \uD55C\uBC88 \uC815\uB9AC\uD574\uC57C\uACA0\uB2E4\uB294 \uC0DD\uAC01\uC774 \uB4E4\uC5B4\uC11C \uC815\uB9AC\uD574\uBCF4\uB824\uACE0 \uD55C\uB2E4.\\n\\n### \uC2DC\uC791\uD558\uAE30 \uC804\uC5D0\\n\\n\uC544\uB798 \uCF54\uB4DC\uB97C \uC2E4\uD589\uD558\uBA74 \uACB0\uACFC\uAC00 \uC5B4\uB5BB\uAC8C \uCD9C\uB825\uB420 \uC9C0 \uC0DD\uAC01\uD574\uBCF4\uC790.\\n\\n```js\\nconsole.log(\'Main 1\');\\n\\nconst interval = setInterval(() => {\\n    console.log(\'interval 1\');\\n}, 0);\\n\\nsetTimeout(() => {\\n    console.log(\'timeout 1\');\\n\\n    Promise.resolve()\\n        .then(() => {\\n            console.log(\'promise 1\');\\n        })\\n        .then(() => {\\n            console.log(\'promise 2\');\\n            clearInterval(interval);\\n        });\\n\\n    console.log(\'timeout 2\');\\n}
1)\\n\\nconsole.log(\'Main 2\');\\n\\nPromise.resolve()\\n    .then(() => {\\n        console.log(\'promise 3\');\\n    })\\n    .then(() => {\\n        console.log(\'promise 4\');\\n    });\\n```\\n\\n## JavaScript Engine\\n\\n\uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uC5D4\uC9C4\uC740 **Memory Heap** \uACFC **Call Stack** \uC73C\uB85C \uAD6C\uC131\uB418\uC5B4 \uC788\uB2E4.\\n\\n\uAC00\uC7A5 \uC720\uBA85\uD55C \uAC83\uC774 [Google V8 Engine](https://v8.dev/) \uC774\uB2E4.\\n\\nJavaScript\uB294 **Single-Threaded** \uC774\uB2E4. ( Call Stack\uC744 1\uAC1C\uB9CC \uC0AC\uC6A9\uD55C\uB2E4 )\\n\\n\uC2F1\uAE00 \uC2A4\uB808\uB4DC\uB294 \uD55C \uBC88\uC5D0 \uD55C \uAC1C\uC758 \uC791\uC5C5\uB9CC \uC2E4\uD589\uD560 \uC218 \uC788\uB2E4.\\n\\n\uC774\uB7EC\uD55C \uD2B9\uC9D5 \uB54C\uBB38\uC5D0 \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8\uC758 \uD568\uC218\uAC00 \uB3D9\uC791\uD558\uB294 \uBC29\uC2DD\uC744 `Run to Completion`\uC774\uB77C\uACE0 \uD55C\uB2E4.\\n\\n\uC77C\uBC18\uC801\uC73C\uB85C\uB294 \uD55C \uBC88\uC5D0 \uD55C \uC791\uC5C5\uB9CC \uC2E4\uD589\uD560 \uC218 \uC788\uB294 \uAC8C \uD070 \uBB38\uC81C\uAC00 \uB418\uC9C0 \uC54A\uC9C0\uB9CC, \uD55C \uAC1C\uC758 \uC791\uC5C5\uC774 \uC624\uB798 \uAC78\uB9AC\uBA74 \uB4A4\uC5D0 \uC788\uB294 \uB2E4\uB978 \uC791\uC5C5\uC774 \uC2E4\uD589\uC774 \uC548 \uB418\uACE0 \uACC4\uC18D \uC9C0\uC5F0\uB41C\uB2E4.\\n\\n- Memory Heap: \uB3D9\uC801\uC73C\uB85C \uC0DD\uC131\uB41C \uAC1D\uCCB4 ( \uC778\uC2A4\uD134\uC2A4 ) \uAC00 \uC800\uC7A5\uB418\uB294 \uC601\uC5ED\\n- Call Stack: \uCF54\uB4DC\uAC00 \uC2E4\uD589\uB420 \uB54C \uC313\uC774\uB294 \uC601\uC5ED ( Stack \uD615\uD0DC )\\n\\n### Task Queue\\n\\n:::info\\n\\nEvent Queue == Task Queue == Message Queue ( \uBAA8\uB450 \uAC19\uC740 \uB9D0 )\\n\\n:::\\n\\nNodeJS \uB294 2\uAC1C\uC758 Queue( Macro Task, Micro Task )\uB97C \uC0AC\uC6A9\uD55C\uB2E4.\\n\\nMacro Task\uB97C 1\uAC1C \uC218\uD589\uD55C \uD6C4 Micro Task Queue\uC5D0 \uC788\uB294 \uBAA8\uB4E0 Task\uB97C \uC218\uD589\uD55C\uB2E4. ( \uD639\uC740 \uC9C0\uC815\uB41C Max Count\uAE4C\uC9C0 \uC218\uD589\uD55C\uB2E4. )\\n\\n- Macro Task Queue\\n  - I/O\\n  - setInterval\\n  - setImmediate\\n  - setTimeout\\n- Micro Task Queue\\n  - process.nextTick\\n  - Promise\\n  - Object.observe\\n\\n### Event Loop\\n\\n:::info\\n\\nNode.js \uB294 [libuv](http://libuv.org/) \uB97C \uC0AC\uC6A9\uD55C\uB2E4.\\n\\n:::\\n\\n\uC774\uBCA4\uD2B8 \uB8E8\uD504\uB294 \uAC00\uB2A5\uD558\uBA74 \uC5B8\uC81C\uB098 \uC2DC\uC2A4\uD15C \uCEE4\uB110\uC5D0 Task\uB97C \uB118\uACA8\uC11C Node.js \uAC00 Non Blocking I/O \uC791\uC5C5\uC744 \uC218\uD589\uD558\uB3C4\uB85D \uD55C\uB2E4.\\n\\n\uB300\uBD80\uBD84\uC758 \uCEE4\uB110\uC740 Multi-Thread\uC774\uAE30 \uB54C\uBB38\uC5D0 \uBC31\uADF8\uB77C\uC6B4\uB4DC\uC5D0\uC11C \uC5EC\uB7EC \uAC1C\uC758 Task\uB97C \uC218\uD589\uD560 \uC218 \uC788\uB2E4. \uC774\uB7EC\uD55C \uC791\uC5C5 \uC911 \uD558\uB098\uAC00 \uC644\uB8CC\uB418\uBA74 \uCEE4\uB110\uC774 Node.js \uC5D0\uAC8C \uC54C\uB824\uC918\uC11C Callback\uC744 Poll Queue\uC5D0 \uCD94\uAC00\uD560 \uC218 \uC788\uB3C4\uB85D \uD55C\uB2E4.\\n\\nEvent Queue\uB294 \uCD1D 7\uAC1C\uAC00 \uC788\uC73C\uBA70, \uAC01 Queue\uB97C Phase ( \uB2E8\uACC4 )\uB77C\uACE0 \uD45C\uD604\uD55C\uB2E4.\\n\\n\uC774\uBCA4\uD2B8 \uB8E8\uD504\uAC00 \uC2E4\uD589\uD558\uB294 \uC0AC\uC774 Node.js \uB294 \uB2E4\uB978 \uBE44\uB3D9\uAE30 I/O \uB098 Timer\uB97C \uAE30\uB2E4\uB9AC\uA
1CE0 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uC5C6\uC73C\uBA74 \uC885\uB8CC\uD55C\uB2E4.\\n\\n![\uAC01 Phase \uB4E4\uC740 Callback\uC758 FIFO Queue\uB97C \uAC00\uC9C0\uACE0 \uC788\uB2E4.](./image-1.webp)\\n\\n_\uAC01 Phase \uB4E4\uC740 Callback\uC758 FIFO Queue\uB97C \uAC00\uC9C0\uACE0 \uC788\uB2E4._\\n\\n#### Timers\\n\\n- `setTimeout`, `setInterval` Callback \uC774 \uC2E4\uD589\uB418\uB294 \uB2E8\uACC4\\n- Timer Phase\uC5D0 Task\uB97C \uB123\uB294 \uAC83\uC740 Poll Phase\uC5D0\uC11C \uC2E4\uD589\\n- Timer Phase\uB294 \uB2E8\uC9C0 \uC2DC\uAC04 \uAD00\uB828 \uD568\uC218\uB97C \uC2E4\uD589\\n\\n#### Pending Callbacks\\n\\n- Loop\uC758 \uBC18\uBCF5\uC73C\uB85C \uC5F0\uAE30\uB41C I/O Callback \uB4E4\uC744 \uC2E4\uD589\\n\\n#### idle/prepare\\n\\n- \uB0B4\uBD80\uC6A9\uC73C\uB85C\uB9CC \uC0AC\uC6A9\\n\\n#### Poll\\n\\n- I/O \uB97C \uC5BC\uB9C8\uB098 \uC624\uB798 Block \uD574\uC57C \uD558\uACE0 Polling \uD574\uC57C \uD558\uB294\uC9C0 \uACC4\uC0B0\uD568\\n- Poll Queue\uC5D0 \uC788\uB294 \uC774\uBCA4\uD2B8\uB97C \uCC98\uB9AC\uD568\\n- Scheduling \uB41C \uD0C0\uC774\uBA38\uAC00 \uC5C6\uC73C\uBA74\\n  1. `Poll Queue\uAC00 \uBE44\uC5B4\uC788\uC9C0 \uC54A\uB2E4\uBA74` \uC774\uBCA4\uD2B8 \uB8E8\uD504\uAC00 Queue\uB97C \uCC98\uB9AC\uD558\uBA74\uC11C \uB2E4 \uCC98\uB9AC\uD558\uAC70\uB098 \uCD5C\uB300\uCE58\uC5D0 \uB3C4\uB2EC\uD560 \uB54C\uAE4C\uC9C0 \uB3D9\uAE30\uC801\uC73C\uB85C Callback\uC744 \uC2E4\uD589\uD568\\n  1. `Poll Queue\uAC00 \uBE44\uC5B4\uC788\uB2E4\uBA74`\\n     - `setImmediate` \uAC00 \uC2A4\uCF00\uC904\uB9C1 \uB418\uC5B4 \uC788\uB2E4\uBA74 Poll Phase\uB97C \uC885\uB8CC\uD558\uACE0 Check Phase \uB85C \uB118\uC5B4\uAC10\\n     - `setImmediate` \uAC00 \uC2A4\uCF00\uC904\uB9C1 \uB418\uC5B4 \uC788\uC9C0 \uC54A\uC73C\uBA74 Callback\uC774 Queue\uC5D0 \uCD94\uAC00\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0 \uD6C4 \uC989\uC2DC \uC2E4\uD589\uD568\\n\\n#### Check\\n\\n- `setImmediate` Callback \uC774 \uC2E4\uD589\uB418\uB294 \uB2E8\uACC4\\n- `Poll` \uC2E4\uD589 \uC9C1\uD6C4 \uBC14\uB85C \uC2E4\uD589\uB428\\n\\n#### Close\\n\\n- \uC77C\uBD80 Close Callback \uB4E4\uC774 \uC2E4\uD589\uB418\uB294 \uB2E8\uACC4\\n- `socket.close` \uB4F1\\n\\n### \uC5F0\uC2B5 \uBB38\uC81C\\n\\n```js\\nsetTimeout(() => {\\n\\tconsole.log(\'timeout\');\\n}, 0);\\n\\nsetImmediate(() => {\\n\\tconsole.log(\'immediate\');\\n});\\n```\\n\\n\uCD9C\uB825 \uACB0\uACFC\uB294?\\n\\n1. `timeout` \u2192 `immediate`\\n1. `immediate` \u2192 `timeout`\\n1. **\uC54C \uC218 \uC5C6\uB2E4.**\\n\\n```js\\nconst fs = require(\'fs\');\\n\\nfs.readFile(__filename, () => {\\n\\tsetTimeout(() => {\\n\\t\\tconsole.log(\'timeout\');\\n \\t}, 0);\\n\\n\\tsetImmediate(() => {\\n\\t\\tconsole.log(\'immediate\');\\n\\t});\\n});\\n```\\n\\n\uCD9C\uB825 \uACB0\uACFC\uB294?\\n\\n1. `timeout` \u2192 `immediate`\\n1. **`immediate`** **\u2192** **`timeout`**\\n1. \uC54C \uC218 \uC5C6\uB2E4.\\n\\n## \uB808\uD37C\uB7F0\uC2A4\\n\\n- [\u2728\u267B\uFE0F JavaScript Visualized: Event Loop](https://dev.to/lydiahallie/javascript-visualized-event-loop-3dif)\\n- [Node.js \uC774\uBCA4\uD2B8 \uB8E8\uD504, \uD0C0\uC774\uBA38, \\\\`process.nextTick()\\\\` \\\\| Node.js](https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/)\\n- [\\\\[Node.js\\\\] Understanding the Node.js Event Loop (\uBC88\uC5ED) #2](http://egloos.zum.com/sweeper/v/3195982)\\n- [Tasks, microtasks, queues and schedules](https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/)"},{"id":"thoughts-on-dev-culture","metadata":{"permalink":"/blog/thoughts-on-dev-culture","source":"@site/blog/2020-03-12-thoughts-on-dev-culture/index.md","title":"\uD63C\uC790 \uC0DD\uAC01\uD574 \uBCF8 \uAC1C\uBC1C \uBB38\uD654","description":"\uC5EC\uB7EC \uAC1C\uBC1C\uD300\uC758 \uBB38\uD654\uB97C \uBCF4\uBA74\uC11C \uD56D\uC0C1 \uC88B\uC740 \uBB38\uD654\uC640 \uBC29\uBC95\uC5D0 \uB300\uD574 \uC0DD\uAC01\uD574\uC654\uB2E4.","date":"2020-03-12T00:00:00.000Z","tags":[{"inline":false,"label":"\uC544\uBB34\uC18C\uB9AC","permalink":"/blog/tags/essay"}],"readingTime":2.55,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"\uD63C\uC790 \uC0DD\uAC01\uD574 \uBCF8 \uAC1C\uBC1C \uBB38\uD654","slug":"thoughts-on-dev-culture","date":"2020-03-12T00:00:00.000Z","authors":["dongmyeong"],"tags":["essay"],"description":"\uC5EC\uB7EC \uAC1C\uBC1C\uD300\uC758 \uBB38\uD654\uB97C \uBCF4\uBA74\uC11C \uD56D\uC0C1 \uC88B\uC740 \uBB38\uD654\uC640 \uBC29\uBC95\uC5D0 \uB300\uD574 \uC0DD\uAC01\uD574\uC654\uB2E4."},"unlisted":false,"prevItem":{"title":"\uC774\uBCA4\uD2B8 \uB8E8\uD504","permalink":"/blog/event-loop"}
1,"nextItem":{"title":"Go \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3 \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/go-project-layout"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uD63C\uC790 \uC0DD\uAC01\uD574 \uBCF8 \uAC1C\uBC1C \uBB38\uD654\\n\\n\uC5EC\uB7EC \uAC1C\uBC1C\uD300\uC758 \uBB38\uD654\uB97C \uBCF4\uBA74\uC11C \uD56D\uC0C1 \uC88B\uC740 \uBB38\uD654\uC640 \uBC29\uBC95\uC5D0 \uB300\uD574 \uC0DD\uAC01\uD574\uC654\uB2E4.\\n\\n\uC5B4\uB5A4 \uC88B\uC740 \uBC29\uBC95\uC774 \uC788\uB354\uB77C\uB3C4 \uACB0\uAD6D \uD300 \uC548\uC5D0\uC11C \uC0C1\uD669\uC5D0 \uB9DE\uCDB0\uC11C \uBC14\uAFD4 \uC801\uC6A9\uD558\uB294 \uAC8C \uC815\uB2F5\uC77C \uAC70 \uAC19\uB2E4\uB294 \uC0DD\uAC01\uC774 \uB4E0\uB2E4.\\n\\n\uB0B4\uAC00 \uC0DD\uAC01\uD588\uC744 \uB54C \uAC1C\uBC1C\uD300\uC5D0 \uC788\uC73C\uBA74 \uC88B\uACA0\uB2E4\uACE0 \uC0DD\uAC01\uD558\uB294 \uBB38\uD654, \uBC29\uBC95\uB4E4\uC744 \uC815\uB9AC\uD574 \uBCF4\uB824\uACE0 \uD55C\uB2E4.\\n\\n### \uCF54\uB4DC \uB9AC\uBDF0\\n\\n\uCF54\uB4DC \uB9AC\uBDF0\uB97C \uD588\uC744 \uB54C \uC5BB\uC744 \uC218 \uC788\uB294 \uC774\uC810\uC740 **\uBB38\uC81C\uAC00 \uC0DD\uAE38\uB9CC\uD55C \uBD80\uBD84\uC758 \uCF54\uB4DC\uB97C \uBA3C\uC800 \uBC1C\uACAC**, **\uCF54\uB4DC \uC2A4\uD0C0\uC77C ( Convention ) \uC900\uC218**, **\uC911\uBCF5 \uCF54\uB4DC\uB97C \uBC29\uC9C0** \uB4F1\uC774 \uC788\uB2E4.\\n\\n\uAC1C\uBC1C\uD558\uB2E4 \uBCF4\uBA74 \uBCF8\uC778\uC774 \uBC1C\uACAC\uD558\uC9C0 \uBABB\uD55C \uC2E4\uC218\uB97C \uB2E4\uB978 \uC0AC\uB78C\uC774 \uBA3C\uC800 \uBC1C\uACAC\uD558\uC5EC \uACE0\uCE60 \uC218 \uC788\uC73C\uBA70, \uC815\uD574\uC9C4 \uCF54\uB4DC \uC2A4\uD0C0\uC77C\uC744 \uC9C0\uD0B4\uC73C\uB85C\uC368 \uC77C\uAD00\uB41C \uC2A4\uD0C0\uC77C\uC758 \uCF54\uB4DC\uB97C \uC791\uC131\uD560 \uC218 \uC788\uB2E4.\\n\\n\uCF54\uB4DC \uB9AC\uBDF0\uAC00 \uC88B\uB2E4\uB294 \uB9D0\uC740 \uD56D\uC0C1 \uB4E4\uC5B4\uC11C \uC54C\uACE0\uB294 \uC788\uC5C8\uC73C\uB098 \uAD6C\uCCB4\uC801\uC73C\uB85C \uC5B4\uB5A4 \uBD80\uBD84\uC774 \uC88B\uC740\uC9C0 \uBAA8\uB974\uACE0 \uC788\uC5C8\uB294\uB370, \uC2E4\uC81C\uB85C \uCF54\uB4DC \uB9AC\uBDF0\uB97C \uD574\uBCF4\uB2C8 \uC0C1\uB2F9\uD55C \uD6A8\uACFC\uB97C \uB9CE\uC774 \uBD24\uB2E4.\\n\\n\uCD5C\uADFC\uC5D0 \uC9C1\uC811 \uACAA\uC5C8\uB358 \uC0AC\uB840\uB85C \uAE30\uC874 \uC11C\uBE44\uC2A4\uC5D0\uC11C \\"A \uAE30\uB2A5\\"\uC744 \uC870\uAE08 \uC218\uC815\uD558\uACE0 \uCF54\uB4DC \uB9AC\uBDF0 \uC694\uCCAD\uC744 \uD588\uB294\uB370 \uB9AC\uBDF0 \uC911 \uC804\uD600 \uC0C1\uAD00\uC5C6\uC5B4 \uBCF4\uC600\uB358 \\"B \uAE30\uB2A5\\"\uC5D0 \uBB38\uC81C\uAC00 \uC0DD\uAE38 \uC218 \uC788\uC9C0 \uC54A\uB0D0\uB294 \uCF54\uBA58\uD2B8\uB97C \uB4E3\uACE0 \uD655\uC778\uD574\uBCF4\uB2C8 \uC2E4\uC81C\uB85C \uC601\uD5A5\uC744 \uBC1B\uACE0 \uC788\uC5C8\uB2E4.\\n\\n\uB0B4\uBD80 \uB85C\uC9C1\uC774 \uBCF5\uC7A1\uD574\uC11C \uC815\uD655\uD558\uAC8C \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uB358 \uBD80\uBD84\uC778\uB370, \uB9AC\uBDF0\uB97C \uD1B5\uD574\uC11C \uBB38\uC81C\uAC00 \uC788\uC744 \uC218 \uC788\uB2E4\uB294 \uAC83\uC744 \uC54C\uAC8C \uB418\uACE0 \uB2E4\uC2DC \uC218\uC815\uD574\uC11C \uBB38\uC81C\uC5C6\uC774 \uBC30\uD3EC\uD560 \uC218 \uC788\uC5C8\uB2E4.\\n\\n**\uCF54\uB4DC \uB9AC\uBDF0\uB294 \uD560 \uC218 \uC788\uB2E4\uBA74 \uD558\uB294\uAC8C \uC88B\uB2E4.**\\n\\n- [\uCE74\uCE74\uC624\uC2A4\uD1A0\uB9AC \uD300\uC758 \uCF54\uB4DC \uB9AC\uBDF0 \uB3C4\uC785 \uC0AC\uB840 - \uCF54\uB4DC \uB9AC\uBDF0, \uC5B4\uB514\uAE4C\uC9C0 \uD574\uBD24\uB2C8?](https://tech.kakao.com/2016/02/04/code-review/)\\n- [\uCF54\uB4DC\uB9AC\uBDF0\uC758 \uC9C4\uC9DC \uBAA9\uC801\uC740 \uB530\uB85C\uC788\uB2E4](https://blog.logi-spot.com/%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0%EC%9D%98-%EC%A7%84%EC%A7%9C-%EB%AA%A9%EC%A0%81%EC%9D%80-%EB%94%B0%EB%A1%9C%EC%9E%88%EB%8B%A4/)\\n- [\uC18C\uC2A4\uCF54\uB4DC \uB9AC\uBDF0\uC5D0 \uB300\uD55C \uC9E7\uC740 \uC774\uC57C\uAE30](https://velog.io/@zetlos/%EC%86%8C%EC%8A%A4%EC%BD%94%EB%93%9C-%EB%A6%AC%EB%B7%B0%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A7%A7%EC%9D%80-%EC%9D%B4%EC%95%BC%EA%B8%B0)\\n\\n### IaC ( Infrastructure as Code )\\n\\n\uD074\uB77C\uC6B0\uB4DC \uD658\uACBD\uC5D0\uC11C \uB9AC\uC18C\uC2A4\uB97C \uC0D
1D\uC131\uD558\uACE0 \uC0AD\uC81C\uD558\uB294 \uAC74 \uB108\uBB34\uB098 \uAC04\uB2E8\uD558\uB2E4. \uD074\uB9AD \uD55C\uBC88, CLI \uBA85\uB839\uC5B4 \uD55C \uBC88\uC5D0 \uB9AC\uC18C\uC2A4\uAC00 \uC0DD\uC131\uB418\uACE0 \uC0AD\uC81C\uB418\uAE30 \uB54C\uBB38\uC774\uB2E4.\\n\\n\uB9AC\uC18C\uC2A4\uC758 \uC0DD\uC131/\uC0AD\uC81C\uAC00 \uAC04\uD3B8\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC218\uB3D9\uC73C\uB85C \uB9AC\uC18C\uC2A4\uB97C \uD544\uC694\uD560 \uB54C \uB9C8\uB2E4 \uBC14\uB85C\uBC14\uB85C \uB9CC\uB4E4\uC5B4\uC11C \uC0AC\uC6A9\uD588\uB2E4.\\n\\n\uC774\uB807\uAC8C \uC778\uD504\uB77C\uB97C \uAD00\uB9AC\uD574\uB3C4 1\\\\~2\uBA85\uC758 \uC778\uC6D0\uC774 \uAD00\uB9AC\uD560 \uB54C \uC5B4\uB824\uC6C0\uC774 \uC5C6\uC5C8\uB2E4.\\n\\n\uD558\uC9C0\uB9CC \uC778\uC6D0\uC774 \uB298\uC5B4\uB098\uACE0 \uC11C\uBE44\uC2A4 \uADDC\uBAA8\uAC00 \uCEE4\uC9D0\uC5D0 \uB530\uB77C \uBD88\uD544\uC694\uD55C \uB9AC\uC18C\uC2A4\uAC00 \uC0DD\uC131\uB418\uAE30\uB3C4 \uD558\uACE0, \uD544\uC694\uD55C \uB9AC\uC18C\uC2A4\uB97C \uC0AD\uC81C\uD558\uB294 \uC2E4\uC218\uAC00 \uBC1C\uC0DD\uD558\uAE30\uB3C4 \uD588\uB2E4.\\n\\n\uB354 \uD070 \uBB38\uC81C\uB294 \uC2DC\uAC04\uC774 \uC9C0\uB098\uBA74\uC11C \uC5B4\uB5A4 \uBAA9\uC801\uACFC \uC758\uB3C4\uB85C \uB9CC\uB4E4\uC5C8\uB294\uC9C0\uC5D0 \uB300\uD55C \uD788\uC2A4\uD1A0\uB9AC\uAC00 \uC804\uB2EC\uB418\uC9C0 \uC54A\uC558\uACE0, \uC774\uB85C \uC778\uD574 \uC778\uD504\uB77C \uAD00\uB9AC\uAC00 \uC815\uB9D0 \uC5B4\uB824\uC6CC\uC84C\uB2E4.\\n\\n\uC774\uB7F0 \uBB38\uC81C\uC810\uB4E4\uC744 \uD574\uACB0\uD558\uAE30 \uC704\uD574 IAC ( Infrastructure as Code ) \uAC00 \uB4F1\uC7A5\uD588\uB2E4.\\n\\n\uC720\uC5F0\uC131\uC774 \uB5A8\uC5B4\uC9C0\uB294 \uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uC0AC\uB78C\uC774 \uC9C1\uC811 \uB9AC\uC18C\uC2A4\uB97C \uC0DD\uC131\uD558\uB294 \uB300\uC2E0, \uCF54\uB4DC\uB97C \uC774\uC6A9\uD574 \uC2DC\uC2A4\uD15C\uC744 \uC790\uB3D9\uC73C\uB85C \uAD6C\uCD95, \uAD00\uB9AC, \uD504\uB85C\uBE44\uC800\uB2DD\uC744 \uD558\uAC8C \uB418\uC5C8\uB2E4.\\n\\n\uCF54\uB4DC\uB85C \uAD00\uB9AC\uD558\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uBE60\uB974\uACE0 \uC815\uD655\uD558\uAC8C \uAD00\uB9AC\uD560 \uC218 \uC788\uC73C\uBA70, \uB3D9\uC77C\uD55C \uD658\uACBD\uC744 \uAD6C\uC131\uD560 \uB54C\uB3C4 \uC815\uB9D0 \uAC04\uB2E8\uD574\uC9C4\uB2E4.\\n\\n\uB300\uD45C\uC801\uC73C\uB85C\uB294 Terraform, AWS CDK \uB4F1\uC774 \uC788\uB2E4.\\n\\n**IaC \uB294 \uB354\uC774\uC0C1 \uC120\uD0DD\uC774 \uC544\uB2C8\uB77C \uD544\uC218\uB2E4.**\\n\\n- [\\"\uD074\uB77C\uC6B0\uB4DC \uC2DC\uB300 \uC11C\uBC84 \uAD00\uB9AC\uC5D0 \uD544\uC218\\" \uCF54\uB4DC\uD615 \uC778\uD504\uB77C\uC758 \uC774\uD574](http://www.itworld.co.kr/news/118469)\\n\\n### \uBB38\uC11C\uD654\\n\\n\uAC1C\uBC1C\uD558\uB2E4 \uBCF4\uBA74 \uBB34\uC5B8\uAC00 \uC815\uB9AC\uD558\uAE30 \uC704\uD574 \uBB38\uC11C\uD654\uC758 \uD544\uC694\uC131\uC744 \uB290\uB084 \uB54C\uAC00 \uC788\uB2E4. \uD2B9\uD788 \uAC1C\uBC1C\uC790\uB07C\uB9AC \uC758\uC0AC\uC18C\uD1B5\uC744 \uD560 \uB54C \uBB38\uC11C\uD654\uC758 \uD544\uC694\uC131\uC744 \uB9CE\uC774 \uB290\uB080\uB2E4.\\n\\n\uBB38\uC11C\uD654\uB294 \uCF54\uB4DC\uB85C\uB9CC \uD45C\uD604\uD558\uAE30 \uC5B4\uB824\uC6B4 \uC815\uBCF4\uB4E4\uC744 \uBCF4\uCDA9\uD558\uB294 \uAC83\uC774\uB2E4. \uCF54\uB4DC\uB294 \uD14D\uC2A4\uD2B8\uB85C\uB9CC \uD45C\uD604\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC774\uD574\uAC00 \uC27D\uAC8C \uC548 \uB420 \uACBD\uC6B0\uAC00 \uB9CE\uB2E4.\\n\\n\uC774\uB7F0 \uACBD\uC6B0 UML, flowchart \uB4F1\uC758 \uC2DC\uAC01\uC801 \uC790\uB8CC\uB4E4\uC740 \uCF54\uB4DC\uC758 \uC774\uD574\uB97C \uB3D5\uB294 \uAC8C \uB9E4\uC6B0 \uD6A8\uACFC\uC801\uC774\uB2E4.\\n\\n\uCD5C\uADFC\uC5D0 \uB9CE\uC774 \uC801\uC6A9\uB418\uACE0 \uC788\uB294 MSA \uC5D0\uC11C \uC5EC\uB7EC \uC11C\uBE44\uC2A4\uB97C \uD1B5\uC2E0\uD574\uC11C \uAE30\uB2A5\uC744 \uB9CC\uB4DC\uB294 \uACBD\uC6B0\uC5D0\uB3C4 \uBB38\uC11C\uD654\uB97C \uC798\uD574\uB450\uBA74 \uC774\uD574\uD558\uAE30\uAC00 \uD6E8\uC52C \uC218\uC6D4\uD558\uB2E4.\\n\\n\uBB38\uC11C\uB294 \uC0C1\uBD80\uC5D0 \uBCF4\uACE0\uB97C \uC704\uD574 \uB9CC\uB4DC\uB294 \uAC8C \uC544\uB2C8\uB77C \uC758\uC0AC\uC18C\uD1B5\uC744 \uC704\uD574 \uB9CC\uB4DC\uB294 \uAC8C \uB354 \uB9DE\uC9C0 \uC54A\uB0D0\uB294 \uC0DD\uAC01\uC774 \uB4E0\uB2E4.\\n\\n\uAC00\uC7A5 \uC911\uC694\uD55C \uAC74 \uBB38\uC11C\uB97C \uB9CC\uB4E4\uC5C8\uC73C\uBA74 \uC9C0\uC18D\uD574\uC11C \uAD00\uB9AC\uB97C \uD574\uC918\uC57C \uD55C\uB2E4\uB294 \uC810\uC774\uB2E4.\\n\\n\uC624\uD788\uB824 \uB9CC\uB4E4\uC5B4\uB193\uACE0 \uAD00\uB9AC \uC548\uB41C \uBB38\uC11C\uB294 \uC5C6\uB294\uAC83\uBCF4\uB2E4 \uBABB\uD558\uB2E4.\\n\\n**\uBB38\uC11C\uD654 \uC791\uC5C5\uB3C4 \uC5C5\uBB34\uC758 \uC77C\uD658\uC73C\uB85C \uC0D
1D\uAC01\uD558\uACE0 \uC77C\uC815 \uC7A1\uC744 \uB54C \uCDA9\uBD84\uD788 \uACE0\uB824\uB418\uC5B4\uC57C \uD55C\uB2E4.**\\n\\n### \uD68C\uACE0\\n\\n\uC2A4\uD504\uB9B0\uD2B8 \uD68C\uACE0, \uC2A4\uCFFC\uB4DC \uD68C\uACE0, TF \uD68C\uACE0 \uB4F1 \uC5EC\uB7EC \uD68C\uACE0\uB97C \uCC38\uC11D\uD574\uBCF4\uBA74\uC11C \uB290\uB080 \uC810\uC740 \uD68C\uACE0\uB97C \uD1B5\uD574 \uB0B4 \uC0DD\uAC01\uC744 \uC815\uB9AC\uD558\uACE0 \uACF5\uC720\uD560 \uC218 \uC788\uB294 \uC2DC\uAC04\uC774 \uB9CC\uB4E4\uC5B4\uC9C4\uB2E4\uB294 \uAC83\uC774\uB2E4.\\n\\n\uD68C\uACE0\uB77C\uB294 \uC2DC\uAC04\uC744 \uAC16\uC9C0 \uC54A\uACE0\uB3C4 \uB354 \uC790\uC8FC \uACF5\uC720\uD558\uACE0 \uB354 \uC790\uC8FC \uB300\uD654\uB97C \uD558\uB294 \uAC8C \uAC00\uC7A5 \uC88B\uC740 \uBC29\uBC95\uC774\uACA0\uC9C0\uB9CC, \uD604\uC2E4\uC5D0\uC11C\uB294 \uC27D\uC9C0\uB294 \uC54A\uB2E4\uACE0 \uC0DD\uAC01\uD55C\uB2E4.\\n\\n\uC544\uC26C\uC6B4 \uC810, \uC798\uD55C \uC810, \uAC1C\uC120\uD560\uB9CC\uD55C \uB0B4\uC6A9\uC744 \uCC3E\uC544\uB0B4\uACE0 Action Plan\uC744 \uB3C4\uCD9C\uD574\uC11C \uC55E\uC73C\uB85C \uB354\uC6B1 \uD300\uC774 \uC131\uC7A5\uD560 \uC218 \uC788\uB294 \uBC29\uD5A5\uC744 \uCC3E\uB294 \uAC8C \uD300\uC758 \uC131\uC7A5\uC5D0\uB3C4 \uAD49\uC7A5\uD788 \uB3C4\uC6C0\uC774 \uB41C\uB2E4\uACE0 \uC0DD\uAC01\uD55C\uB2E4.\\n\\n- [\uC2A4\uD3EC\uCE74\uC5D0\uC11C\uB294 \uD68C\uACE0\uB97C \uC5B4\uB5BB\uAC8C \uD560\uAE4C?](https://spoqa.github.io/2018/08/29/retrospect.html)\\n\\n### \uC2E0\uADDC \uC785\uC0AC\uC790 \uC801\uC751 \uAE30\uAC04\\n\\n\uAC1C\uBC1C\uC790\uAC00 \uD300\uC5D0 \uC801\uC751\uD558\uB294\uB370 \uAE4C\uC9C0\uB294 \uC9E7\uAC8C 1\uB2EC \\\\~ \uAE38\uAC8C\uB294 6\uB2EC \uC815\uB3C4\uC758 \uC2DC\uAC04\uC774 \uD544\uC694\uD558\uB2E4\uACE0 \uD55C\uB2E4.\\n\\n\uC774 \uC2DC\uAC04\uC744 \uCD5C\uC18C\uD654\uD558\uACE0, \uBE60\uB978 \uC5C5\uBB34 \uC801\uC751\uC744 \uC704\uD574\uC11C\uB294 \uC2E0\uADDC \uC785\uC0AC\uC790\uAC00 \uAE30\uC874 \uAD6C\uC131\uC6D0\uB4E4\uACFC \uD568\uAED8 \uC81C\uD488, \uC2DC\uC2A4\uD15C\uC5D0 \uB300\uD574 \uC774\uD574\uB3C4\uB97C \uC313\uC544\uAC00\uB294 \uC2DC\uAC04\uC774 \uD544\uC694\uD558\uB2E4. ( e.g. \uC2A4\uD3EC\uCE74\uC758 \uBD80\uD2B8\uCEA0\uD504 )\\n\\n\uC11C\uBE44\uC2A4\uB97C \uC0AC\uC6A9\uD558\uBA74\uC11C \uBB38\uC81C\uC810, \uBC84\uADF8\uB97C \uCC3E\uC544 \uC774\uC288\uB85C \uB9CC\uB4E4\uACE0 \uC2A4\uC2A4\uB85C \uD574\uACB0\uD574\uB098\uAC00\uB294 \uACFC\uC815\uC5D0\uC11C \uC11C\uBE44\uC2A4\uC5D0 \uB300\uD55C \uC774\uD574\uB3C4\uB97C \uB192\uC77C \uC218 \uC788\uC744 \uBFD0\uB9CC \uC544\uB2C8\uB77C \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC218\uC815\uD558\uB2E4\uBCF4\uB2C8 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uC5C5\uBB34\uC5D0 \uB300\uD574 \uC801\uC751\uC774 \uB41C\uB2E4.\\n\\n**\uC2E0\uADDC \uC785\uC0AC\uC790 \uC801\uC751 \uAE30\uAC04\uC740 \uAC1C\uC778\uC758 \uC801\uC751 \uBFD0\uB9CC \uC544\uB2C8\uB77C \uB354 \uB098\uC544\uAC00 \uD300\uC758 \uC131\uC7A5\uC744 \uC704\uD55C \uD22C\uC790\uB77C\uACE0 \uC0D
1D\uAC01\uD55C\uB2E4.**\\n\\n- [\uC2A4\uD3EC\uCE74\uC5D0\uC11C \uC2E0\uC785 \uAC1C\uBC1C\uC790\uAC00 \uC801\uC751\uD558\uB294 \uBC95: \uBD80\uD2B8\uCEA0\uD504 \uD6C4\uAE30](https://spoqa.github.io/2019/10/22/bootcamp-review.html)\\n\\n### \uD504\uB85C\uD398\uC154\uB110\\n\\n- \uAC01 \uBD84\uC57C\uC758 \uC804\uBB38\uAC00\uB85C\uC11C, \uB2F9\uC5F0\uD558\uB2E4\uACE0 \uC0DD\uAC01\uD55C\uAC83 \uB4E4\uC740 \uD0C0\uD611\uD558\uC9C0 \uB9D0\uACE0 \uB9D0\uD560 \uC218 \uC788\uC5B4\uC57C \uD55C\uB2E4.\\n- (\\\\*) \uC5C5\uBB34\uC5D0 \uB300\uD55C \uC2DC\uAC04\uC744 \uCE21\uC815\uD558\uACE0, \uADF8 \uC2DC\uAC04 \uC548\uC5D0 \uB05D\uB0B4\uC57C \uD55C\uB2E4.\\n- \uB0B4 \uC77C\uC774 \uC544\uB2C8\uB354\uB77C\uB3C4, \uC8FC\uBCC0 \uB3D9\uB8CC\uB4E4\uC774 \uC5B4\uB824\uC6C0\uC744 \uACAA\uB294\uB2E4\uBA74 \uC801\uADF9\uC801\uC73C\uB85C \uB3C4\uC640\uC900\uB2E4.\\n- \uC6B0\uB9AC \uBAA8\uB450\uAC00 \uD504\uB85C\uB77C\uB294 \uC0DD\uAC01\uC744 \uD558\uB294 \uAC83\uB3C4 \uC911\uC694\uD558\uB2E4."},{"id":"go-project-layout","metadata":{"permalink":"/blog/go-project-layout","source":"@site/blog/2020-03-08-go-project-layout/index.md","title":"Go \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3 \uC54C\uC544\uBCF4\uAE30","description":"Go Lang \uC744 \uBC30\uC6B0\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uACC4\uC18D \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870\uC5D0 \uB300\uD574 \uACE0\uBBFC\uC744 \uD558\uACE0 \uC788\uC5C8\uC73C\uB098, Go Lang \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3\uC774 \uC788\uC5B4\uC11C \uD55C\uBC88 \uB458\uB7EC\uBCFC \uACB8 \uC544\uC8FC \uAC04\uB7B5\uD558\uAC8C \uC815\uB9AC\uD588\uB2E4.","date":"2020-03-08T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":1.29,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Go \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3 \uC54C\uC544\uBCF4\uAE30","slug":"go-project-layout","date":"2020-03-08T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"Go Lang \uC744 \uBC30\uC6B0\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uACC4\uC18D \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870\uC5D0 \uB300\uD574 \uACE0\uBBFC\uC744 \uD558\uACE0 \uC788\uC5C8\uC73C\uB098, Go Lang \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3\uC774 \uC788\uC5B4\uC11C \uD55C\uBC88 \uB458\uB7EC\uBCFC \uACB8 \uC544\uC8FC \uAC04\uB7B5\uD558\uAC8C \uC815\uB9AC\uD588\uB2E4."},"unlisted":false,"prevItem":{"title":"\uD63C\uC790 \uC0DD\uAC01\uD574 \uBCF8 \uAC1C\uBC1C \uBB38\uD654","permalink":"/blog/thoughts-on-dev-culture"},"nextItem":{"title":"Notion Custom Domain \uC5F0\uACB0","permalink":"/blog/notion-custom-domain"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Go Lang  \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3\\n\\nGo Lang \uC744 \uBC30\uC6B0\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uACC4\uC18D \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870\uC5D0 \uB300\uD574 \uACE0\uBBFC\uC744 \uD558\uACE0 \uC788\uC5C8\uC73C\uB098, Go Lang \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3\uC774 \uC788\uC5B4\uC11C \uD55C\uBC88 \uB458\uB7EC\uBCFC \uACB8 \uC544\uC8FC \uAC04\uB7B5\uD558\uAC8C \uC815\uB9AC\uD588\uB2E4.\\n\\n\uC0C1\uC138\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uACE0 \uC2F6\uC73C\uBA74 `golang-standards/project-layout` Repository \uB97C \uCC38\uACE0\uD55C\uB2E4.\\n\\n:::info\\n\\n`/src` \uD3F4\uB354\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4.\\n\\n:::\\n\\n### Go Directories\\n\\n#### /cmd\\n\\n- \uBA54\uC778 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n- \uAC01 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uB514\uB809\uD1A0\uB9AC \uC774\uB984\uC740 \uC2E4\uD589\uD558\uAE30 \uC6D0\uD558\uB294 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uACFC \uC774\uB984\uC774 \uB3D9\uC77C\uD574\uC57C \uD55C\uB2E4 ( e.g. `/cmd/myapp` )\\n- `/internal` \uACFC `/pkg` \uB514\uB809\uD1A0\uB9AC \uC5D0\uC11C \uCC38\uC870\uD558\uC5EC \uD638\uCD9C\uD558\uB294 \uC791\uC740 `main` \uD568\uC218\uB97C \uB450\uB294\uAC8C \uC77C\uBC18\uC801\uC774\uB2E4\\n\\n#### /internal\\n\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uACFC \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC758 \uB0B4\uBD80 \uCF54\uB4DC\uB97C \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n- \uC678\uBD80 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC774\uB098 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB294 \uC774 \uD3F4\uB354\uC5D0 \uC788\uB294 \uCF54\uB4DC\uB97C \uCC38\uC870\uD560 \uC218 \uC5C6\uB2E4\\n\\n#### /pkg\\n\\n- \uC678\uBD80 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0\uC11C \uC774 \uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uCC38\uC870\uD560 \uC218 \uC788\uB294 \uCF54\uB4DC\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n#### /vendor\\n\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0 \uC5F0\uAD00 \uC788\uB294 \uC678\uBD80 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uC744 \uC218\uB3D9\uC73C\uB85C \uAD00\uB9AC\uD560 \uB54C \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n### Service Application Directories\\n\\
1n#### /api\\n\\n- OpenAPI, Swagger \uC2A4\uD399, JSON \uC2A4\uD0A4\uB9C8 \uD30C\uC77C, \uD504\uB85C\uD1A0\uCF5C \uC815\uC758 \uD30C\uC77C\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n### Web Application Directories\\n\\n#### /web\\n\\n- \uC6F9 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uCEF4\uD3EC\uB10C\uD2B8 \uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n  - assets \uD30C\uC77C\uB4E4\\n  - Server Side Teampltes\\n  - SPA\\n\\n### Common Application Directories\\n\\n#### /configs\\n\\n- \uC124\uC815 \uD30C\uC77C\uC758 \uD15C\uD50C\uB9BF \uD639\uC740 \uAE30\uBCF8 \uC124\uC815 \uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n#### /init\\n\\n- \uC2DC\uC2A4\uD15C( systemd, upsert, sysv ) \uD639\uC740 \uD504\uB85C\uC138\uC2A4 ( runit, supervisord )\uC124\uC815 \uD30C\uC77C\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n#### /scripts\\n\\n- \uB2E4\uC591\uD55C \uBE4C\uB4DC, \uC124\uCE58, \uBD84\uC11D, \uADF8 \uC678 \uB2E4\uB978 \uD589\uB3D9\uC744 \uD558\uAE30 \uC704\uD55C \uC2A4\uD06C\uB9BD\uD2B8\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uB2E4\\n- \uC774 \uD3F4\uB354\uC5D0 \uC788\uB294 \uC2A4\uD06C\uB9BD\uD2B8\uB4E4\uC740 \uCD5C\uC0C1\uC704 \uD3F4\uB354\uC5D0 \uC788\uB294 `Makefile` \uC744 \uC791\uACE0 \uAC04\uB2E8\uD558\uAC8C \uB9CC\uB4E0\uB2E4\\n  - e.g. [https://github.com/hashicorp/terraform/blob/master/Makefile](https://github.com/hashicorp/terraform/blob/master/Makefile)\\n\\n#### /build\\n\\n- \uD328\uD0A4\uC9C0 \uC640 CI \uC124\uC815 \uC815\uBCF4\uB97C \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4.\\n- \uD074\uB77C\uC6B0\uB4DC \uC815\uBCF4 ( AMI ), \uCEE8\uD14C\uC774\uB108 ( Docker ), OS ( deb, rpm, pkg ) \uD328\uD0A4\uC9C0 \uC124\uC815 \uC815\uBCF4\uC640 \uC2A4\uD06C\uB9BD\uD2B8\uB4E4\uC740 `/build/package` \uD3F4\uB354\uC5D0 \uB123\uB294\uB2E4\\n- CI ( Travis, Circle, drone ) \uC124\uC815 \uD30C\uC77C\uB4E4\uC740 `/build/ci` \uD3F4\uB354\uC5D0 \uB123\uB294\uB2E4\\n\\n#### /deployments\\n\\n- IaaS, PasS, \uC2DC\uC2A4\uD15C \uB610\uB294 \uCEE8\uD14C\uC774\uB108 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uC158 \uBC30\uD3EC \uC124\uC815 \uD30C\uC77C \uB610\uB294 \uD15C\uD50C\uB9BF\uC744 \uB123\uC5B4\uB450\uB294 \uD3F4\uB354\uC774\uB2E4. ( docker-compose, kubernetes, helm, mesos, terraform, bosh )\\n\\n#### /test\\n\\n- \uCD94\uAC00 \uD14C\uC2A4\uD2B8 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uB610\uB294 \uD14C\uC2A4\uD2B8 \uB370\uC774\uD130\uB97C \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4.\\n- \uC774 \uD3F4\uB354\uB294 \uC790\uC720\uB86D\uAC8C \uAD6C\uC131\uD55C\uB2E4\\n\\n### Other Directories\\n\\n#### /docs\\n\\n- \uB514\uC790\uC778\uACFC \uC0AC\uC6A9\uC790\uB4E4\uC758 \uBB38\uC11C\uB97C \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4 (  `godoc` \uC73C\uB85C \uB9CC\uB4E0 \uBB38\uC11C\uB4E4\uB3C4 \uD3EC\uD568\uB41C\uB2E4 )\\n\\n#### /tools\\n\\n- \uC774 \uD504\uB85C\uC81D\uD2B8\uB97C \uC0AC\uC6A9\uD558\uAE30 \uC704\uD55C \uB3C4\uAD6C\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n- \uC774 \uD3F4\uB354\uC5D0 \uC788\uB294 \uB3C4\uAD6C\uB4E4\uC740  `/pkg` \uC640 `/internal` \uD3F4\uB354\uC5D0 \uC788\uB294 \uCF54\uB4DC\uB97C \uCC38\uC870\uD560 \uC218 \uC788\uB2E4\\n\\n#### /examples\\n\\n- \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uB610\uB294 \uACF5\uAC1C \uB77C\uC774\uBE0C\uB7EC\uB9AC\uC758 \uC608\uC2DC\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n#### /third\\\\_party\\n\\n- external helper tool, forked code, 3rd party utilities \uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n  - e.g. Swagger UI\\n\\n#### /githooks\\n\\n- Git hooks \uC124\uC815 \uD30C\uC77C\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n#### /assets\\n\\n- \uC800\uC7A5\uC18C\uC5D0\uC11C Go Lang \uC744 \uC704\uD55C assets \uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4 \\n  - e.g. \uC774\uBBF8\uC9C0, \uB85C\uACE0\\n\\n#### /website\\n\\n- Github Pages \uB97C \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC744 \uB54C \uD504\uB85C\uC81D\uD2B8 \uC6F9 \uC0AC\uC774\uD2B8 \uC815\uBCF4\uB4E4\uC744 \uB123\uC5B4\uB454 \uD3F4\uB354\uC774\uB2E4\\n\\n## \uCC38\uACE0\\n\\n- [golang-standards/project-layout](https://github.com/golang-standards/project-layout)"},{"id":"notion-custom-domain","metadata":{"permalink":"/blog/notion-custom-domain","source":"@site/blog/2020-02-18-notion-custom-domain/index.md","title":"Notion Custom Domain \uC5F0\uACB0","description":"Notion \uC744 \uB0B4 \uD504\uB85C\uD544 + \uBE14\uB85C\uADF8\uB85C \uC0AC\uC6A9\uD558\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uAC1C\uC778 \uB3C4\uBA54\uC778 \uC5F0\uACB0\uC774 \uD544\uC694\uD558\uB2E4\uACE0 \uC0D
1D\uAC01\uD588\uB2E4.","date":"2020-02-18T00:00:00.000Z","tags":[{"inline":false,"label":"\uC778\uD504\uB77C","permalink":"/blog/tags/infra"}],"readingTime":0.56,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Notion Custom Domain \uC5F0\uACB0","slug":"notion-custom-domain","date":"2020-02-18T00:00:00.000Z","authors":["dongmyeong"],"tags":["infra"],"description":"Notion \uC744 \uB0B4 \uD504\uB85C\uD544 + \uBE14\uB85C\uADF8\uB85C \uC0AC\uC6A9\uD558\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uAC1C\uC778 \uB3C4\uBA54\uC778 \uC5F0\uACB0\uC774 \uD544\uC694\uD558\uB2E4\uACE0 \uC0DD\uAC01\uD588\uB2E4."},"unlisted":false,"prevItem":{"title":"Go \uD45C\uC900 \uD504\uB85C\uC81D\uD2B8 \uB808\uC774\uC544\uC6C3 \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/go-project-layout"},"nextItem":{"title":"ElasticSearch \uC54C\uC544\uBCF4\uAE30 (1)","permalink":"/blog/elasticsearch-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Notion Custom Domain \uC5F0\uACB0\\n\\nNotion \uC744 \uB0B4 \uD504\uB85C\uD544 + \uBE14\uB85C\uADF8\uB85C \uC0AC\uC6A9\uD558\uAE30 \uC2DC\uC791\uD558\uBA74\uC11C \uAC1C\uC778 \uB3C4\uBA54\uC778 \uC5F0\uACB0\uC774 \uD544\uC694\uD558\uB2E4\uACE0 \uC0DD\uAC01\uD588\uB2E4.\\n\\n\uD558\uC9C0\uB9CC Notion \uC740 \uC544\uC9C1 \uAC1C\uC778 \uB3C4\uBA54\uC778 \uC5F0\uACB0\uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 ( ~~\uC9C0\uC6D0\uD560 \uC608\uC815\uC774\uB77C\uB294\uB370 \uC5B8\uC81C...~~ ) \uB2E4\uB978 \uBC29\uBC95\uC744 \uCC3E\uC544\uBCF4\uB2E4\uAC00 CloudFlare Worker \uB97C \uC0AC\uC6A9\uD55C \uBC29\uBC95\uC744 \uBC1C\uACAC\uD574\uC11C \uBC14\uB85C \uC801\uC6A9\uD558\uAE30\uB85C \uD588\uB2E4.\\n\\n\uD558\uC9C0\uB9CC CloudFlare Worker Script \uB97C \uC9C1\uC811 \uB123\uACE0 \uD558\uB294 \uACFC\uC815\uC774 \uB9E4\uC6B0 \uBC88\uAC70\uB85C\uC6E0\uAE30 \uB54C\uBB38\uC5D0 \uACB8\uC0AC\uACB8\uC0AC \uCD5C\uADFC\uC5D0 \uC0AC\uC6A9\uD574\uBD24\uB358 Terraform \uC73C\uB85C \uC0AC\uC6A9\uD574\uBCF4\uAE30\uB85C \uACB0\uC815\uD588\uB2E4.\\n\\n### \uC21C\uC11C\\n\\n#### 1. Notion \uC744 \uACF5\uAC1C \uD398\uC774\uC9C0\uB85C \uACF5\uC720\uD55C\uB2E4.\\n\\n![Notion Custom Domain \uC5F0\uACB0](./image-1.webp)\\n\\n#### 2. Terraform \uD504\uB85C\uC81D\uD2B8 \uB2E4\uC6B4\uB85C\uB4DC\\n\\n`notion-cloudflare-proxy` \uD504\uB85C\uC81D\uD2B8\uB97C \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC740 \uD6C4  [`README.md`](http://readme.md) \uC5D0 \uC801\uD600 \uC788\uB294 \uC21C\uC11C \uB300\uB85C \uC124\uCE58\uD55C\uB2E4.\\n\\n- [ClaudeSeo/notion-cloudflare-proxy](https://github.com/claudeseo/notion-cloudflare-proxy)\\n\\n#### 2-1. cloudflare\\\\_zone \uBD80\uBD84\uC5D0\uC11C \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC\\n\\n\uC774\uBBF8 CloudFlare Zone \uC5D0 \uB4F1\uB85D\uB41C \uACBD\uC6B0 \uC5D0\uB7EC\uAC00 \uBC1C\uC0DD\uD560 \uC218 \uC788\uB2E4.\\n\\n\uADF8\uB7F0 \uACBD\uC6B0 \uC544\uB798\uC758 \uBA85\uB839\uC5B4\uB97C \uD1B5\uD574 \uD574\uACB0\uD560 \uC218 \uC788\uB2E4.\\n\\n```bash\\n$ terraform import cloudflare_zone.clud {ZONE_ID}\\n```\\n\\n![ZONE\\\\_ID \uB294 CloudFlare \uC6B0\uCE21 \uD558\uB2E8\uC5D0\uC11C \uD655\uC778\uD560 \uC218 \uC788\uB2E4.](./image-2.webp)\\n\\n_ZONE\\\\_ID \uB294 CloudFlare \uC6B0\uCE21 \uD558\uB2E8\uC5D0\uC11C \uD655\uC778\uD560 \uC218 \uC788\uB2E4._\\n\\n## TODO\\n\\n\uD3B8\uD558\uAC8C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB3C4\uB85D \uC218\uC815\uD558\uACE0 \uAE00\uC744 \uC774\uC5B4\uC11C \uC791\uC131\uD574\uC57C\uC9C0.."},{"id":"elasticsearch-1","metadata":{"permalink":"/blog/elasticsearch-1","source":"@site/blog/2020-02-03-elasticsearch-1/index.md","title":"ElasticSearch \uC54C\uC544\uBCF4\uAE30 (1)","de
1scription":"","date":"2020-02-03T00:00:00.000Z","tags":[{"inline":false,"label":"Elasticsearch","permalink":"/blog/tags/elasticsearch"}],"readingTime":0.64,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"ElasticSearch \uC54C\uC544\uBCF4\uAE30 (1)","slug":"elasticsearch-1","date":"2020-02-03T00:00:00.000Z","authors":["dongmyeong"],"tags":["elasticsearch"],"description":""},"unlisted":false,"prevItem":{"title":"Notion Custom Domain \uC5F0\uACB0","permalink":"/blog/notion-custom-domain"},"nextItem":{"title":"Kubernetes","permalink":"/blog/kubernetes"}},"content":"\x3c!-- truncate --\x3e\\n\\n## ElasticSearch\\n\\nBLABLA\\n\\n### \uC124\uCE58 \uBC29\uBC95 ( With Docker )\\n\\n#### Docker Compose\\n\\n```yaml\\nversion: \\"3.7\\"\\n\\nservices:\\n    elasticsearch:\\n        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1\\n        environment:\\n            - xpack.security.enabled=false\\n            - discovery.type=single-node\\n            - \\"ES_JAVA_OPTS=-Xms512m -Xmx512m\\"\\n        ports:\\n            - 9200:9200\\n        ulimits:\\n            memlock:\\n                soft: -1\\n                hard: -1\\n        healthcheck:\\n            test: curl -f http://localhost:9200\\n            interval: 30s\\n            timeout: 10s\\n            retries: 5\\n        networks:\\n            - elastic\\n        volumes:\\n            - \\"esdata:/usr/share/elasticsearch/data\\"\\n\\n    kibana:\\n        image: docker.elastic.co/kibana/kibana:7.5.1\\n        ports:\\n            - 5601:5601\\n        healthcheck:\\n            test: curl -f http://localhost:5601\\n            interval: 10s\\n            timeout: 5s\\n            retries: 3\\n        depends_on:\\n            - elasticsearch\\n        networks:\\n            - elastic\\n\\n    apm-server:\\n        image: docker.elastic.co/apm/apm-server:7.5.1\\n        ports:\\n            - 8200:8200\\n        depends_on:\\n            - elasticsearch\\n            - kibana\\n        networks:\\n            - elastic\\n        volumes:\\n            - ./apm-server.yml:/usr/share/apm-server/apm-server.yml\\n\\n    metric-beat:\\n        image: docker.elastic.co/beats/metricbeat:7.5.1\\n        depends_on:\\n            - elasticsearch\\n            - kibana\\n        networks:\\n            - elastic\\n        volumes:\\n            - ./metric-beat.yml:/usr/share/metricbeat/metricbeat.yml\\n\\nnetworks:\\n    elastic:\\n        driver: bridge\\n\\nvolumes:\\n    esdata:\\n```\\n\\n#### APM Server\\n\\n```yaml\\napm-server:\\n  host: \\"0.0.0.0:8200\\"\\n\\n  kibana:\\n    enabled: true\\n    host: \\"kibana:5601\\"\\n\\noutput.elasticsearch:\\n  hosts: [\\"elasticsearch:9200\\"]\\n\\nlogging:\\n  to_files: false\\n```\\n\\n#### MetricBeat\\n\\n```yaml\\nmetricbeat.config.modules:\\n  reload.enabled: false\\n  reload.period: 10s\\n\\nsetup.dashboards.enabled: true\\nsetup.kibana.host: kibana:5601\\n\\noutput.elasticsearch:\\n  hosts: [\'elasticsearch:9200\']\\n\\nmetricbeat.modules:\\n  - module: system\\n    metricsets:\\n      - cpu\\n      - load\\n      - memory\\n      - network\\n      - process\\n      - process_summary\\n      - uptime\\n      - socket_summary\\n    enabled: true\\n    period: 10s\\n    processes: [\'.*\']\\n    cpu.metrics: [\'percentages\']\\n    core.metrics: [\'percentages\']\\n```"},{"id":"kubernetes","metadata":{"permalink":"/blog/kubernetes","source":"@site/blog/2020-01-24-kubernetes/index.md","title":"Kubernetes","description":"API Server, Scheduler, kubelet\uB4F1 \uC5EC\uB7EC\uAC1C\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uC774\uB8E8\uC5B4\uC9C4 \uC9D1\uD569\uCCB4","date":"2020-01-24T00:00:00.000Z","tags":[{"inline":false,"label":"Kubernetes","permalink":"/blog/tags/kubernetes"}],"readingTime":0.48,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Kubernetes","slug":"kubernetes","date":"2020-01-24T00:00:00.000Z","authors":["dongmyeong"],"tags":["kubernetes"],"description":"API Server, Scheduler, kubelet\uB4F1 \uC5EC\uB7EC\uAC1C\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uC774\uB8E8\uC5B4\uC9C4 \uC9D1\uD569\uCCB4"},"unlisted":false,"prevItem":{"title":"ElasticSearch \uC54C\uC544\uBCF4\uAE30 (1)","permalink":"/blog/elasticsearch-1"},"nextItem":{"title":"AWS Community Day - re:Invent \uD2B9\uC9D1","permalink":"/blog/aws-community-day-reinvent"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC544\uD0A4\uD14D\uCC98\\n\\n- API Server, Scheduler, kubelet\uB4F1 \uC5EC\uB7EC\uAC1C\uC758 \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uC774\uB8E8\uC5B4\uC9C4 \uC9D1\uD569\uCCB4\\n- \uC0AC\uC6A9\uC790\uC758 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC774\uB098 \uB370\uC774\uD130\uC640 \uAD6C\uBCC4\uD558\uC5EC Control Plane \uC774\uB77C\uACE0 \uBD80\uB978\uB2E4.\\n\\n### \uB9C8\uC2A4\uD130\\n\\n- API Server\\n- Scheduler\\n- Controller Manager\\n- etcd\\n\\
1n### \uB178\uB4DC\\n\\n- kubelet\\n- kube-proxy\\n- \uCEE8\uD14C\uC774\uB108 \uB7F0\uD0C0\uC784 ( \uC560\uD50C\uB9AC\uCF00\uC774\uC158 )\\n\\n#### Add-On\\n\\n- Dashboard\\n- DNS\\n- Ingress Controller\\n- \uAC10\uC2DC\uC6A9 \uC5D0\uC774\uC804\uD2B8 ( Prometheus Node Exporter, Microsoft OMS Agent \uB4F1 )\\n\\n### \uC124\uACC4 \uC6D0\uCE59\\n\\n- [kubernetes/community](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md)\\n- [kubernetes/community](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/principles.md)\\n\\n- `API Server` \uB9CC\uC774 `etcd` \uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB2E4\\n- \uBD80\uBD84\uC801\uC778 \uC11C\uBC84 \uC7A5\uC560\uAC00 \uD074\uB7EC\uC2A4\uD130 \uC804\uCCB4\uC758 \uB2E4\uC6B4\uC73C\uB85C \uC774\uC5B4\uC9C0\uC9C0 \uC54A\uB3C4\uB85D \uD574\uC57C\uD55C\uB2E4.\\n- \uAC01 \uCEF4\uD3EC\uB10C\uD2B8\uC5D0 \uB300\uD55C \uC9C0\uC2DC\uB97C \uC783\uC5B4\uBC84\uB824\uB3C4 \uCD5C\uADFC\uC758 \uC9C0\uC2DC\uB97C \uBC14\uD0D5\uC73C\uB85C \uCC98\uB9AC\uB97C \uACC4\uC18D\uD560 \uC218 \uC788\uB3C4\uB85D \uD55C\uB2E4.\\n- \uAC01 \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uAD00\uB828\uB41C \uC124\uC815\uC774\uB098 \uC0C1\uD0DC\uB97C \uBA54\uBAA8\uB9AC\uC5D0 \uC800\uC7A5\uD558\uC9C0\uB9CC \uC601\uAD6C\uD654\uB294 `API Server` \uB97C \uD1B5\uD574 `etcd` \uC5D0 \uD55C\uB2E4.\\n- \uC0AC\uC6A9\uC790\uB098 \uB2E4\uB978 \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uC624\uBE0C\uC81D\uD2B8\uB97C \uBCC0\uD654\uC2DC\uD0A8 \uAC83\uC744 \uAC10\uC9C0\uD560 \uC218 \uC788\uB3C4\uB85D \uCEF4\uD3EC\uB10C\uD2B8\uB294 `API Server` \uB97C \uC6CC\uCE58\uD55C\uB2E4.\\n- `API Server` \uC5D0\uC11C \uD3F4\uB9C1\uD558\uB294 \uAC83\uC774 \uC544\uB2C8\uB77C \uAC01 \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uC790\uC728\uC801\uC73C\uB85C \uC6CC\uCE58\uD55C\uB2E4."},{"id":"aws-community-day-reinvent","metadata":{"permalink":"/blog/aws-community-day-reinvent","source":"@site/blog/2020-01-21-aws-community-day-reinvent/index.md","title":"AWS Community Day - re:Invent \uD2B9\uC9D1","description":"\uC2DC\uC791 \uC77C\uC2DC: 2020\uB144 1\uC6D4 21\uC77C 13\uC2DC 00\uBD84","date":"2020-01-21T00:00:00.000Z","tags":[{"inline":false,"label":"\uCEE8\uD37C\uB7F0\uC2A4","permalink":"/blog/tags/conference"}],"readingTime":9.49,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"AWS Community Day - re:Invent \uD2B9\uC9D1","slug":"aws-community-day-reinvent","date":"2020-01-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["conference"],"description":"\uC2DC\uC791 \uC77C\uC2DC: 2020\uB144 1\uC6D4 21\uC77C 13\uC2DC 00\uBD84"},"unlisted":false,"prevItem":{"title":"Kubernetes","permalink":"/blog/kubernetes"},"nextItem":{"title":"Session Manager \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/aws-session-manager"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC77C\uC815\\n\\n- \uC2DC\uC791 \uC77C\uC2DC: 2020\uB144 1\uC6D4 21\uC77C 13\uC2DC 00\uBD84\\n- \uC885\uB8CC \uC77C\uC2DC: 2020\uB144 1\uC6D4 21\uC77C 17\uC2DC 30\uBD84\\n\\n## \uD0A4\uB178\uD2B8\\n\\n### \uC2E0\uADDC \uCD9C\uC2DC \uC11C\uBE44\uC2A4 \uBC0F \uAE30\uB2A5 \uC54C\uC544\uBCF4\uAE30\\n\\n- AWS Graviton2 Processor\\n  - \uD074\uB77C\uC6B0\uB4DC \uAE30\uBC18 \uCD5C\uCD08\uC758 ARM \uAE30\uBC18 \uD504\uB85C\uC138\uC11C\\n  - AWS \uC124\uACC4\uD55C 16mm \uC2E4\uB9AC\uCF58\uC73C\uB85C 64\uBE44\uD2B8 ARM Neoverse \uCF54\uC5B4\uC5D0 \uAD6C\uCD95\\n  - \uCD5C\uB300 16\uAC1C\uC758 vCPU, 10Gbps\\n  - \uCD5C\uB300 40% \uD5A5\uC0C1\uB41C \uAC00\uACA9 \uB300\uBE44 \uC131\uB2A5 \uC81C\uACF5\\n  - \uC778\uC2A4\uD134\uC2A4 \uD0C0\uC785\\n    - M6g ( Preview )\\n    - C6g, R6g ( 2020\uB144 Comming Soon )\\n- AQUA ( Advanced Query Accelerator ) for Amazon Redshift\\n  - \uC0C8\uB85C\uC6B4 \uD558\uB4DC\uC6E8\uC5B4 \uAE30\uBC18 \uAC00\uC18D \uCE90\uC2DC\uB97C \uD1B5\uD574 \uBE44\uC6A9 \uC99D\uAC00 \uC5C6\uC774 \uD0C0 \uD074\uB77C\uC6B0\uB4DC \uB370\uC774\uD130 \uC6E8\uC5B4\uD558\uC6B0\uC2A4 \uBCF4\uB2E4 10\uBC30 \uBE60\uB974\uAC8C \uC9C8\uC758 \uC2E4\uD589 \\n  - Amazon Redshift Update\\n  - RA3 Instance\\n    - \uAE30\uC874 \uD074\uB77C\uC6B0\uB4DC \uAE30\uBC18 3\uBC30 \uC131\uB2A5 \uC81C\uACF5\\n    - \uBE44\uC2B7\uD55C \uAC00\uACA9\uC758 DS2 \uC778\uC2A4\uD134\uC2A4\uB85C\uC11C 2\uBC30\uC758 \uC131\uB2A5\uACFC 2\uBC30\uC758 \uC2A4\uD1A0\uB9AC\uC9C0\\n  - Amazon Athena Federated Query & PartiQL\\n    - lambda \uB97C Connector \uB97C \uD1B5\uD574 \uB2E4\uC591\uD55C \uB370\uC774\uD130 \uBCA0\uC774\uC2A4 \uC194\uB8E8\uC158\uACFC \uC5F0\uACC4\uD558\uC5EC Query \uD560 \uC218 \uC788\uB294 \uAE30\uB2A5\\n    - RDS, Aurora, S3 \uD1B5\uD569 SQL \uC9C8\uC758 \uAC00\uB2A5\\n    - Apache Parquest \uAE30\uBC18 S3 \uB370\uC774\uD130 \uB808\uC774\uD06C \uB0B4\uBCF4\uAE30\uB97C \uD1B5\uD55C \uC0C8\uB85C\uC6B4 \uD1B5\uCC30\uB825 \uC81C\uACF5\\n    - PartiQL\\n      - RDB \uBFD0\uB9CC \uC544\uB2C8\uB77C \uB2E4\uB978 \uB370\uC774\uD130 \uBCA0\uC774\uC2A4\uC5D0\uC11C\uB3C4 \uCFFC\uB9AC\uB97C \uD560 \uC218 \uC788\uB3C4\uB85D \uB9CC\uB4DC\uB294 \uD45C\uC900 \uCFFC\uB9AC\\n- AWS Outposts\\n  - AWS \uC778\uD504\uB77C \uBC0F \uC8FC\uC694 \uC11C\uBE44\uC2A4, API \uBC0F \uAC1C\uBC1C \uB3C4\uAD6C\uB97C \uACE0\uAC1D \uC628-\uD504\uB808\uBBF8\uC2A4\uB85C \uD655\uC7A5\uD558\uB294 \uC644\uC804 \uAD00\uB9AC\uD6BD \uC11C\uBE44\uC2A4\uB85C\uC11C \uAE30\uC874 \uD074\uB77C\uC6B0\uB4DC \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB0AE\uC740 \uB300\uAE30 \uC2DC\uAC04\uACFC \uC77C\uAD00\uB41C \uBC30\uD3EC \uC81C\uACF5\\n  - AWS \uB9AC\uC804 \uB370\uC774\uD130 \uC13C\uD130\uC640 \uB3D9\uC77C\uD55C \uC124\uACC4 \uC778\uD504\uB77C\uB974 \uACE0\uAC1D \uC2DC\uC124\uC5D0 \uC81C\uACF5\\n  - AWS \uB9AC\uC804 \uB0B4\uBD80\uC640 \uB9C8\uCC2C\uAC00\uC9C0\uB85C AWS \uC5D0\uC11C \uC804\uCCB4 \uAD00\uB9AC, \uBAA8\uB2C8\uD130\uB9C1 \uBC0F \uC6B4\uC601\\n  - \uB3D9\uC77C\uD55C API \uBC0F \uB3C4\uAD6C\uB97C \uC81C\uACF5\uD558\uB294 \uD074\uB77C\uC6B0\uB4DC \uB2E8\uC77C \uC6B4\uC601\\n  - \uC628-\uD504\uB808\uBBF8\uC2A4 \uBC0F \uD074\uB77C\uC6B0\uB4DC \uD658\uACBD\uC5D0\uC11C \uD558\uC774\uBE0C\uB9AC\uB3C4 \uC0AC\uC6A9 \uAC00\uB2A5\\n  - \uC11C\uC6B8 \uB9AC\uC804\uC5D0 \uCD9C\uC2DC\\n- AWS Wavelength\\n  - 5G \uB124\uD2B8\uC6CC\uD06C \uC5E3\uC9C0\uC5D0\uC11C AWS \uCEF4\uD4E8\uD305 \uBC0F \uC2A4\uD1A0\uB9AC\uC9C0\uB97C \uC0AC\uC6A9\uD558\uC5EC, 5G \uAE30\uBC18 \uBAA8\uBC14\uC77C \uB514\uBC14\uC774\uC2A4 \uBC0F \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uD55C \uC790\uB9AC \uBC00\uB9AC \uCD08 \uC9C0\uC5F0 \uC2DC\uAC04\uC744 \uC81C\uACF5\uD558\uB294 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uC81C\uACF5 \uAC00\uB2A5\\n  - AWS Outposts \uAE30\uBC18\\n  - AWS \uB9AC\uC804\uACFC \uD1B5\uC2E0\uC0AC 5G  \uB9DD\uACFC \uC9C1\uC811 \uC5F0\uACB0\\n  - \uD2B9\uC9D5\\n    - 5G  \uB2E8\uB9D0\uAE30 \uC0AC\uC6A9\uC790\uB97C \uC704\uD55C \uAD11\uB300\uC5ED \uCF58\uD150\uCE20 \uC11C\uBE44\uC2A4 \uC81C\uACF5\\n    - \uD1B5\uC2E0\uC0AC 5G \uB9DD \uAD00\uB9AC \uB370\uC774\uD130 \uC13C\uD130\\n    - AWS \uB9AC\uC804\uC5D0\uC11C \uC9C1\uC811 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uBC30\uD3EC \uBC0F \uAD00\uB9AC\\n- AWS Kendra\\n  - \uAE30\uC5C5 \uB0B4\uBD80 \uBB38\uC11C \uBC0F \uB370\uC774\uD130\uC5D0 \uB300\uD55C \uAE30\uACC4 \uD559\uC2B5 \uAE30\uBC18 \uBD84\uC11D \uAE30\uBC18 \uC5D4\uD130\uD504\uB77C\uC774\uC988 \uAC80\uC0C9 \uC11C\uBE44\uC2A4\\n  - \uB2E4\uC591\uD55C \uB370\uC774\uD130 \uC18C\uC2A4 ( S3, Sharepoint, \uD30C\uC77C, \uC11C\uBC84, HTTP \uB4F1 )\\n  - \uAC04\uB2E8\uD55C API \uBC0F \uCF58\uC194 \uCF54\uB4DC \uC0D8\uD50C \uC81C\uACF5\\n  - \uC544\uC9C1 \uD55C\uAD6D\uC5B4\uB294 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC74C\\n- Amazon Braket\\n  - \uACFC\uD559\uC790\uC640 \uAC1C\uBC1C\uC790\uAC00 \uC591\uC790 \uCE
1F4\uD4E8\uD305\uC744 \uC27D\uAC8C \uD0D0\uC0C9\uD558\uACE0 \uC2E4\uD5D8 \uD560 \uC218 \uC788\uB294 \uC644\uC804 \uAD00\uB9AC\uD615 \uC11C\uBE44\uC2A4\\n  - \uC591\uC790 \uC54C\uACE0\uB9AC\uC998\uC744 \uC124\uACC4, \uD14C\uC2A4\uD2B8 \uBC0F \uC2E4\uD589\uD558\uAE30 \uC704\uD55C \uB2E8\uC77C \uD658\uACBD\\n  - \uD074\uB77C\uC6B0\uB4DC \uAE30\uBC18 **\uC591\uC790\uCEF4\uD4E8\uD305** \uAC1C\uBC1C \uD658\uACBD\\n- AWS DeepComposer\\n  - \uC138\uACC4 \uCD5C\uCD08 \uAE30\uACC4 \uD559\uC2B5 \uAE30\uBC18 \uC74C\uC545 \uC5F0\uC8FC \uC11C\uBE44\uC2A4\uB85C\uC11C \uAC74\uBC18\uACFC \uC7A5\uB974\uBCC4 \uBC18\uC8FC \uC0DD\uC131\uC744 \uD1B5\uD574 \uC6D0\uD558\uB294 \uC7A5\uB974\uC758 \uC74C\uC545 \uC791\uACE1 \uC11C\uBE44\uC2A4\\n  - GEN \uD559\uC2B5\uBC95\uC744 \uAC00\uC9C0\uACE0 \uBC18\uC8FC\uB97C \uB9CC\uB4E4\uC5B4\uC8FC\uB294 \uC11C\uBE44\uC2A4\\n- AWS DeepRacer Evo & New Challenge\\n  - \uD074\uB77C\uC6B0\uB4DC \uAE30\uBC18 3D \uB808\uC774\uC2F1 \uC2DC\uBBAC\uB808\uC774\uD130, \uAC15\uD654 \uD559\uC2B5\uC73C\uB85C \uC6C0\uC9C1\uC774\uB294 1/18 \uBE44\uC728\uC758 \uC644\uC804 \uC790\uC728 \uACBD\uC8FC\uC6A9 \uC790\uB3D9\uCC28 \uBC0F \uAE00\uB85C\uBC8C \uB808\uC774\uC2F1 \uB9AC\uADF8\uB974 \uD1B5\uD574 \uAE30\uACC4 \uD559\uC2B5 \uACBD\uD5D8 \uC81C\uACF5\\n- AWS SageMaker Studio\\n  - \uAE30\uACC4 \uD559\uC2B5 \uBAA8\uB378 \uAC1C\uBC1C \uBC0F \uBC30\uD3EC\uB97C \uC704\uD55C \uCD5C\uCD08\uC758 \uC644\uC804 \uD1B5\uD569 \uAC1C\uBC1C \uD658\uACBD ( IDE )\\n  - \uC190\uC26C\uC6B4 \uAE30\uACC4 \uD559\uC2B5 \uBAA8\uB378 \uC0DD\uC131, \uD6C8\uB828 \uBC0F \uC11C\uBE44\uC2A4 \uBC30\uD3EC \uC644\uC804 \uAD00\uB9AC \uC11C\uBE44\uC2A4\\n  - \uD2B9\uC9D5\\n    - \uC790\uB3D9 ML \uBAA8\uB378 \uC0DD\uC131\\n    - \uACE0\uD488\uC9C8 ML \uBAA8\uB378 \uAD6C\uC131\\n  - \uAE30\uB2A5\\n    - Notebook\\n    - Expreiment\\n    - Processing\\n    - Debugger\\n    - Model Monitor\\n    - Auto Pilot\\n- AWS Fargate for Amazon EKS\\n  - \uC11C\uBC84\uB9AC\uC2A4 Kube \uCEE8\uD14C\uC774\uB108\uB97C \uC548\uC804\uD558\uACE0 \uC548\uC815\uC801\uC73C\uB85C \uB300\uADDC\uBAA8\uB85C \uC2E4\uD589\uD560 \uC218 \uC788\uB294 \uBC29\uBC95\\n  - \uD2B9\uC9D5\\n    - \uB2E8\uC21C\uD654\uB41C \uBC30\uD3EC, \uAD00\uB9AC \uBC0F \uD655\uC7A5 \uAE30\uB2A5\\n    - \uBAA8\uB4E0 \uD3EC\uB4DC\uC5D0 \uB300\uD55C \uAC15\uB825\uD55C \uBCF4\uC548 \uACA9\uB9AC\\n    - \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8 \uAD6C\uCD95\uC5D0 \uC9D1\uC911 \uAC00\uB2A5\uD55C \uC11C\uBC84\uB9AC\uC2A4\\n  - Fargate Spot\\n  - ECS Capacity Providers\\n  - ECS CLI 2.0\\n  - Cluster AutoScaling\\n- Amazon CodeGuru\\n  - \uC18C\uC2A4 \uCF54\uB4DC \uB9AC\uBDF0 \uBC0F \uB192\uC740 \uBE44\uC6A9\uC774\uB098 \uC624\uB958\uB97C \uC720\uBC1C\uD558\uB294 \uCF54\uB4DC \uC218\uC815 \uB610\uB294 \uAC1C\uC120\uC744 \uC790\uB3D9\uC73C\uB85C \uD574\uC8FC\uB294 \uAC1C\uBC1C\uD300\uC744 \uC704\uD55C \uC778\uACF5 \uC9C0\uB2A5 \uC11C\uBE44\uC2A4\\n  - \uD2B9\uC9D5\\n    - Reviewer\\n    - \uBE44\uC6A9 \uAE30\uBC18 \uD310\uBCC4\\n    - Profiler\\n    - \uC790\uBC14 \uC5B8\uC5B4 \uC9C0\uC6D0\\n- \uBE44\uC9C0\uB2C8\uC2A4\uC5D0 \uC601\uD5A5\uC744 \uC8FC\uB294 AI \uC11C\uBE44\uC2A4\\n  - Amazon Personalize\\n    - \uB192\uC740 \uC815\uD655\uC131\uC758 \uC2DC\uACC4\uC5F4 \uC608\uCE21 \uC11C\uBE44\uC2A4 ( [Amazon.com](http://amazon.com) \uC5D0\uC11C \uC0AC\uC6A9\uB41C\uAC83\uACFC \uB3D9\uC77C\uD55C \uAE30\uC220\uC744 \uAE30\uBC18 )\\n  - Amazon Fraud Detector\\n    - \uC628\uB77C\uC778 \uACB0\uC81C \uC0AC\uAE30 \uBC0F \uAC00\uC9DC \uACC4\uC815 \uC0DD\uC131\uACFC \uAC19\uC740 \uC0AC\uAE30\uC131 \uD65C\uB3D9\uC744 \uC27D\uAC8C \uC2DD\uBCC4\uD560 \uC218 \uC788\uB294 \uC644\uC804 \uAD00\uB9AC\uD615 AI \uC11C\uBE44\uC2A4\\n  - Contact Lens for Amazon Connect\\n    - \uACE0\uAC1D \uB300\uD654\uC5D0 \uB300\uD55C \uC74C\uC131 \uC778\uC2DD, \uC790\uC5F0\uC5B4 \uCC98\uB9AC\uB97C \uD1B5\uD55C \uAC10\uC815\uACFC \uCD94\uC138\uB97C \uC774\uD574\uD558\uB294 Amazon Connect \uC6A9 ML \uBD84\uC11D \uAE30\uB2A5\\n    - \uC544\uC9C1 \uD55C\uAD6D\uC5D0 \uCD9C\uC2DC \uB418\uC9C0 \uC54A\uC74C\\n- \uC11C\uBC84\uB9AC\uC2A4 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uAC1C\uBC1C \uD50C\uB7AB\uD3FC \uC9C0\uC6D0\\n  - Tool\\n    - IDE\\n      - AWS Toolkit for (PyCharm, IntelliJ, VS Code)\\n    - AWS Amplify\\n    - Serverless\\n    - FireCracker\\n  - Service\\n    - Provisioned Concurrency for AWS Lambda\\n      - Cold Start \uBB38\uC81C \uD574\uC18C\\n    - HTTP APIs for Amazon API Gateway\\n    - Amazon RDS Proxy\\n      - Lambda \uD568\uC218\uC6A9 Connection Pool \uBC0F Fail Over \uAE30\uB2A5 \uC81C\uACF5\uC744 \uD1B5\uD55C \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uAC00\uC6A9\uC131 \uC99D\uAC00\\n\\n### Heroes \uD328\uB110 \uD1A0\uD06C - \uD074\uB77C\uC6B0\uB4DC \uAE30\uC220\uC758 \uBBF8\uB798\\n\\n- AWS \uB3C4\uC785 \uD588\uC744 \uB54C \uBB34\uC5C7\uC774 \uBC14\uB00C\uB294\uAC00?\\n  - \uC55E\uC73C\uB85C IDC \uC0AC\uC5C5\uC790, Cloud Vendor \uB9CC \uB0A8\uAC8C \uB420\uAC83\uC774\uACE0, \uAC1C\uC778\uC774 \uC9C1\uC811 \uAD6C\uCD95\uD558\uB294 \uC77C\uC740 \uAC70\uC758 \uC0AC\uB77C\uC9C8\uAC83\uC774\uB2E4.\\n  - AWS \uAC00 \uBCF5\uC7A1\uD574\uC9C0\uB294 \uB9CC\uD07C \uB2E4\uC591\uD55C \uBC29\uBC95\uB860\uACFC \uD65C\uC6A9\uB3C4\uAC00 \uB098\uC624\uACE0 \uC788\uACE0, \uB354 \uB9CE\uC740 \uB808\uC774\uC5B4\uB97C \uC50C\uC6CC\uC11C \uAC04\uB2E8\uD558\uAC8C \uD560 \uC218 \uC788\uB294 \uBC29\uBC95\uC744 \uACE0\uBBFC\uD558\uACE0 \uC788\uB2E4.\\n- AWS  \uAC00 \uCC98\uC74C \uCD9C\uC2DC\uD558\uACE0 \uB09C \uC774\uD6C4 \uAC00\uC7A5 \uD06C\uAC8C \uBCC0\uD654\uB41C \uAC83?\\n  - \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uBCF5\uC7A1\uD574\uC9C0\uACE0, \uBE44\uC9C0\uB2C8\uC2A4 \uB85C\uC9C1\uC774 \uBCF5\uC7A1\uD574\uC9D0\uC5D0 \uB530\uB77C \uC11C\uBE44\uC2A4\uAC00 \uC815\uB9D0 \uB9CE\uC544\uC84C\uB2E4.\\n  - \uAE30\uC874 AWS \uB294 \uC880 \uB354 \uC6D0\uCC9C\uC801\uC778 \uAE30\uC220\uC5D0 \uB300\uD55C \uC9C0\uC6D0\uC744 \uD588\uC5C8\uB2E4\uBA74, \uCD5C\uADFC\uC5D0\uB294 \uC880 \uB354 \uC560\uD50C\uB9AC\uCF00\uC774\uC158 \uB808\uC774\uC5B4\uB97C \uC2E0\uACBD\uC744 \uB9CE\uC774 \uC4F0\uB294\uAC70\uAC19\uB2E4.\\n    - \uC778\uD504\uB77C \u2192 Dev/Ops \u2192 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uB300\uCCB4\uD558\uB294 \uB290\uB08C\\n    - \uAE30\uC874\uC5D0 AWS \uB97C \uC811\uADFC\uD558\uB294 \uC704\uC8FC\uAC00 \uC778\uD504\uB77C\uB97C \uB2F4\uB2F9\uD558\uC2DC\uB294 \uC704\uC8FC\uC600\uC5C8\uB2E4\uBA74, \uCD5C\uADFC \uB4E4\uC5B4\uC11C\uB294 \uAC1C\uBC1C\uC790\uB4E4\uC774 \uC880 \uB354 \uB9CE\uC740 \uC811\uADFC\uC774 \uC788\uB2E4\\n    - \uBCC0\uD654\uAC00 \uB9CE\uC740\uAC83\uC740 \uC815\uB9D0 \uC88B\uC73C\uB098, \uB530\uB77C\uAC00\uAE30 \uD798\uB4E4\uB2E4\\n- \uCD5C\uADFC\uC5D0 \uC5B4\uB5A4 \uBCC0\uD654\uB97C \uC8FC\uC2DC\uD558\uACE0 \uC788\uB294\uAC00?\\n  - \uD558\uC774\uBE0C\uB9AC\uB4DC \uC778\uD504\uB77C ( Outposts, Wavelength, Local Zone, AWS VMWare for Cloud ) \uAC00 \uD5A5\uD6C4 \uB9CE\uC740 \uC11C\uBE44\uC2A4\uB4E4\uC744 \uD65C\uC6A9\uD560 \uC218 \uC788\uB294 \uAE30\uB2A5\uC774 \uB420\uAC70\uB77C \uC0DD\uAC01\\n  - \uB300\uD55C\uBBFC\uAD6D IT \uC5C5\uACC4\uB294 \uD37C\uD3EC\uBA3C\uC2A4\uC5D0 \uB300\uD55C \uD654\uB450\uB97C \uB358\uC9C4\uB2E4\\n- re:Invent \uC5D0\uC11C \uC5B4\uB5A4\uAC78 \uB290\uAF08\uB098?\\n  - \uAE30\uC220 \uBCC0\uD654\uC5D0 \uC801\uC751\uC744 \uC880 \uB354 \uBE68\uB9AC \uD560 \uD544\uC694\uAC00 \uC788\uB2E4\\n  - AWS \uC131\uC7A5\uACFC \uD568\uAED8 \uC804\uC138\uACC4 Cloud \uBCC0\uD654 \uD2B8\uB80C\uB4DC\uB97C \uC77D\uC744 \uC218 \uC788\uB294 \uAE30\uD68C\uAC00 \uB418\uC5C8\uB2E4\\n  - EKS on Fargate\\n    - \uC774 \uC11C\uBE44\uC2A4\uAC00 \uB098\uC624\uB294\uAC83\uC740 \uB2F9\uC5F0\uD55C \uC77C\uC774\uACE0, \uC608\uC0C1 \uAC00\uB2A5\uD55C \uC77C\uC774\uC600\uB2E4\\n    - \uC5EC\uAE30\uC11C \uAC00\uC7A5 \uC911\uC694\uD55C\uAC83\uC740 `Saving Plan` \uC774 \uAC19\uC774 \uB530\uB77C\uC628\uC810\uC774\uB2E4\\n- Latency \uC5D0 \uB300\uD574 \uACE0\uBBFC\uC911\uC778 \uD30C\uD2B8\uB108\uB4E4\uC774 \uB9CE\uB2E4\\n- AWS \uB97C \uB3C4\uC785 \uD574\uC57C\uD558\uB294 \uC774\uC720\uB97C \uC124\uBA85\uD55C\uB2E4\uBA74?\\n  - **\uC801\uC740 \uC778\uC6D0**\uC73C\uB85C **\uBE60\uB974\uAC8C** \uC11C\uBE44\uC2A4\uB97C **\uAC1C\uBC1C**\uD558\uACE0 \uC2F6\uB2E4\uBA74 \uB3C4\uC785\uD574\uC57C \uD55C\uB2E4\\n  - \uC804\uC138\uACC4\uC5D0\uC11C \uD074\uB77C\uC6B0\uB4DC\uC758 \uC0AC\uC6A9\uB7C9\uC740 10% \uC5D0 \uBD88\uACFC\uD558\uB2E4.\\n    - \uC544\uC9C1 \uB2A6\uC9C0 \uC54A\uC558\uACE0, \uC55E\uC73C\uB85C \uB354 \uBC1C\uC804\uD558\uAC8C \uB420 \uAC83\uC774\uB2E4\\n  - \uC628-\uD504\uB808\uBBF8\uC2A4\uC778\uAC00 \uD074\uB77C\uC6B0\uB4DC\uC778\uAC00 \uC5D0 \uB300\uD55C \uC9C8\uBB38\uC740 \uC774\uBBF8 \uB2F5\uC774 \uB098\uC640\u
1C788\uB2E4\\n    - \uC628-\uD504\uB808\uBBF8\uC2A4 \uC774\uB4E0 \uD074\uB77C\uC6B0\uB4DC \uC774\uB4E0 \uAE30\uC220\uC740 \uBE44\uC2B7\uD558\uACE0, \uBE44\uC6A9\uC5D0 \uB300\uD55C \uC99D\uAC00\uD3ED\uC740 \uB2E4 \uB2E4\uB974\uAC8C \uB41C\uB2E4\\n    - \uD074\uB77C\uC6B0\uB4DC \uC0AC\uC6A9\uD560\uAC83\uC778\uAC00? \uC5D0 \uB300\uD574 \uACE0\uBBFC\uD558\uB294\uAC83\uBCF4\uB2E4\uB3C4 \uC5B4\uB5BB\uAC8C \uB354 \uC798 \uC0AC\uC6A9\uD560\uAC83\uC778\uAC00\uB97C \uACE0\uBBFC\uD558\uB294\uAC8C \uC88B\uB2E4\\n    - \uC804\uC138\uACC4 \uAC00\uC7A5 \uD070 4\uAC1C\uC758 \uD074\uB77C\uC6B0\uB4DC \uC5C5\uCCB4\uB294 \uB354\uC6B1 \uB354 \uC131\uC7A5\uD560\uAC83\uC774\uB2E4\\n    - \uC774\uBBF8 \uC120\uD0DD\uC740 \uC640\uC788\uACE0, \uC120\uD0DD\uC744 \uB2E8\uC21C 1\uCC28\uC6D0\uC801\uC778\uAC8C \uC544\uB2C8\uB77C \uB2E4\uAC01\uC801\uC778 \uCE21\uBA74\uC5D0\uC11C \uACE0\uB824\uD574\uBD10\uC57C \uD55C\uB2E4\\n    - \uC0AC\uB78C\uC774 \uBA3C\uC800\uB2E4\\n\\n## \uC138\uC158\\n\\n## \uCFE0\uC54C\uBABB\uC774 Amazon EKS \uB85C \uC548\uC815\uC801\uC778 \uC11C\uBE44\uC2A4 \uC6B4\uC601\uD558\uAE30 ( \uCD5C\uC6A9\uD638, \uB125\uC2A8\uCF54\uB9AC\uC544 )\\n\\n### \uB0B4\uC6A9\\n\\n#### Master Node\\n\\n- \uCEF4\uD3EC\uB10C\uD2B8\uB4E4\uC740 \uC11C\uB85C \uD1B5\uC2E0\uD558\uB294\uAC8C \uC5C6\uC5B4\uC11C \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uC7A5\uC560\uAC00 \uBC1C\uC0DD\uD558\uB354\uB77C\uB3C4 \uBCF5\uC6D0\uB418\uBA74 \uBB38\uC81C\uAC00 \uC5C6\uC74C\\
1n- \uD558\uC9C0\uB9CC API \uC11C\uBC84\uB294 \uBAA8\uB4E0 \uCEF4\uD3EC\uB10C\uD2B8\uB4E4\uACFC \uD1B5\uC2E0\uD558\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 API \uC11C\uBC84\uC5D0 \uC7A5\uC560\uAC00 \uBC1C\uC0DD\uD558\uBA74 \uBAA8\uB4E0 \uD074\uB7EC\uC2A4\uD130\uC5D0 \uC7A5\uC560\uAC00 \uBC1C\uC0DD\uD568\\n  - \uADF8\uB798\uC11C API \uC11C\uBC84\uB294 \uACE0\uAC00\uC6A9\uC131\uC744 \uC720\uC9C0\uD574\uC57C\uD568\\n- etcd \uB3C4 \uC7A5\uC560\uAC00 \uBC1C\uC0DD \uC2DC \uBAA8\uB4E0 \uD074\uB7EC\uC2A4\uD130\uC5D0 \uC7A5\uC560\uAC00 \uBC1C\uC0DD\uD568\\n  - etcd \uB294 \uCD5C\uC18C 3\uB300\uB97C \uC720\uC9C0\uD574\uC57C \uD568\\n  - \uC7A5\uC560 \uBC1C\uC0DD \uC2DC \uB9C8\uC2A4\uD130 \uB178\uB4DC\uB97C \uC120\uD0DD\uD558\uB294 \uD22C\uD45C\uB97C \uD558\uB294\uB370, \uC774\uB97C \uC704\uD574 3\uB300\uB97C \uD568\\n- Amazon EKS \uAC00 `Master Node` \uB97C \uB2E4 \uAD00\uB9AC \uD574\uC90C ( \uC811\uC18D \uC870\uCC28 \uD560 \uD544\uC694\uAC00 \uC5C6\uC74C )\\n\\n#### Woker Node\\n\\n- Kubelet \uC774 \uC124\uCE58\uB418\uC5B4 \uC788\uACE0, cAdvisor \uB4F1 \uC744 \uC0AC\uC6A9\uD568\\n- Node / Container \uC9C0\uD45C \uC218\uC9D1\\n- Scheduler \uB294 Worker Node \uC758 \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0 Node \uC5D0 Pod \uB97C \uD560\uB2F9\uD568\\n- `Amazon EKS Node Groups` \uB77C\uB294 \uAE30\uB2A5\uC774 \uCD94\uAC00\uB418\uBA74\uC11C Auto Scaling, \uC7A5\uC560 \uBCF5\uAD6C \uB4F1\uC744 \uB2E4 \uAD00\uB9AC\uD574\uC90C\\n- EC2 \uB294 \uC0AC\uC6A9\uC790 \uACC4\uC815\uC5D0 \uC0DD\uC131\uB428\\n\\n### AWS EKS\\n\\n#### \uC124\uCE58 \uBC29\uBC95\\n\\n- AWS Management Console\\n- AWS CLI\\n- **eksctl**\\n  - \uC81C\uC77C \uAC04\uB2E8\uD558\uACE0 \uC27D\uAC8C EKS \uD074\uB7EC\uC2A4\uD130\uB97C \uC0DD\uC131\uD560 \uC218 \uC788\uC74C\\n\\n  ```bash\\n  $ eksctl create cluster \\\\\\n  \\t--name eks-test \\\\\\n  \\t--region ap-northeast-2 \\\\\\n  \\t--version 1.14 \\\\\\n  \\t--managed \\\\\\n  \\t--asg-access\\n  ```\\n- Terraform\\n  - \uC778\uD504\uB77C\uB97C \uCF54\uB4DC\uB85C \uAD00\uB9AC\uD560 \uC218 \uC788\uC74C\\n\\n#### \uC778\uC99D & \uAD8C\uD55C\\n\\n- EKS \uB97C \uC0DD\uC131\uD55C AWS IAM User  \uAC00 Master \uAD8C\uD55C\uC744 \uD76D\uB4DD\uD568\\n- `Kubernetes Admin` \u2192 kubectl \uBA85\uB839 ( API \uD638\uCD9C ) \u2192 `Kube Master Node` \u2192 `AWS IAM`\\n  1. Kubectl \uBA85\uB839\\n  1. Master Node \uB294 IAM \uC5D0 \uC720\uC800 \uCCB4\uD06C\\n  1. Kube RBAC \uC778\uC99D\\n- Kube RBAC\\n  - Role ( NameSpace \uB2E8\uC704 )\\n  - Cluster Role ( Cluster \uC804\uC5ED\uC758 \uAD8C\uD55C \uD560\uB2F9 )\\n  - AWS IAM \uACFC \uC720\uC0AC\uD568\\n- `Role \uC0DD\uC131` ( Kube \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uC0AC\uC6A9 \uAD8C\uD55C \uC124\uC815, Policy \uC124\uC815 ) \u2192 `Role Binding \uC0DD\uC131` ( \uB300\uC0C1 Role \uC758 \uAD8C\uD55C \uBD80\uC5EC )\\n- EKS \uD074\uB7EC\uC2A4\uD130\uB97C \uAD00\uB9AC\uD560 \uAD00\uB9AC\uC790\uAC00 \uCD94\uAC00\uB418\uC5C8\uB2E4\uBA74?\\n  - mapUsers \uC5D0 IAM User \uCD94\uAC00 \uBC0F \uAD8C\uD55C \uBD80\uC5EC\\n  - IAM Role \uAE30\uBC18 \uC778\uC99D \uBC29\uBC95\\n    1. IAM Role \uC0DD\uC131\\n    1. aws-auth ConfigMap \uC5D0 \uCD94\uAC00\\n    1. Cluster Role \uB610\uB294 Role \uC0DD\uC131\\n    1. Role Binding \uB610\uB294 Cluster Role Binding \uC0DD\uC131\\n    1. AWS-Auth \uCABD\uC5D0 Kube RBAC \uC124\uC815\\n    1. \uB300\uC0C1 \uC0AC\uC6A9\uC790\uC758 kubeconfig \uD30C\uC77C\uC5D0 \uC778\uC99D \uC815\uBCF4 \uC124\uC815\\n\\n#### \uB124\uD2B8\uC6CC\uD06C\\n\\n- `eth0 (10.0.0.2`) \u2194 `docker0 (172.17.0.1)` \u2194 `veth0 (172.17.0.2)`,  `veth0 (172.0.0.3)`\\n- `eth0 (10.0.0.2`) \u2194 `docker0 (172.17.0.2)` \u2194 `veth0 (172.17.0.2)`,  `veth0 (172.0.0.4)`\\n- Overlay Network ( AWS CNI \uC0AC\uC6A9 )\\n  - \uC2E4\uC81C VPC\uC5D0 \uC788\uB294 IP \uB97C \uD560\uB2F9 \uBC1B\uC74C\\n  - VPC \uC5D0 IP Range \uB97C \uC791\uAC8C \uC7A1\uC73C\uBA74 Pod \uC0DD\uC131\uC744 \uC2E4\uD328\uD560 \uC218 \uC788\uC74C\\n  - IP Range \uC5D0 \uC5EC\uC720\uAC00 \uC788\uB354\uB77C\uB3C4 ENI \uC758 \uC81C\uC57D\uC744 \uBC1B\uC544 Pod \uC0DD\uC131\uC744 \uC2E4\uD328\uD560 \uC218 \uC788\uC74C\\n- Worker Node\\n  - DaemonSet ( IPAM )\\n    - IPAM \uC774 \uD560\uB2F9\uD560 \uC218 \uC788\uB294 \uC544\uC774\uD53C \uB300\uC5ED\uC774 \uC81C\uD55C\uB428\\n    - IPAM \uC774 \uD560\uB2F9\uD560 \uC218 \uC788\uB294 \uCD5C\uB300\uB97C \uCD08\uACFC\uD560 \uACBD\uC6B0 ENI \uAC00 \uCD94\uAC00\uB428\\n  - \uC778\uC2A4\uD134\uC2A4 \uC720\uD615\uC5D0 \uB530\uB77C\uC11C ENI \uAC1C\uC218\uAC00 \uC81C\uD55C\uB418\uC5B4 \uC788\uACE0, ENI \uC5D0 \uB530\uB77C\uC11C \uD560\uB2F9\uD560 \uC218 \uC788\uB294 IP \uAC1C\uC218\uC758 \uC81C\uD55C\uC774 \uC788\uC74C\\n  - Pod \uCD5C\uB300 \uD
1560\uB2F9 \uAC1C\uC218 = \uC778\uC2A4\uD134\uC2A4 \uC720\uD615\uC5D0 \uB530\uB978 ENI \uC218 \\\\* (ENI \uBCC4 IP \uC218 - 1)\\n\\n#### Volume\\n\\n- \uC548\uC815\uC801\uC778 \uC800\uC7A5\uC18C \uC900\uBE44 \u2192 \uCEE8\uD14C\uC774\uB108\uC5D0 \uC548\uC815\uC801\uC778 \uC800\uC7A5\uC18C\uB97C \uB9C8\uC6B4\uD2B8\\n  - EBS, EFS \uC0AC\uC6A9 \uAC00\uB2A5\\n  - Worker Node \uC5D0 \uC788\uB294 File System \uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC74C\\n- \uC5F0\uB3D9 \uBC29\uBC95\\n  1. `StorageClass` \uC0DD\uC131 \\n     - `volumeBindMode: WaitForFirstCosumer` \uCD5C\uCD08\uB85C \uCEE8\uD14C\uC774\uB108\uC5D0 \uB9C8\uC6B4\uD2B8 \uB418\uB294 \uC2DC\uC810\uC5D0 EBS \uAC00 \uC0DD\uC131\uB428\\n  1. `PersistentVolumeClaim` \uC124\uC815\\n  1. \uCEE8\uD14C\uC774\uB108 \uB9C8\uC6B4\uD2B8\\n\\n#### \uBAA8\uB2C8\uD130\uB9C1\\n\\n- Master Node \uC758 \uCEF4\uD3EC\uB10C\uD2B8 \uB4E4\uC758 \uB85C\uADF8\uB4E4\uC740 CloudWatch\uB97C \uD1B5\uD574 \uD655\uC778\uD560 \uC218 \uC788\uC74C ( BlackBox )\\n  - EKS \uD074\uB7EC\uC2A4\uD130 \uC124\uC815\uC5D0\uC11C \uB85C\uAE45 \uBD80\uBD84\uC5D0 \uBCF4\uACE0\uC2F6\uC740 \uB85C\uADF8\uB4E4\uC744 \uD65C\uC131\uD654 \uD574\uC57C\uD568\\n- Pod \uBAA8\uB2C8\uD130\uB9C1\uC740 Container Insight \uB97C \uC0AC\uC6A9\uD558\uBA74 \uAC04\uB2E8\uD558\uAC8C \uC0AC\uC6A9 \uAC00\uB2A5\\n  - \uD504\uB85C\uBA54\uD14C\uC6B0\uC2A4\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC9C0\uB9CC, Container Insight \uB3C4 \uB300\uCCB4\uAC00 \uAC00\uB2A5\uD568\\n  - CloudWatchAgentServerPolicy \uC124\uC815\uC774 \uD544\uC694\uD568\\n  - Node, Pod \uC5D0 \uB300\uD55C \uBAA8\uB2C8\uD130\uB9C1\uC774 \uAC00\uB2A5\uD568\\n  - \uC0C1\uC138\uD55C \uB85C\uADF8\uB4E4\uB3C4 \uD655\uC778\uC774 \uAC00\uB2A5\uD568\\n\\n### \uACB0\uB860\\n\\n- \uD798\uB4E4\uACE0 \uC5B4\uB824\uC6B4 \uBD80\uBD84\uB4E4\uC740 \uB300\uBD80\uBD84 Amazon EKS \uAC00 \uAD00\uB9AC\uD574\uC90C\\n\\n## AWS Fargate on EKS \uC2E4\uC804 \uC0AC\uC6A9\uD558\uAE30 ( \uC6A9\uCC2C\uD638, \uB370\uBE0C\uC2DC\uC2A4\uD130\uC988 )\\n\\n## \uB0B4\uC6A9\\n\\n### Fargate On EKS\\n\\n- Fargate (ECS)\\n  - \uC644\uC804 \uAD00\uB9AC\uD615 \uCEE8\uD14C\uC774\uB108 \uC11C\uBE44\uC2A4\\n  - \uBC94\uC6A9 \uBAA9\uC801\uC758 \uC11C\uBC84\uB9AC\uC2A4 \uCEE8\uD14C\uC774\uB108\\n- EKS\\n  - \uAD00\uB9AC\uD615 \uCFE0\uBC84\uB124\uD2F0\uC2A4 \uC11C\uBE44\uC2A4\\n  - EC2  \uB178\uB4DC \uADF8\uB8F9\uC744 Worker \uB85C \uC0AC\uC6A9\\n- EKS + Fargate\\n  - Fargate \uC5D0 EKS \uC758 App \uBC30\uD3EC \uAC00\uB2A5\\n  - \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130: Kubernetes\\n- Control Plane + Data Plane \uC758 \uC644\uC804\uD55C Serverless\\n- \uAD00\uB9AC\uD574\uC57C \uD560 EC2 Instance \uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC74C\\n  - \uC644\uC804\uD55C \uC11C\uBC84\uB9AC\uC2A4\uD615 \uCFE0\uBC84\uB124\uD2F0\uC2A4 \uC11C\uBE44\uC2A4\\n  - coreDNS, add-on \uB4F1\uC744 \uBAA8\uB450 Fargate \uC5D0 Deploy \uAC00\uB2A5\\n  - \uAE30\uC874 Node Group \uACFC \uD568\uAED8 WorkLoad \uC6B4\uC601 \uAC00\uB2A5  ( \uD558\uC774\uBE0C\uB9AC\uB4DC \uC6B4\uC601 \uAC00\uB2A5 )\\n\\n#### \uC7A5\uC810\\n\\n- \uAD00\uB9AC\uC758 \uBCF5\uC7A1\uB3C4\uAC00 \uC904\uC5B4\uB4E0\uB2E4\\n  - Cluster AutoScaler \uB97C \uC0AC\uC6A9\uD560 \uD544\uC694\uAC00 \uC5C6\uC74C\\
1n  - \uBE44\uC6A9 \uCCAD\uAD6C\uC758 \uB2E8\uC704\uAC00 Pod  \uC758 \uC2E4\uD589 \uC2DC\uAC04\uC774 \uB41C\uB2E4\\n  - Pod \uB97C \uC0AC\uC6A9\uD574\uB3C4 VM \uC218\uC900\uC758 \uACA9\uB9AC\uAC00 \uAC00\uB2A5\\n    - Fargate \uC758 \uB0B4\uBD80 \uAD6C\uC870\uC5D0 \uC758\uD568\\n  - \uAE30\uC874 \uC560\uD50C\uB9AC\uCF00\uC774\uC158\uC758 \uBCC0\uACBD \uC5C6\uC774 Fargate \uB85C \uC774\uC804 \uAC00\uB2A5\\n\\n#### \uB2E8\uC810\\n\\n- Resource \uC0C1\uD55C\uC120 \uC874\uC7AC ( \uCD5C\uB300 4vCPU, 30GB \uBA54\uBAA8\uB9AC )\\n- Stateful\uD55C workload \uC0AC\uC6A9 \uBD88\uAC00\uB2A5\\n- Daemonset \uC744 \uBE44\uB86F\uD55C  Privileged Pod \uC0AC\uC6A9 \uBD88\uAC00\uB2A5\\n- NLB / ELB \uC0AC\uC6A9 \uBD88\uAC00\uB2A5\\n  - ELB + Ingree \uC870\uD569\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC74C\\n\\n#### Use Case\\n\\n- Stateless \uD558\uACE0 \uB9AC\uC18C\uC2A4\uB97C \uD06C\uAC8C \uC694\uAD6C\uD558\uC9C0 \uC54A\uC73C\uBA70 \uD2B9\uBCC4\uD55C \uAD8C\uD55C\uC774 \uD544\uC694 \uC5C6\uB294 workload \uC5D0 \uC801\uD569\uD568\\n- Hybrid \uB85C \uAD6C\uC131\\n  - Fargate On EKS \uC5D0\uB294 Stateless \uD55C \uC11C\uBC84\\n  - EC2 \uC5D0\uB294 Stateful \uD55C \uC11C\uBC84\\n\\n#### \uC0AC\uC6A9 \uBC29\uBC95\\n\\n- \uD604\uC7AC \uBC84\uC9C0\uB2C8\uC544, \uC624\uD558\uC774\uC624, \uC544\uC77C\uB79C\uB4DC, \uB3C4\uCFC4\uC5D0\uC11C \uC9C0\uC6D0\\n- EKS \uD074\uB7EC\uC2A4\uD130 1.14 \uC774\uC0C1\\n- Fargate Profile \uC0DD\uC131 ( Fargate \uC5D0 Pod \uB97C \uC0DD\uC131\uD558\uB294 \uC870\uAC74\uC744 \uBA85\uC2DC )\\n  - \uC0DD\uC131\uD558\uB294\uB370 30\uCD08 \\\\~ 1\uBD84 \uC815\uB3C4 \uAC78\uB9BC\\n\\n### Fargate On EKS \uC0AC\uC6A9\uD574\uBCF4\uAE30 ( Demo \uC601\uC0C1 )\\n\\n- EC2 Node Group \uC73C\uB85C \uB744\uC6B0\uB294\uAC83\uBCF4\uB2E4 \uD6E8\uC52C \uBE60\uB974\uAC8C \uC2A4\uCF00\uC77C\uB9C1\uC774 \uAC00\uB2A5\uD568\\n\\n### Fargate On EKS \uB0B4\uBD80 \uAD6C\uC870 Deep Dive\\n\\n#### \uB124\uD2B8\uC6CC\uD06C \uAD6C\uC870\\n\\n- \uBB3C\uB9AC \uC11C\uBC84 \u2194 VM \uC218\uC900\uC758 \uAC00\uC0C1\uD654 \uB808\uC774\uC5B4 \u2194 Fargate \uC5D0\uC774\uC804\uD2B8 \u2194 \uCEE8\uD14C\uC774\uB108 \uB7F0\uD0C0\uC784 ( docker \uB4F1 )\\n  - Fargate \uB294 1\uAC1C\uC758 \uCEE8\uD14C\uC774\uB108\uC5D0 2\uAC1C \uC774\uC0C1\uC758 Task \uB97C \uC62C\uB9AC\uB294\uAC83\uC744 \uD5C8\uC6A9\uD558\uC9C0 \uC54A\uC74C\\n- 1\uAC1C\uC758 Pod = 1\uAC1C\uC758 Node\\n  - IP \uC808\uC57D \uCE21\uBA74\uC5D0\uC11C \uC774\uC810\\n  - VM \uC218\uC900\uC758 \uACA9\uB9AC \uAC00\uB2A5\\n- Maximum Node: 5,000\uAC1C\\n  - Kube \uB294 \uCD5C\uB300 5\uCC9C\uAC1C\uC758 Pod \uB9CC \uC0AC\uC6A9 \uAC00\uB2A5\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-1.webp)\\n\\n#### \uC2A4\uCF00\uC904\uB9C1\\n\\n- \uC2A4\uCF00\uC904\uB9C1 \uC21C\uC11C\\n  1. Pod \uC0DD\uC131 \uC694\uCCAD\\n  1. Admission Controller for Fargate\\n  1. \uBCC0\uACBD\uB41C Pod Spec\\n  1. Fargate Scheduler\\n  1. Fargate Pod \uD560\uB2F9\\n- \uBCF4\uC774\uC9C0 \uC54A\uB294 AWS Admission Controller \uAC00 Pod Spec \uC744 \uBCC0\uACBD\\n- Pod Spec \uC5D0 compute-type \uC8FC\uC11D\uACFC Fargate Profile \uC744 \uD568\uAED8 \uC0AC\uC6A9\uD560 \uACBD\uC6B0\\n  - compute-type \uC8FC\uC11D\uC758 \uC6B0\uC120\uC21C\uC704\uAC00 \uB354 \uB192\uC74C ( \uAC15\uC81C\uB85C EC2 \uC5D0 \uC0DD\uC131 )\\n\\n### \uC694\uAE08 \uCCB4\uACC4\\n\\n- Resource + 256MB ( \uCFE0\uBC84\uB124\uD2F0\uC2A4 \uCEF4\uD3EC\uB10C\uD2B8 )\\n  - \uACFC\uAE08 \uB418\uB294 \uB9AC\uC18C\uC2A4 \uD0C0\uC785 0.5vCPU / 1GB\\n- EC2 \uC778\uC2A4\uD134\uC2A4\uBCF4\uB2E4 \uC880 \uB354 Find-Grained \uD55C \uB9AC\uC18C\uC2A4 \uC0AC\uC6A9 \uAC00\uB2A5\\n- Burst  \uC2DC\uB098\uB9AC\uC624\uC5D0\uC11C\uC758 \uB3D9\uC791 \uC720\uC758 \uD544\uC694\\n  - Best Effort, Bustable QoS \uD074\uB798\uC2A4\uC758 Pod \uC758 \uACBD\uC6B0, Limit \uC774 \uC758\uBBF8\uAC00 \uC5C6\uC74C\\
1n  - \uC694\uAE08 \uCCB4\uACC4\uB294 `Request` \uB97C \uAE30\uC900\uC73C\uB85C \uD568\\n- \uBB34\uC870\uAC74 Fargate On EKS \uAC00 \uC800\uB834\uD558\uC9C0 \uC54A\uC744 \uC218 \uC788\uC74C\\n  - Fargate On EKS \uB97C \uC704\uD55C Spot Instance, Saving Plan \uC9C0\uC6D0 \uC608\uC815\\n\\n## \uACB0\uB860\\n\\n- Fargate On EKS \uB294 stateless \uD55C workload \uB97C \uC218\uD589\uD558\uAE30\uC5D0 \uC801\uD569\\n- EKS \uC5D0\uC11C Fargate + EC2 \uB97C \uD63C\uD569\uD574 \uC0AC\uC6A9 \uAC00\uB2A5\\n  - stateless + stateful \uC758 \uD63C\uD569\uD615 workload \uAD6C\uC131 \uAC00\uB2A5\\n- \uC5EC\uB7EC\uBD84\uC758 \uC6A9\uB3C4\uC5D0 \uB9DE\uAC8C, \uC880 \uB354 \uC800\uB834\uD55C \uBC29\uBC95\uC744 \uC120\uD0DD\\n\\n## AWS \uAE30\uBC18 \uC11C\uBC84\uB9AC\uC2A4 \uB370\uC774\uD130\uB808\uC774\uD06C \uAD6C\uCD95\uD558\uAE30 ( \uAE40\uC9C4\uC6C5, SK C&C )\\n\\n## \uB0B4\uC6A9\\n\\n### \uB370\uC774\uD130 \uD50C\uB77C\uC774\uD720\\n\\n- Virtuous Cycle ( \uC120\uC21C\uD658 )\\n- User \u2192 Data \u2192 Smarter Algorithms \u2192 Better Product \u2192 User ...\\n\\n#### \uB370\uC774\uD130 \uBD84\uC11D\uC758 \uB51C\uB808\uB9C8\\n\\n- \uB370\uC774\uD130\uB85C \uD558\uACE0 \uC2F6\uC740 \uC77C\\n  - \uB9C8\uCF00\uD305 / \uAD11\uACE0 \uCD5C\uC801\uD654, \uAC1C\uC778\uD654\\n  - \uACE0\uAC1D \uC774\uD0C8 \uBC29\uC9C0\\n  - \uC6D0\uC778 \uBD84\uC11D\\n  - \uB9E4\uCD9C \uC99D\uB300\\n  - \uC131\uACFC \uCE21\uC815\\n  - \uD2B8\uB80C\uB4DC \uD30C\uC545 / \uC608\uCE21\\n  - \uC27D\uACE0 \uD3B8\uD55C \uBD84\uC11D\\n- \uC774\uBBF8 \uACAA\uACE0 \uC788\uAC70\uB098 \uC608\uC0C1\uB418\uB294 \uBB38\uC81C\uB4E4\\n  - \uB370\uC774\uD130 \uD55C\uAD70\uB370 \uC800\uC7A5 \uC5B4\uB824\uC6C0\\n  - \uB2E4\uC591\uD55C \uB370\uC774\uD130 \uD3EC\uB9F7 \uC815\uC81C \uD544\uC694\\n  - \uC77C\uB2E8 \uC2E4\uD5D8\uC5D0 \uB4DC\uB294 \uBD80\uB2F4\\n  - \uB808\uAC70\uC2DC vs \uC2E0\uADDC \uC2DC\uC2A4\uD15C\\n  - \uAE30\uC220 \uB0B4\uC7AC\uD654 \uC5B4\uB824\uC6C0\\n  - \uCC44\uC6A9 \uC5B4\uB824\uC6C0 ( \uC778\uB825 \uD655\uBCF4\uAC00 \uC5B4\uB824\uC6C0 )\\n  - \uC2DC\uAC04\uB3C4 \uB3C8\uB3C4 \uC5C6\uC74C\\
1n  - \uBC95\uACFC \uADDC\uC81C\uC5D0 \uB530\uB978 \uB370\uC774\uD130 \uD65C\uC6A9 \uC81C\uC57D ( \uACF5\uC720, \uC2DD\uBCC4 )\\n\\n#### \uB370\uC774\uD130 \uB808\uC774\uD06C \uC815\uC758\\n\\n![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-2.webp)\\n\\n- AWS \uAC00 \uC815\uC758\uD55C \uB370\uC774\uD130 \uB808\uC774\uD06C : \uC815\uD615\uD654 \uB610\uB294 \uBE44\uC815\uD615\uD654 \uB41C \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uC911\uC559 \uC9D1\uC911\uD654 \uC2DC\uD0A8 \uAC83\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-3.webp)\\n\\n### \uB370\uC774\uD130 \uB808\uC774\uD06C, \uB370\uC774\uD130 \uC635\uC2A4\\n\\n- \uB370\uC774\uD130 \uBD84\uC11D\uC744 \uD558\uB294 \uC2DC\uAC04\uC744 \uC904\uC774\uACE0 \uD488\uC9C8\uC744 \uC904\uC774\uAE30 \uC704\uD574\uC11C \uBAA8\uB4E0 \uC5ED\uB7C9\uC744 \uD22C\uC785\uD558\uACE0, \uADF8 \uC5ED\uB7C9\uC744 \uAC16\uAE30 \uC704\uD574\uC11C \uC790\uB3D9\uD654 \uC2DC\uD0A4\uACE0 \uD504\uB85C\uC138\uC2A4 \uAE30\uBC18\uC758 \uBC29\uBC95\uB860\\n- DataOps Manifesto\\n  1. \uC9C0\uC18D\uC801\uC73C\uB85C \uACE0\uAC1D\uC744 \uB9CC\uC871\uC2DC\uCF1C\uB77C\\n  1. \uBD84\uC11D\uC744 \uAC00\uCE58\uC788\uAC8C \uC0DD\uAC01\uD574\uB77C\\n  1. \uBCC0\uD638 \uC218\uC6A9\\n  1. \uB2E4\uC591\uD55C \uC5ED\uD560, \uAE30\uC220, \uB3C4\uAD6C \uC218\uC6A9\\n  1. \uB9E4\uC77C \uD611\uB825\\n  1. \uC790\uAE30\uC8FC\uB3C4\\n  1. \uC601\uC911\uC8FC\uC758\uB97C \uC904\uC5EC\uB77C\\n  1. \uBC18\uC131\uD558\uB77C\\n  1. \uBD84\uC11D\uC740 \uCF54\uB4DC\uB2E4\\n  1. \uACB0\uD569\uD558\uB77C\\n  1. \uC7AC\uD604 \uAC00\uB2A5\uD558\uAC8C \uB9CC\uB4E4\uC5B4\uB77C\\n  1. \uBE44\uC6A9 \uCD5C\uC18C\uD654\\n  1. \uB2E8\uC21C\uC131\\n  1. \uBD84\uC11D\uC740 \uC81C\uC870\uC640 \uAC19\uB2E4\\n  1. \uD488\uC9C8 \uC81C\uC77C \uC911\uC694\\n  1. \uD488\uC9C8 \uBC0F \uC131\uB2A5\uC744 \uBAA8\uB2C8\uD130\uB9C1\\n  1. \uC7AC\uC0AC\uC6A9\\n  1. \uC0AC\uC774\uD074 \uD0C0\uC784\uC744 \uAC1C\uC120\\n- \uC774\uC0C1\uC801\uC778 DataOps\\n  - \uBAA9\uD45C\uB97C \uC911\uC2EC\uC73C\uB85C \uC2A4\uC2A4\uB85C \uC870\uC9C1\\n  - \uB3C4\uAD6C, \uB370\uC774\uD130, \uC778\uB825 \uB4F1 \uBAA8\uB450 \uC7A5\uC545\uC774 \uD544\uC694\uD568\\n  - \uBAA8\uB4E0 \uB370\uC774\uD130\uB97C \uD55C\uACF3\uC73C\uB85C \uB2E4 \uBAA8\uC73C\uACE0, \uB2E4\uC591\uD55C \uC774\uD574 \uAD00\uACC4\uC790\uC640 \uD568\uAED8 \uB370\uC774\uD130\uB97C \uD65C\uC6A9\uD560 \uC218 \uC788\uB294 \uD50C\uB7AB\uD3FC\uC744 \uAC1C\uBC1C\\n\\n#### \uC544\uD0A4\uD14D\uCC98\\n\\n![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-4.webp)\\n\\n- \uC124\uACC4 \uACE0\uB824 \uC0AC\uD56D\\n  - No-Ops : \uAD00\uB9AC\uD615 \uC11C\uBE44\uC2A4\uB97C \uC0AC\uC6A9\\n  - GitOps : \uBAA8\uB4E0 \uC778\uD504\uB77C, \uCF54\uB4DC, \uC2A4\uD06C\uB9BD\uD2B8\uB4E4\uC744 \uAD00\uB9AC\\n  - Automation : \uC790\uB3D9\uD654\\n\\n### S3 \uB370\uC774\uD130 \uB808\uC774\uD06C\\n\\n- \uAD6C\uC131 \uC0AC\uB840: AWS Glue \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC644\uC804\uD55C \uC11C\uBC84\uB9AC\uC2A4 \uB370\uC774\uD130 \uC6E8\uC5B4\uD558\uC6B0\uC2A4\uB85C \uC804\uD658 ( [woot.com](http://woot.com) \uC608\uC2DC )\\n\\n### S3 \uAE30\uBC18 \uC218\uC9D1, \uCC98\uB9AC, \uBD84\uC11D\\n\\n#### \uB370\uC774\uD130 \uC218\uC9D1\\n\\n- `Batch` \uC11C\uBE44\uC2A4\uB97C  \uD65C\uC6A9\\n  - \uC5B4\uB5A4 \uADDC\uBAA8\uB85C\uB4E0 \uD655\uC7A5 \uAC00\uB2A5\uD55C \uC644\uC804 \uAD00\uB9AC\uD615 \uBC30\uCE58 \uCEF4\uD4E8\uD305\\n- \uAD6C\uC131 \uC0AC\uB840: \uBAA8\uBC14\uC77C \uC571 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD558\uAE30 \uC704\uD55C \uD0C0 \uD074\uB77C\uC6B0\uB4DC \uC5F0\uB3D9 \uC544\uD0A4\uD14D\uCC98\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-5.webp)\\n- \uAD6C\uC131 \uC0AC\uB840: \uC678\uBD80 API \uC5F0\uB3D9 \uC544\uD0A4\uD14D\uCC98 ( Fully Managed Service )\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-6.webp)\\n- \uC2A4\uD2B8\uB9AC\uBC0D \uB370\uC774\uD130 ( Kinesis Data Firehose )\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-7.webp)\\n\\n#### \uB370\uC774\uD130 \uCC98\uB9AC\\n\\n- \uBE44\uC815\uD615 \uB370\uC774\uD130 \u2192 \uC815\uD615 \uB370\uC774\uD130 rhksfl\\n- Glue \uC11C\uBE44\uC2A4\uB97C \uC801\uADF9 \uC0AC\uC6A9\\n  - \uBD84\uC11D\uC744 \uC704\uD574 \uC190\uC27D\uAC8C \uB370\uC774\uD130\uB97C \uC900\uBE44\uD558\uACE0 \uB85C\uB4DC\uD560 \uC218 \uC788\uAC8C \uC9C0\uC6D0\uD558\uB294 \uC644\uC804\uAD00\uB9AC\uD615 ETL ( \uCD94\uCD9C, \uBCC0\uD658, \uB85C\uB4DC ) \uC11C\uBE44\uC2A4\\n- \uAD6C\uC131 \uC0AC\uB840: \uC774\uBCA4\uD2B8 \uAE30\uBC18 Glue \uD30C\uC774\uD504\uB77C\uC778 \uAD6C\uC131\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-8.webp)\\n\\n#### \uB370\uC774\uD130 \uBD84\uC11D\\n\\n![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-9.webp)\\n\\n- SageMaker\\n  - \uAE30\uACC4 \uD559\uC2B5 \uBAA8\uB378\uC744 \uBE60\uB974\uACE0 \uC27D\uAC8C \uAD6C\uCD95, \uD6C8\uB828\uD558\uACE0 \uBC30\uD3EC\uAE4C\uC9C0 \uC9C0\uC6D0\uD558\uB294 \uC11C\uBE44\uC2A4\\n- SageMaker Jupyter \uB178\uD2B8\uBD81: \uBAA8\uB378 \uBC30\uCE58, \uD14C\uC2A4\uD2B8, \uAC80\uC99D\\n  - Jupyter \uC0CC\uB4DC\uBC15\uC2A4 \uC81C\uACF5\\n  - LifeCycle \uAD6C\uC131 \uC2A4\uD06C\uB9BD\uD2B8 \uD65C\uC6A9\uD558\uC5EC \uC0AC\uC804 \uD658\uACBD \uAD6C\uC131\\n  - \uC0AC\uC6A9\uB7C9 \uBE4C\uB9C1\uC744 \uC704\uD55C Cost Explorer API \uC5F0\uB3D9\\n  - Assume Role \uC744 \uD65C\uC6A9\uD55C \uC6D0\uACA9 Account \uBD84\uC11D\uD658\uACBD \uAD6C\uC131\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-10.webp)\\n- SageMaker Training\\n  - \uC6D0\uD558\uB294 \uC54C\uACE0\uB9AC\uC998\uC73C\uB85C \uD559\uC2B5 \uC218\uD589 \uBC0F \uBAA8\uB378 \uC800\uC7A5\\n- \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB294 \uC9C0\uC18D \uC2E4\uD589 \uBE44\uC6A9 \uBC1C\uC0DD. Transform \uC740 \uC2E4\uC81C \uC2E4\uD589 \uB54C\uB9CC \uBC1C\uC0DD\\
1n- BI ( Business Intelligence )\\n  - QuickSight\\n    - \uC644\uC804\uAD00\uB9AC\uD615 \uD074\uB77C\uC6B0\uB4DC \uAE30\uBC18 BI \uC11C\uBE44\uC2A4\\n  - SPICE ( QuickSight \uC6A9 \uC778\uBA54\uBAA8\uB9AC \uCD5C\uC801\uD654 \uACC4\uC0B0 \uC5D4\uC9C4 ) \uC744 \uD65C\uC6A9\uD558\uC5EC \uC8FC\uAE30\uC801\uC778 \uC5C5\uB370\uC774\uD2B8\\n  - 3rd Party BI \uD65C\uC6A9 : RedShift - Trableau Server - \uD3EC\uD138 \uC5F0\uB3D9\\n- \uB370\uC774\uD130 \uD3EC\uD138 \uAC1C\uBC1C\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-11.webp)\\n\\n### SI \uD68C\uC0AC\uC5D0\uC11C\uC758 \uB370\uC774\uD130 \uB808\uC774\uD06C\\n\\n- Fully Managed Service \uB97C \uC774\uC6A9\uD574\uC11C \uB2E8\uAE30\uC801\uC73C\uB85C \uC11C\uBE44\uC2A4\uB97C \uB9CC\uB4E4\uB824\uACE0 \uD588\uC74C\\n- \uC544\uD0A4\uD14D\uCC98\\n\\n  ![AWS Community Day - re:Invent \uD2B9\uC9D1](./image-12.webp)\\n\\n## \uACB0\uB860\\n\\n- S3 \uAE30\uBC18\uC758 \uC11C\uBC84\uB9AC\uC2A4 \uC544\uD0A4\uD14D\uCC98\uB3C4 \uCDA9\uBD84\uD788 \uC801\uC6A9 \uAC00\uB2A5\\n- \uC644\uC804 \uAD00\uB9AC\uD615 \uC11C\uBE44\uC2A4\uB9CC\uC774 \uC815\uB2F5\uC740 \uC544\uB2D8 ( Challenge )\\n  - \uAE30\uC874 Hadoop ecosystem \uD1B5\uD569\\n  - \uAE30\uC874 \uC870\uC9C1\uACFC\uC758 R&R ( \uC815\uBCF4 \uBCF4\uD638, \uAC1C\uBC1C, \uC778\uD504\uB77C \uB4F1 )\\n- \uC11C\uBC84\uB9AC\uC2A4 \uCEF4\uD4E8\uD305 \uC790\uC6D0: EKS On Fargate \uAC80\uD1A0\\n\\n## AWS SAM\uC73C\uB85C \uC11C\uBC84\uB9AC\uC2A4 \uC544\uD0A4\uD14D\uCC98 \uC6B4\uC601\uD558\uAE30 ( \uC774\uC7AC\uBA74, Mymusictaste )\\n\\n\\\\\\n\\\\\\n\\n## \uB0B4\uC6A9\\n\\n### AWS SAM \uC744 \uC0AC\uC6A9\uD55C \uC774\uC720\\n\\n- API Gateway, DynamoDB, SNS, SQS, Lambda \uB85C \uAD6C\uC131\uB41C \uC11C\uBE44\uC2A4 \uAC1C\uBC1C\uC774 \uC9C4\uD589\\n- Infrastrcture as Code \uB97C \uD1B5\uD574\uC11C \uBC30\uD3EC\uB97C \uAD6C\uC131\\n- \uC774\uBBF8 ECS \uB85C \uAD6C\uC131\uB41C Resources \uB4E4\uC774 Terraform \uC73C\uB85C \uAD6C\uC131\uB418\uC5B4 \uC788\uC5C8\uC74C\\n- `sam local` \uC744 \uC774\uC6A9\uD574\uC11C \uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C \uD14C\uC2A4\uD2B8 & \uB514\uBC84\uAE45\uC744 \uD574\uBCFC \uC218 \uC788\uC74C\\n  - `sam local start-api`\\n  - `sam local start-api --docker-network`\\n  - `sam local generate-event dynamodb update > event.json`\\n  - `sam local invoke --event event.json SendMessage`\\n  - `sam local lambda`\\n\\n#### SAM ( Serverless Application Model )\\n\\n- Serverless \uB97C \uC704\uD55C Tool \uB85C \uD3B8\uB9AC\uD558\uAC8C Abstraction \uB418\uC5B4 \uC788\uB2E4.\\n- SAM Template\\n  - Globals \uB85C \uACF5\uD1B5\uC801\uC778 Config \uC124\uC815\\n  - Alias, Versioning \uAD00\uB9AC \uAC00\uB2A5\\n  - Canary \uBC30\uD3EC \uAC00\uB2A5\\n- \uB2E4\uC591\uD55C Resource \uB4E4\uC744 \uC9C0\uC6D0\uD558\uACE0, CloudFormation Syntax \uB97C \uADF8\uB300\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n- `--use-container` \uC635\uC158\uC744 \uD1B5\uD574 `sam build` \uB97C \uD558\uBA74 Amazon Linux Docker Image \uB97C \uC774\uC6A9\uD574\uC11C \uBE4C\uB4DC\\n\\n### CloudFormation \uAE30\uB2A5 \uC124\uBA85\\n\\n- AWS SAM \uC740 AWS::Serverless \uC758 Resource \uB4E4\uC774 cfn \uC774\uB791 \uD638\uD658\uB420 \uC218 \uC788\uB3C4\uB85D \uBCC0\uD658\uD55C\uB2E4\\n- cfn \uC5D0\uC11C \uC9C0\uC6D0\uD558\uB294 \uAE30\uB2A5\uB4E4\uC744 \uB300\uBD80\uBD84 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n#### Parameters\\n\\n- Parameters \uB85C Input \uC744 Dynamic \uD558\uAC8C \uC124\uC815\uD558\uC5EC Stack \uC744 \uC0DD\uC131 \uB610\uB294 \uC5C5\uB370\uC774\uD2B8 \uD560 \uC218 \uC788\uB2E4\\n- System Manager Parameter Store \uC5D0 \uC800\uC7A5\uD55C \uAC12\uC744 \uC27D\uAC8C \uC5F0\uB3D9\uD558\uC5EC cfn parameter \uAC12\uC73C\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n#### Mappings\\n\\n- Key \uAC12 \uBCC4\uB85C \uBBF8\uB9AC Value \uB97C \uC815\uC758\uD574\uB193\uACE0 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n#### Conditions\\n\\n- \uC870\uAC74\uC744 \uB9CC\uC871\uD558\uB294 \uACBD\uC6B0\uC5D0\uB9CC Resource \uB97C \uC0DD\uC131\uD560 \uC218 \uC788\uB3C4\uB85D \uC124\uC815\uD560 \uC218 \uC788\uB2E4\\n\\n#### Nested Stacks\\n\\n- \uACF5\uD1B5\uB41C Re
1source \uB97C \uC815\uC758\uD55C Template \uC744 \uC7AC\uC0AC\uC6A9\uD558\uC5EC \uB9CC\uB4E4 \uC218 \uC788\uB2E4\\n\\n#### StackSets\\n\\n- StackSets \uC73C\uB85C \uC5EC\uB7EC Region \uACFC \uC5EC\uB7EC Acoount \uC5D0 Stack \uC744 \uC0DD\uC131\uD558\uACE0 \uAD00\uB9AC\uD560 \uC218 \uC788\uC74C\\n- Organizations \uC5D0\uC11C Service Mnaged Permission \uC73C\uB85C \uAD00\uB9AC\uB420 \uC218 \uC788\uC744\uAC70\uB77C \uC0DD\uAC01\\n- Organization Unit ( OU ) \uBCC4\uB85C Stack \uC744 \uC790\uB3D9 \uBC30\uD3EC\uD560 \uC218 \uC788\uAC8C \uB420 \uC608\uC815\\n  - OU \uC5D0 Account \uAC00 \uCD94\uAC00\uB418\uBA74 \uC790\uB3D9\uC73C\uB85C Stack \uC774 \uBC30\uD3EC\uB418\uACE0, Account\uAC00 OU \uC5D0\uC11C \uBE60\uC9C0\uBA74 \uC790\uB3D9\uC73C\uB85C Stack \uC774 \uC9C0\uC6CC\uC9C8 \uC218 \uC788\uC74C\\n\\n#### \uC544\uC26C\uC6E0\uB358 \uC810\\n\\n- \uC774\uBBF8 \uC874\uC7AC\uD558\uB294 Resource \uB4E4\uC744 Stack \uC5D0 \uD3EC\uD568\uC2DC\uD0A4\uACE0 \uC2F6\uC744 \uB54C\\n  - `resource import` 2019\uB144 11\uC6D4\uC5D0 \uBC1C\uD45C\uB428\\n  - SAM Template \uC740 Transform \uB418\uC5B4\uC57C \uD558\uB294 \uAC83 \uB
154C\uBB38\uC5D0 \uB2E4\uC74C\uACFC \uAC19\uC740 \uC5D0\uB7EC \uBC1C\uC0DD\\n  - SAM \uC740 Import \uB97C \uC9C0\uC6D0\uD558\uB294 Resource \uB4E4\uC774 \uC81C\uD55C\uC801\uC784\\n\\n### Pipeline\\n\\n#### Pipeline\\n\\n- User \u2192 Template \u2192 Version Control \u2192 Test \u2192 Deploy ( Staging ) \u2192 Deploy ( Production )\\n\\n#### \uAD6C\uC131\uC5D0 \uB3C4\uC6C0\uC774 \uB418\uB294 Tool\\n\\n- `cfn-lint`\\n  - CloudFormation Linter\\n  - .cfnlintrc \uC774\uB984\uC758 YAML \uD30C\uC77C\uC5D0 \uB2E4\uC591\uD55C \uC635\uC158\uC744 \uC124\uC815\uD560 \uC218 \uC788\uC74C\\n- `change-set`\\n  - cfn \uC5D0\uC11C change sets \uC73C\uB85C Stack \uC5D0 \uC5B4\uB5A4 \uBD80\uBD80\uB2DD \uC5C5\uB370\uC774\uD2B8 \uB420 \uC9C0 \uC801\uC6A9\uD558\uAE30 \uC804\uC5D0 \uC54C \uC218 \uC788\uB2E4\\n- `TaskCat`\\n  - AWS QuickStart Team \uC5D0\uC11C cfn template \uC744 \uD14C\uC2A4\uD2B8\uD558\uAE30 \uC704\uD574 \uB9CC\uB4E4\uC5B4\uC9C4 tool\\n  - \uC2E4\uC81C Stack \uC744 \uB9CC\uB4E4\uACE0 \uACB0\uACFC \uB9AC\uD3EC\uD2B8\uB97C \uC0DD\uC131"},{"id":"aws-session-manager","metadata":{"permalink":"/blog/aws-session-manager","source":"@site/blog/2020-01-16-aws-session-manager/index.md","title":"Session Manager \uC54C\uC544\uBCF4\uAE30","description":"AWS SSM (System Manager) \uB294 EC2, S3, RDS \uC778\uC2A4\uD134\uC2A4 \uB97C \uBAA8\uB2C8\uD130\uB9C1 & \uAD00\uB9AC \uB97C \uD560 \uC218 \uC788\uB294 \uC11C\uBE44\uC2A4 \uC774\uB2E4.","date":"2020-01-16T00:00:00.000Z","tags":[{"inline":false,"label":"AWS","permalink":"/blog/tags/aws"}],"readingTime":1.36,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Session Manager \uC54C\uC544\uBCF4\uAE30","slug":"aws-session-manager","date":"2020-01-16T00:00:00.000Z","authors":["dongmyeong"],"tags":["aws"],"description":"AWS SSM (System Manager) \uB294 EC2, S3, RDS \uC778\uC2A4\uD134\uC2A4 \uB97C \uBAA8\uB2C8\uD130\uB9C1 & \uAD00\uB9AC \uB97C \uD560 \uC218 \uC788\uB294 \uC11C\uBE44\uC2A4 \uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"AWS Community Day - re:Invent \uD2B9\uC9D1","permalink":"/blog/aws-community-day-reinvent"},"nextItem":{"title":"Go Version Manager","permalink":"/blog/go-version-manager"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Session Manager\\n\\nAWS SSM (System Manager) \uB294 EC2, S3, RDS \uC778\uC2A4\uD134\uC2A4 \uB97C \uBAA8\uB2C8\uD130\uB9C1 & \uAD00\uB9AC \uB97C \uD560 \uC218 \uC788\uB294 \uC11C\uBE44\uC2A4 \uC774\uB2E4.\\n\\n\uC774 \uC11C\uBE44\uC2A4 \uC911 \uD55C\uAC00\uC9C0 \uAE30\uB2A5\uC73C\uB85C `Session Manager` \uB77C\uB294 \uAE30\uB2A5\uC774 2018\uB144\uC5D0 \uCD94\uAC00 \uB418\uC5C8\uB294\uB370, \uC0AC\uC6A9\uBC95\uC744 \uAE4C\uBA39\uC744\uAC00\uBD10 \uC815\uB9AC\uD574\uB450\uB824 \uD55C\uB2E4.\\n\\n### \uC8FC\uC808\uC8FC\uC808\\n\\n\uBCF4\uD1B5 VPC \uB97C \uAD6C\uC131\uD560 \uB54C Public Subnet, Private Subnet \uC744 \uB098\uB220\uC11C \uAD6C\uC131\uD55C\uB2E4.\\n\\nPrivate Subnet \uC740 \uC678\uBD80 \uB124\uD2B8\uC6CC\uD06C\uC640 \uD1B5\uC2E0\uD558\uAE30 \uC704\uD574 NAT ( Gateway \uD639\uC740 Instance ) \uB97C \uB450\uB294\uB370, \uC774 Subnet \uC548\uC5D0\uC11C \uC0DD\uC131\uB41C \uC778\uC2A4\uD134\uC2A4\uB4E4\uC740 \uD37C\uBE14\uB9AD IP \uAC00 \uC5C6\uAE30 \uB54C\uBB38\uC5D0 \uC678\uBD80\uC5D0\uC11C \uBC14\uB85C \uC811\uC18D\uD560 \uC218 \uC5C6\uB2E4.\\n\\n\uC11C\uBE44\uC2A4\uB97C \uC6B4\uC601\uD558\uB2E4\uBCF4\uBA74 SSH \uB85C \uC11C\uBC84\uC5D0 \uC9C1\uC811 \uC811\uC18D\uD560 \uC77C\uB4E4\uC774 \uC0DD\uAE30\uAC8C \uB418\uB294\uB370, Private Subnet \uC5D0 \uC788\uB294 \uC11C\uBC84\uC5D0 \uC811\uC18D\uD560 \uC218 \uC5C6\uB2E4\uBCF4\uB2C8 Public Subnet \uC5D0 Bastion \uC744 \uB744\uC6B0\uACE0 Bastion \uC744 \uD1B5\uD574 Private Subnet \uC5D0 \uC788\uB294 \uC11C\uBC84\uC5D0 \uC811\uC18D\uD558\uAC8C \uB41C\uB2E4.\\n\\nBastion Host \uC5D0 \uC544\uBB34\uB098 \uC811\uC18D\uD558\uBA74 \uC548\uB418\uAE30 \uB54C\uBB38\uC5D0 Vault \uB098 \uB2E4\uB978 \uC11C\uBE44\uC2A4\uB97C \uD1B5\uD574 \uC778\uC99D \uACFC\uC815\uC744 \uAC70\uCE58\uAE30\uB3C4 \uD558\uC9C0\uB9CC, \uC77C\uBC18\uC801\uC73C\uB85C \uAC00\uC7A5 \uAC04\uB2E8\uD55C PEM \uD30C\uC77C\uC744 \uC774\uC6A9\uD558\uC5EC \uC811\uC18D\uD55C\uB2E4.\\n\\n1\uBA85\uC5D0\uC11C \uC11C\uBC84\uB97C \uAD00\uB9AC\uD560 \uB550 PEM \uD30C\uC77C\uC744 \uAC00\uC9C0\uACE0 \uC811\uC18D\uD560 \uC218 \uC788\uC9C0\uB9CC, \uD300\uC6D0\uC774 \uC99D\uAC00\uD558\uBA74\uC11C P
1EM \uD30C\uC77C\uC744 \uACF5\uC720\uD574\uC57C \uD558\uB294 \uBB38\uC81C\uAC00 \uBC1C\uC0DD\uD55C\uB2E4. ( ~~PEM \uD30C\uC77C\uC774 \uC0AC\uB77C\uC9C0\uAC70\uB098 \uC720\uCD9C\uB418\uB294 \uACBD\uC6B0 \uC0C1\uC0C1\uB3C4 \uD558\uAE30 \uC2EB\uB2E4.~~ )\\n\\n\uC774\uB7EC\uD55C \uBB38\uC81C\uB97C \uC27D\uAC8C \uD574\uACB0\uD558\uAE30 \uC704\uD574 \uB098\uC628\uAC8C `Session Manager`  \uC774\uB2E4.\\n\\nSession Manager \uB294 Shell \uC218\uC900\uC758 \uC811\uADFC\uC744 \uC9C0\uC6D0\uD558\uB294 \uC11C\uBE44\uC2A4\uC778\uB370, IAM \uAD8C\uD55C\uC73C\uB85C \uC778\uC99D\uC744 \uD558\uBA70 Cloud Trail \uB85C \uBAA8\uB4E0 \uC811\uADFC\uC5D0 \uB300\uD55C \uBAA8\uB2C8\uD130\uB9C1\uC744 \uD560 \uC218 \uC788\uB2E4.\\n\\n### SSM Agent\\n\\nSession Manager \uC744 \uC0AC\uC6A9\uD558\uAE30 \uC704\uD574\uC11C\uB294 SSM Agent \uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC57C \uD55C\uB2E4.\\n\\n`Amazon Linux \uAE30\uBC18 AMI(\uB0A0\uC9DC: 2017.09)`, `Amazon Linux 2`, `Ubuntu Server 16.04`, `Ubuntu Server 18.04 LTS` \uB294 \uAE30\uBCF8\uC801\uC73C\uB85C \uC124\uCE58\uB418\uC5B4 \uC788\uB2E4.\\n\\n#### \uC218\uB3D9 \uC124\uCE58\\n\\n- [https://docs.aws.amazon.com/ko\\\\_kr/systems-manager/latest/userguide/sysman-manual-agent-install.html](https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/sysman-manual-agent-install.html)\\n\\n### IAM Role \uC801\uC6A9\\n\\n\uC778\uC2A4\uD134\uC2A4\uAC00  SSM \uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB3C4\uB85D IAM Role  \uC744 \uBD80\uC5EC\uD574\uC918\uC57C \uD55C\uB2E4.\\n\\n\uAE30\uC874 Instance Role \uC774 \uC801\uC6A9\uB418\uC5B4 \uC788\uB2E4\uBA74 \uC544\uB798\uC758 \uC815\uCC45\uC744 \uCD94\uAC00\uD574\uC900\uB2E4.\\n\\n```json\\n{\\n    \\"Version\\": \\"2012-10-17\\",\\n    \\"Statement\\": [\\n        {\\n            \\"Action\\": [\\n                \\"ssmmessages:*\\",\\n                \\"ssm:UpdateInstanceInformation\\",\\n                \\"ec2messages:*\\"\\n            ],\\n            \\"Resource\\": \\"*\\",\\n            \\"Effect\\": \\"Allow\\"\\n        }\\n    ]\\n}\\n```\\n\\nInstance Role \uC744 \uBD80\uC5EC\uD55C \uC774\uD6C4 `amazon-ssm-agent` \uB97C \uC7AC\uC2DC\uC791\uD574\uC57C \uD55C\uB2E4.\\n\\n- Linux\\n\\n  ```bash\\n  $ sudo restart amazon-ssm-agent\\n  ```\\n- Ubuntu\\n\\n  ```bash\\n  $ sudo systemctl restart snap.amazon-ssm-agent.amazon-ssm-agent.service\\n  ```\\n\\n#### Session Manager  \uC2DC\uC791\\n\\nAWS Management Console \uC5D0\uC11C System Manager \uC5D0 \uB4E4\uC5B4\uAC00\uBA74 \uC88C\uCE21\uC5D0 \uC138\uC158 \uB9E4\uB2C8\uC800 (Session Manager) \uC5D0 \uB4E4\uC5B4\uAC00\uC11C \uC2DC\uC791\uD558\uBA74 \uB41C\uB2E4.\\n\\n#### Terminal \uC5D0\uC11C \uC811\uC18D\uD558\uB294 \uBC29\uBC95\\n\\n- `~/.ssh/config` \uC5D0 \uC544\uB798\uC758 \uB0B4\uC6A9\uC744 \uCD94\uAC00\uD574\uC900\uB2E4\\n\\n  ```bash\\n  # SSH over Session Manager\\n  host i-* mi-*\\n      ProxyCommand sh -c \\"aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters \'portNumber=%p\'\\"\\n  ```\\n- \uC811\uC18D\uD560 EC2 Instance \uC758 ID \uB97C \uCC3E\uC544\uB0B8 \uD6C4 SSH \uC811\uC18D\uD558\uBA74 \uB41C\uB2E4\\n\\n  ```bash\\n  $ ssh ec2-user@i-00000000000000000\\n  ```\\n\\n## \uCC38\uACE0\\n\\n- [https://docs.aws.amazon.com/ko\\\\_kr/systems-manager/latest/userguide/session-manager.html](https://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/session-manager.html)"},{"id":"go-version-manager","metadata":{"permalink":"/blog/go-version-manager","source":"@site/blog/2020-01-13-go-version-manager/index.md","title":"Go Version Manager","description":"\uCD5C\uADFC\uC5D0 golang \uC5D0 \uB300\uD574 \uB2E4\uC2DC \uAD00\uC2EC\uC774 \uC0DD\uAE30\uBA74\uC11C \uB9E5\uBD81 \uD658\uACBD\uC5D0 golang \uC744 \uC124\uCE58\uD558\uB824\uACE0 \uD588\uB2E4.","date":"2020-01-13T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":0.7,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Go Version Manager","slug":"go-version-manager","date":"2020-01-13T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"\uCD5C\uADFC\uC5D0 golang \uC5D0 \uB300\uD574 \uB2E4\uC2DC \uAD00\uC2EC\uC774 \uC0DD\uAE30\uBA74\uC11C \uB9E5\uBD81 \uD658\uACBD\uC5D0 golang \uC744 \uC124\uCE58\uD558\uB824\uACE0 \uD588\uB2E4."},"unlisted":false,"prevItem":{"title":"Session Manager \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/aws-session-manager"},"nextItem":{"title":"AWS CDK \uC54C\uC544\uBCF4\uAE30 (1)","permalink":"/blog/aws-cdk-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## GVM\\n\\nGo Version Manager\\n\\n\uCD5C\uADFC\uC5D0 golang \uC5D0 \uB300\uD574 \uB2E4\uC2DC \uAD00\uC2EC\uC774 \uC0DD\uAE30\uBA74\uC11C \uB9E5\uBD81 \uD658\uACBD\uC5D0 golang \uC744 \uC124\uCE58\uD558\uB824\uACE0 \uD588\uB2E4.\\n\\n\uCD5C\uADFC\uC5D0 `nvm`, `pyenv` \uB97C \uC124\uCE58\uD558\uC5EC \uC0AC\uC6A9\uD558\uB2E4\uBCF4\uB2C8 golang \uC5D0\uB3C4 Version Manager \uAC00 \uC788\uC9C0 \uC54A\uC744\uAE4C? \uB77C\uB294 \uC0DD\uAC01\uC5D0 \uAC80\uC0C9\uD574\uBCF4\uB2C8 `gvm` \uC774\uB77C\uB294 \uB3C4\uAD6C\uAC00 \uC788\uC5B4\uC11C \uC124\uCE58\uD588\uB2E4.\\n\\n### \uC124\uCE58 \uBC29\uBC95\\n\\n\uB9E5\uBD81\uC5D0 \uC124\uCE58\uD558\uB824\uBA74 \uBA3C\uC800 \uC544\uB798\uC758 \uC791\uC5C5\uC744 \uBA3C\uC800 \uC9C4\uD589\uD574\uC57C \uD55C\uB2E4\\n\\n```bash\\n$ xcode-select --install\\n$ brew update\\n$ brew install mercurial\\n```\\n\\n#### GVM \uC124\uCE58\\n\\n```bash\\n$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)\\n```\\n\\n#### ZSH \uC124\uC815\\n\\n`~/.zshrc` \uC5D0 \uC544\uB798\uC758 \uB0B4\uC6A9\uC744 \uCD94\uAC00\uD55C\uB2E4 \\n\\n```bash\\n[[ -s \\"$HOME/.gvm/scripts/gvm\\" ]] && source \\"$HOME/.gvm/scripts/gvm\\"\\n```\\n\\n#### Stable \uBC84\uC804 \uC124\uCE58\\n\\nGo 1.5 \uC774\uC0C1 \uBC84\uC804 \uC124\uCE58 \uC2DC 1.4 \uBC84\uC804\uC744 \uBA3C\uC800 \uC124\uCE58\uD574\uC57C \uD55C\uB2E4.\\n\\n```bash\\n$ gvm install go1.4 -B\\n$ gvm use go1.4\\n$ export GOROOT_BOOTSTRAP=$GOROOT\\n$ gvm install go1.13.6 --binary\\n$ gvm list\\n\\ngvm gos (installed)\\n\\n   go1.13.6\\n=> go1.4\\n\\n$ gvm use go1.13.6 --default\\n```\\n\\n### Go \uBC84\uC804 \uBAA9\uB85D \uC870\uD68C\\n\\n```bash\\n$ gvm listall\\n\\ngvm gos (available)\\n\\n   go1\\n   go1.0.1\\n   go1.0.2\\n   go1.0.3\\n   go1.1\\n   go1.1rc2\\n   go1.1rc3\\n   go1.1.1\\n   go1.1.2\\n   go1.2\\n   go1.2rc2\\n   go1.2rc3\\n   go1.2rc4\\n   go1.2rc5\\n   go1.2.1\\n   go1.2.2\\n   go1.3\\n   go1.3beta1\\n   go1.3beta2\\n   go1.3rc1\\n   go1.3rc2\\n   go1.3.1\\n   go1.3.2\\n   go1.3.3\\n   go1.4\\n ... \uC911\uB7B5\\n   go1.13.1\\n   go1.13.2\\n   go1.13.3\\n   go1.13.4\\n   go1.13.5\\n   go1.13.6\\n   go1.14beta1\\n   release.r56\\n   release.r57\\n   release.r58\\n... \uC0DD\uB7B5\\n```\\n\\n## \uCC38\uACE0\\n\\n- [moovweb/gvm](https://github.com/moovweb/gvm)\\n\\n### go 1.4 \uBC84\uC804 \uC124\uCE58 \uC2E4\uD328 \uC2DC\\n\\n- [gvm install go1.4 fails on macOS 10.13.2 \xb7 Issue #287 \xb7 moovweb/gvm](https://github.com/moovweb/gvm/issues/287)"},{"id":"aws-cdk-1","metadata":{"permalink":"/blog/aws-cdk-1","source":"@site/blog/2020-01-05-aws-cdk-1/index.md","title":"AWS CDK \uC54C\uC544\uBCF4\uAE30 (1)","de
1scription":"\uCC98\uC74C AWS\uB97C \uB2E4\uB8E8\uAC8C \uB418\uBA74 \uBCF4\uD1B5 AWS Management Console ( GUI )\uC5D0\uC11C \uC0DD\uC131\uD558\uACE0 \uD655\uC778\uD558\uAC8C \uB41C\uB2E4.","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"AWS","permalink":"/blog/tags/aws"}],"readingTime":2.36,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"AWS CDK \uC54C\uC544\uBCF4\uAE30 (1)","slug":"aws-cdk-1","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["aws"],"description":"\uCC98\uC74C AWS\uB97C \uB2E4\uB8E8\uAC8C \uB418\uBA74 \uBCF4\uD1B5 AWS Management Console ( GUI )\uC5D0\uC11C \uC0DD\uC131\uD558\uACE0 \uD655\uC778\uD558\uAC8C \uB41C\uB2E4."},"unlisted":false,"prevItem":{"title":"Go Version Manager","permalink":"/blog/go-version-manager"},"nextItem":{"title":"DynamoDB Local \uB744\uC6B0\uAE30","permalink":"/blog/dynamodb-local"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC778\uD504\uB77C\uB3C4 \uCF54\uB4DC\uB85C \uAD00\uB9AC\uD55C\uB2E4: IaC\\n\\n:::info\\n\\nIaC = Infrastrcuture As Code\\n\\n:::\\n\\n\uCC98\uC74C AWS\uB97C \uB2E4\uB8E8\uAC8C \uB418\uBA74 \uBCF4\uD1B5 AWS Management Console ( GUI )\uC5D0\uC11C \uC0DD\uC131\uD558\uACE0 \uD655\uC778\uD558\uAC8C \uB41C\uB2E4.\\n\\n\uC774\uB294 \uC18C\uADDC\uBAA8\uC77C \uB550 \uD06C\uAC8C \uBD80\uB2F4\uC2A4\uB7FD\uC9C0 \uC54A\uACE0 \uBE60\uB974\uACE0 \uD3B8\uD558\uAC8C \uC778\uD504\uB77C\uB97C \uAD00\uB9AC\uD560 \uC218 \uC788\uB2E4.\\n\\n\uD558\uC9C0\uB9CC \uC11C\uBE44\uC2A4\uB97C \uC6B4\uC601\uD558\uB2E4 \uBCF4\uBA74 \uC810\uC810 \uB354 \uADDC\uBAA8\uAC00 \uCEE4\uC9C0\uAC8C \uB418\uACE0, \uB2E4\uC591\uD55C \uC11C\uBE44\uC2A4\uB4E4\uC744 \uC774\uC6A9\uD558\uAC8C \uB41C\uB2E4. ( e.g. ECS, Beantalk, SQS, SNS, ElastiCache, RDS \uB4F1 )\\n\\n\uB610\uD55C \uAE30\uC874\uC5D0 \uB2F4\uB2F9\uD558\uB358 \uC0AC\uB78C\uB4E4\uC758 \uBCC0\uB3D9\uC774 \uC0DD\uAE38 \uACBD\uC6B0 \uD788\uC2A4\uD1A0\uB9AC\uB97C \uAD00\uB9AC\uD558\uB294 \uAC83\uC5D0 \uB300\uD55C \uD55C\uACC4\uAC00 \uC0DD\uAE34\uB2E4.\\n\\n\uC774\uB7EC\uD55C \uBB38\uC81C\uC810\uB4E4\uC744 \uD574\uACB0\uD558\uAE30 \uC704\uD574 \uC778\uD504\uB77C\uB97C \uCF54\uB4DC\uB85C \uAD00\uB9AC\uD558\uB294 \uAC83\uC774\uB2E4.\\n\\n## \uC778\uD504\uB77C \uAD00\uB9AC\uC758 \uBD88\uD3B8 \uC0AC\uB840\\n\\n### 1. \uC6F9 \uD658\uACBD\uC758 \uBCC0\uD654\\n\\nManagement Console\uC744 \uC774\uC6A9\uD560 \uB54C\uB294 \uB2E4\uB978 \uC0AC\uB78C\uB4E4\uB3C4 \uB530\uB77C\uC11C \uB9CC\uB4E4 \uC218 \uC788\uB3C4\uB85D \uD654\uBA74\uC744 \uCEA1\uCC98\uD558\uACE0 \uAD00\uB828 \uB0B4\uC6A9\uC744 \uB0A8\uAE30\uAC8C \uB41C\uB2E4.\\n\\n\uD558\uC9C0\uB9CC Management Console\uC740 \uC6F9 \uD658\uACBD\uC774\uAE30 \uB54C\uBB38\uC5D0 \uBCC0\uD654\uAC00 \uC0DD\uAE38 \uC218 \uC788\uACE0, \uC774\uB7F0 \uACBD\uC6B0 \uB192\uC740 \uD655\uB960\uB85C \uBBF8\uB9AC \uB9CC\uB4E4\uC5B4\uB454 \uAC00\uC774\uB4DC\uC640 \uC0C8\uB85C\uC6B4 UI\uC758 \uCC28\uC774\uAC00 \uC0DD\uAE30\uAC8C \uB41C\uB2E4.\\n\\n![(\uAD6C) \uAD00\uB9AC \uD654\uBA74](./image-1.webp)\\n\\n_(\uAD6C) \uAD00\uB9AC \uD654\uBA74_\\n\\n![(\uC2E0) \uAD00\uB9AC \uD654\uBA74](./image-2.webp)\\n\\n_(\uC2E0) \uAD00\uB9AC \uD654\uBA74_\\n\\n### 2. \uC608\uAE30\uCE58 \uC54A\uC740 \uBE44\uC6A9 \uCCAD\uAD6C\\n\\nManagement Console\uC5D0\uC11C \uD14C\uC2A4\uD2B8\uB97C \uC704\uD574 \uB2E4\uC591\uD55C \uC11C\uBE44\uC2A4\uB4E4\uC744 \uC0AC\uC6A9\uD55C \uD6C4 \uB9AC\uC18C\uC2A4\uB4E4\uC744 \uC81C\uAC70\uD574\uC918\uC57C \uBE44\uC6A9\uC774 \uCCAD\uAD6C\uB418\uC9C0 \uC54A\uB294\uB2E4.\\n\\n\uD558\uC9C0\uB9CC \uC791\uC5C5\uD558\uB2E4 \uBCF4\uBA74 \uC5B4\uB5A4 \uB9AC\uC18C\uC2A4\uB4E4\uC744 \uC0DD\uC131\uD588\uACE0 \uC0AC\uC6A9\uD588\uB294\uC9C0 \uC804\uBD80 \uAE30\uC5B5\uD558\uB294 \uAC8C \uC27D\uC9C0 \uC54A\uACE0, \uC2E4\uC218\uB85C \uB193\uCE58\uB294 \uBD80\uBD84\uC774 \uC0DD\uAE38 \uC218 \uC788\uB2E4.\\n\\n- [https://docs.aws.amazon.com/ko\\\\_kr/awsaccountbilling/latest/aboutv2/checklistforunwantedcharges.html](https://docs.aws.amazon.com/ko_kr/awsaccountbilling/latest/aboutv2/checklistforunwantedcharges.html)\\n\\n### 3. \uAD00\uB9AC\uB418\uC9C0 \uC54A\uB294 \uD788\uC2A4\uD1A0\uB9AC\\n\\
1n\uC778\uD504\uB77C\uB97C \uB2F4\uB2F9\uC790\uAC00 \uBC14\uB00C\uAC70\uB098, \uC2DC\uAC04\uC774 \uC624\uB798 \uC9C0\uB09C \uB4A4 \uAE30\uC874 \uC11C\uBE44\uC2A4\uB4E4\uC744 \uC5C5\uB370\uC774\uD2B8\uD558\uB824\uBA74 \uAC00\uC7A5 \uBA3C\uC800 \uB9C9\uB9C9\uD568\uC744 \uB290\uB07C\uAC8C \uB41C\uB2E4.\\n\\n( **\uC774\uAC78 \uC65C \uC774\uB807\uAC8C \uAD6C\uC131\uD588\uC9C0?**, **\uC774\uAC74 \uC5B4\uB514\uC11C \uD544\uC694\uD55C \uAC70\uC9C0?**, **\uC0AC\uC6A9\uD558\uC9C0 \uC54A\uB294 \uAC70 \uAC19\uC740\uB370 \uC0AD\uC81C\uD574\uB3C4 \uB418\uB098?,**  ~~\uC9DC\uC99D \uB098\uB294\uB370 \uB2E4 \uC9C0\uC6CC\uBC84\uB9B4\uAE4C?~~ )\\n\\n\uB2E8\uC21C\uD788 \uCEF4\uD4E8\uD130 \uBA87 \uB300\uB97C \uAD00\uB9AC\uD558\uB294 \uC218\uC900\uC744 \uBC97\uC5B4\uB09C \uC0C1\uD669\uC5D0\uC11C \uD788\uC2A4\uD1A0\uB9AC \uAD00\uB9AC\uAC00 \uB418\uC9C0 \uC54A\uB294\uB2E4\uB294 \uAC83\uC740 \uB2F4\uB2F9\uD558\uB294 \uC0AC\uB78C\uC5D0\uAC8C\uB294 \uB9E4\uC6B0 \uD070 \uC2A4\uD2B8\uB808\uC2A4\uB85C \uB2E4\uAC00\uC624\uAC8C \uB41C\uB2E4.\\n\\n\uB610\uD55C \uC0C8\uB85C\uC6B4 \uC11C\uBE44\uC2A4\uB97C \uCD94\uAC00\uD558\uAC70\uB098 \uBCC0\uACBD\uD560 \uB54C \uAE30\uC874 \uC778\uD504\uB77C \uD658\uACBD\uC744 \uC815\uD655\uD788 \uC54C \uC218 \uC5C6\uAE30 \uB54C\uBB38\uC5D0 \uAE30\uC874 \uADDC\uCE59\uC744 \uACC4\uC18D\uD574\uC11C \uB530\uB77C\uAC00\uAC8C \uB9CC\uB4E0\uB2E4.\\n\\n### 4. \uB3D9\uC77C\uD55C \uD658\uACBD \uAD6C\uC131\uC758 \uC5B4\uB824\uC6C0\\n\\n\uC6B4\uC601 \uD658\uACBD ( Production )\uC744 \uAD6C\uC131\uD558\uACE0 \uB098\uBA74 \uBC18\uB4DC\uC2DC \uD14C\uC2A4\uD2B8 \uD658\uACBD ( Test ) \uC774 \uD544\uC694\uD558\uB2E4.\\n\\n\uC2E0\uADDC \uAE30\uB2A5\uC744 \uCD94\uAC00\uD558\uAC70\uB098 \uAE30\uC874 \uBC84\uADF8\uB97C \uC218\uC815\uD558\uAC70\uB098 \uD588\uC744 \uB54C \uBC18\uB4DC\uC2DC \uBA3C\uC800 \uD14C\uC2A4\uD2B8\uD574 \uBCFC \uD658\uACBD\uC774 \uD544\uC694\uD558\uB2E4.\\n\\n\uC815\uD655\uD55C \uD14C\uC2A4\uD2B8\uB97C \uD558\uAE30 \uC704\uD574\uC11C\uB294 \uC6B4\uC601 \uD658\uACBD\uACFC **\uB3D9\uC77C\uD558\uAC8C** \uD658\uACBD\uC744 \uAD6C\uC131\uD560 \uD544\uC694\uAC00 \uC788\uB2E4.\\n\\nEC2 \uC11C\uBC84 1\\\\~2\uB300 \uC815\uB3C4\uB294 \uAC00\uBCCD\uAC8C \uB744\uC6B8 \uC218 \uC788\uB354\uB77C\uB3C4 \uC0AC\uC6A9\uD558\uB294 \uC11C\uBE44\uC2A4\uAC00 \uB9CE\uC544\uC9C0\uBA74 \uB9CE\uC544\uC9C8\uC218\uB85D \uB3D9\uC77C\uD55C \uD658\uACBD\uC744 \uAD6C\uC131\uD558\uAE30 \uC5B4\uB835\uB2E4.\\n\\n## CDK \uB97C \uC0AC\uC6A9\uD558\uBA74 \uBB50\uAC00 \uC88B\uC740\uAC00?\\n\\n:::info\\n\\nCDK = Cloud Development Kit\\n\\n:::\\n\\nCDK \uB294 \uB0B4\uBD80\uC801\uC73C\uB85C AWS CLI\uC640 Cloud Formation \uC744 \uC0AC\uC6A9\uD558\uC5EC \uC778\uD504\uB77C\uB97C \uCF54\uB4DC\uB85C \uAD00\uB9AC\uD560 \uC218 \uC788\uAC8C \uD574\uC900\uB2E4.\\n\\nCDK \uB97C \uC0AC\uC6A9\uD558\uBA74 \uC704\uC5D0\uC11C \uC5B8\uAE09\uD55C 4\uAC00\uC9C0 \uC0AC\uB840\uB97C \uC27D\uAC8C \uD574\uACB0\uD560 \uC218 \uC788\uB2E4.\\n\\n1. \uC6F9\uD658\uACBD\uC758 \uBCC0\uD654\\n   - Management Console\uC740 \uC6F9 \uD658\uACBD\uC774\uAE30 \uB54C\uBB38\uC5D0 \uBCC0\uACBD\uB420 \uC2
118 \uC788\uC9C0\uB9CC, \uC77C\uBC18\uC801\uC73C\uB85C CDK \uC758 \uC778\uD130\uD398\uC774\uC2A4\uAC00 \uBCC0\uD654\uB420 \uC77C\uC740 \uB9CE\uC9C0 \uC54A\uB2E4.\\n   - AWS CDK \uC758 \uC778\uD130\uD398\uC774\uC2A4\uAC00 \uBCC0\uD654\uB41C \uACBD\uC6B0 backward compatibility \uC744 \uC9C0\uCF1C\uC8FC\uBA70, \uC124\uB839 \uBCC0\uACBD\uB41C\uB2E4\uACE0 \uD558\uB354\uB77C\uB3C4 \uCF54\uB4DC\uC5D0\uC11C \uC77C\uBD80\uB9CC \uC218\uC815\uD558\uBA74 \uB41C\uB2E4.\\n1. \uC608\uAE30\uCE58 \uC54A\uC740 \uBE44\uC6A9 \uCCAD\uAD6C\\n   - CDK \uB85C \uBC30\uD3EC\uD55C \uACBD\uC6B0 \uC0AD\uC81C \uBA85\uB839\uC5B4\uB97C \uD1B5\uD574 \uBC30\uD3EC\uB41C \uB9AC\uC18C\uC2A4\uB4E4\uC744 \uD55C \uBC88\uC5D0 \uAE54\uB054\uD558\uAC8C \uC815\uB9AC\uD574 \uC8FC\uAE30 \uB54C\uBB38\uC5D0 \uBD88\uD544\uC694\uD55C \uC694\uAE08\uC774 \uCCAD\uAD6C\uB420 \uC77C\uC774 \uC5C6\uC5B4\uC9C4\uB2E4\\n1. \uAD00\uB9AC\uB418\uC9C0 \uC54A\uC740 \uD788\uC2A4\uD1A0\uB9AC\\n   - \uCF54\uB4DC\uB85C \uAD00\uB9AC\uD558\uAE30 \uB54C\uBB38\uC5D0  \uBC84\uC804 \uAD00\uB9AC\uB97C \uD558\uAC8C \uB418\uBA74 \uBCC0\uACBD \uC774\uB825\uC744 \uC27D\uAC8C \uD655\uC778\uD560 \uC218 \uC788\uB2E4.\\n1. \uB3D9\uC77C\uD55C \uD658\uACBD \uAD6C\uC131\uC758 \uC5B4\uB824\uC6C0\\n   - \uAD6C\uC131\uD55C \uCF54\uB4DC\uB4E4\uC774 \uC788\uC73C\uBA74 \uBA85\uB839 \uD55C \uBC88\uC5D0 \uC778\uD504\uB77C\uB97C \uD504\uB85C\uBE44\uC800\uB2DD \uD560 \uC218 \uC788\uAE30 \uB54C\uBB38\uC5D0 \uC190\uC27D\uAC8C \uB3D9\uC77C\uD55C \uD658\uACBD\uC744 \uAD6C\uC131\uD560 \uC218 \uC788\uB2E4.\\n\\n### CDK \uB300\uC548\uC740 \uC5C6\uB294\uAC00?\\n\\n- CloudFormation ( cfn )\\n  - AWS \uB9AC\uC18C\uC2A4\uB4E4\uC744 JSON \uD639\uC740 YAML \uD30C\uC77C\uB85C \uC791\uC131\uD560 \uC218 \uC788\uB2E4.\\n  - JSON, YAML \uC5D0 \uBAA8\uB4E0 \uB9AC\uC18C\uC2A4\uB97C \uB2E4 \uC815\uC758\uD574\uC57C \uD558\uBBC0\uB85C \uC0AC\uC6A9\uD558\uAE30\uAC00 \uC27D\uC9C0 \uC54A\uB2E4.\\n  - Designer \uB77C\uB294 \uAE30\uB2A5\uC744 \uC9C0\uC6D0\uD574\uC8FC\uAE34 \uD558\uC9C0\uB9CC, \uCF54\uB4DC\uB85C \uC791\uC131\uD558\uB294 \uAC83\uBCF4\uB2E4\uB294 \uC5B4\uB835\uB2E4 ( \uAC1C\uC778\uC801\uC778 \uCC28\uC774\uAC00 \uC788\uC744 \uC218 \uC788\uC74C )\\n\\n    ![AWS CDK \uC54C\uC544\uBCF4\uAE30 (1)](./image-3.webp)\\n- Serverless ( [https://serverless.com/](https://serverless.com/) )\\n  - Serverless \uD504\uB808\uC784\uC6CC\uD06C\uB294 \uAC1C\uC778\uC801\uC73C\uB85C \uB9CE\uC774 \uC774\uC6A9\uD558\uB294 \uD504\uB808\uC784\uC6CC\uD06C\uC774\uC9C0\uB9CC, \uC804\uCCB4\uC801\uC778 \uC778\uD504\uB77C\uB97C \uAD00\uB9AC\uD558\uB294 \uB370\uB294 \uC801\uD569\uD558\uC9C0 \uC54A\uB2E4.\\n- Terraform\\n  - Terraform\uC740 HashiCorp \uC5D0\uC11C \uAC1C\uBC1C\uD55C \uB3C4\uAD6C\uB85C \uC774 \uBD84\uC57C\uC758 \uAC15\uC790\uC774\uB2E4.\\n  - \uB3C5\uC790\uC801\uC778 HCL \uBB38\uBC95\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC778\uD504\uB77C\uB97C \uB9AC\uC18C\uC2A4\uB97C \uC120\uC5B8\uD55C\uB2E4.\\n  - AWS\uBFD0\uB9CC \uC544\uB2C8\uB77C GCP, Azure, Mongo Atlas \uB4F1 \uB2E4\uC591\uD55C \uD074\uB77C\uC6B0\uB4DC \uD504\uB85C\uBC14\uC774\uB354\uB97C \uC81C\uACF5\uD55C\uB2E4.\\n- CDK\\n  - AWS\uC5D0\uC11C \uC9C1\uC811 \uAC1C\uBC1C\uD55C \uB3C4\uAD6C\uC774\uBA70, \uB2E4\uC591\uD55C \uC5B8\uC5B4 ( Java, Python, TypeScript, C# \uB4F1 )\uC73C\uB85C \uC81C\uACF5\uB41C\uB2E4.\\n  - TypeScript\uB85C \uC791\uC131\uD558\uB294 \uACBD\uC6B0 \uD0C0\uC785\uC744 \uAC80\uC0AC\uB97C \uC81C\uACF5\uD558\uAE30 \uB54C\uBB38\uC5D0 \uAC1C\uBC1C \uBC0F \uC720\uC9C0 \uBCF4\uC218\uC5D0 \uC6A9\uC774\uD558\uB2E4.\\n  - AWS \uBCC0\uD654\uC5D0 \uB300\uD574 \uAC00\uC7A5 \uBC18\uC601\uC774 \uBE60\uB974\uB2E4.\\n\\n\uB9CE\uC740 \uAC1C\uBC1C\uC790\uAC00 Terraform vs CDK \uB97C \uBE44\uAD50\uD55C\uB2E4.\\n\\n\uAC1C\uC778\uC801\uC778 \uC758\uACAC\uC73C\uB85C\uB294 \uB458 \uB2E4 \uC815\uB9D0 \uC88B\uC740 \uB3C4\uAD6C\uC774\uBA70, \uC0C1\uD669\uC5D0 \uB530\uB77C \uC0AC\uC6A9\uD558\uB294 \uAC8C \uC88B\uB2E4\uACE0 \uC0DD\uAC01\uD55C\uB2E4.\\n\\n\uBA40\uD2F0 \uD074\uB77C\uC6B0\uB4DC\uB97C \uC0AC\uC6A9\uD558\uB294 \uACBD\uC6B0 Terraform\uC744 \uC0AC\uC6A9\uD558\uACA0\uC9C0\uB9CC, \uADF8\uB807\uC9C0 \uC54A\uC740 \uACBD\uC6B0\uC5D0\uB294 CDK \uB97C \uC0AC\uC6A9\uD558\uB294\uAC8C \uC88B\uB2E4\uACE0 \uC0D
1D\uAC01\uD55C\uB2E4.\\n\\n## \uCC38\uACE0\\n\\n- [AWS \uD074\uB77C\uC6B0\uB4DC \uAC1C\uBC1C FAQ](https://aws.amazon.com/ko/cdk/faqs/)\\n- [\uD074\uB77C\uC6B0\uB4DC \uB124\uC774\uD2F0\uBE0C \uD658\uACBD\uC5D0 \uB9DE\uB294 IT \uC6B4\uC601 \uC6D0\uCE59\uACFC \uBAA8\uBC94\uC0AC\uB840 - \uAD8C\uC2E0\uC911 \uC194\uB8E8\uC158\uC988 \uC544\uD0A4\uD14D\uD2B8, AWS :: AWS Summit Seoul 2019](https://www.slideshare.net/awskorea/it-aws-aws-summit-seoul-2019)\\n- [AWS CDK\uB97C \uD1B5\uD574 \uC778\uD504\uB77C \uD5A5\uC0C1 - \uBA54\uAC00\uC874 AWS Cloud](https://cloud.hosting.kr/techblog_181227_aws-cdk/)\\n- [\uCF54\uB4DC\uB85C \uC778\uD504\uB77C \uAD00\uB9AC: AWS CDK](https://musma.github.io/2019/11/28/about-aws-cdk.html#%EA%B0%9C%EC%84%A0%ED%95%A0-%EC%A0%90)"},{"id":"dynamodb-local","metadata":{"permalink":"/blog/dynamodb-local","source":"@site/blog/2020-01-05-dynamodb-local/index.md","title":"DynamoDB Local \uB744\uC6B0\uAE30","description":"DynamoDB \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD560 \uB550 \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uC124\uCE58\uD558\uB294\uAC8C \uAC00\uC7A5 \uC88B\uB2E4.","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130\uBCA0\uC774\uC2A4","permalink":"/blog/tags/database"}],"readingTime":0.32,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"DynamoDB Local \uB744\uC6B0\uAE30","slug":"dynamodb-local","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["database"],"description":"DynamoDB \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD560 \uB550 \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uC124\uCE58\uD558\uB294\uAC8C \uAC00\uC7A5 \uC88B\uB2E4."},"unlisted":false,"prevItem":{"title":"AWS CDK \uC54C\uC544\uBCF4\uAE30 (1)","permalink":"/blog/aws-cdk-1"},"nextItem":{"title":"MongoDB Local Replica \uC124\uC815 ( With Docker )","permalink":"/blog/mongodb-local-replica-docker"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uAC1C\uC694\\n\\n- [DynamoDB \uB85C\uCEEC \uC124\uC815(\uB2E4\uC6B4\uB85C\uB4DC \uBC84\uC804)](https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/DynamoDBLocal.html)\\n\\n- DynamoDB \uB97C \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD560 \uB550 \uB85C\uCEEC\uC5D0\uB2E4\uAC00 \uC124\uCE58\uD558\uB294\uAC8C \uAC00\uC7A5 \uC88B\uB2E4.\\n- \uC9C1\uC811  \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC544\uC11C \uC124\uCE58\uD574\uB3C4 \uBB34\uBC29\uD558\uB098, \uD3B8\uC758\uC131\uC744 \uC704\uD574 Docker \uB85C \uC124\uCE58\uD558\uB294 \uBC29\uBC95\uC744 \uC120\uD0DD\uD588\uB2E4.\\n\\n## DynamoDB Local in Docker\\n\\n```bash\\n$ docker pull amazon/dynamodb-local\\n\\n$ docker run -p 8000:8000 -v $(pwd)/dynamodb/data:/data/ amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb -dbPath /data\\n```\\n\\n## \uC8FC\uC758 \uC0AC\uD56D\\n\\n- [DynamoDB \uC0AC\uC6A9 \uC2DC \uC8FC\uC758\uC0AC\uD56D](https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/DynamoDBLocal.UsageNotes.html)\\n\\n- `sharedDb` \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC73C\uBA74 \uAC01 \uC778\uC2A4\uD134\uC2A4 \uB9C8\uB2E4 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD30C\uC77C\uC774 \uBCC4\uB3C4\uB85C \uC0DD\uAE30\uAE30 \uB54C\uBB38\uC5D0 \uC11C\uB85C \uB2E4\uB978 \uC778\uC2A4\uD134\uC2A4\uC5D0\uC11C\uB294 \uB370\uC774\uD130\uB97C \uACF5\uC720\uD560 \uC218 \uC5C6\uC74C"},{"id":"mongodb-local-replica-docker","metadata":{"permalink":"/blog/mongodb-local-replica-docker","source":"@site/blog/2020-01-05-mongodb-local-replica-docker/index.md","title":"MongoDB Local Replica \uC124\uC815 ( With Docker )","description":"MongoDB Watch \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD558\uB824\uACE0 \uD558\uB2C8 \uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C Replica \uB97C \uAD6C\uC131\uD574\uC57C \uD588\uC74C","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130\uBCA0\uC774\uC2A4","permalink":"/blog/tags/database"}],"readingTime":0.67,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"MongoDB Local Replica \uC124\uC815 ( With Docker )","slug":"mongodb-local-replica-docker","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["database"],"description":"MongoDB Watch \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD558\uB824\uACE0 \uD558\uB2C8 \uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C Replica \uB97C \uAD6C\uC131\uD574\uC57C \uD588\uC74C"},"unlisted":false,"prevItem":{"title":"DynamoDB Local \uB744\uC6B0\uAE30","permalink":"/blog/dynamodb-local"},"nextItem":{"title":"PostgreSQL \uC720\uC6A9 \uBA85\uB839\uC5B4","permalink":"/blog/postgresql-commands"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Introduction\\n\\n- MongoDB Watch \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC11C\uBE44\uC2A4\uB97C \uAC1C\uBC1C\uD558\uB824\uACE0 \uD558\uB2C8 \uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C Replica \uB97C \uAD6C\uC131\uD574\uC57C \uD588\uC74C\\n- Docker \uB97C \uC0AC\uC6A9\uD558\uC5EC \uB85C\uCEEC \uD658\uACBD\uC5D0\uC11C Mongo Replica \uB97C \uAD6C\uC131\uD558\uB294 \uBC29\uBC95 \uC815\uB9AC\\n- MongoDB 4.0 \uBC84\uC804\uC744 \uAE30\uC900\uC73C\uB85C \uC124\uBA85\\n\\n### Step\\n\\n1. MongoDB \uB3C4\uCEE4 \uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\\n\\n   ```bash\\n   $ docker pull mongo:4.0\\n   ```\\n1. MongoDB \uB3C4\uCEE4 \uCEE8\uD14C\uC774\uB108 \uC2E4\uD589\\n\\n   ```bash\\n   $ mkdir -p ~/Documents/docker/mongo/data/db\\n   $ docker run --name mongo -d -p 27017:27017 -v ~/Documents/docker/mongo/data/db:/data/db mongo:4.0 --replSet localDev\\n   ```\\n1. Docker Container \uC758 MongoDB Shell \uC811\uC18D\\n\\n   ```bash\\n   $ docker exec -it mongo /bin/sh\\n   # mongo\\n   ```\\n1. Replica \uC124\uC815\\n\\n   ```bash\\n   ddocdocDev:OTHER> rs.initiate()\\n   ddocdocDev:OTHER> rsconf = rs.conf();\\n   ddocdocDev:OTHER> rsconf.members = [{ _id: 0, host: \'127.0.0.1:27017\' }]\\n   ddocdocDev:OTHER> rs.reconfig(rsconf, { force: true });\\n   ddocdocDev:PRIMARY> exit\\n   ```\\n1. `OTHER` \uC5D0\uC11C `PRIMARY` \uB85C \uBCC0\uACBD\uB418\uBA74 \uC124\uC815\uC774 \uBAA8\uB450 \uB05D\uB09C\uAC70\uB2E4\\n\\n### Finish\\n\\n- \uC880 \uB354 \uAC04\uB2E8\uD558\uAC8C \uC124\uC815\uD560 \uC218 \uC788\uB294 \uBC29\uBC95\uC744 \uCC3E\uC744 \uACBD\uC6B0 \uBB38\uC11C\uB97C \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4\\n- `rs.initiate()` \uB97C \uD588\uC744 \uB54C \uC790\uB3D9\uC73C\uB85C \uC124\uC815\uB418\uC5B4 \uC788\uB2E4\uBA74 `rs.reconfig` \uB97C \uD560 \uD544\uC694\uAC00 \uC5C6\uB2E4\\n- Replica \uC124\uC815 \uC815\uBCF4\\n\\n  ```js\\n  {\\n  \\t\\"_id\\" : \\"localDev\\",\\n  \\t\\"version\\" : 45345,\\n  \\t\\"protocolVersion\\" : NumberLong(1),\\n  \\t\\"writeConcernMajorityJournalDefault\\" : true,\\n  \\t\\"members\\" : [\\n  \\t\\t{\\n  \\t\\t\\t\\"_id\\" : 0,\\n  \\t\\t\\t\\"host\\" : \\"127.0.0.1:27017\\",\\n  \\t\\t\\t\\"arbiterOnly\\" : false,\\n  \\t\\t\\t\\"buildIndexes\\" : true,\\n  \\t\\t\\t\\"hidden\\" : false,\\n  \\t\\t\\t\\"priority\\" : 1,\\n  \\t\\t\\t\\"tags\\" : {\\n\\n  \\t\\t\\t},\\n  \\t\\t\\t\\"slaveDelay\\" : NumberLong(0),\\n  \\t\\t\\t\\"votes\\" : 1\\n  \\t\\t}\\n  \\t],\\n  \\t\\"settings\\" : {\\n  \\t\\t\\"chainingAllowed\\" : true,\\n  \\t\\t\\"heartbeatIntervalMillis\\" : 2000,\\n  \\t\\t\\"heartbeatTimeoutSecs\\" : 10,\\n  \\t\\t\\"electionTimeoutMillis\\" : 10000,\\n  \\t\\t\\"catchUpTimeoutMillis\\" : -1,\\n  \\t\\t\\"catchUpTakeoverDelayMillis\\" : 3
10000,\\n  \\t\\t\\"getLastErrorModes\\" : {\\n\\n  \\t\\t},\\n  \\t\\t\\"getLastErrorDefaults\\" : {\\n  \\t\\t\\t\\"w\\" : 1,\\n  \\t\\t\\t\\"wtimeout\\" : 0\\n  \\t\\t},\\n  \\t\\t\\"replicaSetId\\" : ObjectId(\\"5d26dcefa2e3659e1b79e5b6\\")\\n  \\t}\\n  }\\n  ```"},{"id":"postgresql-commands","metadata":{"permalink":"/blog/postgresql-commands","source":"@site/blog/2020-01-05-postgresql-commands/index.md","title":"PostgreSQL \uC720\uC6A9 \uBA85\uB839\uC5B4","description":"=# \\\\q : psql \uC885\uB8CC ( ctrl + d \uC640 \uB3D9\uC77C )","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130\uBCA0\uC774\uC2A4","permalink":"/blog/tags/database"}],"readingTime":0.17,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"PostgreSQL \uC720\uC6A9 \uBA85\uB839\uC5B4","slug":"postgresql-commands","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["database"],"description":"=# \\\\q : psql \uC885\uB8CC ( ctrl + d \uC640 \uB3D9\uC77C )"},"unlisted":false,"prevItem":{"title":"MongoDB Local Replica \uC124\uC815 ( With Docker )","permalink":"/blog/mongodb-local-replica-docker"},"nextItem":{"title":".vimrc \uC124\uC815","permalink":"/blog/vimrc"}},"content":"\x3c!-- truncate --\x3e\\n\\n## PGSQL \uC720\uC6A9 \uBA85\uB839\uC5B4\\n\\n- `=# \\\\q` : psql \uC885\uB8CC ( `ctrl + d`  \uC640 \uB3D9\uC77C )\\n- `=# \\\\d` : Table, View, Sequence, Index \uC870\uD68C\\n- `=# \\\\dt{table_name}` : Column \uBAA9\uB85D\\n- `=# \\\\dS` : \uC2DC\uC2A4\uD15C \uD14C\uC774\uBE14 \uBAA9\uB85D\\n- `=# \\\\dv` : View \uBAA9\uB85D\\n- `=# \\\\ds` : Sequnece \uBAA9\uB85D\\n- `=# \\\\dl` : DB \uBAA9\uB85D\\n- `=# \\\\du` : Role (User) \uBAA9\uB85D\\n- `=# \\\\dn` : Schema \uBAA9\uB85D\\n- `=# \\\\c {database_name}` : \uB2E4\uB978 DB  \uC811\uC18D\\n- `=# \\\\db` : Table Space \uBAA9\uB85D"},{"id":"vimrc","metadata":{"permalink":"/blog/vimrc","source":"@site/blog/2020-01-05-vimrc/index.md","title":".vimrc \uC124\uC815","description":"vim-plug command: :PlugInstall","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.26,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":".vimrc \uC124\uC815","slug":"vimrc","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"vim-plug command: :PlugInstall"},"unlisted":false,"prevItem":{"title":"PostgreSQL \uC720\uC6A9 \uBA85\uB839\uC5B4","permalink":"/blog/postgresql-commands"},"nextItem":{"title":"Visual Studio Code \uB97C \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD558\uAE30","permalink":"/blog/vscode-from-terminal"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC124\uC815\\n\\n\uACBD\uB85C: `~/.vimrc`\\n\\n```text\\nset nu\\nsyntax on\\nset encoding=utf8\\nset expandtab\\nset ts=4\\nset sw=4\\nset sts=4\\n\\ncall plug#begin()\\nPlug \'arcticicestudio/nord-vim\'\\nPlug \'vim-airline/vim-airline\'\\nPlug \'scrooloose/nerdtree\'\\ncall plug#end()\\n\\ncolorscheme nord\\nautocmd vimenter * NERDTree\\n```\\n\\n## vim-plug \uC124\uCE58\\n\\nvim-plug command: `:PlugInstall`\\n\\n```text\\ncurl -fLo ~/.vim/autoload/plug.vim --create-dirs \\\\\\n    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\\n```\\n\\n## \uCC38\uACE0\\n\\n- https://github.com/junegunn/vim-plug\\n- https://github.com/arcticicestudio/nord-vim"},{"id":"vscode-from-terminal","metadata":{"permalink":"/blog/vscode-from-terminal","source":"@site/blog/2020-01-05-vscode-from-terminal/index.md","title":"Visual Studio Code \uB97C \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD558\uAE30","description":"visual studio code \uB97C \uC2E4\uD589\uD55C\uB2E4","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.15,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Visual Studio Code \uB97C \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD558\uAE30","slug":"vscode-from-terminal","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"visual studio code \uB97C \uC2E4\uD589\uD55C\uB2E4"},"unlisted":false,"prevItem":{"title":".vimrc \uC124\uC815","permalink":"/blog/vimrc"},"nextItem":{"title":"zsh \uC124\uC815 \uD30C\uC77C","permalink":"/blog/zshrc"}},"content":"\x3c!-- truncate --\x3e\\n\\n## vscode (visual studio code) \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD558\uB294 \uBC29\uBC95\\n\\n1. visual studio code \uB97C \uC2E4\uD589\uD55C\uB2E4\\n1. Command Palette \uB97C \uC5F0\uB2E4. ( Command + Option + P )\\n1. Shell Command \uB97C \uC785\uB825\uD558\uC5EC `Shell Command: Install \'code\' command in PATH command` \uB97C \uC2E4\uD589\uD55C\uB2E4\\n1. \uD130\uBBF8\uB110\uC5D0\uC11C `code .` \uB97C \uC785\uB825\uD558\uC5EC vscode \uB97C \uC2E4\uD589\uD55C\uB2E4"},{"id":"zshrc","metadata":{"permalink":"/blog/zshrc","source":"@site/blog/2020-01-05-zshrc/index.md","title":"zsh \uC124\uC815 \uD30C\uC77C","description":"","date":"2020-01-05T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.19,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"zsh \uC124\uC815 \uD30C\uC77C","slug":"zshrc","date":"2020-01-05T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":""},"unlisted":false,"prevItem":{"title":"Visual Studio Code \uB97C \uD130\uBBF8\uB110\uC5D0\uC11C \uC2E4\uD589\uD558\uAE30","permalink":"/blog/vscode-from-terminal"},"nextItem":{"title":"ipython \uC124\uCE58","permalink":"/blog/ipython-install"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Mac OS X zsh \uC124\uC815\\n\\n```bash\\n# ~/.zshrc\\nsource ~/.zshrc.local\\n```\\n\\n```bash\\n# ~/.zshrc.local\\nexport NVM_DIR=\\"$HOME/.nvm\\"\\n[ -s \\"$NVM_DIR/nvm.sh\\" ] && \\\\. \\"$NVM_DIR/nvm.sh\\"  # This loads nvm\\n[ -s \\"$NVM_DIR/bash_completion\\" ] && \\\\. \\"$NVM_DIR/bash_completion\\"  # This loads nvm bash_completion\\n\\neval \\"$(pyenv init -)\\";\\neval \\"$(pyenv virtualenv-init -)\\"\\n\\nprompt_context() {\\n    emojis=(\\"\u26A1\uFE0F\\" \\"\u{1F525}\\" \\"\u{1F1F0} \\" \\"\u{1F451}\\" \\"\u{1F60E}\\" \\"\u{1F438}\\" \\"\u{1F435}\\" \\"\u{1F984}\\" \\"\u{1F308}\\" \\"\u{1F37B}\\" \\"\u{1F680}\\" \\"\u{1F4A1}\\" \\"\u{1F389}\\" \\"\u{1F511}\\" \\"\u{1F6A6}\\" \\"\u{1F319}\\")\\n    RAND_EMOJI_N=$(( $RANDOM % ${#emojis[@]} + 1))\\n    prompt_segment black default \\"claude ${emojis[$RAND_EMOJI_N]} \\"\\n}\\n\\nsource <(kubectl completion zsh)\\n```"},{"id":"ipython-install","metadata":{"permalink":"/blog/ipython-install","source":"@site/blog/2018-09-21-ipython-install/index.md","title":"ipython \uC124\uCE58","description":"virtualenv \uD658\uACBD\uC5D0\uC11C iPython \uC124\uCE58","date":"2018-09-21T00:00:00.000Z","tags":[{"inline":false,"label":"Python","permalink":"/blog/tags/python"}],"readingTime":0.44,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"ipython \uC124\uCE58","slug":"ipython-install","date":"2018-09-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["python"],"description":"virtualenv \uD658\uACBD\uC5D0\uC11C iPython \uC124\uCE58"},"unlisted":false,"prevItem":{"title":"zsh \uC124\uC815 \uD30C\uC77C","permalink":"/blog/zshrc"},"nextItem":{"title":"AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30","permalink":"/blog/aws-saa-review"}},"content":"\x3c!-- truncate --\x3e\\n\\n## iPython Install for Mac\\n\\nvirtualenv \uD658\uACBD\uC5D0\uC11C iPython \uC124\uCE58\\n\\n```bash\\n# 1.Homebrew \uC124\uCE58\\n$ /usr/bin/ruby -e \\"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\\"\\n\\n# 2. python \uC124\uCE58 (PATH\uB294 \uB2EC\uB77C\uC9C8 \uC218 \uC788\uC74C)\\n$ brew install python \\n$ vim ~/.bash_profile\\nexport PATH=/usr/local/bin:$PATH\\n\\n# 3. virtualenv \uC124\uCE58\\n$ pip install virtualenv\\n$ cd ~/Desktop\\n$ virtualenv venv\\n$ source venv/bin/activate\\n\\n# 4. numpy \uC124\uCE58\\n(venv) $ pip install numpy\\n\\n# 5. SciPy \uC124\uCE58\\n(venv) $ brew install gcc\\n(venv) $ pip install scipy\\n\\n# 6. mataplotlib \uC124\uCE58\\n(venv) $ pip install matplotlib\\n\\n# 7. iPython \uC124\uCE58\\n(venv) $ pip install ipython\\n(venv) $ ipython\\nPython 3.6.0 (default, Mar  4 2017, 12:32:34) \\nType \'copyright\', \'credits\' or \'license\' for more information\\nIPython 6.2.0 -- An enhanced Interactive Python. Type \'?\' for help.\\n\\nIn [1]: \\n\\n# (Addon). iPython notebook \uC124\uCE58\\n(venv) $ pip install ipython[zmq,qtconsole,notebook,test]\\n```"},{"id":"aws-saa-review","metadata":{"permalink":"/blog/aws-saa-review","source":"@site/blog/2018-08-12-aws-saa-review/index.md","title":"AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30","description":"AWS \uC790\uACA9\uC99D\uC5D0\uB294 \uC5EC\uB7EC \uC885\uB958\uAC00 \uC788\uB294\uB370 \uC788\uB294\uB370, \uB09C \uADF8\uC911 Solution Architect - Associate (SAA) \uC790\uACA9\uC99D \uC2DC\uD5D8\uC5D0 \uC751\uC2DC\uD588\uB2E4. 2018\uB144 2\uC6D4\uBD80\uD130 
1SAA \uC0C8\uB85C\uC6B4 \uC720\uD615\uC758 \uC2DC\uD5D8\uC774 \uCD94\uAC00\uB410\uACE0, 2018\uB144 8\uC6D4\uBD80\uD130\uB294 \uC774\uC804 \uC720\uD615\uC758 \uC2DC\uD5D8\uC744 \uBCFC\u2026","date":"2018-08-12T00:00:00.000Z","tags":[{"inline":false,"label":"AWS","permalink":"/blog/tags/aws"}],"readingTime":1.09,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30","slug":"aws-saa-review","date":"2018-08-12T00:00:00.000Z","authors":["dongmyeong"],"tags":["aws"],"description":"AWS \uC790\uACA9\uC99D\uC5D0\uB294 \uC5EC\uB7EC \uC885\uB958\uAC00 \uC788\uB294\uB370 \uC788\uB294\uB370, \uB09C \uADF8\uC911 Solution Architect - Associate (SAA) \uC790\uACA9\uC99D \uC2DC\uD5D8\uC5D0 \uC751\uC2DC\uD588\uB2E4. 2018\uB144 2\uC6D4\uBD80\uD130 SAA \uC0C8\uB85C\uC6B4 \uC720\uD615\uC758 \uC2DC\uD5D8\uC774 \uCD94\uAC00\uB410\uACE0, 2018\uB144 8\uC6D4\uBD80\uD130\uB294 \uC774\uC804 \uC720\uD615\uC758 \uC2DC\uD5D8\uC744 \uBCFC\u2026"},"unlisted":false,"prevItem":{"title":"ipython \uC124\uCE58","permalink":"/blog/ipython-install"},"nextItem":{"title":"\uC720\uB2DB \uD14C\uC2A4\uD2B8","permalink":"/blog/nodejs-unit-test"}},"content":"\x3c!-- truncate --\x3e\\n\\nAWS \uC790\uACA9\uC99D\uC5D0\uB294 \uC5EC\uB7EC \uC885\uB958\uAC00 \uC788\uB294\uB370 \uC788\uB294\uB370, \uB09C \uADF8\uC911 Solution Architect - Associate (SAA) \uC790\uACA9\uC99D \uC2DC\uD5D8\uC5D0 \uC751\uC2DC\uD588\uB2E4.\\\\\\n2018\uB144 2\uC6D4\uBD80\uD130 SAA \uC0C8\uB85C\uC6B4 \uC720\uD615\uC758 \uC2DC\uD5D8\uC774 \uCD94\uAC00\uB410\uACE0, 2018\uB144 8\uC6D4\uBD80\uD130\uB294 \uC774\uC804 \uC720\uD615\uC758 \uC2DC\uD5D8\uC744 \uBCFC \uC218 \uC5C6\uB2E4 \uD558\uAE38\uB798 \uC544\uC608 \uC0C8\uB85C\uC6B4 \uC720\uD615\uC758 \uC2DC\uD5D8\uC73C\uB85C \uC751\uC2DC\uD588\uB2E4.\\n\\n![AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30](./image-1.webp)\\n\\n## **\uC2DC\uD5D8 \uC900\uBE44**\\n\\nSAA \uB97C \uC900\uBE44\uD558\uBA74\uC11C \uAD50\uC7AC\uB4E4\uC744 \uCC3E\uC544\uBD24\uC73C\uB098, \uD574\uC678 \uC11C\uC801\uC73C\uB85C \uC788\uB294 \uAC70 \uC678\uC5D0 \uB9C8\uB545\uD55C \uC11C\uC801\uC740 \uCC3E\uC9C0 \uBABB\uD588\uB2E4. \uADF8\uB798\uC11C \uAD50\uC7AC\uB97C \uC0AC\uB294 \uB300\uC2E0 \uC628\uB77C\uC778 \uAC15\uC88C\uC640 \uBC31\uC11C, \uADF8\uB9AC\uACE0 \uB2E4\uC591\uD55C \uD6C4\uAE30\uB4E4\uC744 \uBA3C\uC800 \uCC3E\uC544\uBD24\uACE0 \uAC01\uC885 \uD301\uC744 \uC5BB\uC5B4 \uC2DC\uD5D8\uC744 \uC900\uBE44\uD588\uB2E4\\n\\nAWSKRUG \uC5D0 \uC62C\uB77C\uC628 SAA \uD6C4\uAE30\uB97C \uC77D\uACE0 \uC57D 1\uB2EC \uC815\uB3C4 \uACF5\uBD80\uB97C \uD558\uACE0 \uC2DC\uD5D8\uC744 \uBD24\uB2E4.\\\\\\nAWS\uB97C \uC2E4\uBB34\uC5D0\uC11C \uC0AC\uC6A9\uD574\uBD24\uB358 \uACBD\uD5D8\uB355\uBD84\uC778\uC9C0 \uC2EC\uAC01\uD560\uC815\uB3C4\uB85C \uC5B4\uB835\uB2E4\uB294 \uB290\uB08C\uC744 \uBC1B\uC9C4 \uC54A\uC558\uB2E4.\\\\\\n\uC2E4\uBB34\uC5D0\uC11C \uC0AC\uC6A9\uD574\uBD24\uB358 \uACBD\uD5D8\uC774 \uC788\uB294 \uBD84\uB4E4\uC740 \uD6E8\uC52C \uC218\uC6D4\uD558\uAC8C \uC2DC\uD5D8\uC744 \uBCFC \uC218 \uC788\uC744\uAC70 \uAC19\uC73C\uBA70, \uC2E4\uBB34 \uACBD\uD5D8\uC774 \uC5C6\uB354\uB77C\uB3C4 \uAC15\uC758\uC640 \uBC31\uC11C \uB4F1\uC744 \uC77D\uC73C\uBA74 \uD574\uBCFC \uB9CC\uD55C \uAC70 \uAC19\uB2E4.\\n\\n- Udemy \uAC15\uC758: [https://www.udemy.com/aws-certified-solutions-architect-associate/](https://www.udemy.com/aws-certified-solutions-architect-associate/)\\n- \uBE44\uACF5\uC2DD AWS \uACF5\uC778 \uC194\uB8E8\uC158\uC2A4 \uC544\uD0A4\uD14D\uD2B8 \u2013 \uC5B4\uC18C\uC2DC\uC5D0\uC774\uD2B8 \uC2DC\uD5D8 \uAC00\uC774\uB4DC[: https://github.com/serithemage/AWSCertifiedSolutionsArchitectUnofficialStudyGuide](https://github.com/serithemage/AWSCertifiedSolutionsArchitectUnofficialStudyGuide)\\n- SAA \uC2DC\uD5D8 \uC548\uB0B4\uC11C: [https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate\\\\_Exam%20Guide\\\\_v1.5b\\\\_FINALKO.pdf](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate_Exam%20Guide_v1.5b_FINALKO.pdf)\\n- SAA \uC5F0\uC2B5 \uBB38\uD56D: [https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS\\\\_Certified\\\\_Solutions%20Architect\\\\_Associate\\\\_Feb\\\\_2018\\\\_Sample%20Questions\\\\_v1.0.pdf](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS_Certified_Solutions%20Architect_Associate_Feb_2018_Sample%20Questions_v1.0.pdf)\\n\\n## **\uC2DC\uD5D8 \uB4F1\uB85D**\\n\\
1nAWS \uAD50\uC721 \uBC0F \uB4F1\uB85D \uC0AC\uC774\uD2B8 \uC790\uACA9\uC99D \uBA54\uB274\uC5D0\uC11C \uD68C\uC6D0\uAC00\uC785 \uD6C4 \uB85C\uADF8\uC778\uC744 \uD558\uC5EC \uC2DC\uD5D8\uC744 \uC2E0\uCCAD\uD560 \uC218 \uC788\uB2E4. SAA 2018\uB144 2\uC6D4 \uAC1C\uC815 \uC2DC\uD5D8\uC5D0\uB294 \uC601\uC5B4, \uC77C\uBCF8\uC5B4\uB9CC \uC9C0\uC6D0\uD558\uACE0 \uC788\uB2E4\\\\\\n\uC2DC\uD5D8\uC7A5\uC740 \uAC15\uB0A8, \uC591\uC7AC, \uC885\uB85C \uB4F1 \uC5EC\uB7EC \uAD70\uB370 \uC788\uB294\uB370, \uADF8\uC911 \uB09C \uC885\uB85C\uC5D0\uC11C \uC2DC\uD5D8\uC744 \uBD24\uB2E4.\\n\\n![AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30](./image-2.webp)\\n\\n## **\uC2DC\uD5D8 \uACB0\uACFC**\\n\\n\uC2DC\uD5D8\uC740 \uCD1D 120\uBD84\uC774\uBA70, \uC2DC\uD5D8\uC774 \uB05D\uB098\uACE0 \uC81C\uCD9C\uC744 \uB204\uB974\uBA74 \uBC14\uB85C \uD569\uACA9 \uC5EC\uBD80\uAC00 \uB098\uC624\uACE0, 5\uC77C \uC774\uB0B4\uB85C \uBA54\uC77C\uB85C \uBC43\uC9C0\uC640 \uC2DC\uD5D8 \uACB0\uACFC\uB97C \uB2E4\uC2DC \uBCF4\uB0B4\uC900\uB2E4\uACE0 \uD558\uB294\uB370, \uB098\uB294 \uADF8\uB0A0 \uC0C8\uBCBD\uC5D0 \uBA54\uC77C\uC744 \uBC1B\uC558\uC5C8\uB2E4.\\\\\\n\uC870\uB9CC\uAC04 AWS Developer Associate\uB3C4 \uC900\uBE44\uD574\uC11C \uC2DC\uD5D8\uC744 \uBCFC \uC608\uC815\uC774\uACE0, SAP (Solution Architect Professional)\uB3C4 \uB3C4\uC804\uD574\uBCFC \uACC4\uD68D\uC774\uB2E4"},{"id":"nodejs-unit-test","metadata":{"permalink":"/blog/nodejs-unit-test","source":"@site/blog/2018-05-04-nodejs-unit-test/index.md","title":"\uC720\uB2DB \uD14C\uC2A4\uD2B8","description":"\uD68C\uC0AC\uC5D0\uC11C \uC4F0\uB294 \uD14C\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uACF5\uBD80\uD574\uBD05\uC2DC\uB2E4","date":"2018-05-04T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":1.21,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"\uC720\uB2DB \uD14C\uC2A4\uD2B8","slug":"nodejs-unit-test","date":"2018-05-04T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"\uD68C\uC0AC\uC5D0\uC11C \uC4F0\uB294 \uD14C\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uACF5\uBD80\uD574\uBD05\uC2DC\uB2E4"},"unlisted":false,"prevItem":{"title":"AWS SAA \uC790\uACA9\uC99D \uD6C4\uAE30","permalink":"/blog/aws-saa-review"},"nextItem":{"title":"gh-pages \uBC30\uD3EC\uD558\uAE30","permalink":"/blog/vue-gh-pages-deploy"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uB2E8\uC704 \uD14C\uC2A4\uD2B8\\n\\n\uD68C\uC0AC\uC5D0\uC11C \uC4F0\uB294 \uD14C\uC2A4\uD2B8\uC5D0 \uB300\uD574 \uACF5\uBD80\uD574\uBD05\uC2DC\uB2E4\\n\\n### \uC0AC\uC6A9\uD558\uB294 \uB77C\uC774\uBE0C\uB7EC\uB9AC\\n\\n- mocha: \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uD14C\uC2A4\uD2B8 \uD504\uB808\uC784\uC6CC\uD06C\\n- should: BDD \uC2A4\uD0C0\uC77C\uC758 \uBE44\uAD50 \uB77C\uC774\uBE0C\uB7EC\uB9AC\\n- sinon: Mock \uB77C\uC774\uBE0C\uB7EC\uB9AC\\n\\n### \uC6A9\uC5B4 \uC815\uB9AC\\n\\n- \uD14C\uC2A4\uD2B8 \uB354\uBE14 (Test Double): \uD14C\uC2A4\uD2B8\uD558\uAE30 \uC5B4\uB824\uC6B4 \uACBD\uC6B0 \uC774\uB97C \uB300\uC2E0\uD574 \uD14C\uC2A4\uD2B8\uB97C \uC9C4\uD589\uD560 \uC218 \uC788\uB3C4\uB85D \uB9CC\uB4E4\uC5B4\uC8FC\uB290 \uAC1D\uCCB4\uB97C \uC758\uBBF8\uD55C\uB2E4.\\n- \uB354\uBE44 \uAC1D\uCCB4 (Dummy Object): \uB2E8\uC21C\uD788 \uC778\uC2A4\uD134\uC2A4\uD654 \uB41C \uAC1D\uCCB4\uAC00 \uD544\uC694\uD560 \uB54C \uC0AC\uC6A9\uD558\uBA70, \uAC1D\uCCB4\uC758 \uAE30\uB2A5\uC774 \uD544\uC694\uD55C \uACBD\uC6B0 \uB2E4\uB978 \uD14C\uC2A4\uD2B8 \uAC1D\uCCB4\uB97C \uC0DD\uC131\uD574\uC57C\uB41C\uB2E4.\\n- \uD14C\uC2A4\uD2B8 \uC2A4\uD141 (Test Stub): \uB354\uBE44 \uAC1D\uCCB4\uBCF4\uB2E4 \uC880 \uB354 \uAD6C\uD604\uD654\uB41C \uAC1D\uCCB4\uC774\uBA70, \uC0C1\uD0DC\uAC80\uC99D\uC744 \uD560 \uB54C \uC0AC\uC6A9\uD55C\uB2E4. \uD2B9\uC815\\n- \uC0C1\uD0DC\uB97C \uC815\uC758\uD574\uB193\uACE0 \uC0AC\uC6A9\uD558\uAE30 \uB584\uBB38\uC5D0 \uAC12\uC758 \uBCC0\uACBD\uC740 \uD14C\uC2A4\uD2B8 \uD560 \uC218 \uC5C6\uB2E4.\\n- \uD398\uC774\uD06C \uAC1D\uCCB4 (Fake Object): \uC5EC\uB7EC\uAC1C\uC758 \uC778\uC2A4\uD134\uC2A4\uB97C \uB300\uD45C\uD558\uAC70\uB098 \uC880 \uB354 \uBCF5\uC7A1\uD55C \uAD6C\uD604\uC774 \uB4E4\uC5B4\uAC00\uC788\uB294 \uACBD\uC6B0 \uC0AC\uC6A9\uD55C\uB2E4.\\n- \uD14C\uC2A4\uD2B8 \uC2A4\uD30C\uC774 (Test Spy): \uD14C\uC2A4\uD2B8\uC5D0 \uD544\uC694\uD55C \uAC1D\uCCB4\uC5D0 \uB300\uD574\uC11C \uD2B9\uC815 \uAC1C\uCCB4\uAC00 \uC81C\uB300\uB85C \uD638\uCD9C\uB418\uC5C8\uB294\uC9C0, \uBA87\uBC88 \uD638\uCD9C\uB418\uC5C8\uB294\uC9C0 \uB4F1\uC744 \uAC10\uC2DC\uD558\uACE0 \uC788\uB2E4\uAC00 \uD2B9\uBCC4\uD55C \uD638\uCD9C\uC774 \uB4E4\uC5B4\uC62C\uACBD\uC6B0 \uC815\uBCF4\uB97C \uC804\uB2EC\uD574\uC900\uB2E4. \uC77C\uBC18\uC801\uC73C\uB85C \uD14C\uC2A4\uD2B8 \uC2A4\uD30C\uC774\uB97C \uC798 \uC0AC\uC6A9\uD558\uB294 \uACBD\uC6B0\uB294 \uC5C6\uB2E4. (Mock \uAC1D\uCCB4\uAC00 \uB354 \uD3B8\uB9AC\uD558\uAE30 \uB584\uBB38\uC774\uB2E4)\\n- Mock \uAC1D\uCCB4 (Mock Object): \uD
1589\uC704 \uAC80\uC99D\uC744 \uD560 \uB54C \uC0AC\uC6A9\uD558\uB294 \uAC1D\uCCB4\uC774\uBA70, \uD14C\uC2A4\uD2B8 \uB354\uBE14\uC758 \uD558\uC704 \uAC1D\uCCB4\uB85C\uC758 \uC881\uC740 \uC758\uBBF8\uC640 \uD14C\uC2A4\uD2B8 \uB354\uBE14\uC744 \uD3EC\uD568\uD55C \uB113\uC740 \uC758\uBBF8 2\uAC00\uC9C0\uB85C \uC0AC\uC6A9\uB41C\uB2E4. \uD589\uC704 \uAC80\uC99D\uC740 \uBCF5\uC7A1\uB3C4\uAC00 \uB192\uAC70\uB098 \uC815\uD655\uD558\uAC8C \uC791\uC131\uD558\uAE30 \uC5B4\uB835\uAE30 \uB54C\uBB38\uC5D0 \uC0C1\uD0DC\uAC80\uC99D\uC73C\uB85C \uB300\uCCB4\uAC00 \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uD589\uC704 \uAC80\uC99D \uD14C\uC2A4\uD2B8 \uCF54\uB4DC\uB294 \uC791\uC131\uD558\uC9C0 \uC54A\uB294\uB2E4.\\n\\n### mocha\\n\\n`Runner` \uB97C \uD3EC\uD568\uD558\uACE0 \uC788\uB294 \uD14C\uC2A4\uD2B8 \uD504\uB808\uC784\uC6CC\uD06C\uB85C \uC0AC\uC6A9\uC790\uAC00 \uAC00\uC7A5 \uB9CE\uC740 \uD14C\uC2A4\uD2B8 \uD504\uB808\uC784\uC6CC\uD06C\uC774\uB2E4.\\n\\n`mocah` \uC790\uCCB4\uB294 `assertion` \uC744 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uAE30 \uB54C\uBB38\uC5D0 \uBCC4\uB3C4\uC758 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uAC00 \uD544\uC694\uD558\uB2E4. Node.js \uC5D0\uC11C \uAE30\uBCF8\uC801\uC73C\uB85C \uC9C0\uC6D0\uD558\uB294 `assert` \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uC73C\uBA70 \uCD5C\uADFC\uC5D0\uB294 `chai`, `should` \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uACFC \uD568\uAED8 \uC0AC\uC6A9\uD55C\uB2E4\uACE0 \uD55C\uB2E4.\\n\\n- package.json \uC2A4\uD06C\uB9BD\uD2B8\uC5D0 \uB123\uC5B4\uB450\uBA74 \uD3B8\uB9AC\uD558\uB2E4 (\uD544\uC218\uB294 \uC544\uB2D8)\\n\\n```bash\\n$ yarn add global mocha\\n$ vim package.json\\n\\"scripts\\": {\\n  \\"test\\": \\"mocha $(find ./ -name \'*.spec.js\') --recursive -w\\"\\n},\\n```\\n\\n```js\\ndescribe(\'calc.js \uD14C\uC2A4\uD2B8\', () => {\\n    describe(\'sum \uD568\uC218 \uD14C\uC2A4\uD2B8\', () => {\\n        it(\'1\uACFC 2\uB97C \uB9E4\uAC1C\uBCC0\uC218\uB85C \uC804\uB2EC\uD558\uBA74 3\uC774 \uBC18\uD658\uB41C\uB2E4\', () => {\\n            const result = sum(1, 2)\\n            assert.equal(result, 3);\\n        })\\n    })\\n})\\n```\\n\\n### should\\n\\nshould.js \uB294 \uB3C5\uCC3D\uC131\uC788\uACE0 \uAC00\uB3C5\uC131\uC774 \uC88B\uC73C\uBA70 \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uC758\uC874\uC801\uC774\uC9C0 \uC54A\uC740 BDD \uC2A4\uD0C0\uC77C\uC758 Assertion \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC774\uB2E4. Node.js\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 `assert` \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uD655\uC7A5\uD574 \uB9CC\uB4E0 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC774\uAE30 \uB584\uBB38\uC5D0 \uAE30\uC874 assert \uBAA8\uB4C8\uACFC \uB3D9\uC77C\uD558\uAC8C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4.\\n\\n```bash\\n$ yarn add should\\n```\\n\\n```js\\nconst should = require(\'should\')\\nconst a = 1\\n\\nshould.strictEqual(a, 1) // true\\na.should.equal(1) // true\\n```\\n\\n- assertion\uC774 \uC2E4\uD328\uD588\uC744 \uACBD\uC6B0 \uC880 \uB354 \uC815\uD655\uD558\uAC8C \uB0B4\uC6A9\uC744 \uC804\uB2EC\uD574\uC8FC\uAE30 \uCD94\uAC00\uC801\uC778 \uC124\uBA85\uC744 \uC801\uC744 \uC218 \uC788\uB2E4.\\n\\n```js\\n> const a = 1\\n> a.should.equal(2, \'\uB0B4\uAC00 \uC65C \uC2E4\uD328\uD588\uB294\uC9C0 \uBAA8\uB974\uACA0\uB124\uC694..\')\\nAssertionError: \uB0B4\uAC00 \uC65C \uC2E4\uD328\uD588\uB294\uC9C0 \uBAA8\uB974\uACA0\uB124\uC694..\\n```\\n\\n### \uC8FC\uC758\uC0AC\uD56D\\n\\n- Mock \uD504\uB808\uC784\uC6CC\uD06C\uAC00 \uC2E4\uC81C\uB85C \uD544\uC694\uD55C\uC9C0 \uAC80\uD1A0\uD574\uBCF4\uACE0, \uD544\uC694\uD558\uB2E4\uBA74 \uC758\uC874\uC131\uC774 \uC801\uC740 \uAD6C\uC870\uB85C \uD504\uB85C\uADF8\uB798\uBC0D \uD55C\uB2E4.\\n- Mock \uAC1D\uCCB4\uB294 \uC2E4\uC81C \uAC1D\uCCB4\uB97C \uB300\uC2E0\uD558\uC5EC \uD749\uB0B4\uB0B8 \uAC1D\uCCB4\uC77C\uBFD0 \uC2E4\uC81C\uB85C \uB3D9\uC791\uD558\uC9C0 \uC54A\uC744 \uAC00\uB2A5\uC131\uC774 \uC788\uB2E4."},{"id":"vue-gh-pages-deploy","metadata":{"permalink":"/blog/vue-gh-pages-deploy","source":"@site/blog/2018-03-28-vue-gh-pages-deploy/index.md","title":"gh-pages \uBC30\uD3EC\uD558\uAE30","description":"vue-cli \uB85C \uAC1C\uBC1C\uB41C \uD504\uB85C\uC81D\uD2B8\uB97C github pages \uBC30\uD3EC\uD558\uB294 \uBC29\uBC95 \uC815\uB9AC","date":"2018-03-28T00:00:00.000Z","tags":[{"inline":false,"label":"Vue.js","permalink":"/blog/tags/vuejs"}],"readingTime":0.21,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"gh-pages \uBC30\uD3EC\uD558\uAE30","slug":"vue-gh-pages-deploy","date":"2018-03-28T00:00:00.000Z","authors":["dongmyeong"],"tags":["vuejs"],"description":"vue-cli \uB85C \uAC1C\uBC1C\uB41C \uD504\uB85C\uC81D\uD2B8\uB97C github pages \uBC30\uD3EC\uD558\uB294 \uBC29\uBC95 \uC815\uB9AC"},"unlisted":false,"prevItem":{"title":"\uC720\uB2DB \uD14C\uC2A4\uD2B8","permalink":"/blog/nodejs-unit-test"},"nextItem":{"title":"Git \uC6D0\uACA9 \uC800\uC7A5\uC18C \uBE0C\uB79C\uCE58 \uBD88\uB7EC\uC624\uAE30","permalink":"/blog/git-fetch-remote-branch"}},"content":"\x3c!-- truncate --\x3e\\n\\n## gh-pages \uBC30\uD3EC\uD558\uAE30\\n\\nvue-cli \uB85C \uAC1C\uBC1C\uB41C \uD504\uB85C\uC81D\uD2B8\uB97C github pages \uBC30\uD3EC\uD558\uB294 \uBC29\uBC95 \uC815\uB9AC\\n\\
1n- config/index.js\\n  - assetsPublicPath \uC218\uC815\\n  - \uC18C\uC2A4\uB9F5\uC744 \uB044\uB824\uBA74 productionSourceMap \uB97C false \uB85C \uBCC0\uACBD\\n\\n  ```js\\n  build: {\\n  \\tassetsSubDirectory: \'static\',\\n  \\tassetsPublicPath: \'/portfolio/\',\\n  \\tproductionSourceMap: false,\\n  }\\n  ```\\n- src/router.index.js\\n  - \uC544\uB798\uC758 \uCF54\uB4DC\uB97C \uCD94\uAC00\\n\\n  ```js\\n  export default new Router({base: \'/portfolio\'})\\n  ```\\n- package.json\\n  - \uC2A4\uD06C\uB9BD\uD2B8 \uCD94\uAC00\\n\\n  ```json\\n  \\"scripts\\": {\\"deploy\\": \\"gh-pages -d dist/\\"}\\n  ```\\n- `yarn build` \uD6C4 `yarn deploy` \uB97C \uD558\uBA74 \uBC30\uD3EC\uAC00 \uB41C\uB2E4."},{"id":"git-fetch-remote-branch","metadata":{"permalink":"/blog/git-fetch-remote-branch","source":"@site/blog/2018-03-06-git-fetch-remote-branch/index.md","title":"Git \uC6D0\uACA9 \uC800\uC7A5\uC18C \uBE0C\uB79C\uCE58 \uBD88\uB7EC\uC624\uAE30","description":"","date":"2018-03-06T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.12,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Git \uC6D0\uACA9 \uC800\uC7A5\uC18C \uBE0C\uB79C\uCE58 \uBD88\uB7EC\uC624\uAE30","slug":"git-fetch-remote-branch","date":"2018-03-06T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":""},"unlisted":false,"prevItem":{"title":"gh-pages \uBC30\uD3EC\uD558\uAE30","permalink":"/blog/vue-gh-pages-deploy"},"nextItem":{"title":"MySQL CheatSheet","permalink":"/blog/mysql-cheatsheet"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uC6D0\uACA9 \uC800\uC7A5\uC18C \uBE0C\uB79C\uCE58 \uBD88\uB7EC\uC624\uAE30\\n\\n```bash\\n# \uC6D0\uACA9 \uBE0C\uB79C\uCE58 \uBCF4\uAE30\\n$ git branch -r\\n\\n# \uBAA8\uB4E0 \uBE0C\uB79C\uCE58 \uBCF4\uAE30\\n$ git branch -a\\n\\n# \uC6D0\uACA9 \uBE0C\uB79C\uCE58\uB85C \uCCB4\uD06C\uC544\uC6C3\\n$ git checkout -b <\uBE0C\uB79C\uCE58\uBA85> <\uC6D0\uACA9 \uBE0C\uB79C\uCE58\uBA85>\\n\\n# \uC6D0\uACA9 \uBE0C\uB79C\uCE58\uBA85\uC744 \uADF8\uB300\uB85C \uC0AC\uC6A9\uD574 \uCCB4\uD06C\uC544\uC6C3\\n$ git checkout -t <\uC6D0\uACA9 \uBE0C\uB79C\uCE58\uBA85>\\n```"},{"id":"mysql-cheatsheet","metadata":{"permalink":"/blog/mysql-cheatsheet","source":"@site/blog/2017-10-31-mysql-cheatsheet/index.md","title":"MySQL CheatSheet","description":"","date":"2017-10-31T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130\uBCA0\uC774\uC2A4","permalink":"/blog/tags/database"}],"readingTime":0.62,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"MySQL CheatSheet","slug":"mysql-cheatsheet","date":"2017-10-31T00:00:00.000Z","authors":["dongmyeong"],"tags":["database"],"description":""},"unlisted":false,"prevItem":{"title":"Git \uC6D0\uACA9 \uC800\uC7A5\uC18C \uBE0C\uB79C\uCE58 \uBD88\uB7EC\uC624\uAE30","permalink":"/blog/git-fetch-remote-branch"},"nextItem":{"title":"Martini","permalink":"/blog/go-martini"}},"content":"\x3c!-- truncate --\x3e\\n\\n## CheatSheet\\n\\n```sql\\n# \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC0DD\uC131\\nCREATE DATABASE TEST1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\\n\\n# \uC0AC\uC6A9\uC790 \uC0DD\uC131\\nCREATE USER TEST1;\\n\\n# \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uB300\uD55C \uBAA8\uB4E0 \uAD8C\uD55C \uBD80\uC5EC\\nGRANT ALL PRIVILEGES ON TEST1.* TO \'TEST1\'@\'localhost\' IDENTIFIED BY \'TEST1\';\\n\\n# \uD14C\uC774\uBE14 \uC0DD\uC131\\nCREATE TABLE `test_table` (\\n  `client_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\\n  `datetime` datetime NOT NULL,\\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci\\nPARTITION BY RANGE(TO_DAYS(`datetime`)) (\\n    PARTITION P20171018 VALUES LESS THAN (TO_DAYS(\'2017-10-19\')),\\n    PARTITION P_MAX VALUES LESS THAN (MAXVALUE)\\n);\\n\\n# \uD30C\uD2F0\uC158 \uBD84\uD560\\nALTER TABLE `test_table` REORGANIZE PARTITION P_MAX INTO (\\n    PARTITION P20171025 VALUES LESS THAN (TO_DAYS(\'2017-10-26\')),\\n    PARTITION P_MAX VALUES LESS THAN (MAXVALUE)\\n);\\n\\n# \uD30C\uD2F0\uC158 \uC0AD\uC81C\\nALTER TABLE test_table DROP PARTITION P20171019\\n\\n# \uAE30\uBCF8 \uD14C\uC774\uBE14\uC5D0 \uD30C\uD2F0\uC158 \uC801\uC6A9\\nALTER TABLE `test_table` PARTITION BY RANGE(TO_DAYS(`datetime`)) (\\n    PARTITION P20171025 VALUES LESS THAN (TO_DAYS(\'2017-10-26\')),\\n    PARTITION P_MAX VALUES LESS THAN (MAXVALUE)\\n);\\n\\n# \uD30C\uD2F0\uC158 \uC870\uD68C\\nSELECT PARTITION_ORDINAL_POSITION, PARTITION_NAME, TABLE_ROWS, PARTITION_METHOD \\nFROM information_schema.PARTITIONS\\nWHERE TABLE_SCHEMA = \'TEST1\' AND TABLE_NAME 
1= \'test_table\';\\n\\n# \uC778\uB371\uC2A4 \uCD94\uAC00\\nCREATE INDEX test_table_datetime_ix ON test_table(`datetime`);\\n\\nALTER TABLE test_table ADD INDEX test_table_datetime_ix (`datetime`);\\n\\n# \uC778\uB371\uC2A4 \uD655\uC778\\nSHOW INDEX FROM test_table;\\n\\n# \uD14C\uC774\uBE14 \uC778\uCF54\uB529 \uC124\uC815\\nALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\\n```"},{"id":"go-martini","metadata":{"permalink":"/blog/go-martini","source":"@site/blog/2017-10-02-go-martini/index.md","title":"Martini","description":"","date":"2017-10-02T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":0.27,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Martini","slug":"go-martini","date":"2017-10-02T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":""},"unlisted":false,"prevItem":{"title":"MySQL CheatSheet","permalink":"/blog/mysql-cheatsheet"},"nextItem":{"title":"Go Tour-2","permalink":"/blog/go-tour-2"}},"content":"\x3c!-- truncate --\x3e\\n\\n## go-martini\\n\\n### Getting Started\\n\\n```bash\\n$ go get github.com/go-martini/martini\\n```\\n\\n```go\\npackage main\\n\\nimport (\\n    \\"fmt\\"\\n    \\"github.com/go-martini/martini\\"\\n)\\n\\nfunc main() {\\n    m := martini.Classic()\\n    m.Get(\\"/\\", func() string {\\n        return \\"Hello world!\\"\\n    })\\n    m.Group(\\"/api\\", func(r martini.Router) {\\n        r.Get(\\"/projects\\", GetProjects)\\n        r.Post(\\"/projects\\", CreateProject)\\n        r.Get(\\"/projects/(?P<id>[0-9]+)\\", GetProject)\\n        r.Delete(\\"/projects/(?P<id>[0-9]+)\\", DeleteProject)\\n        r.Put(\\"/projects/(?P<id>[0-9]+)/archive\\", ArchiveProject)\\n        r.Put(\\"/projects/(?P<id>[0-9]+)/restore\\", RestoreProject)\\n    })\\n    addr := fmt.Sprintf(\\"%s:%d\\", \\"127.0.0.1\\", 8080)\\n    m.RunOnAddr(addr)\\n}\\n```"},{"id":"go-tour-2","metadata":{"permalink":"/blog/go-tour-2","source":"@site/blog/2017-09-13-go-tour-2/index.md","title":"Go Tour-2","description":"\uC2AC\uB77C\uC774\uC2A4\uB294 \uBC30\uC5F4\uC758 \uAC12\uC744 \uAC00\uB974\uD0A4\uBA70, []T \uB85C \uB9CC\uB4E4 \uC218 \uC788\uB2E4.","date":"2017-09-13T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":2.58,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Go Tour-2","slug":"go-tour-2","date":"2017-09-13T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"\uC2AC\uB77C\uC774\uC2A4\uB294 \uBC30\uC5F4\uC758 \uAC12\uC744 \uAC00\uB974\uD0A4\uBA70, []T \uB85C \uB9CC\uB4E4 \uC218 \uC788\uB2E4."},"unlisted":false,"prevItem":{"title":"Martini","permalink":"/blog/go-martini"},"nextItem":{"title":"Go Tour-1","permalink":"/blog/go-tour-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Go Tour\\n\\n### \uC2AC\uB77C\uC774\uC2A4\\n\\n- \uC2AC\uB77C\uC774\uC2A4\uB294 \uBC30\uC5F4\uC758 \uAC12\uC744 \uAC00\uB974\uD0A4\uBA70, `[]T` \uB85C \uB9CC\uB4E4 \uC218 \uC788\uB2E4.\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    p := []int{1,2,3,4,5}\\n    fmt.Println(p)\\n\\n    fmt.Println(\\"p[0:3] == \\", p[0:3])\\n    fmt.Println(\\"p[:3] == \\", p[:3])\\n    fmt.Println(\\"p[2:] == \\",p[2:])\\n}\\n```\\n\\n- `make` \uD568\uC218\uB85C \uC2AC\uB77C\uC774\uC2A4\uB97C \uB9CC\uB4E4 \uC218 \uC788\uB2E4.\\n- `len` \uB294 \uC2AC\uB77C\uC774\uC2A4 \uAE38\uC774, `cap` \uB294 \uC2AC\uB77C\uC774\uC2A4\uC5D0 \uC800\uC7A5 \uAC00\uB2A5\uD55C \uCD5C\uB300 \uAE38\uC774\uB97C \uBC18\uD658\uD55C\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    p := make([]int, 5) // len = 5, cap = 5\\n    fmt.Println(\\"p == \\", p)\\n    fmt.Println(\\"len(p) == \\", len(p))\\n    fmt.Println(\\"cap(p) == \\", cap(p))\\n\\n    q := make([]int, 0, 5) // len = 0, cap = 5\\n    fmt.Println(\\"q == \\", q)\\n    fmt.Println(\\"q[:cap(q)] == \\", q[:cap(q)])\\n    fmt.Println(\\"q[1:] == \\", q[1:])\\n\\n    var z []int // len = 0, cap = 0\\n    fmt.Println(\\"z == \\", z)\\n    fmt.Println(\\"len(z) == \\", len(z))\\n    fmt.Println(\\"cap(z) == \\", cap(z))\\n}\\n```\\n\\n- for \uBB38\uC5D0\uC11C `range` \uD568\uC218\uB97C \uD1B5\uD574 \uC2AC\uB77C\uC774\uC2A4\uB098 \uB9F5\uC744 \uC774\uD130\uB808\uC774\uD2B8 \uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    p := []int {2,4,6,8,10,12}\\n    for i, v := range p {\\n        fmt.Println(\\"index == \\", i)\\n        fmt.Println(\\"value == \\", value)\\n    }\\n\\n    for i := range p {\\n        fmt.Println(\\"index == \\", i)\\n    }\\n\\n    for _, v := range p {\\n        fmt.Println(\\"value == \\", v)\\n    }\\n}
1\\n```\\n\\n### \uB9F5(Map)\\n\\n- `Map` \uC740 \uD0A4\uB97C \uC9C0\uC815\uD558\uC5EC `\uD0A4:\uBCA8\uB958` \uD615\uD0DC\uB85C \uC800\uC7A5\uD560 \uC218 \uC788\uB2E4\\n- \uB9F5\uC740 \uC0AC\uC6A9\uD558\uAE30\uC804\uC5D0 \uBC18\uB4DC\uC2DC `make` \uB97C \uBA85\uC2DC\uD574\uC918\uC57C\uD55C\uB2E4.\\n\\n```go\\ntype Vertax struct {\\n    Lat float64\\n    Lng float64\\n}\\n\\nvar m map[string]Vertax\\n\\nfunc main () {\\n    m = make(map[string]Vertax)\\n    m[\\"Seoul\\"] = Vertax {37.541, 126.986}\\n    fmt.Println(\\"m == \\", m)\\n    fmt.Println(\\"m[\'Seoul\'] == \\", m[\\"Seoul\\"])\\n}\\n```\\n\\n- \uB9CC\uC57D \uB9F5\uC5D0 \uD0A4\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC744 \uACBD\uC6B0, \uD0C0\uC785\uC5D0 \uB9DE\uB294 `zero value` \uAC00 \uB41C\uB2E4\\n- `delete(map, key)` \uB85C \uC0AD\uC81C\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\ntype Vertax struct {\\n    Lat float64\\n    Lng float64\\n}\\n\\nvar m = map[string]Vertax {\\n    \\"Seoul\\": {\\n        37.541, 126.986,\\n    },\\n    \\"Busan\\": {\\n        35.06, 129.0203,\\n    },\\n}\\n\\nfunc main () {\\n    fmt.Println(m)\\n    \\n    fmt.Println(m[\\"Seoul\\"])\\n    m[\\"Seoul\\"] = Vertax{37.33, 126.5815}\\n    fmt.Println(m[\\"Seoul\\"])\\n\\n    delete(m, \\"Seoul\\")\\n    fmt.Println(m)\\n\\n    v, ok := m[\\"Seoul\\"]\\n    fmt.Println(ok)\\n    fmt.Println(v)\\n}\\n```\\n\\n### \uD568\uC218\\n\\n- \uD568\uC218\uB3C4 \uAC12\uC774\uAE30 \uB54C\uBB38\uC5D0 \uBCC0\uC218\uB85C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    hap := func(x int, y int) 
1int {\\n        return x + y\\n    }\\n    fmt.Println(hap(1,2))\\n}\\n```\\n\\n- \uD074\uB85C\uC800\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc adder () func(int) int {\\n    sum := 0\\n    return func(x int) int {\\n        sum += x\\n        return sum\\n    }\\n}\\n\\nfunc main () {\\n    a, b := adder(), adder()\\n    for i := 0; i < 10; i++ {\\n        fmt.Println(\\n            a(i + 1),\\n            b(i * 2),\\n        )\\n    }\\n}\\n```\\n\\n- A Tour of Go 44\\n\\n```go\\nimport \\"fmt\\"\\n\\n// fibonacci is a function that returns\\n// a function that returns an int.\\nfunc fibonacci() func() int {\\n    i, j := 0, 1\\n    return func () int {\\n        sum := i\\n        i, j = j, i + j\\n        return sum\\n    }\\n}\\n\\nfunc main() {\\n    f := fibonacci()\\n    for i := 0; i < 10; i++ {\\n        fmt.Println(f())\\n    }\\n}\\n```\\n\\n### \uC2A4\uC704\uCE58\\n\\n- \uB2E4\uB978 \uC5B8\uC5B4\uC640 `Switch` \uC640 \uB3D9\uC77C\uD55C \uAE30\uB2A5\uC744 \uD558\uC9C0\uB9CC, case\uBB38\uC758 \uCF54\uB4DC \uC2E4\uD589\uC774 \uB05D\uB098\uBA74 \uC790\uB3D9\uC73C\uB85C break \uD558\uB294\uAC8C \uB2E4\uB974\uB2E4\\n- \uC2A4\uC704\uCE58\uB294 \uC704\uC5D0\uC11C\uBD80\uD130 \uC544\uB798\uB85C \uCF00\uC774\uC2A4\uB97C \uCC3E\uB294\uB2E4\\n- \uC2A4\uC704\uCE58\uC5D0\uC11C \uC870\uAC74\uC744 \uC0DD\uB7B5\uD558\uBA74 `switch true` \uC640 \uB3D9\uC77C\uD55C \uC218\uD589\uC744 \uD55C\uB2E4\\n  - `if-then-else` \uAC00 \uAE38\uC5B4\uC9C8 \uACBD\uC6B0, \uC774 \uBC29\uBC95\uC744 \uC0AC\uC6A9\uD558\uBA74 \uCF54\uB4DC\uAC00 \uAE54\uB054\uD574\uC9C8 \uC218 \uC788\uB2E4\\n\\n```go\\nimport (\\n    \\"fmt\\"\\n    \\"runtime\\"\\n)\\n\\nfunc main () {\\n    switch os := runtime.GOOS; os {\\n        case \\"darwin\\":\\n            fmt.Println(\\"Mac OS\\")\\n        case \\"linux\\":\\n            fmt.Println(\\"linux\\")\\n        default:\\n            fmt.Println(os)\\n    }\\n}\\n```\\n\\n### \uBA54\uC18C\uB4DC\\n\\n- \uACE0\uC5D0\uB294 \uD074\uB798\uC2A4\uAC00 \uC5C6\uC9C0\uB9CC, \uBA54\uC18C\uB4DC\uB97C \uAD6C\uC870\uCCB4\uC5D0 \uBD99\uD600\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n- \uAD6C\uC870\uCCB4 \uBFD0\uB9CC \uC544\uB2C8\uB77C \uC5B4\uB5A0\uD55C \uD0C0\uC785\uC5D0\uB3C4 \uBA54\uC18C\uB4DC\uB97C \uBD99\uD790 \uC218 \uC788\uB2E4\\n  - \uB2E4\uB978 \uD328\uD0A4\uC9C0\uC5D0 \uC788\uB294 \uD0C0\uC785\uC774\uB098 \uAE30\uBCF8 \uD0C0\uC785\uC5D0\uB294 \uBD99\uD790 \uC218 \uC5C6\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\ntype Vertax struct {\\n    Lat, Lng float64\\n}\\n\\nfunc (v *Vertax) toString() string {\\n    return fmt.Sprintf(\\"%f / %f\\", v.Lat, v.Lng)\\n}\\n\\nfunc main () {\\n    v := Vertax{23, 25}\\n    fmt.Println(v.toString())\\n}\\n```\\n\\n### \uC778\uD130\uD398\uC774\uC2A4\\n\\n```go\\nimport \\"fmt\\"\\n\\ntype MyInterface interface {\\n    Abs() float64\\n}\\n\\nfunc main () {\\n    var a MyInterface\\n    v := Vertax{10, 15}\\n\\n    a = v\\n    fmt.Println(a.Abs())\\n\\n    a = MyFloat(5)\\n    fmt.Println(a.Abs())\\n}\\n\\ntype MyFloat float64\\nfunc (m MyFloat) Abs() float64 {\\n    if m < 0 {\\n        return float64(-m)\\n    }\\n    return float64(m)\\n}\\n\\ntype Vertax struct {\\n    X, Y float64\\n}\\nfunc (v Vertax) Abs() float64 {\\n    return v.X + v.Y\\n}\\n```\\n\\n### \uC5D0\uB7EC\\n\\n```go\\nimport (\\n    \\"fmt\\"\\n    \\"time\\"\\n)\\n\\ntype CustomError struct {\\n    When time.Time\\n    What string\\n}\\n\\nfunc (e *CustomError) Error() string {\\n    return fmt.Sprintf(\\"at %v, %s\\", e.When, e.What)\\n}\\n\\nfunc run() error {\\n    return &CustomError{time.Now(), \\"Custom Error Test\\"}\\n}\\n\\nfunc main () {\\n    err := run()\\n    if (err != nil) {\\n        fmt.Println(err)\\n    }\\n}\\n```\\n\\n### \uACE0\uB8E8\uD2F4\uACFC \uCC44\uB110\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc fibonacci (n int, c chan int) {\\n    x, y := 0, 1\\n    for i := 0; i < n; i++ {\\n        c <- x\\n        y, x = x, x + y\\n    }\\n    close(c)\\n}\\n\\nfunc main () {\\n    c := make (chan int, 15)\\n    go fibonacci(cap(c), c)\\n    for r := range c {\\n        fmt.Println(r)\\n    }\\n}\\n```\\n\\n- `select` \uB97C \uC774\uC6A9\uD558\uBA74 \uB2E4\uC218\uC758 \uCC44\uB110\uB85C \uBD80\uD130 \uC218\uC2E0\uC744 \uCC44\uB110\uBCC4\uB85C \uB2E4\uB978 \uB3D9\uC791\uC744 \uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc fibonacci (c, q chan int) {\\n    x, y := 0, 1\\n    for {\\n        select {\\n            case c <- x:\\n                x, y = y, x + y\\n            case <- q:\\n                fmt.Println(\\"quit\\")\\n                return\\n        }\\n    }\\n}\\n\\nfunc main () {\\n    c := make(chan int, 10)\\n    q := make(chan int)\\n\\n    go func() {\\n        for i := 0; i < cap(c); i++ {\\n            fmt.Println(<-c)\\n        }\\n        q <- 0\\n    }()\\n    fibonacci(c, q)\\n}\\n```\\n\\n```go\\nimport (\\n    \\"time\\"\\n    \\"fmt\\"\\n)\\n\\nfunc main () {\\n    tick := time.Tick(1000)\\n    boom := time.After(5000)\\n    for {\\n        select {\\n            case <- tick:\\n                fmt.Println(\\"Tick!!\\")\\n            case <- boom:\\n                fmt.Println(\\"Boom!!\\")\\n                return\\n            default:\\n                fmt.Println(\\"...\\")\\n                time.Sleep(500)\\n        }\\n    }\\n}\\n```"},{"id":"go-tour-1","metadata":{"permalink":"/blog/go-tour-1","source":"@site/blog/2017-09-08-go-tour-1/index.md","title":"Go Tour-1","description":"\uACE0\uB7AD(Go Lang)\uC73C\uB85C \uC791\uC131\uB41C \uD504\uB85C\uADF8\uB7A8\uC740 \uBAA8\uB450 \uD328\uD0A4\uC9C0\uB85C \uAD6C\uC131\uB418\uC5B4\uC788\uC73C\uBA70, \uD328\uD0A4\uC9C0\uBA85\uC740 \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C\uC758 \uB9C8\uC9C0\uB9C9\uAEC4 \uC0AC\uC6A9\uD55C\uB2E4.","date":"2017-09-08T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":2,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Go Tour-1","slug":"go-tour-1","date":"2017-09-08T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"\uACE0\uB7AD(Go Lang)\uC73C\uB85C \uC791\uC131\uB41C \uD504\uB85C\uADF8\uB7A8\uC740 \uBAA8\uB450 \uD328\uD0A4\uC9C0\uB85C \uAD6C\uC131\uB418\uC5B4\uC788\uC73C\uBA70, \uD328\uD0A4\uC9C0\uBA85\uC740 \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C\uC758 \uB9C8\uC9C0\uB9C9\uAEC4 \uC0AC\uC6A9\uD55C\uB2E4."},"unlisted":false,"prevItem":{"title":"Go Tour-2","permalink":"/blog/go-tour-2"},"nextItem":{"title":"Go \uC124\uCE58\uD558\uAE30","permalink":"/blog/go-install"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Go Tour\\n\\n### \uD328\uD0A4\uC9C0\\n\\n\uACE0\uB7AD(Go Lang)\uC73C\uB85C \uC791\uC131\uB41C \uD504\uB85C\uADF8\uB7A8\uC740 \uBAA8\uB450 \uD328\uD0A4\uC9C0\uB85C \uAD6C\uC131\uB418\uC5B4\uC788\uC73C\uBA70, \uD328\uD0A4\uC9C0\uBA85\uC740 \uB514\uB809\uD1A0\uB9AC \uACBD\uB85C\uC758 \uB9C8\uC9C0\uB9C9\uAEC4 \uC0AC\uC6A9\uD55C\uB2E4.\\n\\ne.g) `path/filepath` \uC77C \uACBD\uC6B0 \uD328\uD0A4\uC9C0\uBA85\uC740 `filepath` \uC774\uB2E4.\\n\\n### \uD328\uD0A4\uC9C0 \uC784\uD3EC\uD2B8\\n\\n- \uD328\uD0A4\uC9C0 \uC784\uD3EC\uD2B8\uB294 \uC18C\uAD04\uD638\uB85C \uAC10\uAC70\uB098, import \uBB38\uC7A5\uC744 \uC5EC\uB7EC\uBC88 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport (\\n    \\"fmt\\"\\n    \\"math\\"\\n)\\n```\\n\\n```go\\nimport \\"fmt\\"\\nimport \\"math\\"\\n```\\n\\n### \uD328\uD0A4\uC9C0 \uC775\uC2A4\uD3EC\uD2B8\\n\\n- \uD328\uD0A4\uC9C0\uB97C \uC784\uD3EC\uD2B8\uD558\uBA74 \uD328\uD0A4\uC9C0 \uB0B4\uC5D0\uC11C \uC775\uC2A4\uD3EC\uD2B8 \uD55C \uBA54\uC18C\uB4DC, \uC0C1\uC218\uB4F1\uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB2E4.\\n- \uBCC0\uC218\uBA85, \uD568\uC218\uBA85\uC758 \uCCAB\uAE00\uC790\uAC00 \uB300\uBB38\uC790\uB85C \uC2DC\uC791\uD558\uBA74 \uC678\uBD80\uC5D0\uC11C \uC811\uADFC\uC774 \uAC00\uB2A5\uD574\uC9C4\uB2E4.\\n\\n```text\\n- Foo (o)\\n- FOO (o)\\n- foo (x)\\n```\\n\\n### \uD568\uC218\\n\\n- C, C++, Java\uC640 \uB2E4\uB974\uAC8C \uB9E4\uAC1C\uBCC0\uC218\uB97C \uC624\uB978\uCABD\uC5D0 \uBA85\uC2DC\uD574\uC900\uB2E4.\\n  - \uC624\uB978\uCABD\uC5D0 \uBA85\uC2DC\uD558\uB294 \uC774\uC720\uB97C \uAC04\uB2E8\uD788 \uC124\uBA85\uD558\uC790\uBA74, \uCF54\uB4DC\uB97C \uC67C\uCABD\uC5D0\uC11C \uC624\uB978\uCABD\uC73C\uB85C \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uC77D\uAE30 \uC704\uD574\uC11C\uB77C\uACE0 \uD55C\uB2E4. \\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc add(x int, y int) 
1int {\\n    return x + y\\n}\\n\\nfunc main() {\\n    fmt.Println(add(1,2))\\n}\\n```\\n\\n- \uB9E4\uAC1C\uBCC0\uC218\uC758 \uD0C0\uC785\uC774 \uAC19\uC744\uACBD\uC6B0, \uB9C8\uC9C0\uB9C9 \uB9E4\uAC1C\uBCC0\uC218\uC758 \uD0C0\uC785\uB9CC \uBA85\uC2DC\uD558\uACE0 \uB098\uBA38\uC9C0\uB294 \uC0DD\uB7B5\uC774 \uAC00\uB2A5\uD558\uB2E4\\n\\n```go\\nfunc add (x, y int) int {\\n    return x + y\\n}\\n```\\n\\n- \uD568\uC218\uB0B4\uC5D0 \uC5EC\uB7EC\uAC1C\uC758 \uACB0\uACFC\uB97C \uBC18\uD658\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nfunc swap(x, y String) (String, String) {\\n    return y, x\\n}\\n```\\n\\n- \uBC18\uD658\uAC12\uC5D0 \uC774\uB984\uC744 \uBA85\uC2DC\uD574\uB458 \uACBD\uC6B0 \uBCC0\uC218\uCC98\uB7FC \uC0AC\uC6A9\uC774 \uAC00\uB2A5\uD558\uBA70, \uBC18\uD658\uAC12\uC744 \uC9C0\uC815\uD558\uC9C4 `return` \uBB38\uC5D0 \uC790\uB3D9\uC73C\uB85C \uCC98\uB9AC\uB41C\uB2E4\\n\\n```go\\nfunc division (sum int) (result int) {\\n    result = sum / 2\\n    return\\n}\\n```\\n\\n### \uBCC0\uC218\\n\\n- \uBCC0\uC218\uB294 `var` \uD0A4\uC6CC\uB4DC\uB97C \uC0AC\uC6A9\uD55C\uB2E4\\n- \uD568\uC218\uC758 \uB9E4\uAC1C\uBCC0\uC218\uC640 \uAC19\uC774 \uBCC0\uC218\uBA85 \uB4A4\uC5D0 \uD0C0\uC785\uC744 \uBA85\uC2DC\uD55C\uB2E4\\n- \uAC12\uC744 \uCD08\uAE30\uD654 \uD560 \uACBD\uC6B0 \uCD08\uAE30\uD654 \uD55C \uAC12\uC758 \uD0C0\uC785\uC774 \uC790\uB3D9\uC73C\uB85C \uACB0\uC815\uB41C\uB2E4\\n\\n```go\\nvar x, y, z int\\nvar python, java, node = true, false, true\\n```\\n\\n- `\uD568\uC218 \uB0B4\uC5D0\uC11C` \uBCC0\uC218 \uC120\uC5B8\uC744 \uAC04\uB2E8\uD558\uAC8C \uC0AC\uC6A9\uC774 \uAC00\uB2A5\uD558\uB2E4\\n\\n```go\\nfunc main () {\\n    x, y, z := 1, 2, 3\\n}\\n```\\n\\n- \uC0C1\uC218\uB294 `const` \uD0A4\uC6CC\uB4DC\uB97C \uC0AC\uC6A9\uD558\uBA70, (\uBB38\uC790\uC5F4, Bool, \uC22B\uC790) \uD0C0\uC785\uB9CC \uC120\uC5B8\uD560 \uC218 \uC788\uB2E4\\n- \uC784\uD3EC\uD2B8\uCC98\uB7FC \uC18C\uAD04\uD638\uB85C \uBB36\uC5B4\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nconst Pi = 3.14\\n\\nconst (\\n    Big = 1 << 100\\n    Small = Big >> 99\\n)\\n\\nfunc main () {\\n    fmt.Println(Pi)\\n}\\n```\\n\\n### \uBC18\uBCF5\uBB38\\n\\n- Go\uC5D0\uC11C\uB294 \uBC18\uBCF5\uBB38\uC740 `for` \uB9CC \uC0AC\uC6A9\uD55C\uB2E4.\\n- \uC0AC\uC6A9\uBC95\uC740 C, Java \uC640 \uC720\uC0AC\uD558\uBA70, \uC18C\uAD04\uD638\uB294 \uC0DD\uB7B5\uD55C\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    sum := 0\\n    for i := 1; i < 10; i++ {\\n        sum += i\\n    }\\n    fmt.Println(sum)\\n}\\n```\\n\\n- \uC870\uAC74\uBD80\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4 ( While\uBB38 )\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    sum := 0\\n    for sum < 100 {\\n        sum += 5\\n    }\\n    fmt.Println(sum)\\n}\\n```\\n\\n- \uC870\uAC74\uBD80\uB3C4 \uC0DD\uB7B5\uD558\uBA74 \uBB34\uD55C\uB8E8\uD504\uAC00 \uB41C\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc main () {\\n    for {\\n        fmt.Println(\\"\uC73C\uC545! \uBB34\uD55C\uB8E8\uD504\uB2E4\\")\\n    }\\n}\\n```\\n\\n### \uC870\uAC74\uBB38\\n\\n- \uC870\uAC74\uBB38\uC740 C, Java \uC640 \uC720\uC0AC\uD558\uAC8C \uC0AC\uC6A9\uC774 \uAC00\uB2A5\uD558\uBA70, \uBC18\uBCF5\uBB38\uACFC \uB9C8\uCC2C\uAC00\uC9C0\uB85C \uC18C\uAD04\uD638\uB294 \uC0DD\uB7B5\uD55C\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc odd (num int) bool {\\n    if num / 2 == 1 {\\n        return true\\n    } else {\\n        return false\\n    }\\n}\\n\\nfunc main () {\\n    fmt.Println(odd(3))\\n}\\n```\\n\\n- \uC870\uAC74\uBB38 \uC55E\uC5D0 \uBCC0\uC218\uB97C \uC120\uC5B8\uD560 \uC218 \uC788\uC73C\uBA70, \uC5EC\uAE30\uC11C \uC120\uC5B8\uB41C \uBCC0\uC218\uB294 if, else \uBB38 \uB0B4\uC758 \uC2A4\uCF54\uD504\uC5D0\uC11C\uB9CC \uC720\uD6A8\uD558\uB2E4\\n\\n```go\\nimport \\"fmt\\"\\n\\nfunc odd (num int) bool {\\n    if b := num / 2; b == 1 {\\n        return true\\n    }\\n    // Undefined: b\\n    // fmt.Println(b)\\n    return false\\n}\\n\\nfunc main () {\\n    fmt.Println(odd(3))\\n}\\n```\\n\\n### \uD0C0\uC785\\n\\n\uAE30\uBCF8 \uC790\uB8CC\uD615\uC740 \uC544\uB798\uC640 \uAC19\uB2E4\\n\\n- bool\\n- string\\n- int\\n  - int, int8 int16 int32 int64\\n  - uint uint8 uint16 uint32 uint64 uintptr\\n- byte (uint8 alias)\\n- rune (int32 alias)\\n- float\\n  - float32 float64\\n- complex\\n  - complex64 compl128\\n\\n### \uAD6C\uC870\uCCB4\\n\\n`struct` \uD0A4\uC6CC\uB4DC\uB97C \uD1B5\uD574 \uAD6C\uC870\uCCB4\uB97C \uB9CC\uB4E4 \uC218 \uC788\uC73C\uBA70, `type` \uC120\uC5B8\uC73C\uB85C \uAD6C\uC870\uCCB4\uC758 \uC774\uB984\uC744 \uC9C0\uC815\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\" \\n\\ntype User struct {\\n    name string\\n    age int\\n}\\n\\nfunc main () {\\n    user := User{\\"\uC11C\uB3D9\uBA85\\", 21}\\n    fmt.Println(user.name)\\n}\\n```\\n\\n### \uD3EC\uC778\uD130\\n\\n- \uD3EC\uC778\uD130\uB294 \uC788\uC9C0\uB9CC, \uD3EC\uC778\uD2B8 \uC5F0\uC0B0\uC740 \uBD88\uAC00\uB2A5\uD558\uB2E4\\n- \uAD6C\uC870\uCCB4\uB294 \uAD6C\uC870\uCCB4 \uD3EC\uC778\uD130\uB85C \uC811\uADFC\uC774 \uAC00\uB2A5\uD558\uBA70, \uC2E4\uC81C \uAD6C\uC870\uCCB4\uC5D0 \uC9C1\uC811\uC801\uC778 \uC601\uD5A5\uC744 \uB07C\uCE5C\uB2E4\\n\\n```go\\nimport \\"fmt\\" \\n\\ntype User struct {\\n    name string\\n    age int\\n}\\n\\nfunc main () {\\n    user := User{\\"\uC11C\uB3D9\uBA85\\", 21}\\n    p := &user\\n    p.name = \\"\uB204\uAD70\uC9C0 \uBAA8\uB974\uACA0\uC5B4\\"\\n    fmt.Println(user.name)\\n    fmt.Println(p.name)\\n}\\n```\\n\\n- \uAD6C\uC870\uCCB4 \uB9AC\uD130\uB7F4\\n  - `{key: value}` \uD615\uD0DC\uB85C \uAC12\uC744 \uC124\uC815\uD560 \uC218 \uC788\uB2E4 (\uC21C\uC11C\uB294 \uC0C1\uAD00\uC5C6\uB2E4)\\n  - `&` \uD0A4\uC6CC\uB4DC\uB97C \uD1B5\uD574 \uAD6C\uC870\uCCB4 \uB9AC\uD130\uB7F4 \uD3EC\uC778\uD130\uB97C \uC0D
1D\uC131\uD560 \uC218 \uC788\uB2E4\\n\\n```go\\nimport \\"fmt\\" \\n\\ntype User struct {\\n    name string\\n    age int\\n}\\n\\nfunc main () {\\n    user := User{\\"\uC11C\uB3D9\uBA85\\", 21}\\n    user1 := User{name: \\"\uB204\uAD74\uAE4C\\"}\\n    user2 := &User{age: 21}\\n    fmt.Println(user.name)\\n    fmt.Println(user1.name)\\n    fmt.Println(user)\\n    fmt.Println(user1)\\n    fmt.Println(user2)\\n}\\n```\\n\\n### new \uD568\uC218\\n\\n- `new(T)` \uB294 \uBAA8\uB4E0 \uAC12\uC774 0 (Zero Value) \uB85C \uD560\uB2F9\uB41C \uD0C0\uC785\uC758 \uD3EC\uC778\uD130\uB97C \uBC18\uD658\uD55C\uB2E4\\n  - \uC22B\uC790 \uD0C0\uC785\uC740 0, \uCC38\uC870 \uD0C0\uC785\uC740 nill\\n\\n```go\\nimport \\"fmt\\" \\n\\ntype User struct {\\n    name string\\n    age int\\n}\\n\\nfunc main () {\\n    user := new(User)\\n    fmt.Println(user)\\n    user.name = \\"\uC11C\uB3D9\uBA85\\"\\n    fmt.Println(user)\\n}\\n```"},{"id":"go-install","metadata":{"permalink":"/blog/go-install","source":"@site/blog/2017-08-30-go-install/index.md","title":"Go \uC124\uCE58\uD558\uAE30","description":"http://golang.org/dl \uC0AC\uC774\uD2B8\uC5D0 \uC812\uC18D\uD558\uC5EC Mac \uC6A9 \uD328\uD0A4\uC9C0 (.pkg) \uB97C \uB2E4\uC6B4\uBC1B\uB294\uB2E4","date":"2017-08-30T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":0.29,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Go \uC124\uCE58\uD558\uAE30","slug":"go-install","date":"2017-08-30T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"http://golang.org/dl \uC0AC\uC774\uD2B8\uC5D0 \uC812\uC18D\uD558\uC5EC Mac \uC6A9 \uD328\uD0A4\uC9C0 (.pkg) \uB97C \uB2E4\uC6B4\uBC1B\uB294\uB2E4"},"unlisted":false,"prevItem":{"title":"Go Tour-1","permalink":"/blog/go-tour-1"},"nextItem":{"title":"Sequelize.js","permalink":"/blog/sequelize"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Mac\uC5D0 Go Lang \uC124\uCE58\uD558\uAE30\\n\\n### \uC124\uCE58\uBC29\uBC95\\n\\n1. [http://golang.org/dl](http://golang.org/dl) \uC0AC\uC774\uD2B8\uC5D0 \uC812\uC18D\uD558\uC5EC Mac \uC6A9 \uD328\uD0A4\uC9C0 (.pkg) \uB97C \uB2E4\uC6B4\uBC1B\uB294\uB2E4\\n1. \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC740 \uD328\uD0A4\uC9C0\uB97C \uC2E4\uD589\uD558\uACE0, \uD574\uD0A4\uC9C0 \uC124\uCE58\uD654\uBA74\uC774 \uB098\uC624\uB294 Wizard \uB97C \uB530\uB77C \uC124\uCE58\uD55C\uB2E4\\n1. \uD130\uBBF8\uB110\uC744 \uC2E4\uD589\uC2DC\uD0A8 \uD6C4, `~/.zshrc` \uD558\uB2E8\uC5D0 `export PATH=$PATH:/usr/local/go/bin` \uCF54\uB4DC\uB97C \uCD94\uAC00\uD55C \uD6C4 \uC800\uC7A5\uD55C\uB2E4\\n1. \uC544\uB798\uC758 \uCEE4\uB9E8\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.\\n\\n```bash\\n$ source ~/.zshrc\\n$ go version\\ngo version go1.9 darwin/amd64\\n```\\n\\n### Hello World\\n\\n```bash\\n$ vim hello.go\\n```\\n\\n```go\\npackage main\\nimport \\"fmt\\"\\n\\nfunc main() {\\n    fmt.Printf(\\"Hello World\\\\n\\")\\n}\\n```\\n\\n```bash\\n$ go run hello.go\\nHello World\\n```"},{"id":"sequelize","metadata":{"permalink":"/blog/sequelize","source":"@site/blog/2017-05-29-sequelize/index.md","title":"Sequelize.js","description":"Sequelize.js \uB294 Node.js \uAE30\uBC18\uC758 ORM (Object-Relational-Mapping) \uC774\uB2E4.","date":"2017-05-29T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":0.55,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}
1],"frontMatter":{"title":"Sequelize.js","slug":"sequelize","date":"2017-05-29T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"Sequelize.js \uB294 Node.js \uAE30\uBC18\uC758 ORM (Object-Relational-Mapping) \uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"Go \uC124\uCE58\uD558\uAE30","permalink":"/blog/go-install"},"nextItem":{"title":"Github Flow","permalink":"/blog/github-flow"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Sequelize.js\\n\\nSequelize.js \uB294 Node.js \uAE30\uBC18\uC758 ORM (Object-Relational-Mapping) \uC774\uB2E4.\\n\\n[Sequelize.js](http://docs.sequelizejs.com/) \uB294 Node.js v4 \uC774\uC0C1\uC5D0\uC11C \uC0AC\uC6A9\uC774 \uAC00\uB2A5\uD558\uBA70, Promise \uB97C \uAE30\uBCF8\uC73C\uB85C \uB3D9\uC791\uD55C\uB2E4.\\n\\n### \uACF5\uC2DD \uC9C0\uC6D0 DBMS\\n\\n- MySQL / MariaDB\\n- PostgreSQL\\n- SQLite\\n- MS-SQL\\n\\n### \uC124\uCE58\\n\\n- Sequelize \uB294 DBMS \uD328\uD0A4\uC9C0\uB97C \uD3EC\uD568\uD558\uACE0 \uC788\uC9C0 \uC54A\uC73C\uBBC0\uB85C \uC0AC\uC6A9\uD558\uB824\uB294 DBMS \uD328\uD0A4\uC9C0\uB97C \uBCC4\uB3C4\uB85C \uC124\uCE58\uD574\uC57C\uB41C\uB2E4\\n\\n```bash\\n$ yarn add sequelize\\n$ yarn add mysql\\n```\\n\\n### \uC124\uC815\\n\\n```js\\nconst Sequelize = require(\'sequelize\');\\nconst sequelize = new Sequelize(\\n    \'til\', // DB \uC774\uB984\\n    \'username\', // \uC720\uC800 \uBA85\\n    \'password\', // \uBE44\uBC00\uBC88\uD638\\n    {\\n        host: \'localhost\', // \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD638\uC2A4\uD2B8 ( defualt localhost )\\n        dialect: \'mysql\' // DBMS \uC885\uB958\\n    }\\n);\\n```\\n\\n### \uBAA8\uB378 \uC0DD\uC131\\n\\n```js\\nsequelize.define(\'TIL\', {\\n    id: {\\n        type: Sequelize.INTEGER,\\n        primaryKey: true,\\n        autoIncrement: true\\n    },\\n    content: {\\n        type: Sequelize.STRING,\\n        allowNull: false \\n    },\\n    create_ts: {\\n        type: Sequlieze.INTEGER,\\n        allowNull: false,\\n        default: 0\\n    }\\n})\\n```\\n\\n### \uB370\uC774\uD130 \uCD94\uAC00\\n\\n```js\\nTIL.create({\\n    content: \'Practive of Sequelize.js\',\\n    create_ts: new Date().getTime()\\n})\\n```\\n\\n### \uB370\uC774\uD130 \uC870\uD68C\\n\\n- `findOne()`, `findAll()` \uBA54\uC18C\uB4DC\uB85C \uC870\uD68C\uD560 \uC218 \uC788\uB2E4\\n\\n```js\\nTIL.findAll({\\n    where: {\\n        id: 1\\n    }\\n})\\n```\\n\\n### \uB370\uC774\uD130 \uC5C5\uB370\uC774\uD2B8\\n\\n```js\\nTIL.update({\\n    content: \'WOW\'\\n}, {\\n    where: {\\n        id: 1\\n    }\\n})\\n```\\n\\n### \uB370\uC774\uD130 \uC0AD\uC81C\\n\\n```js\\nTIL.destory({\\n    where: {\\n        id: 1\\n    }\\n})\\n```\\n\\n### \uCC38\uACE0\\n\\n- http://docs.sequelizejs.com/manual/installation/getting-started.html\\n  - \uACF5\uC2DD Document \uB97C \uBCF4\uB294\uAC8C \uAC00\uC7A5 \uC88B\uB2E4\\n- http://webframeworks.kr/tutorials/expressjs/expressjs\\\\_orm\\\\_one/"},{"id":"github-flow","metadata":{"permalink":"/blog/github-flow","source":"@site/blog/2017-05-23-github-flow/index.md","title":"Github Flow","description":"\uBC30\uD3EC\uAC00 \uBE48\uBC88\uD558\uAC8C \uBC1C\uC0DD\uD558\uB294 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC5B4\uC6B8\uB9AC\uB294 \uBE0C\uB79C\uCE58 \uAE30\uBC18\uC758 \uC6CC\uD06C \uD50C\uB85C\uC6B0\uB2E4.","date":"2017-05-23T00:00:00.000Z","tags":[{"inline":false,"label":"\uAC1C\uBC1C \uBC29\uBC95\uB860","permalink":"/blog/tags/methodology"}],"readingTime":0.73,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Github Flow","slug":"github-flow","date":"2017-05-23T00:00:00.000Z","authors":["dongmyeong"],"tags":["methodology"],"description":"\uBC30\uD3EC\uAC00 \uBE48\uBC88\uD558\uAC8C \uBC1C\uC0DD\uD558\uB294 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC5B4\uC6B8\uB9AC\uB294 \uBE0C\uB79C\uCE58 \uAE30\uBC18\uC758 \uC6CC\uD06C \uD50C\uB85C\uC6B0\uB2E4."},"unlisted":false,"prevItem":{"title":"Sequelize.js","permalink":"/blog/sequelize"},"nextItem":{"title":"MySQL INET","permalink":"/blog/mysql-inet"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Github flow\\n\\n\uBC30\uD3EC\uAC00 \uBE48\uBC88\uD558\uAC8C \uBC1C\uC0DD\uD558\uB294 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC5B4\uC6B8\uB9AC\uB294 \uBE0C\uB79C\uCE58 \uAE30\uBC18\uC758 \uC6CC\uD06C \uD50C\uB85C\uC6B0\uB2E4.\\n\\n![Github Flow](./image-1.png)\\n\\nGithub Flow\\n\\n### \uC791\uC5C5 \uD750\uB984\\n\\n1. `master` \uBE0C\uB79C\uCE58\uB294 \uD56D\uC0C1 \uC989\uC2DC \uBC30\uD3EC\uAC00 \uAC00\uB2A5\uD55C \uC0C1\uD0DC\uB97C \uC720\uC9C0\uD55C\uB2E4\\n1. \uC0C8\uB85C\uC6B4 \uC791\uC5C5\uC744 \uC2DC\uC791\uD560 \uB54C\uB294 master \uBE0C\uB79C\uCE58\uB85C\uBD80\uD130 \uC0C8\uB85C\uC6B4 \uBE0C\uB79C\uCE58\uB97C \uC0D
1D\uC131\uD55C\uB2E4.\\n1. \uC6D0\uACA9 \uBE0C\uB79C\uCE58\uC5D0 \uCF54\uB4DC\uB97C \uC218\uC2DC\uB85C \uD478\uC2DC\uD55C\uB2E4\\n1. \uD53C\uB4DC\uBC31\uC774\uB098 \uB3C4\uC6C0\uC774 \uD544\uC694\uD560 \uACBD\uC6B0, \uD639\uC740 \uC791\uC5C5\uC774 \uC644\uB8CC\uB41C \uACBD\uC6B0 `Pull Request` \uB97C \uC0DD\uC131\uD55C\uB2E4\\n1. \uC791\uC5C5\uD55C \uB0B4\uC6A9\uC5D0 \uB300\uD55C \uB9AC\uBDF0\uAC00 \uC644\uB8CC\uB418\uBA74 `master` \uBE0C\uB79C\uCE58\uC5D0 `merge` \uD55C\uB2E4\\n1. `master` \uC5D0 `merge` \uAC00 \uB418\uBA74 \uC989\uC2DC \uBC30\uD3EC\uB97C \uC9C4\uD589\uD55C\uB2E4\\n\\n### \uADDC\uCE59\\n\\n1. `master` \uBE0C\uB79C\uCE58\uB294 \uD56D\uC0C1 \uBC30\uD3EC\uAC00 \uAC00\uB2A5\uD55C \uC0C1\uD0DC\uB97C \uC720\uC9C0\uD574\uC57C\uD55C\uB2E4\\n   - `master` \uBE0C\uB79C\uCE58\uC5D0 \uBC84\uADF8\uAC00 \uC788\uC744 \uACBD\uC6B0 `HEAD` \uB97C \uC774\uC804\uC73C\uB85C \uB418\uB3CC\uB9B0\uB2E4\\n   - \uD14C\uC2A4\uD2B8 \uCF54\uB4DC\uAC00 \uC5C6\uAC70\uB098 \uC2E4\uD328\uD55C \uCF54\uB4DC\uB294 `master` \uBE0C\uB79C\uCE58\uC5D0 `merge` \uD558\uC9C0 \uC54A\uB294\uAC83\uC744 \uC6D0\uCE59\uC73C\uB85C \uD55C\uB2E4\\n1. \uC0C8\uB85C\uC6B4 \uC791\uC5C5\uC744 \uD560 \uB54C\uB294 `master` \uBE0C\uB79C\uCE58\uC5D0\uC11C \uC0C8\uB85C\uC6B4 \uBE0C\uB79C\uCE58\uB97C \uC0DD\uC131\uD55C\uB2E4\\n1. \uBE0C\uB79C\uCE58\uBA85\uC740 \uB2E4\uB978 \uAC1C\uBC1C\uC790\uAC00 \uBD24\uC744 \uB584 \uC5B4\uB5A4 \uC77C\uC744 \uD558\uB294\uC9C0 \uC54C \uC218 \uC788\uB3C4\uB85D \uBA85\uD655\uD788 \uC791\uC131\uD55C\uB2E4\\n   - refactor-authentication\\n   - user-content-cache-key\\n   - make-retina-avatars\\n1. \uC0DD\uC131\uD55C \uBE0C\uB79C\uCE58\uB294 \uBA85\uC2DC\uB41C \uAE30\uB2A5 \uC774\uC678\uC758 \uAC83\uC744 \uC218\uC815\uD558\uC9C0 \uC54A\uB294\uB2E4\\n1. `master` \uC5D0 `merge` \uAC00 \uB41C \uD6C4 \uBC30\uD3EC\uB97C \uC9C4\uD589\uD55C \uD6C4 \uC815\uC0C1 \uB3D9\uC791\uD558\uB294\uC9C0 \uD655\uC778\uD55C\uB2E4\\n\\n### \uC120\uD589 \uC870\uAC74\\n\\n- \uD14C\uC2A4\uD2B8 \uC790\uB3D9\uD654\\n  - eg) Travis CI, Jenkins CI\\n- \uBC30\uD3EC \uC790\uB3D9\uD654\\n  - eg) fabric, Ansible, Capistrano\\n\\n### \uAE30\uD0C0\\n\\n- `git flow` \uC5D0 \uBE44\uD574 \uAD49\uC7A5\uD788 \uB2E8\uC21C\uD558\uACE0 \uAC04\uB2E8\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC27D\uAC8C \uB3C4\uC785\uD560 \uC218 \uC788\uB2E4\\n- `Pull Request` \uB294 \uCD5C\uC18C \uB2E8\uC704\uB85C \uC0DD\uC131\uD558\uB294\uAC8C \uC88B\uB2E4\\n  - \uB108\uBB34 \uBC29\uB300\uD55C\uD560 \uACBD\uC6B0 \uB9AC\uBDF0\uC5B4\uAC00 \uAD49\uC7A5\uD788 \uACE0\uD1B5\uBC1B\uACE0 \uD798\uB4E4\uC5B4\uD55C\uB2E4\\n- \uD300 \uB0B4\uC5D0\uC11C \uAC1C\uBC1C \uADDC\uCE59\uC744 \uC815\uD558\uC5EC `Wiki` \uB85C \uACF5\uC720\uD558\uB294\uAC83\uB3C4 \uC88B\uC740 \uBC29\uBC95\uC774\uB2E4\\n\\n### \uCC38\uACE0\\n\\n- https://guides.github.com/introduction/flow/"},{"id":"mysql-inet","metadata":{"permalink":"/blog/mysql-inet","source":"@site/blog/2017-05-19-mysql-inet/index.md","title":"MySQL INET","description":"INET_ATON : IP \uC8FC\uC18C\uB97C \uC815\uC218\uB85C \uBCC0\uD658\uD574\uC8FC\uB294 \uD568\uC218","date":"2017-05-19T00:00:00.000Z","tags":[{"inline":false,"label":"\uB370\uC774\uD130\uBCA0\uC774\uC2A4","permalink":"/blog/tags/database"}],"readingTime":0.16,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"MySQL INET","slug":"mysql-inet","date":"2017-05-19T00:00:00.000Z","authors":["dongmyeong"],"tags":["database"],"description":"INET_ATON : IP \uC8FC\uC18C\uB97C \uC815\uC218\uB85C \uBCC0\uD658\uD574\uC8FC\uB294 \uD568\uC218"},"unlisted":false,"prevItem":{"title":"Github Flow","permalink":"/blog/github-flow"},"nextItem":{"title":"Kotlin","permalink":"/blog/kotlin"}},"content":"\x3c!-- truncate --\x3e\\n\\n## INET\\\\_ATON, INET\\\\_NTOA\\n\\n- INET\\\\_ATON : IP \uC8FC\uC18C\uB97C \uC815\uC218\uB85C \uBCC0\uD658\uD574\uC8FC\uB294 \uD568\uC218\\n- INET\\\\_NTOA : \uC815\uC218\uB97C IP \uC8FC\uC18C\uB85C \uBCC0\uD658\uD574\uC8FC\uB294 \uD568\uC218\\n\\n### Usage\\n\\n```bash\\nMySQL> SELECT INET_ATON(\'192.168.219.103\');\\n+------------------------------+\\n| INET_ATON(\'192.168.219.103\') |\\n+------------------------------+\\n|                   3232291687 |\\n+------------------------------+\\n\\nMySQL> SELECT INET_NTOA(\'3232291687\');\\n+-------------------------+\\n| INET_NTOA(\'3232291687\') |\\n+-------------------------+\\n| 192.168.219.103         |\\n+-------------------------+\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function\\\\_inet-aton"},{"id":"kotlin","metadata":{"permalink":"/blog/kotlin","source":"@site/blog/2017-05-11-kotlin/index.md","title":"Kotlin","description":"Kotlin \uC740 IntelliJ \uB97C \uB9CC\uB4E0 JetBrains \uC5D0\uC11C \uB9CC\uB4E0 JVM \uAE30\uBC18\uC758 \uC5B8\uC5B4\uC774\uB2E4.","date":"2017-05-11T00:00:00.000Z","tags":[{"inline":false,"label":"Kotlin","permalink":"/blog/tags/kotlin"}],"readingTime":0.69,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Kotlin","slug":"kotlin","date":"2017-05-11T00:00:00.000Z","authors":["dongmyeong"],"tags":["kotlin"],"description":"Kotlin \uC740 IntelliJ \uB97C \uB9CC\uB4E0 JetBrains \uC5D0\uC11C \uB9CC\uB4E0 JVM \uAE30\uBC18\uC758 \uC5B8\uC5B4\uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"MySQL INET","permalink":"/blog/mysql-inet"},"nextItem":{"title":"nohup","permalink":"/blog/nohup"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Kotlin Getting Started\\n\\n### Kotlin?\\n\\n- Kotlin \uC740 IntelliJ \uB97C \uB9CC\uB4E0 JetBrains \uC5D0\uC11C \uB9CC\uB4E0 JVM \uAE30\uBC18\uC758 \uC5B8\uC5B4\uC774\uB2E4.\\n- Java \uC640 100% \uD638\uD658\uC131\uC744 \uAC00\uC9C0\uACE0 \uC788\uAE30 \uB54C\uBB38\uC5D0 Java \uC758 \uB300\uC548\uC5B8\uC5B4\uB85C \uAC01\uAD11\uBC1B\uACE0 \uC788\uC73C\uBA70 \uD604\uC7AC \uC548\uB4DC\uB85C\uC774\uB4DC, Tomcat, Java EE, Web \uB97C \uAC1C\uBC1C\uD560 \uB54C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n### \uD2B9\uC9D5\\n\\
1n- Null Pointer Expcetion \uC774 \uC790\uC720\uB86D\uB2E4\\n- \uC790\uBC14\uC758 boilerplate \uCF54\uB4DC \uB4E4\uC744 \uC904\uC5EC\uC8FC\uACE0 \uAC04\uACB0\uD558\uAC8C \uCF54\uB4DC\uB97C \uC791\uC131\uD560 \uC218 \uC788\uB294 \uBB38\uBC95\uC744 \uC81C\uACF5\uD55C\uB2E4\\n- `==` \uC5F0\uC0B0\uC790\uB294 Java \uC758 `equals()` \uC640 \uB3D9\uC77C\uD558\uAC8C \uB3D9\uC791\uD55C\uB2E4\\n  - \uC790\uBC14\uC5D0\uC11C\uB294 `String i` \uC640 `String j` \uB97C `==` \uC73C\uB85C \uBE44\uAD50\uD588\uC744 \uACBD\uC6B0, \uAC00\uB974\uD0A4\uB294 \uAC1D\uCCB4\uAC00 \uB2E4\uB974\uAE30 \uB54C\uBB38\uC5D0 `False`\uAC00 \uBC18\uD658\uB41C\uB2E4\\n  - \uC5EC\uD0C0 \uB2E4\uB978 \uC5B8\uC5B4\uC5D0\uC11C\uB294 `Value` \uB97C \uAC80\uC0AC\uD558\uAE30 \uB584\uBB38\uC5D0 \uC704\uC758 \uACBD\uC6B0 `True` \uB97C \uBC18\uD658\uD55C\uB2E4\\n  - Kotlin \uC5D0\uC11C\uB294 `==` \uC774 Java\uC758 `equals()` \uC640 \uB3D9\uC77C\uD558\uAC8C \uB3D9\uC791\uD558\uAE30 \uB54C\uBB38\uC5D0 \uC704\uC758 \uACBD\uC6B0 `True` \uB97C \uBC18\uD658\uD55C\uB2E4\\n  - Kotlin \uC5D0\uC11C \uB3D9\uC77C\uD55C \uAC1D\uCCB4\uC778\uC9C0 \uAC80\uC0AC\uD558\uB824\uBA74 `===` \uC744 \uC0AC\uC6A9\uD558\uBA74 \uB41C\uB2E4\\n- Functional Programming \uC744 \uC9C0\uC6D0\uD560 \uBFD0\uB9CC \uC544\uB2C8\uB77C, Java \uC5D0\uC11C\uC758 \uBD88\uD3B8\uD55C \uC810\uB4E4\uC774 \uB9CE\uC774 \uAC1C\uC120\uB418\uC5C8\uB2E4\\n- JetBrains \uC5D0\uC11C \uAC1C\uBC1C\uD588\uAE30 \uB54C\uBB38\uC5D0 Andoird Studio \uC5D0 Java \uC5D0\uC11C Kotlin \uC73C\uB85C \uBCC0\uD658\uD558\uB294 \uD234\uC744 \uC81C\uACF5\uD558\uACE0 \uC788\uB2E4\\n- Kotlin \uC740 \uC548\uB4DC\uB85C\uC774\uB4DC \uC804\uC6A9 \uC5B8\uC5B4\uAC00 \uC544\uB2C8\uAE30 \uB54C\uBB38\uC5D0 \uC11C\uBC84 \uD504\uB85C\uADF8\uB798\uBC0D, \uC6F9 \uD504\uB85C\uADF8\uB798\uBC0D\uC5D0\uB3C4 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n### \uC124\uCE58\\n\\n1. Kotlin \uD50C\uB7EC\uADF8\uC778 \uC124\uCE58\\n   - \\\\[Android Studio\\\\] - \\\\[Preferences\\\\] - \\\\[Plugins\\\\] - \\\\[Install Jetbrains Plugin\\\\] - \\\\[Kotlin\\\\]\\n1. \uD504\uB85C\uC81D\uD2B8 \uBCC0\uD658\\n   - \\\\[Android Studio\\\\] - \\\\[Tools\\\\] - \\\\[Kotlin\\\\] - \\\\[Configure Kotlin in Project\\\\]\\n1. \uC2E4\uD589\\n   - \\\\[Android Studio\\\\] - \\\\[Run\\\\] - \\\\[Run \u2018app\u2019\\\\]\\n\\n### \uCC38\uACE0\\n\\n- http://kotlinlang.org/docs/tutorials/kotlin-android.html\\n- https://news.realm.io/kr/news/android-kotlin/\\n- https://gist.github.com/Hazealign/1bbc586ded1649a8f08f"},{"id":"nohup","metadata":{"permalink":"/blog/nohup","source":"@site/blog/2017-05-11-nohup/index.md","title":"nohup","description":"Linux, Unix \uC5D0\uC11C HUP(hangup) Signal \uC744 \uBB34\uC2DC\uD558\uACE0 \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uC2DC\uD0A4\uB294 \uBA85\uB839\uC5B4","date":"2017-05-11T00:00:00.000Z","tags":[{"inline":false,"label":"Linux","permalink":"/blog/tags/linux"}],"readingTime":0.42,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"nohup","slug":"nohup","date":"2017-05-11T00:00:00.000Z","authors":["dongmyeong"],"tags":["linux"],"description":"Linux, Unix \uC5D0\uC11C HUP(hangup) Signal \uC744 \uBB34\uC2DC\uD558\uACE0 \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uC2DC\uD0A4\uB294 \uBA85\uB839\uC5B4"},"unlisted":false,"prevItem":{"title":"Kotlin","permalink":"/blog/kotlin"},"nextItem":{"title":"PhantomJS \uC124\uCE58","permalink":"/blog/phantomjs-install"}},"content":"\x3c!-- truncate --\x3e\\n\\n## nohup\\n\\n### \uAC1C\uC694\\n\\n- Linux, Unix \uC5D0\uC11C HUP(hangup) Signal \uC744 \uBB34\uC2DC\uD558\uACE0 \uBA85\uB839\uC5B4\uB97C \uC2E4\uD589\uC2DC\uD0A4\uB294 \uBA85\uB839\uC5B4\\n- \uD45C\uC900 \uCD9C\uB825\uC744 `nohup.out` \uD30C\uC77C\uC5D0 \uCD9C\uB825\uD568\\n  - \uD30C\uC77C \uC704\uCE58\uB294 \uBCC0\uACBD\uC774 \uAC00\uB2A5\uD558\uB2E4\\n- [daemonize](https://github.com/bmc/daemonize) \uC640 \uB3D9\uC77C\uD55C \uAE30\uB2A5\\n\\n### \uC0AC\uC6A9\uBC95\\n\\n- \uD45C\uC900 \uCD9C\uB825\\n\\n```bash\\n# \uC77C\uBC18\uC801\uC778 \uCD9C\uB825\\n$ echo \'Hello World\'\\nHello World\\n\\n# nohup\\n$ nohup echo \'Hello World\'\\nnohup: ignoring input and appending output to \'nohup.out\'\\n\\n$ cat nohup.out\\nHello World\\n\\n# \uD30C\uC77C \uCD9C\uB825\\n$ nohup echo \'Hello World\' > test.txt\\nnohup: ignoring input and redirecting stderr to stdout\\n\\n$ cat test.txt\\nHello World\\n\\n# \uCD9C\uB825 \uC548\uD558\uAE30\\n$ nohup echo \'Hello World\' > /dev/null\\nnohup: ignoring input and redirecting stderr to stdout\\n\\n$ cat nohup.out\\ncat: nohup.out: No such file or directory\\n```\\n\\n- background \uC2E4\uD589\\n\\n```bash\\n$ nohup ./shell.sh &\\nnohup: ignoring input and appending output to \'nohup.out\'\\n\\n$ ps -ef | grep shell.sh\\n...\\n```\\n\\n### \uCD9C\uCC98\\n\\n- https://en.wikipedia.org/wiki/Nohup"},{"id":"phantomjs-install","metadata":{"permalink":"/blog/phantomjs-install","source":"@site/blog/2017-05-11-phantomjs-install/index.md","title":"PhantomJS \uC124\uCE58","description":"https://github.com/Medium/phantomjs","date":"2017-05-11T00:00:00.000Z","tags":[{"inline":false,"label":"Linux","permalink":"/blog/tags/linux"}],"readingTime":0.08,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"PhantomJS \uC124\uCE58","slug":"phantomjs-install","date":"2017-05-11T00:00:00.000Z","authors":["dongmyeong"],"tags":["linux"],"description":"https://github.com/Medium/phantomjs"},"unlisted":false,"prevItem":{"title":"nohup","permalink":"/blog/nohup"},"nextItem":{"title":"Vuex","permalink":"/blog/vuex"}},"content":"\x3c!-- truncate --\x3e\\n\\n## PhantomJS \uC124\uCE58\\n\\n### requirements\\n\\n- Node.js\\n- yarn\\n\\n### \uC124\uCE58\\n\\n```bash\\n$ yarn add phantomjs-prebuilt\\n$ ./node_modules/phantomjs-prebuilt/bin/phantomjs\\nphantomjs>\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://github.com/Medium/phantomjs"},{"id":"vuex","metadata":{"permalink":"/blog/vuex","source":"@site/blog/2017-05-10-vuex/index.md","title":"Vuex","description":"Vuex\uB294 Vue.js \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0 \uB300\uD55C \uC0C1\uD0DC \uAD00\uB9AC \uD328\uD134 + \uB77C\uC774\uBE0C\uB7EC\uB9AC","date":"2017-05-10T00:00:00.000Z","tags":[{"inline":false,"label":"Vue.js","permalink":"/blog/tags/vuejs"}],"readingTime":0.7,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Vuex","slug":"vuex","date":"2017-05-10T00:00:00.000Z","authors":["dongmyeong"],"tags":["vuejs"],"description":"Vuex\uB294 Vue.js \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0 \uB300\uD55C \uC0C1\uD0DC \uAD00\uB9AC \uD328\uD134 + \uB77C\uC774\uBE0C\uB7EC\uB9AC"},"unlisted":false,"prevItem":{"title":"PhantomJS \uC124\uCE58","permalink":"/blog/phantomjs-install"},"nextItem":{"title":"Event Bus","permalink":"/blog/vue-event-bus"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Vuex\\n\\nVuex\uB294 Vue.js \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC5D0 \uB300\uD55C `\uC0C1\uD0DC \uAD00\uB9AC \uD328\uD134 + \uB77C\uC774\uBE0C\uB7EC\uB9AC`\\n\\n### \uC0C1\uD0DC, \uBDF0, \uC561\uC158\\n\\n```js\\nnew Vue({\\n\\t// \uC0C1\uD0DC\\n\\tdata () {\\n\\t\\treturn {\\n\\t\\t\\tcount: 0\\n\\t\\t}\\n\\t},\\n\\n\\t// \uBDF0\\n\\ttemplate: \'<div>{{ count }}</div>\',\\n\\n\\t// \uC561\uC158\\n\\tmethods: {\\n\\t\\tincrement () {\\n\\t\\t\\tthis.count ++\\n\\t\\t}\\n\\t}\\n})\\n```\\n\\n- \uC0C1\uD0DC: \uC571\uC744 \uC791\uB3D9\uD558\uB294 \uC6D0\uBCF8 \uC18C\uC2A4 ( data )\\n- \uBDF0: \uC0C1\uD0DC\uC758 \uC120\uC5B8\uC801 \uB9E4\uD551 ( template )\\n- \uC561\uC158: \uC0AC\uC6A9\uC790 \uD589\uB3D9\uC5D0 \uBC18\uC751\uD574 \uC0C1\uD0DC\uB97C \uBCC0\uACBD ( methods )\\n\\n### Vuex\\n\\n`Vue.js` \uB294 \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131 \uC2DC \uC778\uC790\uB85C \uBC1B\uB294 `data` \uAC1D\uCCB4\uB97C \uC774\uC6A9\uD574\uC11C \uC0C1\uD0DC\uB97C \uAD00\uB9AC\uD558\uBA70, `data`\uC548\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uB418\uBA74 \uC774\uB97C \uC778\uC9C0\uD558\uACE0 \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD558\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC5C5\uB370\uC774\uD2B8\uD55C\uB2E4\\n\\n\uAC1C\uBC1C\uC744 \uD558\uB2E4\uBCF4\uBA74 \uC11C\uB85C \uB2E4\uB978 \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uB3D9\uC77C\uD55C \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD558\uB294 \uACBD\uC6B0\uAC00 \uC0D
1D\uAE30\uB294\uB370, \uC774\uB97C \uD574\uACB0\uD558\uAE30 \uC704\uD574 `props` \uB97C \uD1B5\uD574 \uB370\uC774\uD130\uB97C \uC804\uB2EC\uD558\uAC70\uB098 \uC774\uBCA4\uD2B8\uB97C \uD1B5\uD574 `data` \uB97C \uB3D9\uAE30\uD654 \uD558\uB294 \uBC29\uBC95\uC774 \uC788\uB2E4\\n\\n\uD558\uC9C0\uB9CC \uC704\uC758 \uBC29\uBC95\uC73C\uB85C \uAC1C\uBC1C\uC744 \uD558\uAC8C \uB418\uBA74 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC870\uAE08\uB9CC \uBCF5\uC7A1\uD574\uC9C0\uBA74 \uAD00\uB9AC\uD558\uAE30\uAC00 \uB9E4\uC6B0 \uC5B4\uB824\uC6CC\uC9C0\uBA70, `Vue.js` \uC758 \uC7A5\uC810\uC778 \uB2E8\uC228\uD568\uC774 \uAD49\uC7A5\uD788 \uBE60\uB974\uAC8C \uC800\uD558\uB41C\uB2E4\\n\\n`Vuex` \uB294 \uC774\uB7EC\uD55C \uBB38\uC81C\uB97C \uD574\uACB0\uD558\uAE30 \uC704\uD574 \uC804\uC5ED\uC5D0\uC11C \uC811\uADFC \uAC00\uB2A5\uD55C \uC2A4\uD1A0\uC5B4 \uC5ED\uD65C\uC744 \uD558\uACE0 \uC788\uC73C\uBA70, \uC815\uD574\uC9C4 \uADDC\uCE59\uC5D0 \uB9DE\uCDB0 \uC0C1\uD0DC\uB97C \uBCC0\uACBD\uD560 \uC218 \uC788\uB2E4\\n\\n`Vuex`\uB294 `Flux`, `Redux`, `The Elm Architecture` \uC5D0\uC11C \uC601\uAC10\uC744 \uC5BB\uC5B4 \uAC1C\uBC1C\uB418\uC5C8\uB2E4\\n\\n![Vuex](./image-1.png)\\n\\nVuex\\n\\n### Vuex\uAC00 \uBB34\uC870\uAC74 \uB3C4\uC785\uD558\uB294\uAC8C \uC88B\uC744\uAE4C?\\n\\n`Vuex` \uB294 \uC5EC\uB7EC \uCEF4\uD3EC\uB10C\uD2B8\uC5D0\uC11C \uACF5\uC720\uB41C \uB370\uC774\uD130\uB97C \uCC98\uB9AC\uD558\uB294\uB370 \uAD49\uC7A5\uD788 \uC720\uC6A9\uD558\uC9C0\uB9CC, \uBC30\uC6B0\uAE30 \uC704\uD574 \uB7EC\uB2DD \uCF54\uC2A4\uD2B8\uAC00 \uB4E0\uB2E4.\\n\\n\uB9CC\uC57D, \uD504\uB85C\uC81D\uD2B8\uAC00 \uB2E8\uAE30\uAC04\uB0B4\uC5D0 \uB05D\uB0B4\uC57C\uB418\uACE0 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158 \uADDC\uBAA8\uAC00 \uC791\uB2E4\uBA74 `Vuex` \uC5C6\uC774 [EventBus](https://github.com/ClaudeSeo/TIL/blob/master/Vue.js/170507_vue_event_bus.md) \uB97C \uC0AC\uC6A9\uD574\uC11C \uAD6C\uD604\uD558\uBA74 \uB41C\uB2E4. \uD558\uC9C0\uB9CC \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC774 \uC911\uADDC\uBAA8 \uC774\uC0C1\uC77C \uACBD\uC6B0 `Vuex` \uB294 \uBC18\uB4DC\uC2DC \uB3C4\uC785\uD558\uB294\uAC8C \uC88B\uB2E4\\n\\n### \uCC38\uACE0\\n\\n- http://vuex.vuejs.org/kr/intro.html"},{"id":"vue-event-bus","metadata":{"permalink":"/blog/vue-event-bus","source":"@site/blog/2017-05-07-vue-event-bus/index.md","title":"Event Bus","description":"\uC77C\uBC18\uC801\uC73C\uB85C \uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uB0B4\uC5D0\uC11C \uBCC0\uC218, \uBA54\uC11C\uB4DC \uB4F1\uC774 \uC815\uC758\uB418\uAE30 \uB54C\uBB38\uC5D0 \uC774\uBCA4\uD2B8\uB97C \uC0AC\uC6A9\uD560 \uD544\uC694 \uC5C6\uC774 \uBC14\uB85C \uD638\uCD9C\uD558\uC5EC \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4","date":"2017-05-07T00:00:00.000Z","tags":[{"inline":false,"label":"Go","permalink":"/blog/tags/go"}],"readingTime":0.87,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Event Bus","slug":"vue-event-bus","date":"2017-05-07T00:00:00.000Z","authors":["dongmyeong"],"tags":["go"],"description":"\uC77C\uBC18\uC801\uC73C\uB85C \uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uB0B4\uC5D0\uC11C \uBCC0\uC218, \uBA54\uC11C\uB4DC \uB4F1\uC774 \uC815\uC758\uB418\uAE30 \uB54C\uBB38\uC5D0 \uC774\uBCA4\uD2B8\uB97C \uC0AC\uC6A9\uD560 \uD544\uC694 \uC5C6\uC774 \uBC14\uB85C \uD638\uCD9C\uD558\uC5EC \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4"},"unlisted":false,"prevItem":{"title":"Vuex","permalink":"/blog/vuex"},"nextItem":{"title":"Vue Plugin","permalink":"/blog/vue-plugin"}},"content":"\x3c!-- truncate --\x3e\\n\\n## EventBus\\n\\n\uC77C\uBC18\uC801\uC73C\uB85C \uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uB0B4\uC5D0\uC11C \uBCC0\uC218, \uBA54\uC11C\uB4DC \uB4F1\uC774 \uC815\uC758\uB418\uAE30 \uB54C\uBB38\uC5D0 \uC774\uBCA4\uD2B8\uB97C \uC0AC\uC6A9\uD560 \uD544\uC694 \uC5C6\uC774 \uBC14\uB85C \uD638\uCD9C\uD558\uC5EC \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n\uD558\uC9C0\uB9CC, \uC11C\uB85C \uB2E4\uB978 \uCEF4\uD3EC\uB10C\uD2B8\uC5D0\uC11C \uB370\uC774\uD130\uB97C \uC804\uC1A1\uD558\uAC70\uB098 \uD568\uC218\uB97C \uD638\uCD9C\uD558\uB824\uBA74 \uC5B4\uB5BB\uAC8C \uD574\uC57C\uD560\uAE4C? \uC11C\uB85C \uB370\uC774\uD130\uB97C \uC8FC\uACE0 \uBC1B\uC744 \uC218 \uC788\uB294 \uACF5\uAC04\uC744 \uB9CC\uB4E4\uACE0, \uC774\uB97C \uD1B5\uD574 \uC815\uD574\uC9C4 \uADDC\uACA9\uC5D0 \uB9DE\uCDB0 \uB370\uC774\uD130\uB97C \uC8FC\uACE0 \uBC1B\uC73C\uBA74 \uB41C\uB2E4\\n\\n\uB370\uC774\uD130\uB97C \uBC1B\uC744 \uCEF4\uD3EC\uB10C\uD2B8\uC5D0\uC11C \uC774\uBCA4\uD2B8\uB97C \uCCAD\uCDE8(on) \uD558\uACE0 \uC788\uC73C\uBA74, \uB2E4\uB978 \uCEF4\uD3EC\uB10C\uD2B8\uAC00 \uC774\uBCA4\uD2B8\uB97C \uBC1C\uC0DD(emit) \uC2DC\uD0AC \uB54C \uC804\uC1A1\uD558\uB294 \uB370\uC774\uD130\uB97C \uBC1B\uC544\uC11C \uB85C\uC9C1\uC744 \uC218\uD589\uD55C\uB2E4\\n\\n```js\\n// \uC774\uBCA4\uD2B8 \uBC84\uC2A4 \uC0DD\uC131\\nlet EventBus = new Vue() // \uC774\uBCA4\uD2B8 \uCCAD\uCDE8\\nEventBus.$on(\'my-event\', (message) => {console.log(message)}
1) // \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\\nEventBus.$emit(\'my-event\', \'\uBFB0\uB85C\uB871\uBFB0\uB871 \uBFB0\uB85C\uB85C\uB871\');\\n```\\n\\n## \uC608\uC81C\\n\\n```html\\n<div id=\\"sender-app\\">\\n\\t<input type=\\"text\\" v-model=\\"text\\">\\n\\t<button @click.prevent=\\"sendMessage\\">\uC804\uC1A1</button>\\n</div>\\n<div id=\\"receiver-app\\">\\n\\t<p v-if=\\"text\\">receiver: {{ text }}</p>\\n</div>\\n```\\n\\n```js\\nlet EventBus = new Vue()\\nlet SenderApp = new Vue({\\n\\tel: \'#sender-app\',\\n\\tdata () {\\n\\t\\treturn {text: \'\'}\\n\\t},\\n\\tmethods: {\\n\\t\\tsendMessage () {\\n\\t\\t\\tEventBus.$emit(\'message\', this.text)\\n\\t\\t}\\n\\t}\\n})\\nlet ReceiverApp = new Vue({\\n\\tel: \'#receiver-app\',\\n\\tdata () {\\n\\t\\treturn {text: \'\'}\\n\\t},\\n\\tcreated () {\\n\\t\\tEventBus.$on(\'message\', (text) => {this.text = text})\\n\\t}\\n})\\n```\\n\\n\uC704\uC758 \uC608\uC2DC\uC5D0\uC11C \uD655\uC778\uD560 \uC218 \uC788\uB4DC\uC2DC SenderApp, ReceiverApp\uC774 \uB2E4\uB978 App \uC784\uC5D0\uB3C4 \uBD88\uAD6C\uD558\uACE0 \uC815\uC0C1\uC801\uC73C\uB85C \uB370\uC774\uD130\uB97C \uACF5\uC720\uD560 \uC218 \uC788\uB2E4\\n\\n## EventBus plugin\\n\\n```js\\nlet EventBusPlugin = {}\\nEventBusPlugin.install = (Vue, options) => {\\n\\tconst eventBus = new Vue()\\n\\tVue.eventBus = eventBusVue.prototype.$eventBus = eventBus\\n}\\nexport default EventBusPlugin\\n```\\n\\n```js\\nimport EvnetBusPlugin from \'./plugins/bus\'\\nVue.use(EvnetBusPlugin)\\n```\\n\\n```html\\n<template>\\n    <p v-if=\\"text\\">Receiver: {{ text }}</p>\\n</template>\\n<script>\\nexport default {\\n    name: \'my-component\',\\n    data () {\\n        return {\\n            text: \'\'\\n        }\\n    },\\n    created () {\\n        this.$eventBus.$on(\'message\', (text) => {\\n            this.text = text\\n        })\\n    }\\n}\\n<\/script>\\n<style scoped>\\n</style>\\n```\\n\\n## \uCC38\uACE0\\n\\n- [Demo](https://jsfiddle.net/ClaudeSeo/9Lgys9sf/)\\n- https://github.com/ClaudeSeo/TIL/blob/master/JavaScript/170507\\\\_vue\\\\_plugin.md\\n- https://vuejs-kr.github.io/jekyll/update/2017/02/13/vuejs-eventbus/"},{"id":"vue-plugin","metadata":{"permalink":"/blog/vue-plugin","source":"@site/blog/2017-05-07-vue-plugin/index.md","title":"Vue Plugin","description":"\uD50C\uB7EC\uADF8\uC778\uC740 \uC77C\uBC18\uC801\uC73C\uB85C \uC804\uC5ED \uC218\uC900 \uAE30\uB2A5\uC744 vue\uC5D0 \uCD94\uAC00\uD55C\uB2E4","date":"2017-05-07T00:00:00.000Z","tags":[{"inline":false,"label":"Vue.js","permalink":"/blog/tags/vuejs"}],"readingTime":0.36,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Vue Plugin","slug":"vue-plugin","date":"2017-05-07T00:00:00.000Z","authors":["dongmyeong"],"tags":["vuejs"],"description":"\uD50C\uB7EC\uADF8\uC778\uC740 \uC77C\uBC18\uC801\uC73C\uB85C \uC804\uC5ED \uC218\uC900 \uAE30\uB2A5\uC744 vue\uC5D0 \uCD94\uAC00\uD55C\uB2E4"},"unlisted":false,"prevItem":{"title":"Event Bus","permalink":"/blog/vue-event-bus"},"nextItem":{"title":"CSS lang \uC120\uD0DD\uC790","permalink":"/blog/css-lang-selector"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Vue Plugin\\n\\n\uD50C\uB7EC\uADF8\uC778\uC740 \uC77C\uBC18\uC801\uC73C\uB85C \uC804\uC5ED \uC218\uC900 \uAE30\uB2A5\uC744 vue\uC5D0 \uCD94\uAC00\uD55C\uB2E4\\n\\n### \uD50C\uB7EC\uADF8\uC778 \uC720\uD615\\n\\n1. \uC804\uC5ED\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uBA54\uC11C\uB4DC \uD639\uC740 \uC18D\uC131\\n1. \uB514\uB809\uD2F0\uBE0C, \uD544\uD130, \uC804\uD658 \uD6A8\uACFC \uB4F1\\n1. \uC5B4\uB514\uC11C\uB4E0 \uC811\uADFC \uAC00\uB2A5\uD55C mixin\\n1. \uC778\uC2A4\uD134\uC2A4 \uBA54\uC11C\uB4DC \uCD94\uAC00\\n1. \uC6D0\uB798 \uAC00\uC9C0\uACE0 \uC788\uB294 api\uB97C \uC81C\uACF5\uD558\uBA74\uC11C \uC704\uC758 \uAE30\uB2A5\uB4E4\uC744 \uC870\uD569\uD558\uC5EC \uC81C\uACF5\uD558\uB294 \uB77C\uC774\uBE0C\uB7EC\uB9AC\\n\\
1n### \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\\n\\n```js\\nlet MyPlugin = {}\\nMyPlugin.install = (Vue, options) => {\\n\\t// 1. \uC804\uC5ED\uC5D0\uC11C \uC0AC\uC6A9\uD558\uB294 \uBA54\uC11C\uB4DC \uD639\uC740 \uC18D\uC131\\n\\tVue.globalMethod = () => {\\n\\t\\t...\\n\\t}\\n\\n\\t// 2. \uB514\uB809\uD2F0\uBE0C, \uD544\uD130, \uC804\uD658 \uD6A8\uACFC \uB4F1\\n\\tVue.directive(\'my-directive\', {\\n\\t\\tbind (el, biding, vnode, oldVnode) {\\n\\t\\t\\t...\\n\\t\\t}\\n\\t})\\n\\n\\t// 3. \uC5B4\uB514\uC11C\uB4E0 \uC811\uADFC \uAC00\uB2A5\uD55C mixin\\n\\tVue.mixin({\\n\\t\\tcreated () {\\n\\t\\t\\t...\\n\\t\\t}\\n\\t})\\n\\n\\t// 4. \uC778\uC2A4\uD134\uC2A4 \uBA54\uC11C\uB4DC \uCD94\uAC00\\n\\tVue.prototype.$myMethod = () => {\\n\\t\\t...\\n\\t}\\n}\\n\\nexport default MyPlugin\\n```\\n\\n### \uD50C\uB7EC\uADF8\uC778 \uC801\uC6A9\\n\\n```js\\nimport myPlugin from \'./plugins/myPlugin\'\\n\\nVue.use(myPlugin)\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://kr.vuejs.org/v2/guide/plugins.html"},{"id":"css-lang-selector","metadata":{"permalink":"/blog/css-lang-selector","source":"@site/blog/2017-05-01-css-lang-selector/index.md","title":"CSS lang \uC120\uD0DD\uC790","description":"\uB2E4\uAD6D\uC5B4 \uBB38\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC5B8\uC5B4\uBCC4\uB85C \uAE00\uAF34, \uAE00\uC790 \uD06C\uAE30, \uAE00\uC790 \uBAA8\uC591\uC744 \uBCC0\uACBD\uD558\uACE0 \uC2F6\uC744 \uB54C\uAC00 \uC788\uB2E4","date":"2017-05-01T00:00:00.000Z","tags":[{"inline":false,"label":"CSS","permalink":"/blog/tags/css"}],"readingTime":0.38,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"CSS lang \uC120\uD0DD\uC790","slug":"css-lang-selector","date":"2017-05-01T00:00:00.000Z","authors":["dongmyeong"],"tags":["css"],"description":"\uB2E4\uAD6D\uC5B4 \uBB38\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC5B8\uC5B4\uBCC4\uB85C \uAE00\uAF34, \uAE00\uC790 \uD06C\uAE30, \uAE00\uC790 \uBAA8\uC591\uC744 \uBCC0\uACBD\uD558\uACE0 \uC2F6\uC744 \uB54C\uAC00 \uC788\uB2E4"},"unlisted":false,"prevItem":{"title":"Vue Plugin","permalink":"/blog/vue-plugin"},"nextItem":{"title":"yarn","permalink":"/blog/yarn"}},"content":"\x3c!-- truncate --\x3e\\n\\n## **:lang selector**\\n\\n\uB2E4\uAD6D\uC5B4 \uBB38\uC11C\uB97C \uB9CC\uB4E4 \uB54C \uC5B8\uC5B4\uBCC4\uB85C \uAE00\uAF34, \uAE00\uC790 \uD06C\uAE30, \uAE00\uC790 \uBAA8\uC591\uC744 \uBCC0\uACBD\uD558\uACE0 \uC2F6\uC744 \uB54C\uAC00 \uC788\uB2E4\\n\\nclass \uB97C \uB9CC\uB4E4\uACE0 \uC9C1\uC811 style \uBD80\uC5EC\uD574\uB3C4 \uB418\uC9C0\uB9CC, \uC774\uB7F4 \uB54C\uB294 lang \uC18D\uC131\uC744 \uC0AC\uC6A9\uD558\uBA74 \uD6E8\uC52C \uC27D\uAC8C \uAC00\uB2A5\uD558\uB2E4\\n\\n### \uCF54\uB4DC\\n\\n```html\\n<!DOCTYPE html>\\n<html>\\n\\t<head>\\n\\t\\t<meta charset=\\"UTF-8\\">\\n\\t\\t<style>\\n\\t\\t\\t@import url(//fonts.googleapis.com/earlyaccess/notosanskr.css);\\n\\t\\t\\tp {\\n\\t\\t\\t\\tfont-family: \\"Noto Sans KR\\";\\n\\t\\t\\t}\\n\\n\\t\\t\\tp:lang(en) {\\n\\t\\t\\t\\tfont-family: sans-serif;\\n\\t\\t\\t\\tfont-weight:bold;\\n\\t\\t\\t}\\n\\t\\t</style>\\n\\t</head>\\n\\t<body>\\n\\t\\t<p>\uD55C\uAD6D\uC5B4</p>\\n\\t\\t<p lang=\\"en\\">English</p>\\n\\t</body>\\n</html>\\n```\\n\\n### \uACB0\uACFC\\n\\n![CSS lang \uC120\uD0DD\uC790](./image-1.webp)\\n\\n## **\uC5B8\uC5B4\uBCC4 \uCF54\uB4DC**\\n\\n- \uD55C\uAD6D\\n  - ko\\n- \uC601\uC5B4\\n  - en\\n- \uC77C\uBCF8\uC5B4\\n  - jp\\n- \uC911\uAD6D\uC5B4(\uAC04\uCCB4)\\n  - zh-cn\\n- \uC911\uAD6D\uC5B4(\uBC88\uCCB4)\\n  - zh-tw\\n- \uD504\uB791\uC2A4\uC5B4\\n  - fr\\n- \uC2A4\uD398\uC778\uC5B4\\n  - es\\n- \uB3C5\uC77C\uC5B4\\n  - de\\n\\n## **\uCC38\uACE0**\\n\\n- https://www.w3schools.com/cssref/sel\\\\_lang.asp\\n- \\\\[\uC2E0\uB3D9\uD559\\\\](http://github.com/aeun)"},{"id":"yarn","metadata":{"permalink":"/blog/yarn","source":"@site/blog/2017-04-29-yarn/index.md","title":"yarn","de
1scription":"Facebook \uC5D0\uC11C \uB9CC\uB4E0 JavaScript Package Manager \uC774\uB2E4","date":"2017-04-29T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":1.06,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"yarn","slug":"yarn","date":"2017-04-29T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"Facebook \uC5D0\uC11C \uB9CC\uB4E0 JavaScript Package Manager \uC774\uB2E4"},"unlisted":false,"prevItem":{"title":"CSS lang \uC120\uD0DD\uC790","permalink":"/blog/css-lang-selector"},"nextItem":{"title":"Apex \uB85C\uADF8, \uB864\uBC31","permalink":"/blog/apex-logs-rollback"}},"content":"\x3c!-- truncate --\x3e\\n\\n## yarn\\n\\nFacebook \uC5D0\uC11C \uB9CC\uB4E0 JavaScript Package Manager \uC774\uB2E4\\n\\n### \uC65C \uB9CC\uB4E4\uC5C8\uB294\uAC00?\\n\\n\uCF54\uB4DC \uBCA0\uC774\uC2A4\uAC00 \uCEE4\uC9C0\uBA74\uC11C npm \uC744 \uC0AC\uC6A9\uD588\uC744 \uB54C \uC548\uC815\uC131, \uC131\uB2A5, \uBCF4\uC548\uC5D0 \uB300\uD55C \uC774\uC288\uAC00 \uBC1C\uC0DD\uD558\uC5EC Facebook, Google, Exponent, Tilde \uAC1C\uBC1C\uC790\uB4E4\uC774 npm client\uB97C \uB300\uCCB4\uD560 \uD328\uD0A4\uC9C0\uB97C \uB9CC\uB4E4\uAC8C \uB418\uC5C8\uB2E4\\n\\n### npm \uC774\uC288?\\n\\n- \uC131\uB2A5 \uC774\uC288\\n  - \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC124\uCE58\uAC00 \uBCD1\uB82C\uC801\uC774\uC9C0 \uC54A\uACE0, \uC758\uC874\uC131 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uD558\uB098\uD558\uB098 \uB2E4\uC6B4\uBC1B\uB2E4\uBCF4\uB2C8 \uC131\uB2A5\uC774 \uAD49\uC7A5\uD788 \uC800\uD558\uB428\\n- \uBCF4\uC548 \uC774\uC288\\n  - \uC624\uD504\uB77C\uC778 \uD658\uACBD \uD639\uC740 \uC678\uBD80 \uBC29\uD654\uBCBD\uC774 \uCC28\uB2E8\uB418\uC5B4 \uC788\uB294 \uD658\uACBD\uC5D0\uC11C \uC758\uC874\uC131 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uBC1B\uC744 \uC218 \uC5C6\uB2E4.\\n- \uADF8 \uC678\uC5D0 \uC5EC\uB7EC \uC774\uC288\uB4E4\uC774 \uC788\uC74C\\n\\n### yarn vs npm\\n\\n- No Cache, No node\\\\_moduels, No locks\\n- **npm install** : 1\uBD84 29\uCD08\\n- **yarn install** : 24\uCD08\\n\\n### \uC124\uCE58\\n\\n- npm\\n\\n```bash\\n$ npm i -g yarn\\n```\\n\\n- mac\\n\\n```bash\\n$ brew install yarn\\n```\\n\\n- ubuntu\\n\\n```bash\\n$ sudo apt-get update && sudo apt-get install yarn\\n```\\n\\n- yarn update ( currently not available )\\n\\n```bash\\n$ yarn self-update\\n```\\n\\n### \uC0AC\uC6A9\\n\\n- \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654\\n  - npm \uCC98\uB7FC package.json\uC744 \uC0DD\uC131\uD55C\uB2E4\\n  - \uC774\uBBF8 package.json\uC774 \uC788\uB294 \uACBD\uC6B0 \uC7AC\uC0AC\uC6A9\uD55C\uB2E4\\n\\n  ```bash\\n  $ yarn init\\n  ```\\n- \uBAA8\uB4C8 \uC124\uCE58\\n\\n```bash\\n$ yarn install [package-name]@[version-or-tag] [options]\\n```\\n\\n- \uD328\uD0A4\uC9C0 \uCD94\uAC00\\n  - `npm install --save` \uC640 \uAC19\uC740 \uC758\uBBF8 \\n\\n  ```bash\\n  $ yarn add [package-name]@[version-or-tag] // production\\n  $ yarn add --dev [package-name]@[version-or-tag] // development\\n\\n  $ yarn add file:/path/to/local/folder // \uB85C\uCEEC \uD3F4\uB354 \uCD94\uAC00 \\n  $ yarn add file:/path/to/local/tarball.tgz // \uB85C\uCEEC \uD30C\uC77C \uCD94\uAC00\\n  $ yarn add <git remote url> // git repository \uCD94\uAC00 \\n  $ yarn add https://my-project/package.tar.gz  // URL \uCD94\uAC00\\n  ```\\n- \uD328\uD0A4\uC9C0 \uC0AD\uC81C\\n\\n```bash\\n$ yarn remove [package-name]@[version-or-tag]\\n```\\n\\n- Global \uD328\uD0A4\uC9C0 \uC124\uCE58\\n\\n```bash\\n$ yarn global add [package-name]@[version-or-tag]\\n```\\n\\n- Global \uD328\uD0A4\uC9C0 \uC0AD\uC81C\\n\\n```bash\\n$ yarn global remove [package-name]@[version-or-tag]\\n```\\n\\n- \uCE90\uC2DC \uC0AD\uC81C\\n\\n```bash\\n$ yarn cache clean\\n```\\n\\n- \uC758\uC874\uC131 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC124\uCE58\\n\\n```bash\\n$ cat package.json\\n...\\n    \\"dependencies\\": {}\\n    \\"devDependencies\\": {\\n        \\"babel-core\\": \\"^6.7.0\\",\\n        \\"babel-loader\\": \\"^6.2.4\\",\\n        \\"babel-preset-es2015\\": \\"^6.6.0\\"\\n    }\\n...\\n```\\n\\n### migration\\n\\nyarn\uC740 npm, bower \uC6CC\uD06C \uD50C\uB85C\uC6B0\uC5D0 \uBAA8\uB450 \uD638\uD658\uC131\uC744 \uAC00\uC9C0\uACE0 \uC788\uC73C\uBA70 mixing registries\uB97C \uC9C0\uC6D0\uD558\uAE30 \uB584\uBB38\uC5D0 \uBCC4\uB2E4\uB978 \uC791\uC5C5 \uC5C6\uC774 \uBC14\uB85C yarn\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n### \uCC38\uACE0\\n\\n- https://code.facebook.com/posts/1840075619545360\\n- https://yarnpkg.com/en/compare\\n- https://yarnpkg.com/en/docs/install#mac-tab\\n- https://yarnpkg.com/en/docs/getting-started"},{"id":"apex-logs-rollback","metadata":{"permalink":"/blog/apex-logs-rollback","source":"@site/blog/2017-04-27-apex-logs-rollback/index.md","title":"Apex \uB85C\uADF8, \uB864\uBC31","de
1scription":"","date":"2017-04-27T00:00:00.000Z","tags":[{"inline":false,"label":"Python","permalink":"/blog/tags/python"}],"readingTime":0.24,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Apex \uB85C\uADF8, \uB864\uBC31","slug":"apex-logs-rollback","date":"2017-04-27T00:00:00.000Z","authors":["dongmyeong"],"tags":["python"],"description":""},"unlisted":false,"prevItem":{"title":"yarn","permalink":"/blog/yarn"},"nextItem":{"title":"Apex","permalink":"/blog/apex"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Apex \uB85C\uADF8, \uB864\uBC31\\n\\n### \uB85C\uADF8\\n\\n```bash\\n# \uC804\uCCB4 \uB85C\uADF8 \uC870\uD68C\\n$ apex logs hello\\n\\n# -s \uC635\uC158\uC744 \uD1B5\uD574 \uC2DC\uAC04\uC744 \uC9C0\uC815\uD574\uC11C \uC870\uD68C\uD560 \uC218 \uC788\uB2E4.\\n$ apex logs hello -s 1h\\n\\n# -f \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 \uB85C\uADF8\uB97C \uCD94\uC801\uD574\uC11C \uBCFC \uC218 \uC788\uB2E4\\n$ apex logs hello -f\\n\\n# \uD568\uC218\uC5D0 \uB300\uD55C \uBA54\uD2B8\uB9AD \uC870\uD68C\uB97C \uD560 \uC218 \uC788\uB2E4\\n$ apex metrics hello\\n```\\n\\n### \uB864\uBC31\\n\\n```bash\\n# AWS Lambda function \uC5D0 \uBC84\uC804 \uAD00\uB9AC \uAE30\uB2A5\uC774 \uC5C6\uC9C0\uB9CC, apex\uC774 \uC81C\uACF5\uD558\uACE0 \uC788\uC73C\uBBC0\uB85C \uC798\uBABB \uBC30\uD3EC\uD588\uC73C\uBA74 \uB418\uB3CC\uB9AC\uBA74 \uB41C\uB2E4\\n$ apex rollback hello\\n\\n# \uC0AD\uC81C\\n$ apex delete hello\\n```"},{"id":"apex","metadata":{"permalink":"/blog/apex","source":"@site/blog/2017-04-26-apex/index.md","title":"Apex","description":"Apex\uB294 AWS lambda function \uBE4C\uB4DC, \uBC30\uD3EC, \uAD00\uB9AC\uB97C \uD3B8\uB9AC\uD558\uB3C4\uB85D \uB3C4\uC640\uC8FC\uB294 \uD234\uC774\uB2E4","date":"2017-04-26T00:00:00.000Z","tags":[{"inline":false,"label":"Python","permalink":"/blog/tags/python"}],"readingTime":0.7,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Apex","slug":"apex","date":"2017-04-26T00:00:00.000Z","authors":["dongmyeong"],"tags":["python"],"description":"Apex\uB294 AWS lambda function \uBE4C\uB4DC, \uBC30\uD3EC, \uAD00\uB9AC\uB97C \uD3B8\uB9AC\uD558\uB3C4\uB85D \uB3C4\uC640\uC8FC\uB294 \uD234\uC774\uB2E4"},"unlisted":false,"prevItem":{"title":"Apex \uB85C\uADF8, \uB864\uBC31","permalink":"/blog/apex-logs-rollback"},"nextItem":{"title":"Model IME \uBC84\uADF8","permalink":"/blog/vue-model-ime-bug"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Apex\\n\\nApex\uB294 AWS lambda function \uBE4C\uB4DC, \uBC30\uD3EC, \uAD00\uB9AC\uB97C \uD3B8\uB9AC\uD558\uB3C4\uB85D \uB3C4\uC640\uC8FC\uB294 \uD234\uC774\uB2E4\\n\\n### \uC124\uCE58\\n\\n- mac, linux, OpenBSD\\n\\n```bash\\n$ curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh\\n```\\n\\n- window : [\uBC14\uC774\uB108\uB9AC](https://github.com/apex/apex/releases) \uC124\uCE58\\n\\n### \uC778\uC99D \uC124\uC815\\n\\n```bash\\n$ ~/.aws/credentials\\n\\n[example]\\naws_access_key_id = xxxxxxxx\\naws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxx\\n\\n$ ~/.aws/config\\n[profile example]\\nregion = ap-northeast-2\\n```\\n\\n### \uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131\\n\\n```bash\\n$ mkdir example\\n$ cd example\\n$ apex init # project name, description \uB4F1 \uC124\uC815\\n$ apex deploy\\n```\\n\\n### \uD3F4\uB354 \uAD6C\uC870\\n\\n```text\\n\u251C\u2500\u2500 functions\\n\u2502    \u2514\u2500\u2500 hello\\n\u2502        \u2514\u2500\u2500 index.js\\n\u2514\u2500\u2500 project.json\\n```\\n\\n### \uD14C\uC2A4\uD2B8\\n\\n```bash\\n$ vim event.json\\n{\\"hello\\": \\"world\\"}\\n\\n$ apex invoke hello < event.json\\n$ apex invoke hello # without event\\n```\\n\\n### project.json\\n\\n- name: \uD504\uB85C\uC81D\uD2B8\uBA85\\n- description: \uD
1504\uB85C\uC81D\uD2B8 \uC124\uBA85\\n- runtime: lambda\uC758 \uB7F0\uD0C0\uC784 \uC124\uC815\\n  - java (Java 8)\\n  - python (Python 2.7)\\n  - nodejs (Node.js 0.10)\\n  - nodejs4.3 (Node.js 4.3)\\n  - nodejs6.10 (Node.js 6.10)\\n  - golang (any version)\\n  - clojure (any version)\\n  - rust-musl\\\\[^rust-runtime\\\\]\\\\[^rust-linux-only\\\\] (any version)\\n  - rust-gnu\\\\[^rust-runtime\\\\]\\\\[^rust-linux-only\\\\] (any version)\\n- memory: lambda \uD560\uB2F9 \uBA54\uBAA8\uB9AC\\n- timeout: lambda \uD568\uC218 \uCD5C\uB300 \uC2E4\uD589 \uC2DC\uAC04 ( \uCD5C\uB300 300\uCD08 \uAE4C\uC9C0 \uD5C8\uC6A9 )\\n- role: AWS role\\n- profile: AWS \uD504\uB85C\uD30C\uC77C\uBA85\\n- defaultEnvironment: \uAE30\uBCF8 \uC778\uD504\uB77C \uD658\uACBD (stage, production \uB4F1)\\n- environment: lambda\uC5D0 \uC801\uC6A9\uD560 \uD658\uACBD \uBCC0\uC218\\n- nameTemplate: lambda function \uB9CC\uB4E4 \uB54C \uC0AC\uC6A9\uB418\uB294 \uC774\uB984 \uD15C\uD50C\uB9BF (default: {{.Project.Name}}\\\\_{{.Function.Name}})\\n- retainedVersions: lambda \uD568\uC218\uC5D0\uC11C \uC720\uC9C0\uD558\uACE0 \uC788\uC744 \uBC84\uC804 \uAC1C\uC218 (default: 10, \uB864\uBC31\uC6A9 \uB4F1\uC73C\uB85C \uC0AC\uC6A9\uD568)\\n- vpc: AWS VPC\\n- vpc.securityGroups: Security Group ID \uBAA9\uB85D\uB4E4\\n- vpc.subnets: \uC11C\uBE0C\uB137 ID \uBAA9\uB85D\uB4E4"},{"id":"vue-model-ime-bug","metadata":{"permalink":"/blog/vue-model-ime-bug","source":"@site/blog/2017-04-24-vue-model-ime-bug/index.md","title":"Model IME \uBC84\uADF8","description":"v-model \uB514\uB809\uD2F0\uBE0C\uB97C \uC0AC\uC6A9\uD558\uBA74 input\uACFC textarea \uC5D0 \uC591\uBC29\uD5A5 \uB370\uC774\uD130 \uBC14\uC778\uB529\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4","date":"2017-04-24T00:00:00.000Z","tags":[{"inline":false,"label":"Vue.js","permalink":"/blog/tags/vuejs"}],"readingTime":0.87,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Model IME \uBC84\uADF8","slug":"vue-model-ime-bug","date":"2017-04-24T00:00:00.000Z","authors":["dongmyeong"],"tags":["vuejs"],"description":"v-model \uB514\uB809\uD2F0\uBE0C\uB97C \uC0AC\uC6A9\uD558\uBA74 input\uACFC textarea \uC5D0 \uC591\uBC29\uD5A5 \uB370\uC774\uD130 \uBC14\uC778\uB529\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4"},"unlisted":false,"prevItem":{"title":"Apex","permalink":"/blog/apex"},"nextItem":{"title":"Git commit \uBA54\uC2DC\uC9C0 \uC218\uC815\uD558\uAE30","permalink":"/blog/git-amend-commit-message"}},"content":"\x3c!-- truncate --\x3e\\n\\n## v-model IME \uBC84\uADF8\\n\\n`v-model` \uB514\uB809\uD2F0\uBE0C\uB97C \uC0AC\uC6A9\uD558\uBA74 `input`\uACFC `textarea` \uC5D0 \uC591\uBC29\uD5A5 \uB370\uC774\uD130 \uBC14\uC778\uB529\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n```text\\n<template>\\n    <div class=\\"container\\">\\n        <input v-model=\\"message\\">\\n        <p> {{ message }}</p>\\n    </div>\\n</template>\\n\\n<script>\\nnew Vue({\\n    el: \'#app\',\\n    data: {\\n        message: \'\uC548\uB155\uD558\uC138\uC694\'\\n    }\\n})\\n<\/script>\\n```\\n\\nIME (Chinese, Japanese, Korea etc) \uAC00 \uD544\uC694\uD55C \uC5B8\uC5B4\uB97C \uC0AC\uC6A9\uD560 \uACBD\uC6B0 `v-model` \uC774 \uC81C\uB300\uB85C \uC5C5\uB370\uC774\uD2B8 \uB418\uC9C0 \uC54A\uB294 \uBC84\uADF8\uAC00 \uC788\uB2E4. [\uCC38\uACE0 \uB9C1\uD06C](https://jsfiddle.net/kciter/b5qhxbfh/)\\n\\n```text\\n- Vue.js \uACF5\uC2DD \uD648\uD398\uC774\uC9C0\\nIME (\uC911\uAD6D\uC5B4, \uC77C\uBCF8\uC5B4, \uD55C\uAD6D\uC5B4 \uB4F1)\uAC00 \uD544\uC694\uD55C \uC5B8\uC5B4\uC758 \uACBD\uC6B0 IME \uC911 v-model\uC774 \uC5C5\uB370\uC774\uD2B8 \uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC774\uB7EC\uD55C \uC5C5\uB370\uC774\uD2B8\uB97C \uCC98\uB9AC\uD558\uB824\uBA74 input \uC774\uBCA4\uD2B8\uB97C \uB300\uC2E0 \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC624.\\n\\n- Vue.js github issue\\nv-model does not working properly with Korean chars (only with IE 11)\\n```\\n\\n\uC774 \uBB38\uC81C\uB97C \uD574\uACB0\uD558\uAE30 \uC704\uD574\uC11C\uB294 `input` \uC774\uBCA4\uD2B8 \uD639\uC740 `@blur` \uB97C \uC0AC\uC6A9\uD574\uC11C \uD574\uACB0\uD574\uC57C\uD55C\uB2E4.\\n\\n\uBAA8\uB4E0 `input` \uD0DC\uADF8\uC5D0 \uC774\uBCA4\uD2B8\uB97C \uBC14\uC778\uB529 \uD574\uC8FC\uB294\uAC74 \uAD49\uC7A5\uD788 \uADC0\uCC2E\uACE0 \uCF54\uB4DC\uB3C4 \uB354\uB7EC\uC6CC\uC9C0\uAE30 \uB54C\uBB38\uC5D0 `custom directive` \uB97C \uB9CC\uB4E4\uC5B4\uC11C \uC0AC\uC6A9\uD588\uB2E4.\\n\\n```text\\n<template>\\n    <div id=\\"app\\">\\n        <input v-typing=\\"message\\">\\n        <p>{{message}}</p>\\n    </div>\\n</template>\\n\\n<script>\\nVue.directive(\'typing\', {\\n    bind: function (el, binding, vnode) {\\n        var expression = binding.expression\\n        el.value = vnode.context[expression]\\n        el.addEventListener(\'input\', function (e) {\\n            vnode.context[expression] = e.target.value\\n        })\\n    }\\n}
1)\\n\\nnew Vue({\\n    el: \'#app\',\\n    data: {\\n        message: \'\uC548\uB155\uD558\uC138\uC694\'\\n    }\\n})\\n<\/script>\\n```\\n\\n### \uB77C\uC774\uBE0C\uB7EC\uB9AC\\n\\n\uC774\uC120\uD611\uB2D8\uC774 \uB9CC\uB4DC\uC2E0 [`vue-ime-model`](https://github.com/kciter/vue-ime-model) \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uC0AC\uC6A9\uD558\uBA74 \uB41C\uB2E4.\\n\\n~~\uC9C1\uC811 \uD50C\uB7EC\uADF8\uC778\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC11C \uBC30\uD3EC\uB97C \uD558\uAE30 \uC9C1\uC804\uC5D0 \uBC1C\uACAC\uD588\uB2E4\uACE0 \uD55C\uB2E4~~\\n\\n### \uCC38\uACE0\\n\\n- [Vuejs \uD3FC \uC785\uB825 \uBC14\uC778\uB529 \uAE30\uBCF8 \uC0AC\uC6A9\uBC95](https://kr.vuejs.org/v2/guide/forms.html#%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95)\\n- \\\\[@input \uC744 \uC0AC\uC6A9\uD55C \uD574\uACB0 \uBC29\uBC95\\\\](https://jsfiddle.net/kciter/tLz9gt4o/)\\n- \\\\[@blur \uC744 \uC0AC\uC6A9\uD55C \uD574\uACB0 \uBC29\uBC95\\\\](https://jsfiddle.net/posva/g94vLx3o/)\\n- [custom directive \uB97C \uC0AC\uC6A9\uD55C \uD574\uACB0 \uBC29\uBC95](https://jsfiddle.net/ClaudeSeo/79nkvvn9/10/)"},{"id":"git-amend-commit-message","metadata":{"permalink":"/blog/git-amend-commit-message","source":"@site/blog/2017-04-23-git-amend-commit-message/index.md","title":"Git commit \uBA54\uC2DC\uC9C0 \uC218\uC815\uD558\uAE30","description":"\uAE43 \uCEE4\uBC0B\uBA54\uC2DC\uC9C0\uB97C \uC791\uC131\uD558\uB2E4\uBCF4\uBA74 \uC624\uD0C0\uAC00 \uB098\uAC70\uB098 \uBA54\uC2DC\uC9C0\uB97C \uC798\uBABB \uC801\uB294 \uACBD\uC6B0\uAC00 \uC0DD\uAE34\uB2E4","date":"2017-04-23T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.27,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Git commit \uBA54\uC2DC\uC9C0 \uC218\uC815\uD558\uAE30","slug":"git-amend-commit-message","date":"2017-04-23T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"\uAE43 \uCEE4\uBC0B\uBA54\uC2DC\uC9C0\uB97C \uC791\uC131\uD558\uB2E4\uBCF4\uBA74 \uC624\uD0C0\uAC00 \uB098\uAC70\uB098 \uBA54\uC2DC\uC9C0\uB97C \uC798\uBABB \uC801\uB294 \uACBD\uC6B0\uAC00 \uC0DD\uAE34\uB2E4"},"unlisted":false,"prevItem":{"title":"Model IME \uBC84\uADF8","permalink":"/blog/vue-model-ime-bug"},"nextItem":{"title":"Git Alias","permalink":"/blog/git-alias"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Fix Commit Message\\n\\n\uAE43 \uCEE4\uBC0B\uBA54\uC2DC\uC9C0\uB97C \uC791\uC131\uD558\uB2E4\uBCF4\uBA74 \uC624\uD0C0\uAC00 \uB098\uAC70\uB098 \uBA54\uC2DC\uC9C0\uB97C \uC798\uBABB \uC801\uB294 \uACBD\uC6B0\uAC00 \uC0DD\uAE34\uB2E4\\n\\n```bash\\n$ git add --all\\n$ git commit -m \\"update commetn\\"\\n```\\n\\n`--amend` \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uC5EC \uCEE4\uBC0B \uBA54\uC2DC\uC9C0\uB97C \uC218\uC815\uD558\uBA74 \uB41C\uB2E4\\n\\n```bash\\n$ git commit --amend\\n  1 update commetn\\n  2\\n  3 # Please enter the commit message for your changes. Lines starting\\n  4 # with \'#\' will be ignored, and an empty message aborts the commit.\\n```\\n\\n\uC218\uC815\uC774 \uB05D\uB0AC\uC73C\uBA74 \uC800\uC7A5 \uD6C4 \uC885\uB8CC\uD558\uACE0 `git log -n 1` \uBA85\uB839\uC5B4\uB97C \uD1B5\uD574 \uD655\uC778\uD574\uBCF4\uBA74 \uB41C\uB2E4\\n\\n```bash\\n$ git log -n 1\\n    update comment\\n```"},{"id":"git-alias","metadata":{"permalink":"/blog/git-alias","source":"@site/blog/2017-04-21-git-alias/index.md","title":"Git Alias","description":"git alias \uAE30\uB2A5\uC744 \uD1B5\uD574 \uCD95\uC57D\uC5B4 \uD615\uD0DC\uB85C git command \uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4","date":"2017-04-21T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.39,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Git Alias","slug":"git-alias","date":"2017-04-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"git alias \uAE30\uB2A5\uC744 \uD1B5\uD574 \uCD95\uC57D\uC5B4 \uD615\uD0DC\uB85C git command \uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4"},"unlisted":false,"prevItem":{"title":"Git commit \uBA54\uC2DC\uC9C0 \uC218\uC815\uD558\uAE30","permalink":"/blog/git-amend-commit-message"},"nextItem":{"title":"Git Stash","permalink":"/blog/git-stash"}},"content":"\x3c!-- truncate --\x3e\\n\\n## alias\\n\\ngit alias \uAE30\uB2A5\uC744 \uD1B5\uD574 \uCD95\uC57D\uC5B4 \uD615\uD0DC\uB85C git command \uB97C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB2E4\\n\\n### \uC124\uC815\\n\\n```bash\\n$ git config --global alias.co checkout\\n$ git config --global alias.br branch\\n$ git config --global alias.ci commit\\n$ git config --global alias.st status\\n```\\n\\n### \uC0AC\uC6A9\\n\\n```bash\\n$ git co BRANCH\\nSwitched to branch \'BRANCH\'\\n\\n$ git br\\n* master\\n```\\n\\n### \uAE30\uD0C0\\n\\n- \uC9C1\uC811 git
1config \uD30C\uC77C\uC744 \uC218\uC815\uD574\uC11C \uC124\uC815\uD560 \uC218 \uC788\uB2E4\\n- \uB0B4\uAC00 \uC8FC\uB85C \uC0AC\uC6A9\uD558\uB294 alias \uB4E4\uC740 \uC544\uB798\uC640 \uAC19\uB2E4\\n\\n```bash\\n$ vim ~/.gitconfig\\n[alias]\\n    co = checkout\\n    br = branch\\n    ci = commit\\n    st = status\\n    unstage = reset HEAD --\\n    last = log -1 HEAD -p\\n    hide = update-index --assume-unchanged\\n    unhide = update-index --no-assume-unchanged\\n\\n$ git unstage FILE_NAME\\n$ git last\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-Git-Alias"},{"id":"git-stash","metadata":{"permalink":"/blog/git-stash","source":"@site/blog/2017-04-21-git-stash/index.md","title":"Git Stash","description":"http://www.popit.kr/git-stash/","date":"2017-04-21T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.19,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Git Stash","slug":"git-stash","date":"2017-04-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"http://www.popit.kr/git-stash/"},"unlisted":false,"prevItem":{"title":"Git Alias","permalink":"/blog/git-alias"},"nextItem":{"title":"Literal String Interpolation","permalink":"/blog/python-f-string"}},"content":"\x3c!-- truncate --\x3e\\n\\n## stash\\n\\ngit \uC784\uC2DC \uC800\uC7A5\\n\\n### \uC0AC\uC6A9\\n\\n```bash\\n# \uC800\uC7A5\\n$ git stash save [\uBA54\uC2DC\uC9C0]\\n\\n# \uBAA9\uB85D \uC870\uD68C\\n$ git stash list\\n\\n# \uBC18\uC601\\n$ git stash apply [stash@{index}]\\n\\n# \uC0AD\uC81C\\n$ git stash drop [stash@{index}]\\n\\n# \uBC18\uC601 \uD6C4 \uC0AD\uC81C\\n$ git stash pop [stash@{index}]\\n\\n# \uBCC0\uACBD\uC0AC\uD56D \uC870\uD68C\\n$ git stash show [stash@{index}]\\n\\n# \uBE0C\uB79C\uCE58\uB85C \uBD84\uB9AC\\n$ git stash branch <BRANCHNAME>
1 [stash@{index}]\\n```\\n\\n### \uCC38\uACE0\\n\\n- http://www.popit.kr/git-stash/"},{"id":"python-f-string","metadata":{"permalink":"/blog/python-f-string","source":"@site/blog/2017-04-21-python-f-string/index.md","title":"Literal String Interpolation","description":"PEP 498\uC5D0 \uC815\uC758\uB418\uC5B4\uC788\uB2E4","date":"2017-04-21T00:00:00.000Z","tags":[{"inline":false,"label":"Python","permalink":"/blog/tags/python"}],"readingTime":0.24,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Literal String Interpolation","slug":"python-f-string","date":"2017-04-21T00:00:00.000Z","authors":["dongmyeong"],"tags":["python"],"description":"PEP 498\uC5D0 \uC815\uC758\uB418\uC5B4\uC788\uB2E4"},"unlisted":false,"prevItem":{"title":"Git Stash","permalink":"/blog/git-stash"},"nextItem":{"title":"Vuetiful Korea (Vue.js \uD55C\uAD6D\uC5B4 \uC0AC\uC6A9\uC790 \uBAA8\uC784) 1\uD68C \uBAA8\uC784","permalink":"/blog/vuetiful-korea-1"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Literal String Interpolation\\n\\n- PEP 498\uC5D0 \uC815\uC758\uB418\uC5B4\uC788\uB2E4\\n- python 3.6 \uBD80\uD130 \uC0AC\uC6A9\uC774 \uAC00\uB2A5\uD558\uB2E4\\n\\n```python\\n>>> from datetime import datetime\\n>>> now = datetime.now()\\n>>> name = \'Claude\'\\n>>> age = 22\\n>>> f\'my name is {name}, my age is {age}, today is {now: %Y-%m-%d %H:%M:%S}\'\\n\'my name is Claude, my age is 22, today is  2017-04-21 11:29:47\'\\n```\\n\\n### escape\\n\\n```python\\n>>> foo = \'test\'\\n>>> f\'{foo} {{bar}}\'\\n\'test {bar}\'\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://www.python.org/dev/peps/pep-0498/"},{"id":"vuetiful-korea-1","metadata":{"permalink":"/blog/vuetiful-korea-1","source":"@site/blog/2017-04-19-vuetiful-korea-1/index.md","title":"Vuetiful Korea (Vue.js \uD55C\uAD6D\uC5B4 \uC0AC\uC6A9\uC790 \uBAA8\uC784) 1\uD68C \uBAA8\uC784","description":"\uC6B0\uB2F9\uD0D5\uD0D5 \uD68C\uC0AC\uC5D0 Vue.js\uB97C \uB3C4\uC785\uD55C \uC0BD\uC9C8\uAE30 - \uBC15\uC0C8\uBBF8\uB2D8","date":"2017-04-19T00:00:00.000Z","tags":[{"inline":false,"label":"\uCEE8\uD37C\uB7F0\uC2A4","permalink":"/blog/tags/conference"}],"readingTime":2.05,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Vuetiful Korea (Vue.js \uD55C\uAD6D\uC5B4 \uC0AC\uC6A9\uC790 \uBAA8\uC784) 1\uD68C \uBAA8\uC784","slug":"vuetiful-korea-1","date":"2017-04-19T00:00:00.000Z","authors":["dongmyeong"],"tags":["conference"],"description":"\uC6B0\uB2F9\uD0D5\uD0D5 \uD68C\uC0AC\uC5D0 Vue.js\uB97C \uB3C4\uC785\uD55C \uC0BD\uC9C8\uAE30 - \uBC15\uC0C8\uBBF8\uB2D8"},"unlisted":false,"prevItem":{"title":"Literal String Interpolation","permalink":"/blog/python-f-string"},"nextItem":{"title":"async-await","permalink":"/blog/async-await"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uBAA9\uCC28\\n\\n- \uC6B0\uB2F9\uD0D5\uD0D5 \uD68C\uC0AC\uC5D0 Vue.js\uB97C \uB3C4\uC785\uD55C \uC0BD\uC9C8\uAE30 - \uBC15\uC0C8\uBBF8\uB2D8\\n- \uBC31\uC5D4\uB4DC \uAC1C\uBC1C\uC790, \uC785\uBB38\uC790\uB85C\uC11C Vue \uC774\uD574\uD558\uACE0 \uC0AC\uC6A9\uD558\uB2E4 - \uCC28\uACBD\uBB35\uB2D8\\n- \uC6F9 \uB514\uC790\uC774\uB108\uC758 \uB3C4\uC804 Vue.js \uB530\uB77C\uD558\uAE30 - \uC774\uC2B9\uBBFC\uB2D8\\n- Vue.js\uC640 Firebase \uD65C\uC6A9\uAE30 - \uAE40\uC778\uC219\uB2D8\\n- Nuxt\uB85C \uC0AC\uB0B4 \uC11C\uBE44\uC2A4 \uAD6C\uD604\uD558\uBA74\uC11C \uC5BB\uC740 \uACBD\uD5D8 \uACF5\uC720 - \uC870\uBBFC\uD658\uB2D8\\n\\n## \uC6B0\uB2F9\uD0D5\uD0D5 \uD68C\uC0AC\uC5D0 Vue.js\uB97C \uB3C4\uC785\uD55C \uC0BD\uC9C8\uAE30\\n\\n- \uAD6D\uB0B4 \uCD5C\uACE0 \uAD11\uACE0 \uCC28\uB2E8 \uC5B4\uD50C \uC720\uB2C8\uCF58 \uAC1C\uBC1C\uC790\\n- \uAD00\uB9AC\uC790 \uD398\uC774\uC9C0\uB97C Vue.js\uB85C \uAC1C\uBC1C\uD558\uACE0 \uC2E4\uC81C \uC11C\uBE44\uC2A4 \uC911\\n- \uC8FC\uC81C: Vue.js\uB97C \uC0AC\uC6A9\uD574\uC11C \uD504\uB85C\uC81D\uD2B8\uB97C \uC9C4\uD589\uD55C \uACBD\uD5D8 \uACF5\uC720\\n- Vue.js\uB97C \uB3C4\uC785\uD55C \uC774\uC720\\n  - \uC8FC\uBA39\uAD6C\uAD6C\uC2DD \uCF54\uB4DC \uC791\uC5C5\uC73C\uB85C \uC778\uD574 \uAD00\uB9AC\uA
1C00 \uC548\uB418\uB294 \uCF54\uB4DC\\n  - React.js \uB3C4\uC785 \uC2E4\uD328\uB85C \uC778\uD55C \uC2DC\uAC04 \uC190\uC2E4\\n    - \uCEF4\uD3EC\uB10C\uD2B8 \uAD6C\uC870\uC5D0 \uB300\uD55C \uC774\uD574 \uBD80\uC871\\n    - \uD55C\uBC88\uC5D0 \uBAA8\uB4E0\uAC78 \uC801\uC6A9\uD558\uB824\uACE0 \uC774\uAC83\uC800\uAC83 \uB3C4\uC785\\n  - \uAC00\uC7A5 \uC801\uC740 \uBE44\uC6A9\uC73C\uB85C \uB3C4\uC785\uC774 \uAC00\uB2A5\uD560 \uAC83 \uAC19\uC544\uC11C\\n    - \uAC00\uC7A5 \uD070 \uC7A5\uC810: \uACF5\uC2DD \uD648\uD398\uC774\uC9C0\uAC00 \uD55C\uAE00\uC774\uACE0, \uBC14\uB85C \uAC80\uC0C9\uD574\uC11C \uC790\uB8CC\uB97C \uCC3E\uC744 \uC218 \uC788\uB2E4.\\n    - \uB2E8\uC77C \uD30C\uC77C\uB0B4\uC5D0 \uBAA8\uB4E0 \uC791\uC5C5\uC744 \uD560 \uC218 \uC788\uB2E4. ( \uB2E8\uC77C \uD30C\uC77C \uCEF4\uD3EC\uB10C\uD2B8 )\\n  - \uC2EC\uD50C\uD558\uBA74\uC11C \uBAA8\uB4E0 \uAE30\uB2A5\uC744 \uAC00\uC9C0\uACE0 \uC788\uC5B4\uC11C\\n  - \uD68C\uC0AC\uC5D0\uC11C \uC6B0\uB824\uD55C \uC0AC\uD56D\\n    - \uB300\uC911\uC801\uC774\uC9C0 \uBABB\uD558\uACE0, \uC778\uC218\uC778\uACC4\uC5D0 \uB300\uD55C \uC5B4\uB824\uC6C0\uC774 \uC0DD\uAE38 \uAC00\uB2A5\uC131\uC774 \uB192\uB2E4\\n    - Vue\uC758 \uBA54\uC774\uC800 \uD6C4\uC6D0\uC0AC \uC5EC\uBD80\\n  - \uB3C4\uC785 \uACFC\uC815\\n    - \uAD6C\uB9E4\uD55C Bootstrap \uD14C\uB9C8\uAC00 \uC801\uC6A9 \uAC00\uB2A5\uD55C \uD14C\uB9C8 \uC608\uC81C \uD655\uBCF4 ( Vue Admin LTE Theme )\\n    - Bootstrap \uD14C\uB9C8 \uC801\uC6A9 \uBC0F \uD504\uB85C\uC81D\uD2B8 \uAD6C\uC870 \uC7A1\uAE30\\n      - \uC0AC\uC6A9\uB41C jQuery \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB85C \uC778\uD55C \uC9C0\uC800\uBD84\uD55C \uCF54\uB4DC\\n      - Router \uD398\uC774\uC9C0 \uC774\uB3D9 \uCC98\uB9AC\\n      - Rest Paameter \uB370\uC774\uD130\uAC00 \uC5C6\uC744 \uB54C 404 \uCC98\uB9AC\\n    - \uB2E8\uC77C \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uAD6C\uC131\uB41C\uAC83\uB4E4\uC744 \uC7AC\uC0AC\uC6A9 \uB418\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uAE30\uC900\uC73C\uB85C \uBD84\uB9AC\\n    - \uB808\uAC70\uC2DC \uCF54\uB4DC\uB4E4\uC744 \uC21C\uC218 vue \uCF54\uB4DC\uB85C \uBCC0\uD658\uD560 \uC608\uC815\\n- \uB3C4\uC785 \uD6C4 \uB290\uB080\uC810\\n  - \uBB38\uC11C\uB9CC \uBCF4\uACE0 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC744 \uC815\uB3C4\uC758 \uD504\uB808\uC784\uC6CC\uD06C\\n  - \uD55C\uAE00 \uBB38\uC11C\uAC00 \uAD49\uC7A5\uD788 \uB9E4\uB825\uC801\uC774\uB2E4\\n  - jQuery\uC758 \uB2AA\\n  - JavaScript\uC758 this\uAC00 \uD56D\uC0C1 \uC5B4\uB835\uAC8C \uB290\uAEF4\uC9C4\uB2E4\\n  - \uCEF4\uD3EC\uB10C\uD2B8 \uAE30\uBC18\uC758 \uC791\uC5C5\uC5D0 \uB300\uD55C \uB450\uB824\uC6C0\uC774 \uC0AC\uB77C\uC84C\uB2E4\\n  - \uC0BD\uC9C8\uC774 \uB2F5\uC774\uB2E4\\n\\n## \uBC31\uC5D4\uB4DC \uAC1C\uBC1C\uC790, \uC785\uBB38\uC790\uB85C\uC11C Vue \uC774\uD574\uD558\uACE0 \uC0AC\uC6A9\uD558\uB2E4\\n\\n- Python back-end \uAC1C\uBC1C\uC790 ( Prototype.js, jQuery \uC138\uB300 )\\n- Vue.js\uB97C \uB3C4\uC785\uD55C \uC774\uC720\\n  - React, Angular.js\uC5D0 \uBE44\uD574 \uB35C \uC720\uBA85\uD55C\uAC70 \uAC19\uC544\uC11C\\n    - \uC0DD\uD0DC\uACC4\uC5D0 \uB4E4\uC5B4\uC640\uBCF4\uB2C8 \uC0AC\uC6A9\uC790\uAC00 \uC0DD\uAC01\uBCF4\uB2E4 \uB9CE\uC544\uC11C \uC2E4\uB9DD(?)\\n  - \uACF5\uC2DD \uBB38\uC11C\uC758 \uAE00\uD22C\uAC00 \uB2E4\uC815\uD574\uC11C\\n  - \uC804\uD658 \uBE44\uC6A9\uC774 \uB0AE\uC544\uC11C\\n    - EJS + jQuery ==&gt; Vue.js\\n- \uC8FC\uC81C: back-end \uAC1C\uBC1C\uC790\uAC00 front-end \uAC1C\uBC1C \uC0AC\uACE0\uB97C \uC775\uD600\uAC00\uB294 \uBA85\uB791 \uC131\uC7A5\uAE30\\n- \uAC1C\uB150 \uBE44\uC720\\n  - \uD504\uB9AC\uC820\uD14C\uC774\uC158\\n  - \uC2A4\uD504\uB808\uB4DC\uC2DC\uD2B8\\n- \uBC18\uC751\uD615 \uB3D9\uC791\uACFC \uB3D9\uAE30\uC2DD \uB3D9\uC791\\n  - \uD2B9\uC815 \uB370\uC774\uD130\uC758 \uC0C1\uD0DC\uC5D0 \uC758\uC874\uD558\uB294 \uB3D9\uC791(behavior)\uC740 \uC608\uC0C1\uACFC \uC758\uB3C4\uB300\uB85C \uB3D9\uC791\uD558\uC9C0 \uC54A\uAE30\uB3C4 \uD55C\uB2E4\\n  - \uB370\uC774\uD130\uC758 \uC758\uC874 \uAD00\uACC4\uC640 \uACC4\uCE35 \uAD6C\uC870 \uC124\uACC4\uAC00 \uD544\uC694\uD558\uB2E4\\n    - UI\uAC00 \uBC18\uC751\uD560 \uB370\uC774\uD130\uC758 \uC758\uC874\uACFC \uACC4\uCE35 \uAD6C\uC870\uB97C \uACE0\uBBFC\\n  - \uB370\uC774\uD130\uB97C \uC81C\uC5B4\uD558\uC5EC UI \uC694\uC18C\uB97C \uC81C\uC5B4\uD55C\uB2E4\uB294 \uAD00\uC810 \uC804\uD658\\n- \uBC18\uBCF5\uB418\uB294 \uCF54\uB4DC\\n  - UI \uC694\uC18C\uB97C \uB2E8\uC704 \uC694\uC18C\uB85C \uBCF4\uC9C0 \uC54A\uACE0, \uB370\uC774\uD130 \uC81C\uC5B4 \uC218\uB2E8\uC73C\uB85C \uC811\uADFC\uD55C \uAE30\uC874 \uAD00\uC810\\n    - \uD15C\uD50C\uB9BF \uCF54\uB4DC\uAC00 \uAE38\uC5B4\uC838 \\\\*.vue \uD3B8\uC9D1\uC774 \uBD88\uD3B8\uD558\uB2E4\\n  - \uB3D9\uC77C \uBAA9\uC801\uB2F9 \uD55C \uB2E8\uC704 \uCEF4\uD3EC\uB10C\uD2B8\uB85C \uC791\uC131\\n- \uCEF4\uD3EC\uB10C\uD2B8\\n  - \uC7AC\uC0AC\uC6A9 \uAC00\uB2A5\uD55C UI \uC694\uC18C \uB2E8\uC704\\n  - UI \uC694\uC18C\uB97C \uAC1C\uCCB4\uD654\uD558\uC5EC \uC7AC\uC0AC\uC6A9\uC131\uACFC \uC758\uC874\uC131 \uAD00\uB9AC\\n    - Python\uC758 \uC6F9 \uD504\uB808\uC784\uC6CC\uD06C\uC778 Django \uC758 App\uACFC \uC720\uC0AC\\n  - \uC7AC \uC0AC\uC6A9\uC758 JavaScript \uCF54\uB4DC \uB2E8 \uC758\uBBF8\\n    - \uCEF4\uD3EC\uB10C\uD2B8\uC758 `data`\uAC00 \uD568\uC218\uC778 \uC774\uC720\uB294?\\n      - \uCEF4\uD3EC\uB10C\uD2B8\uC758 \uAE30\uC900\uC740 _\uC7AC\uC0AC\uC6A9\uC131_ \uC778\uB370, Object\uB85C \uC0AC\uC6A9\uD558\uAC8C \uB420 \uACBD\uC6B0 \uB370\uC774\uD130\uAC00 \uCC38\uC870\uB418\uC5B4 \uCEF4\uD3EC\uB10C\uD2B8\uAC04\uC758 \uC601\uD5A5\uC744 \uC904 \uC218 \uC788\uAE30 \uB54C\uBB38\uC774\uB2E4\\n  - store \uD328\uD134, slot\\n- REST API \uAD00\uC810 \uBCC0\uD654\\n  - SSR\\n    - \uD45C\uD604\uB2E8\uC5D0 \uB370\uC774\uD130\uB97C \uC804\uB2EC\uD558\uB294 \uBC29\uBC95\uC740 \uB2E4\uC18C \uB290\uC2A8\uD558\uACE0 \uAC8C\uC73C\uB974\uAC8C \uC811\uADFC\\n  - RESTfulAPI \uAD6C\uD604\\n    - UI \uD45C\uD604\uC5D0 \uD544\uC694\uD55C \uB370\uC774\uD130\uB97C \uC804\uB2EC\\n  - \uBCC0\uD654\uD558\uB294 \uAD00\uC810\\n    - UI\uAC00 \uBC18\uC751\uD560 \uB370\uC774\uD130\uC5D0 \uD544\uC694\uD55C \uB370\uC774\uD130\uB97C \uACE0\uBBFC\\n- Vue.js\uB294 React\uC5D0 \uBE44\uD574 \uC0C1\uB300\uC801\uC73C\uB85C \uBCC0\uD654\uAC00 \uC801\uC740\uD3B8\uC774\uB2E4\\n\\n## \uC6F9 \uB514\uC790\uC774\uB108\uC758 \uB3C4\uC804 Vue.js \uB530\uB77C\uD558\uAE30\\n\\n- \uC54C\uACE0\uB7A9 \uB514\uC790\uC774\uB108\\n- \uB2E8\uC77C \uD398\uC774\uC9C0\uC778\uB370 jQuery\uB85C \uBAA8\uB4E0 \uC0C1\uD0DC \uBCC0\uD654 \uCC98\uB9AC ( \uCF54\uB4DC\uB294 \uC57D 4,000\uB77C\uC778 )\\n- jQuery \uBCF4\uB2E4 \uC88B\uC544\uBCF4\uC774\uACE0, React \uBCF4\uB2E4 \uC27D\uACE0 \uC88B\uC544\uBCF4\uC5EC\uC11C \uC0AC\uC6A9\uD558\uAE30 \uC2DC\uC791\\n- 02:05:29 + a \uC815\uB3C4 \uC2DC\uAC04\uC744 \uD22C\uC790\uD558\uC5EC \uACF5\uBD80\\n- \uB514\uC790\uC774\uB108\uB3C4 \uC870\uAE08\uB9CC \uB178\uB825\uD558\uBA74 \uC27D\uAC8C \uC811\uADFC\uD560 \uC218 \uC788\uB2E4\\n\\n## Vue.js\uC640 Firebase \uD65C\uC6A9\uAE30\\n\\n- \uAC00\uBE44\uC544 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uD300\\n- Vue.js\uB97C \uB3C4\uC785\uD55C \uC774\uC720\\n  - \uB2E4\uB978 \uD504\uB808\uC784\uC6CC\uD06C\uC5D0 \uBE44\uD574 \uB7EC\uB2DD\uCF54\uC2A4\uD2B8\uAC00 \uC801\uAC8C \uB4E0\uB2E4\\n  - \uB2E8\uC77C \uD30C\uC77C \uCEF4\uD3EC\uB10C\uD2B8 (\\\\*.vue)\\n  - \uC720\uC5F0\uD568\\n  - \uAC00\uBCBC\uC6C0\\n  - \uD55C\uAD6D\uC5B4 \uAC00\uC774\uB4DC \uBB38\uC11C\uAC00 \uC798\uB418\uC5B4 \uC788\uC74C\\n- Firebase\uB97C \uC120\uD0DD\uD55C \uC774\uC720\\n  - \uC6F9, iOS, Android \uAC1C\uBC1C\uC5D0 \uD544\uC694\uD55C \uC11C\uBE44\uC2A4\uB97C \uC81C\uACF5\uD558\uB294 BaaS (Back-end As A Service)\\n  - \uC9C1\uC811 back-end\uB97C \uAD6C\uC131\uD560 \uD544\uC694\uAC00 \uC5C6\uC5B4 \uC2DC\uAC04 \uB2E8\uCD95\uC5D0 \uB3C4\uC6C0\\n- \uAC1C\uBC1C \uD504\uB85C\uC138\uC2A4\\n  - FireBase \uC14B\uD305\\n  - Vue.js \uC14B\uD305\\n  - \uD504\uB85C\uC81D\uD2B8\uC5D0 \uD544\uC694\uD55C \uB77C\uC774\uBE0C\uB7EC\uB9AC \uCD94\uAC00\\n    - VueFire\\n    - firebase\\n    - firebase-tools\\n    - vue-blu\\n  - FireBase \uC5F0\uACB0\\n  - \uBE4C\uB4DC\\n  - \uBC30\uD3EC\\n\\n## Nuxt\uB85C \uC0AC\uB0B4 \uC11C\uBE44\uC2A4 \uAD6C\uD604\uD558\uBA74\uC11C \uC5BB\uC740 \uACBD\uD5D8 \uACF5\uC720\\n\\n- \uB370\uBE0C\uC2DC\uC2A4\uD130\uC988 \uC6F9\uC140 \uD504\uB860\uD2B8\uC5D4\uB4DC \uAC1C\uBC1C\uC790\\n- React \uC758 Next.js : Vue \uC758 Nuxt.js\\n- Web Development Nowaday\\n  - Component, C
1ontainer, Store\\n  - SSR\\n  - Router W/History API\\n  - ECMAScript\\n  - Hot Module Reloading\\n  - SASS\\n- Full Packages === Nuxt.js\\n- Isomorphic JavaScript\\n  - \uC8FC\uC758\uD560\uC810\\n  - Diffrent Context\\n  - Tree Shaking\\n- REST API Mocking Tool: json-server\\n- JavaScript\uB97C \uCC28\uB2E8\uD558\uB354\uB77C\uB3C4 \uC77C\uC815 \uBD80\uBD84 \uCEE8\uD150\uCE20\uB97C \uC81C\uACF5\uD560 \uC218 \uC788\uC74C\\n- \uC0DD\uC0B0\uC131\uC774 \uC815\uB9D0 \uC88B\uC544\uC9D0"},{"id":"async-await","metadata":{"permalink":"/blog/async-await","source":"@site/blog/2017-04-17-async-await/index.md","title":"async-await","description":"Node.js\uB294 JavaScript\uB97C \uC0AC\uC6A9\uD558\uBA70 Non-block I/O, \uB2E8\uC77C \uC2A4\uB808\uB4DC \uC774\uBCA4\uD2B8 \uB8E8\uD504\uB97C \uC0AC\uC6A9\uD558\uC5EC \uB192\uC740 \uD37C\uD3EC\uBA3C\uC2A4\uB97C \uC790\uB791\uD558\uB294 \uC5B8\uC5B4\uC774\uB2E4.","date":"2017-04-17T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":0.98,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"async-await","slug":"async-await","date":"2017-04-17T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"Node.js\uB294 JavaScript\uB97C \uC0AC\uC6A9\uD558\uBA70 Non-block I/O, \uB2E8\uC77C \uC2A4\uB808\uB4DC \uC774\uBCA4\uD2B8 \uB8E8\uD504\uB97C \uC0AC\uC6A9\uD558\uC5EC \uB192\uC740 \uD37C\uD3EC\uBA3C\uC2A4\uB97C \uC790\uB791\uD558\uB294 \uC5B8\uC5B4\uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"Vuetiful Korea (Vue.js \uD55C\uAD6D\uC5B4 \uC0AC\uC6A9\uC790 \uBAA8\uC784) 1\uD68C \uBAA8\uC784","permalink":"/blog/vuetiful-korea-1"},"nextItem":{"title":"Webpack","permalink":"/blog/webpack"}},"content":"\x3c!-- truncate --\x3e\\n\\n## async-await\\n\\nNode.js\uB294 JavaScript\uB97C \uC0AC\uC6A9\uD558\uBA70 Non-block I/O, \uB2E8\uC77C \uC2A4\uB808\uB4DC \uC774\uBCA4\uD2B8 \uB8E8\uD504\uB97C \uC0AC\uC6A9\uD558\uC5EC \uB192\uC740 \uD37C\uD3EC\uBA3C\uC2A4\uB97C \uC790\uB791\uD558\uB294 \uC5B8\uC5B4\uC774\uB2E4.\\n\\nNode.js\uB85C \uBE44\uB3D9\uAE30\uC2DD \uCF54\uB4DC\uB97C \uC791\uC131\uD558\uBA74 \uC544\uB798\uC640 \uAC19\uC740 \uCF54\uB4DC\uAC00 \uB098\uC628\uB2E4\\n\\n```js\\nrequest(\'http://naver.com\', (error, response, body) => {\\n    success(body)\\n})\\n```\\n\\ncallback\uC774 \uC704\uC640 \uAC19\uC774 \uB2E8\uC21C\uD558\uB2E4\uBA74 \uD06C\uAC8C \uBB38\uC81C\uAC00 \uC5C6\uC73C\uBA70, \uC810\uC810 \uC694\uAD6C\uC0AC\uD56D\uC774 \uBCF5\uC7A1\uD574\uC9C0\uBA74\uC11C **Callback Hell** \uC774 \uC2DC\uC791\uB41C\uB2E4\\n\\n```js\\nrequest(\'http://naver.com\', (error1, resp1, body1) => {\\n    request(\'http://google.com\', (error2, resp2, body2) => {\\n        request(\'http://daum.net\', (error3, resp3, body3) => {\\n            success(body1, body2, body3)\\n        })\\n    })\\n})\\n```\\n\\n\uB2F9\uC7A5 \uC704\uC758 \uCF54\uB4DC\uB9CC \uBD10\uB3C4 \uAD49\uC7A5\uD788 \uB2F5\uB2F5\uD568\uC744 \uB290\uB084 \uC218 \uC788\uB2E4. \uC774\uB7EC\uD55C \uBB38\uC81C\uB4E4\uC744 \uD574\uACB0\uD558\uAE30 \uC704\uD574 \uB9CE\uC740 \uC6C0\uC9C1\uC784\uB4E4\uC774 \uC788\uC5C8\uACE0, 2014\uB144 \uCC28\uAE30 ES6 \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uADDC\uACA9\uC5D0 `Promises/A+` \uC2A4\uD399\uC774 \uD655\uC815\uB418\uBA74\uC11C \uC5B4\uB290\uC815\uB3C4 \uD574\uACB0\uB418\uC5C8\uB2E4\\n\\n```js\\nPromise.all([\\n    request(\'http://naver.com\'),\\n    request(\'http://google.com\'),\\n    request(\'http://daum.net\')\\n]).then(success, error)\\n```\\n\\n\uD558\uC9C0\uB9CC, \uB354 \uBCF5\uC7A1\uD55C \uB85C\uC9C1\uC758 \uC5B4\uD50C\uB9AC\uCF00\uC774\uC158\uC744 \uAC1C\uBC1C\uD558\uB2E4\uBCF4\uBA74 Promise \uB3C4 \uBCF5\uC7A1\uD574\uC838\uC11C \uCF54\uB4DC \uC77D\uAE30\uAC00 \uAD49\uC7A5\uD788 \uD798\uB4E4\uC5B4\uC9C0\uB294 \uC0C1\uD669\uC774 \uC654\uB2E4.\\n\\n\uC774\uB7EC\uD55C \uC0C1\uD669\uC744 \uD574\uACB0\uD558\uAE30 \uC704\uD574 C# \uC5D0\uC11C \uBE44\uB3D9\uAE30 \uD1B5\uC2E0\uC744 \uAD6C\uD604\uD560 \uB54C \uC0AC\uC6A9\uD558\uB294 `Async/Await` \uBB38\uBC95\uC744 JavaScript\uC5D0 \uB3C4\uC785\uD558\uAE30\uB85C \uD588\uACE0, Node.js 7.6+ \uBD80\uD130 \uC815\uC2DD\uC73C\uB85C \uC9C0\uC6D0\uD558\uACE0 \uC788\uB2E4.\\n\\n```js\\nasync function doComplicateJob() {\\n    const naver = await request(\'http://naver.com\')\\n    const google = await request(\'http://google.com\')\\n    const daum = await request(\'http://daum.net\')\\n    console.log(daum)\\n    return {naver, google, daum}\\n}\\n\\ndoComplicateJob().then(success, error)\\n```\\n\\n`async-await`\uC758 \uBCF8\uC9C8\uC740 `Promise` \uC774\uB2E4. async \uC9C0\uC2DC\uC790\uAC00 \uBD99\uC740 \uD568\uC218\uB294 \uBC18\uB4DC\uC2DC Promise\uB97C \uBC18\uD658\uD55C\uB2E4.\\n\\n\uB610\uD55C await \uC9C0\uC2DC\uC790\uAC00 \uBD99\uC740 Promise\uB294 `<Pending>` \uC0C1\uD0DC\uC5D0\uC11C `<Resolved>` \uD639\uC740 `<Rejected>
1` \uB85C \uC0C1\uD0DC\uAC00 \uBCC0\uD654\uD560 \uB54C \uAE4C\uC9C0 \uAE30\uB2E4\uB824\uC900\uB2E4.\\n\\n`async-await`\uB97C \uC0AC\uC6A9\uD55C\uB2E4\uACE0 Synchronize \uB3D9\uC791\uD558\uB294\uAC83\uC740 \uC544\uB2C8\uC9C0\uB9CC, \uB9C8\uCE58 \uB3D9\uAE30\uC2DD \uCF54\uB4DC\uC778\uAC83\uCC98\uB7FC \uC77D\uC744 \uC218 \uC788\uAC8C \uB41C\uB2E4.\\n\\n\uC774\uC804\uC5D0 10\uC911 **Callback Hell**\uC744 \uB9DB\uBCF4\uACE0 \uB098\uC11C, \uC5B4\uB5BB\uAC8C \uD574\uC57C \uAE54\uB054\uD558\uAC8C \uC791\uC131\uD560 \uC218 \uC788\uC744\uAE4C \uACE0\uBBFC\uD558\uACE0 \uC788\uC5C8\uB294\uB370 `Promise` \uC640 `async/await`\uB97C \uC0AC\uC6A9\uD574\uBCF4\uB2C8 \uC774\uC804\uC5D0 \uBE44\uD574 \uD6E8\uC52C \uAE54\uB054\uD558\uAC8C \uC791\uC131\uD560 \uC218 \uC788\uAC8C \uB418\uC5C8\uB2E4.\\n\\n### \uCC38\uACE0\\n\\n- http://tc39.github.io/ecmascript-asyncawait/\\n- [Javascript \uBE44\uB3D9\uAE30 Callback, Promise, Async/Await](http://blog.naver.com/PostView.nhn?blogId=bitofsky&logNo=220850909832&categoryNo=0&parentCategoryNo=53&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView)"},{"id":"webpack","metadata":{"permalink":"/blog/webpack","source":"@site/blog/2017-04-17-webpack/index.md","title":"Webpack","description":"\uBCC4\uB3C4\uB85C \uBD84\uB9AC\uB418\uC5B4\uC788\uB294 JavaScript \uBAA8\uB4C8\uB4E4\uC758 \uC758\uC874\uC131\uC744 \uAC80\uC0AC\uD558\uACE0 N\uAC1C\uC758 \uD30C\uC77C\uB85C \uBB36\uB294\uB2E4. \uC774\uB97C \uBC88\uB4E4\uB9C1\uC774\uB77C\uACE0 \uD558\uBA70, Webpack\uC740 \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uBC88\uB4E4\uB7EC \uC911 \uD558\uB098\uC774\uB2E4.","date":"2017-04-17T00:00:00.000Z","tags":[{"inline":false,"label":"JavaScript","permalink":"/blog/tags/javascript"}],"readingTime":0.71,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Webpack","slug":"webpack","date":"2017-04-17T00:00:00.000Z","authors":["dongmyeong"],"tags":["javascript"],"description":"\uBCC4\uB3C4\uB85C \uBD84\uB9AC\uB418\uC5B4\uC788\uB294 JavaScript \uBAA8\uB4C8\uB4E4\uC758 \uC758\uC874\uC131\uC744 \uAC80\uC0AC\uD558\uACE0 N\uAC1C\uC758 \uD30C\uC77C\uB85C \uBB36\uB294\uB2E4. \uC774\uB97C \uBC88\uB4E4\uB9C1\uC774\uB77C\uACE0 \uD558\uBA70, Webpack\uC740 \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uBC88\uB4E4\uB7EC \uC911 \uD558\uB098\uC774\uB2E4."},"unlisted":false,"prevItem":{"title":"async-await","permalink":"/blog/async-await"},"nextItem":{"title":"Object Join","permalink":"/blog/javascript-object-join"}},"content":"\x3c!-- truncate --\x3e\\n\\n## Webpack\\n\\n\uBCC4\uB3C4\uB85C \uBD84\uB9AC\uB418\uC5B4\uC788\uB294 JavaScript \uBAA8\uB4C8\uB4E4\uC758 \uC758\uC874\uC131\uC744 \uAC80\uC0AC\uD558\uACE0 N\uAC1C\uC758 \uD30C\uC77C\uB85C \uBB36\uB294\uB2E4. \uC774\uB97C \uBC88\uB4E4\uB9C1\uC774\uB77C\uACE0 \uD558\uBA70, Webpack\uC740 \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uBC88\uB4E4\uB7EC \uC911 \uD558\uB098\uC774\uB2E4.\\n\\n\uB2E4\uB978 \uBC88\uB4E4\uB7EC\uB85C\uB294 browserify, roullup.js \uB4F1\uC774 \uC788\uB2E4.\\n\\n![Webpack](./image-1.webp)\\n\\n### \uC124\uCE58\\n\\n```text\\n$ npm install webpack --save-dev\\n```\\n\\n### \uC0AC\uC6A9\\n\\n```js\\n// hello.js\\nmodule.exports = \'Hello\'\\n\\n// world.js\\nmodule.exports = \'World\'\\n\\n// entry.js\\nconst hello = require(\'./hello\')\\nconst world = require(\'./world\')\\nconsole.log(hello + world)\\n```\\n\\n```bash\\n$ webpack entry.js bundle.js\\nHash: 9e568770bce462c4b398\\nVersion: webpack 2.4.1\\nTime: 79ms\\n    Asset     Size  Chunks             Chunk Names\\nbundle.js  2.92 kB       0  [emitted]  main\\n   [0] ./hello.js 25 bytes {0} [built]\\n   [1] ./world.js 25 bytes {0} [built]\\n   [2] ./entry.js 93 bytes {0} [built]\\n\\n$ node bundle.js\\n>> Helloworld\\n```\\n\\n### \uC124\uC815\\n\\n`command line`\uC73C\uB85C webpack\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC9C0\uB9CC, \uC635\uC158\uACFC \uC124\uC815\uB4E4\uC774 \uB2E4\uC591\uD574\uC9C0\uBA74 \uBA85\uB839\uC5B4\uAC00 \uBCF5\uC7A1\uD574\uC9C0\uACE0 \uD55C\uACC4\uAC00 \uC0D
1D\uAE30\uBBC0\uB85C \uC124\uC815 \uD30C\uC77C\uC744 \uBD84\uB9AC\uD574\uC11C \uC0AC\uC6A9\uD55C\uB2E4.\\n\\n```js\\n// webpack.config.js\\nmodule.exports = {\\n    entry: {\\n        \'entry\': \'./entry.js\'\\n    },\\n    output: {\\n        filename: \'bundle.js\'\\n    }\\n}\\n\\n// package.json\\n{\\n  \\"dependencies\\": {},\\n  \\"devDependencies\\": {\\n    \\"webpack\\": \\"^2.4.1\\"\\n  },\\n  \\"scripts\\": {\\n    \\"build\\": \\"webpack entry.js bundle.js\\"\\n  }\\n}\\n```\\n\\n```bash\\n$ npm run build\\nHash: 048e62e002d64d39acb9\\nVersion: webpack 2.4.1\\nTime: 70ms\\n    Asset     Size  Chunks             Chunk Names\\nbundle.js  2.92 kB       0  [emitted]  entry\\n   [0] ./hello.js 25 bytes {0} [built]\\n   [1] ./world.js 25 bytes {0} [built]\\n   [2] ./entry.js 93 bytes {0} [built]\\n```\\n\\n\uC704\uC758 \uC608\uC81C\uB294 \uC544\uC8FC \uAE30\uBCF8\uC801\uC778 \uBC29\uBC95\uC774\uB2E4.\\n\\n\uC774 \uC678\uC5D0\uB3C4 babel transpiler, eslint, css-loader, file-loader \uB4F1 \uB2E4\uC591\uD55C \uC124\uC815\uC744 \uD1B5\uD558\uC5EC \uBA4B\uC9C0\uACE0 \uC544\uB984\uB2F5\uAC8C(?) \uBC88\uB4E4\uB9C1\uC744 \uD560 \uC218 \uC788\uB2E4.\\n\\n### \uCC38\uACE0\\n\\n- http://d2.naver.com/helloworld/0239818\\n- https://webpack.js.org/"},{"id":"javascript-object-join","metadata":{"permalink":"/blog/javascript-object-join","source":"@site/blog/2017-04-14-javascript-object-join/index.md","title":"Object Join","description":"","date":"2017-04-14T00:00:00.000Z","tags":[{"inline":false,"label":"JavaScript","permalink":"/blog/tags/javascript"}],"readingTime":0.12,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Object Join","slug":"javascript-object-join","date":"2017-04-14T00:00:00.000Z","authors":["dongmyeong"],"tags":["javascript"],"description":""},"unlisted":false,"prevItem":{"title":"Webpack","permalink":"/blog/webpack"},"nextItem":{"title":"forEach \uC640 Some","permalink":"/blog/foreach-and-some"}},"content":"\x3c!-- truncate --\x3e\\n\\n## object join\\n\\n```js\\nconst join =  (obj, glue = \'=\', separator = \'&\') => {\\n\\treturn Object.getOwnPropertyNames(obj).map((key) => {\\n\\t\\treturn [key, obj[key]].join(glue)\\n\\t}).join(separator)\\n}\\n\\nvar obj = {\\n\\tname: \'ClaudeSeo\',\\n\\tage: 21\\n}\\nconsole.log(join(obj))\\n\\n>> name=ClaudeSeo&age=21\\n```"},{"id":"foreach-and-some","metadata":{"permalink":"/blog/foreach-and-some","source":"@site/blog/2017-04-13-foreach-and-some/index.md","title":"forEach \uC640 Some","description":"JavaScript \uC5D0\uC11C\uB3C4 \uCEEC\uB809\uC158\uC758 \uC694\uC18C\uB97C \uBC18\uBCF5\uD560 \uC218 \uC788\uB294 forEach \uBB38\uC774 \uC874\uC7AC\uD55C\uB2E4. \uC0AC\uC6A9\uBC95\uC740 \uAC04\uB2E8\uD558\uB2E4","date":"2017-04-13T00:00:00.000Z","tags":[{"inline":false,"label":"JavaScript","permalink":"/blog/tags/javascript"}],"readingTime":0.37,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"forEach \uC640 Some","slug":"foreach-and-some","date":"2017-04-13T00:00:00.000Z","authors":["dongmyeong"],"tags":["javascript"],"description":"JavaScript \uC5D0\uC11C\uB3C4 \uCEEC\uB809\uC158\uC758 \uC694\uC18C\uB97C \uBC18\uBCF5\uD560 \uC218 \uC788\uB294 forEach \uBB38\uC774 \uC874\uC7AC\uD55C\uB2E4. \uC0AC\uC6A9\uBC95\uC740 \uAC04\uB2E8\uD558\uB2E4"},"unlisted":false,"prevItem":{"title":"Object Join","permalink":"/blog/javascript-object-join"},"nextItem":{"title":"UglifyJS","permalink":"/blog/uglifyjs"}},"content":"\x3c!-- truncate --\x3e\\n\\n## forEach and some\\n\\nJavaScript \uC5D0\uC11C\uB3C4 \uCEEC\uB809\uC158\uC758 \uC694\uC18C\uB97C \uBC18\uBCF5\uD560 \uC218 \uC788\uB294 forEach \uBB38\uC774 \uC874\uC7AC\uD55C\uB2E4. \uC0AC\uC6A9\uBC95\uC740 \uAC04\uB2E8\uD558\uB2E4\\n\\n```js\\n[1,2,3,4,5].forEac
1h(function (v) {\\n    console.log(v)\\n})\\n\\n>> 1\\n>> 2\\n>> 3\\n>> 4\\n>> 5\\n```\\n\\nforEach\uBB38\uC5D0\uC11C\uB294 \uC911\uAC04\uC5D0 \uBC18\uBCF5\uC744 \uC911\uB2E8\uD560 \uC218 \uC788\uB294 `break` \uBB38\uC774 \uC5C6\uB2E4.\\n\\nError Exception\uC744 \uBC1C\uC0DD\uC2DC\uCF1C \uBA48\uCD94\uB294 \uBCC0\uD0DC\uC801\uC778 \uBC29\uBC95\uC774 \uC788\uC9C0\uB9CC, \uC544\uB798\uC758 \uC608\uC81C\uC5D0\uC11C \uBCF4\uB2E4\uC2DC\uD53C \uAD49\uC7A5\uD788 \uC9C0\uC800\uBD84\uD558\uACE0 \uAC00\uB3C5\uC131\uC774 \uC548\uC88B\uB2E4.\\n\\n```js\\nvar StopException = new Error(\'StopException\')\\ntry {\\n    [1,2,3,4,5].forEach(function (v) {\\n        console.log(v)\\n        if (v == 2) {\\n            throw StopException\\n        }\\n    })\\n} catch (e) {\\n    if (e !== StopException) {\\n        throw e\\n    }\\n}\\n\\n>> 1\\n>> 2\\n```\\n\\n\uC774\uB97C \uB300\uC2E0\uD574\uC11C \uC0AC\uC6A9\uD560 \uC218 \uC788\uB294 \uD568\uC218\uAC00 \uBC14\uB85C `some()` \uC774\uB2E4. `some()` \uD568\uC218\uB294 \uBC18\uBCF5\uD558\uB294 \uB3C4\uC911 `true` \uAC12\uC774 \uBC18\uD658\uB418\uBA74 \uBC18\uBCF5\uC744 \uC911\uB2E8\uD55C\uB2E4.\\n\\n```js\\n[1,2,3,4,5].some(function (v) {\\n    console.log(v)\\n    return v == 2\\n})\\n\\n>> 1\\n>> 2\\n>> true\\n```"},{"id":"uglifyjs","metadata":{"permalink":"/blog/uglifyjs","source":"@site/blog/2017-04-12-uglifyjs/index.md","title":"UglifyJS","description":"uglifyjs\uB294 \uC8FC\uC694 \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uC5D0\uC11C \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uC555\uCD95 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB2E4","date":"2017-04-12T00:00:00.000Z","tags":[{"inline":false,"label":"Node.js","permalink":"/blog/tags/nodejs"}],"readingTime":0.17,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"UglifyJS","slug":"uglifyjs","date":"2017-04-12T00:00:00.000Z","authors":["dongmyeong"],"tags":["nodejs"],"description":"uglifyjs\uB294 \uC8FC\uC694 \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uC5D0\uC11C \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uC555\uCD95 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB2E4"},"unlisted":false,"prevItem":{"title":"forEach \uC640 Some","permalink":"/blog/foreach-and-some"},"nextItem":{"title":"Vue.js \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/vuejs-introduction"}},"content":"\x3c!-- truncate --\x3e\\n\\n## UglifyJS\\n\\nuglifyjs\uB294 \uC8FC\uC694 \uC790\uBC14\uC2A4\uD06C\uB9BD\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB4E4\uC5D0\uC11C \uAC00\uC7A5 \uB9CE\uC774 \uC4F0\uC774\uB294 \uC555\uCD95 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB2E4\\n\\n### \uC124\uCE58\\n\\n```bash\\n$ npm install uglify-js -g\\n```\\n\\n### \uC0AC\uC6A9\uBC95\\n\\n- output \uD30C\uC77C\uC740 \uAE30\uC874\uC758 \uD30C\uC77C\uBA85\uC5D0\uC11C .min \uC744 \uBD99\uC5EC\uC8FC\uB294\uAC83\uC774 \uC554\uBB35\uC801\uC778 \uADDC\uCE59\uC774\uB2E4\\n- \uB2E4\uC591\uD55C \uC635\uC158\uB4E4\uC774 \uC874\uC7AC\uD558\uBBC0\uB85C github \uB97C \uCC38\uACE0\uD558\uC5EC \uD544\uC694\uD55C \uC635\uC158\uC744 \uB123\uC73C\uBA74 \uB41C\uB2E4\\n\\n```bash\\n$ uglifyjs test.js -o test.min.js [options]\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://github.com/mishoo/UglifyJS2"},{"id":"vuejs-introduction","metadata":{"permalink":"/blog/vuejs-introduction","source":"@site/blog/2017-04-12-vuejs-introduction/index.md","title":"Vue.js \uC54C\uC544\uBCF4\uAE30","description":"\uD754\uD788 \uC54C\uB824\uC9C4 MVC \uD328\uD134\uC5D0\uC11C View\uB9CC \uB2F4\uB2F9\uD558\uB294 \uD504\uB808\uC784\uC6CC\uD06C\uC774\uB2E4","date":"2017-04-12T00:00:00.000Z","tags":[{"inline":false,"label":"Vue.js","permalink":"/blog/tags/vuejs"}],"readingTime":0.81,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Vue.js \uC54C\uC544\uBCF4\uAE30","slug":"vuejs-introduction","date":"2017-04-12T00:00:00.000Z","authors":["dongmyeong"],"tags":["vuejs"],"description":"\uD754\uD788 \uC54C\uB824\uC9C4 MVC \uD328\uD134\uC5D0\uC11C View\uB9CC \uB2F4\uB2F9\uD558\uB294 \uD504\uB808\uC784\uC6CC\uD06C\uC774\uB2E4"},"unlisted":false,"prevItem":{"title":"UglifyJS","permalink":"/blog/uglifyjs"},"nextItem":{"title":"REST API Best Practices","permalink":"/blog/rest-api-best-practices"}},"content":"\x3c!-- truncate --\x3e\\n\\n## **Vue.js**\\n\\n\uD754\uD788 \uC54C\uB824\uC9C4 MVC \uD328\uD134\uC5D0\uC11C View\uB9CC \uB2F4\uB2F9\uD558\uB294 \uD504\uB808\uC784\uC6CC\uD06C\uC774\uB2E4\\n\\n### **\uC124\uCE58**\\n\\n- \uC124\uCE58 \uBC29\uBC95\uC740 CDN, NPM, Bower, AMD \uBAA8\uB4C8 \uB85C\uB354 \uB4F1\uC774 \uC788\uC9C0\uB9CC, \uB098\uB294 NPM\uB9CC \uC0AC\uC6A9\uD560\uAC83\uC774\uB2E4\\n- vue\uB9CC \uBCC4\uB3C4\uB85C \uC124\uCE58\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8\uB97C \uC14B\uD305\uD558\uB294 \uBC29\uBC95\uC774 \uC788\uC9C0\uB9CC \\\\`vue-cli\\\\` \uB77C\uB294 \uC544\uC8FC \uD6CC\uB96D\uD55C \uD234\uC744 \uC81C\uACF5\uD558\uACE0 \uC788\uC73C\uB2C8 \uC774\uB97C \uD1B5\uD574 \uD504\uB85C\uC81D\uD2B8\uB97C \uC14B\uD305\uD55C\uB2E4\\n\\n```bash\\n$ npm install vue-cli -g\\n\\n$ vue init webpack <proejct-name>\\n\\n$ cd <project-name>\\n\\n$ npm install\\n\\n$ npm run dev\\n```\\n\\n### **\uD30C\uC77C \uAD6C\uC870**\\n\\n\uD504\uB85C\uC81D\uD2B8 \uC0DD\uC131\uD560 \uB54C \uC9C0\uC815\uD558\uB294 \uC635\uC158\uC5D0 \uB530\uB77C \uD30C\uC77C \uAD6C\uC870\uAC00 \uB2EC\uB77C\uC9C8 \uC218 \uC788\uB2E4\\n\\n- `/build` : webpack build \uC124\uC815 \uD30C\uC77C\uB4E4 (vue-loader, babel-loader, webpack ...)\\n- `/config` : \uD658\uACBD \uC124\uC815 \uD30C\uC77C\uB4E4 (development, test, production)\\n- `/src/assets` : static \uD30C\uC77C\uB4E4 (\uC774\uBBF8\uC9C0, \uC544\uC774\uCF58, \uD3F0\uD2B8 \uB4F1)\\n- `/src/components` : \uCEF4\uD3EC\uB10C\uD2B8 \uD30C\uC77C\uB4E4\\n- `/src/router/index.js` : vue-router \uC124\uC815 \uD30C\uC77C\\n- `/src/App.vue` : Application \uBA54\uC778 \uCEF4\uD3EC\uB10C\uD2B8\\n- `/test` : e2e, unit \uD14C\uC2A4\uD2B8\\n\\n### **\uCEE8\uC149**\\n\\n- \uCEF4\uD3EC\uB10C\uD2B8 \uB0B4\uBD80\uC5D0 HTML, CSS, JavaScript, Method, Data \uB97C \uBB36\uC5B4\uC11C \uD558\uB098\uC758 \\\\`\\\\*.vue\\\\` \uD30C\uC77C\uB85C \uAD6C\uC131\\n- \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uCD1D 3\uAC00\uC9C0\uC758 \uC601\uC5ED (Language Block)\uB85C \uAD6C\uC131\\n- **&lt;template&gt;**\\n  - HTML\\n  - Jade\\n  - Pug\\n- **&lt;script&gt;**\\n  - JavaScript\\n  - TypeScript\\n  - CoffeeScript\\n- **&lt;style&gt;**\\n  - sass\\n  - less\\n  - css\\n- \uAC01 \uBE14\uB7ED\uC740 **script** \uBE14\uB7ED\uC5D0 \uC815\uC758\uB41C **data**\uC640 **method**\uB97C \uACF5\uC720\uD568\\n- **template** \uBE14\uB7ED\uACFC **script** \uBE14\uB7ED\uC740 \uC591\uBC29\uD5A5 \uB370\uC774\uD130 \uACF5\uC720\uAC00 \uAC00\uB2A5\\n- vue\uB294 \uCEF4\uD3EC\uB10C\uD2B8\uC758 \uC870\uD569\uC73C\uB85C \uC774\uB8E8\uC5B4\uC9C0\uBA70 \uD2B8\uB9AC\uAD6C\uC870\uB97C \uAC00\uC9C0\uACE0 \uC788\uC74C\\n- \uB370\uC774\uD130\uB294 \uBD80\uBAA8 \uCEF4\uD3EC\uB10C\uD2B8\uC5D0\uC11C \uC790\uC2DD \uCE
1F4\uD3EC\uB10C\uD2B8\uB85C \uB370\uC774\uD130\uB97C **\uB2E8\uBC29\uD5A5**\uC73C\uB85C \uC804\uB2EC\uD568\\n\\n### **\uB9DB\uBCF4\uAE30**\\n\\n```html\\n<template>\\n\\t<div class=\\"container\\">\\n\\t\\t<p>Hello {{ name }}</p>\\n\\t</div>\\n</template>\\n\\n<script>\\nexport default {\\n\\tname: \'main\',\\n\\tdata () {\\n\\t\\treturn {\\n\\t\\t\\tname: \'ClaudeSeo\'\\n\\t\\t}\\n\\t}\\n}\\n<\/script>\\n\\n<style scoped>\\n.container {\\n\\twidth: 100%;\\n\\ttext-align: center;\\n}\\n</style>\\n```\\n\\n### **\uCC38\uACE0**\\n\\n- https://kr.vuejs.org/v2/guide/installation.html#Bower\\n- https://www.slideshare.net/sunhyouplee/tour-of-vuejs-70654520"},{"id":"rest-api-best-practices","metadata":{"permalink":"/blog/rest-api-best-practices","source":"@site/blog/2017-04-11-rest-api-best-practices/index.md","title":"REST API Best Practices","description":"\uB2E8\uC218, \uBCF5\uC218\uD615\uC744 \uD63C\uD569\uD558\uC5EC \uC0AC\uC6A9\uD558\uC9C0\uB9D0\uACE0, \uBAA8\uB4E0 \uB9AC\uC18C\uB4DC\uB4E4\uC740 \uBCF5\uC218\uD615 \uBA85\uC0AC\uB9CC \uC0AC\uC6A9\uD574\uB77C","date":"2017-04-11T00:00:00.000Z","tags":[{"inline":false,"label":"\uD504\uB85C\uADF8\uB798\uBC0D \uC77C\uBC18","permalink":"/blog/tags/programming"}],"readingTime":1.31,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"REST API Best Practices","slug":"rest-api-best-practices","date":"2017-04-11T00:00:00.000Z","authors":["dongmyeong"],"tags":["programming"],"description":"\uB2E8\uC218, \uBCF5\uC218\uD615\uC744 \uD63C\uD569\uD558\uC5EC \uC0AC\uC6A9\uD558\uC9C0\uB9D0\uACE0, \uBAA8\uB4E0 \uB9AC\uC18C\uB4DC\uB4E4\uC740 \uBCF5\uC218\uD615 \uBA85\uC0AC\uB9CC \uC0AC\uC6A9\uD574\uB77C"},"unlisted":false,"prevItem":{"title":"Vue.js \uC54C\uC544\uBCF4\uAE30","permalink":"/blog/vuejs-introduction"},"nextItem":{"title":"Git Repository \uC14B\uD305\uD558\uAE30","permalink":"/blog/git-repository-setup"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uB354 \uC88B\uC740 RESTful API\uB97C \uC704\uD55C 10\uAC00\uC9C0 \uC0AC\uB840\\n\\n### 1. \uB3D9\uC0AC \uB300\uC2E0 \uBA85\uC0AC\uB97C \uC0AC\uC6A9\uD574\uB77C\\n\\n**Copy of Untitled**\\n\\n| Resource. | GET (read) | POST (create) | PUT (update) | DELETE |\\n| --- | --- | --- | --- | --- |\\n| /reviews | \uB9AC\uBDF0 \uBAA9\uB85D\uB4E4\uC744 \uBC18\uD658 | \uB9AC\uBDF0 \uC0DD\uC131 | \uBAA8\uB4E0 \uB9AC\uBDF0\uB97C \uB3D9\uC2DC\uC5D0 \uC218\uC815 | \uBAA8\uB4E0 \uB9AC\uBDF0\uB97C \uC0AD\uC81C |\\n| /reviews/1 | 1\uBC88 \uB9AC\uBDF0 \uC815\uBCF4 \uBC18\uD658 | Method not allowd (405) | 1\uBC88 \uB9AC\uBDF0 \uC815\uBCF4 \uC218\uC815 | 1\uBC88 \uB9AC\uBDF0 \uC0AD\uC81C |\\n\\n- \uC544\uB798\uCC98\uB7FC \uC0AC\uC6A9\uD558\uC9C0\uB9C8\uB77C\\n\\n```text\\n/getAllReview\\n/getReview?id=1\\n/createReview\\n/deleteReview?id=1\\n```\\n\\n### 2. GET \uBA54\uC18C\uB4DC\uC640 \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130\uB85C \uC0C1\uD0DC\uB97C \uBCC0\uACBD\uD558\uC9C0\uB9C8\uB77C\\n\\n```text\\nGET /users/activate (x)\\nGET /users?activate (x)\\n\\nPUT /users (o)\\n```\\n\\n### 3. \uBCF5\uC218\uD615\uB9CC \uC0AC\uC6A9\uD574\uB77C\\n\\n\uB2E8\uC218, \uBCF5\uC218\uD615\uC744 \uD63C\uD569\uD558\uC5EC \uC0AC\uC6A9\uD558\uC9C0\uB9D0\uACE0, \uBAA8\uB4E0 \uB9AC\uC18C\uB4DC\uB4E4\uC740 \uBCF5\uC218\uD615 \uBA85\uC0AC\uB9CC \uC0AC\uC6A9\uD574\uB77C\\n\\n```text\\nGET /user (x)\\nGET /users (o)\\n\\nGET /review (x)\\nGET /reviews (o)\\n```\\n\\n### 4. \uB9AC\uC18C\uC2A4\uAC00 \uB2E4\uB978 \uB9AC\uC18C\uC2A4\uC5D0 \uAD00\uACC4\uAC00 \uC788\uC744\uACBD\uC6B0 \uD558\uC704 \uB9AC\uC18C\uC2A4\uB97C \uC0AC\uC6A9\uD574\uB77C\\n\\n```text\\nGET /users/1/reviews ( 1\uBC88 \uC0AC\uC6A9\uC790\uC758 \uB9AC\uBDF0\uB97C \uC804\uBD80 \uBC18\uD658 )\\nGET /users/1/reviews/1 ( 1\uBC88 \uC0AC\uC6A9\uC790\uC758 1\uBC88 \uB9AC\uBDF0\uB97C \uBC18\uD658 )\\n```\\n\\n### 5. HTTP Header\uB97C \uC0AC\uC6A9\uD574\uB77C\\n\\n\uC11C\uBC84\uC640 \uD074\uB77C\uC774\uC5B8\uD2B8\uB294 \uD1B5\uC2E0\uC744 \uD558\uAE30 \uC704\uD574 \uD544\uC694\uD55C \uC815\uC758\uB41C \uD3EC\uB9F7\uC774 \uD544\uC694\uD558\uBA70, HTTP Header\uC5D0 \uC815\uC758\uB418\uC5B4\uC57C \uD55C\uB2E4.\\n\\n```text\\n- Content-Type : \uC804\uC1A1 \uD3EC\uB9F7 ( text/html, text/javascript, */* ... )\\n- Accept : \uC751\uB2F5 \uAC00\uB2A5\uD55C \uD3EC\uB9F7 ( text/html, text/javascript ... )\\n```\\n\\n### 6. HATEOAS\\n\\n- HATEOAS : Hypermedia as the Engine of Application State)\\n- API \uC751\uB2F5\uAC12\uC5D0 link\uB97C \uC81C\uACF5\uD558\uC5EC \uD0D0\uC0C9\uC744 \uC27D\uAC8C\uD560 \uC218 \uC788\uB3C4\uB85D \uD55C\uB2E4\\n\\n```json\\n{\\n    \\"name\\": \\"ClaudeSeo\\"\\n    \\"links\\": [\\n        {\\n            \\"rel\\": \\"self\\",\\n            \\"href\\": \\"/api/v1/users/1\\"\\n        }\\n    ]\\n}\\n```\\n\\n### 7. \uC815\uB82C, \uD544\uD130\uB9C1, \uD544\uB4DC \uC120\uD0DD, \uD398\uC774\uC9C0\uB124\uC774\uC158\uC744 \uC81C\uACF5\uD574\uB77C\\n\\n- Filter : \uACE0\uC720 \uCFFC\uB9AC \uD30C\uB77C\uBA54\uD130\uB97C \uD1B5\uD558\uC5EC \uD544\uD130\uB9C1\uD55C\uB2E4\\n\\n```text\\nGET /users?isActive=1\\n```\\n\\n- Sort : desc(-), asc(+)\uB85C \uD45C\uD604\uD558\uACE0 \uCEEC\uB7FC\uB2E8\uC704\uB85C \uD45C\uD604\uD55C\uB2E4\\n\\n```text\\nGET /users?sort=+id\\n```\\n\\n- Field : \uD544\uC694\uD55C \uD544\uB4DC\uB4E4\uB9CC \uC870\uD68C\uD560 \uC218 \uC788\uB294 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4\\n\\n```text\\nGET /users?fields=id,username\\n```\\n\\n- Pagiantion : offset, limit \uB97C \uC0AC\uC6A9\uD558\uC5EC \uD398\uC774\uC9C0\uB124\uC774\uC158 \uAE30\uB2A5\uC744 \uC81C\uACF5\uD55C\uB2E4\\n  - limit : \uBC18\uD658\uD560 \uB370\uC774\uD130 \uAC2F\uC218\\n  - offset : \uBA87\uBC88\uC7AC\uBD80\uD130 \uB370\uC774\uD130\uB97C \uC870\uD68C\uD560\uAC74\uC9C0\\n\\n  ```text\\n  GET /users?offset=10&limit=10\\n  ```\\n\\n### 8. API\uC5D0 \uBC84\uC804\uC744 \uC0AC\uC6A9\uD574\uB77C\\n\\n`v`\uB97C prefix \uB85C \uAC00\uC9C0\uBA70, \uADF8 \uB4A4\uB294 \uC815\uC218\uB9CC \uC0AC\uC6A9\uD55C\uB2E4\\n\\n```text\\nGET /api/v1\\n```\\n\\n### 9. HTTP Staus code\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC5D0\uB7EC\uB97C \uBC18\uD658\uD574\uB77C\\n\\n```text\\n- 200 : \uC11C\uBC84\uAC00 \uC815\uC0C1\uC801\uC73C\uB85C \uC694\uCCAD\uC744 \uCC98\uB9AC\uD568\\n- 201 : \uB9AC\uC18C\uC2A4\uAC00 \uC131\uACF5\uC801\uC73C\uB85C \uC0D
1D\uC131\uB428\\n- 204 : \uC131\uACF5\uD588\uC9C0\uB9CC, \uC751\uB2F5\uAC12 \uC5C6\uC74C. ( \uC8FC\uB85C delete \uC5D0\uC11C \uC0AC\uC6A9\uB428 )\\n\\n- 400 : \uC798\uBABB\uB41C request\uAC00 \uB4E4\uC5B4\uC634 \\n- 401 : \uAD8C\uD55C \uC5C6\uC74C ( authentication )\\n- 403 : \uC811\uADFC\uC774 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC74C ( Authorization )\\n- 404 : \uB9AC\uC18C\uC2A4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C\\n- 405 : \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC740 Method\uB85C \uC694\uCCAD ( Method not allow )\\n\\n- 500 : \uC11C\uBC84 \uB0B4\uBD80 \uC624\uB958  ( Internal Server Error )\\n```\\n\\n### 10. HTTP Method\uB97C \uC624\uBC84\uB77C\uC774\uB529\uD558\uC5EC \uC0AC\uC6A9\uD574\uB77C\\n\\n- X-HTTP-Method-Override \uB97C \uC0AC\uC6A9\uD558\uC5EC RESTful API\uAC00 \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 \uBA54\uC18C\uB4DC\uB97C \uAD6C\uD604\uD560 \uB54C \uC0AC\uC6A9\uD55C\\n\\n### \uCC38\uACE0\\n\\n- https://blog.mwaysolutions.com/2014/06/05/10-best-practices-for-better-restful-api/"},{"id":"git-repository-setup","metadata":{"permalink":"/blog/git-repository-setup","source":"@site/blog/2017-04-10-git-repository-setup/index.md","title":"Git Repository \uC14B\uD305\uD558\uAE30","description":"https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/","date":"2017-04-10T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.23,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Git Repository \uC14B\uD305\uD558\uAE30","slug":"git-repository-setup","date":"2017-04-10T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/"},"unlisted":false,"prevItem":{"title":"REST API Best Practices","permalink":"/blog/rest-api-best-practices"},"nextItem":{"title":"Fork \uD6C4 \uC6D0\uBCF8 \uCF54\uB4DC\uC640 \uB3D9\uAE30\uD654","permalink":"/blog/git-sync-fork"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uAE43 repository \uC14B\uD305\uD558\uAE30\\n\\n### \uC0C8\uB85C \uD504\uB85C\uC81D\uD2B8\uB97C \uC2DC\uC791\uD558\uB294 \uACBD\uC6B0\\n\\n```bash\\n$ git clone https://github.com/ClaudeSeo/TIL.git\\n```\\n\\n### \uAE30\uC874 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC788\uB294 \uACBD\uC6B0\\n\\n```bash\\n$ git init\\n\\n$ git add .\\n\\n$ git commit -m \\"Initialize\\"\\n\\n$ git remote add origin https://github.com/ClaudeSeo/TIL.git\\n\\n$ git remote -v\\norigin  https://github.com/ClaudeSeo/TIL.git (fetch)\\norigin  https://github.com/ClaudeSeo/TIL.git (push)\\n\\n$ git push -u origin master\\n```\\n\\n### \uCC38\uACE0\\n\\n- https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/"},{"id":"git-sync-fork","metadata":{"permalink":"/blog/git-sync-fork","source":"@site/blog/2017-04-10-git-sync-fork/index.md","title":"Fork \uD6C4 \uC6D0\uBCF8 \uCF54\uB4DC\uC640 \uB3D9\uAE30\uD654","description":"https://help.github.com/articles/syncing-a-fork/","date":"2017-04-10T00:00:00.000Z","tags":[{"inline":false,"label":"\uB3C4\uAD6C","permalink":"/blog/tags/tools"}],"readingTime":0.25,"hasTruncateMarker":true,"authors":[{"name":"\uC11C\uB3D9\uBA85","title":"Backend Engineer \xb7 Engineering Leader","url":"https://clud.me","socials":{"github":"https://github.com/claudeseo","linkedin":"https://www.linkedin.com/in/dongmyeong-seo-19703a110/"},"imageURL":"https://github.com/claudeseo.png","key":"dongmyeong","page":null}],"frontMatter":{"title":"Fork \uD6C4 \uC6D0\uBCF8 \uCF54\uB4DC\uC640 \uB3D9\uAE30\uD654","slug":"git-sync-fork","date":"2017-04-10T00:00:00.000Z","authors":["dongmyeong"],"tags":["tools"],"description":"https://help.github.com/articles/syncing-a-fork/"},"unlisted":false,"prevItem":{"title":"Git Repository \uC14B\uD305\uD558\uAE30","permalink":"/blog/git-repository-setup"}},"content":"\x3c!-- truncate --\x3e\\n\\n## \uAE43 Fork \uD6C4 \uC6D0\uBCF8 \uCF54\uB4DC\uC640 \uB3D9\uAE30\uD654\\n\\n```bash\\n$ git clone https://github.com/ClaudeSeo/dev-meetup.github.io.git\\n$ git remote add upstream https://github.com/dev-meetup/dev-meetup.github.io.git\\n\\n$ git remote -v\\norigin https://github.com/ClaudeSeo/dev-meetup.github.io.git (fetch)\\norigin https://github.com/ClaudeSeo/dev-meetup.github.io.git (push)\\nupstream https://github.com/dev-meetup/dev-meetup.github.io.git (fetch)\\nupstream https://github.com/dev-meetup/dev-meetup.github.io.git (push)\\n\\
1n$ git fetch upstream\\n$ git checkout master\\n$ git merge upstream/master\\n```\\n\\n## **\uCC38\uACE0**\\n\\n- https://help.github.com/articles/syncing-a-fork/"}]}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.