๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

"ํ”„๋กœ์ ํŠธ" ํƒœ๊ทธ๋กœ ์—ฐ๊ฒฐ๋œ 11๊ฐœ ๊ฒŒ์‹œ๋ฌผ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ํƒœ๊ทธ ๋ณด๊ธฐ

ยท ์•ฝ 1๋ถ„

๋‚ด์ผ ํ•  ๊ฒƒ#

์œˆ๋„์šฐ#

  • ๊ฒ€์ƒ‰ :win + s

  • ์œˆ๋„์šฐ VSCode ํ„ฐ๋ฏธ๋„ ์„ค์ •

  • ์œˆ๋„์šฐ React, NodeJS ํ™˜๊ฒฝ ์„ค์ •

Jira#

  • ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ• ์ง€์› ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ

URL Shortener#

๊ธฐ์ˆ  ์Šคํƒ#

  • TypeScript (Vanilla)

  • Node, Express

  • Jest

๊ธฐ๋Šฅ#

  • URL Validation

  • ์ธ๊ธฐ URL ํ†ต๊ณ„

  • ์ตœ๊ทผ ๊ฒ€์ƒ‰ URL


ยท ์•ฝ 6๋ถ„

Narkdown ํ”„๋กœ์ ํŠธ#

  • notion-py ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Python ๊ธฐ๋ฐ˜์œผ๋กœ์ง„ํ–‰ํ–ˆ์—ˆ์ง€๋งŒ Python์„ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ ํž˜๋“ค์—ˆ๋‹ค.

  • ts ๊ธฐ๋ฐ˜ notion-api-worker ๊ฐ€ ์žˆ์–ด์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋ชฉํ‘œ#

  • CLI๋กœ page url ๋˜๋Š” database url์„ ์ž…๋ ฅ ๋ฐ›๊ณ  notion์˜ ์ปจํ…์ธ ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ md ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ž. (CMS๋ฅผ ์œ„ํ•ด)

  • ์ดํ›„ ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๋“ฏ.

fetch vs axios#

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ fetch, axios๋Š” ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, node ํ™˜๊ฒฝ์—์„œ api ์š”์ฒญ์„ ํ•ด๋ณด๋Š”๊ฒƒ์€ ์ฒ˜์Œ์ด๋ผ, ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ๋‹ค.

  • axios๋Š” node ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • fetch๋Š” node-fetch ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” NodeJS ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ window.fetch ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

  • ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ fetch ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์žฅ์ ์ด๋ผ๊ณ ์ƒ๊ฐํ•˜๋Š”๋ฐ, ๊ตณ์ด node-fetch๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ, axios๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ๊ฒฐ์ •ํ–ˆ๋‹ค. (๋ณด์•ˆ์ ์ธ ์˜ต์…˜๋„ axios๊ฐ€ ๋งŽ์ด ์ œ๊ณตํ•œ๋‹ค.)

https://www.geeksforgeeks.org/difference-between-fetch-and-axios-js-for-making-http-requests/

ts-node#

  • tsconfig ์ƒ์„ฑ ๋ช…๋ น์–ด
tsc --init
  • tsconfig ์˜ต์…˜ ์ •๋ฆฌ

8 Best Practices for Future-Proofing Your TypeScript Code

tsconfig ์ปดํŒŒ์ผ ์˜ต์…˜ ์ •๋ฆฌ

[TS / Node] TS + Node.js + Express + Babel(option) + eslint๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…ํ•˜๊ธฐ

Node.js ์‹œ์ž‘ํ•˜๊ธฐ

notion-api-worker#

  • get page ๋ฆฌํ„ด

    • ๊ธฐ๋ณธ ํŽ˜์ด์ง€
      {    "847c0e9b-15a1-42c9-9392-ca2f817c4eac": {        "role": "editor",        "value": {            "id": "847c0e9b-15a1-42c9-9392-ca2f817c4eac",            "version": 23,            "type": "page",            "properties": {                "title": [["hello"]]            },            "content": ["cc1dee2e-269d-4cd0-a5a3-b1c3d72edf61"],            "permissions": [                {                    "role": "editor",                    "type": "user_permission",                    "user_id": "b21a69b3-a19b-438c-b599-e850190836a3"                }            ],            "created_time": 1605604740000,            "last_edited_time": 1605604740000,            "parent_id": "ee7c0178-18cf-474e-a665-83f2432f545f",            "parent_table": "space",            "alive": true,            "created_by_table": "notion_user",            "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "last_edited_by_table": "notion_user",            "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "shard_id": 1004639,            "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"        }    },    "cc1dee2e-269d-4cd0-a5a3-b1c3d72edf61": {        "role": "editor",        "value": {            "id": "cc1dee2e-269d-4cd0-a5a3-b1c3d72edf61",            "version": 12,            "type": "text",            "properties": {                "title": [["1234"]]            },            "created_time": 1605604740000,            "last_edited_time": 1605604740000,            "parent_id": "847c0e9b-15a1-42c9-9392-ca2f817c4eac",            "parent_table": "block",            "alive": true,            "created_by_table": "notion_user",            "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "last_edited_by_table": "notion_user",            "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "shard_id": 1004639,            "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"        }    }}
    • Database ํ•˜์œ„ ํŽ˜์ด์ง€
      {  "15afa14b-8f9c-4b6c-97cc-46375c775cc5": {    "role": "reader",    "value": {      "id": "15afa14b-8f9c-4b6c-97cc-46375c775cc5",      "version": 25,      "type": "page",      "properties": [Object],      "created_time": 1605517260000,      "last_edited_time": 1605602760000,      // ๋ถ€๋ชจ Id      // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ collection_id      "parent_id": "e543505f-be64-46cd-9c55-07117dc85a92",      // ๋ถ€๋ชจ      "parent_table": "collection",      "alive": true,      "created_by_table": "notion_user",      // user_id      "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",      "last_edited_by_table": "notion_user",      "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",      "shard_id": 1004639,      "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"    }  },
        // ๋ถ€๋ชจ๊ฐ€ space๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ถ€๋ชจ  "acc3dfd0-339e-4cac-b5ba-ae8673fddfad": {    "role": "reader",    "value": {      "id": "acc3dfd0-339e-4cac-b5ba-ae8673fddfad",      "version": 106,      "type": "collection_view_page",      "view_ids": [Array],      "collection_id": "e543505f-be64-46cd-9c55-07117dc85a92",      "format": [Object],      "permissions": [Array],      "created_time": 1600223639505,      "last_edited_time": 1605594780000,      "parent_id": "ee7c0178-18cf-474e-a665-83f2432f545f",      "parent_table": "space",      "alive": true,      "created_by_table": "notion_user",      "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",      "last_edited_by_table": "notion_user",      "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",      "shard_id": 1004639,      "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"    }  }}
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํŽ˜์ด์ง€
      {    "1c7c8eb6-ec3b-42fb-b950-63abd3c9bd61": {        "role": "reader",        "value": {            "id": "1c7c8eb6-ec3b-42fb-b950-63abd3c9bd61",            "version": 6,            "type": "page",            // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•˜์œ„์— ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ€๋ชจ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•ด์„œ ๊ฐ€์ ธ์™€์•ผ ํ•จ.            "properties": {                "RXKJ": [                    // ์—ฌ๋Ÿฌ ํƒœ๊ทธ ๋ชฉ๋ก์ด ๋ฌธ์ž์—ด ',' ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์˜ด.                    ["hello,bye"]                ],                "fb_;": [["๐Ÿ›  In Progress"]],                "qS^H": [["Test"]],                "title": [["asdf"], ["์˜ ์‚ฌ๋ณธ"]]            },            // ์ „์ฒด ํŽ˜์ด์ง€, ์ž‘์€ ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ์ผ ๋•Œ ํ•จ๊ป˜ ์˜ด, ์—†์œผ๋ฉด ์•ˆ์˜ด.            "format": {                "page_icon": "๐Ÿšก",                // link์ธ ๊ฒฝ์šฐ๋Š” ๋งํฌ                "page_cover": "https://user-images.githubusercontent.com/1440854/79684011-6c948280-822e-11ea-9e23-1644903796fb.png",                // ์—…๋กœ๋“œ์ธ ๊ฒฝ์šฐ https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d53a69fd-a3e1-4914-b014-63158a1078a2/blue.png                // ๊ธฐ๋ณธ ์ œ๊ณต์ธ ๊ฒฝ์šฐ /images/blue.png => https://notion.so/images/blue.png๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ                "page_cover_position": 0.5,                "page_full_width": true,                "page_small_text": true            },            "created_time": 1605594821014,            "last_edited_time": 1605603000000,            "parent_id": "e543505f-be64-46cd-9c55-07117dc85a92",            "parent_table": "collection",            "alive": true,            "copied_from": "15afa14b-8f9c-4b6c-97cc-46375c775cc5",            "created_by_table": "notion_user",            "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "last_edited_by_table": "notion_user",            "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "shard_id": 1004639,            "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"        }    },    "acc3dfd0-339e-4cac-b5ba-ae8673fddfad": {        "role": "reader",        "value": {            "id": "acc3dfd0-339e-4cac-b5ba-ae8673fddfad",            "version": 106,            "type": "collection_view_page",            "view_ids": [                "be43c1c8-dd64-4cfb-9df9-efd97d8af60a",                "cfabb574-6051-47ed-9c14-ea3a1b6aead7",                "87cdd007-d8d6-464c-82f2-c7a4153bab0d",                "c09c2c36-0419-4bff-8195-bf6c2b897d6f",                "e0d39abd-4d7b-4c5c-9ce9-4984a3315932",                "83b3d2a6-6f63-4940-987d-1142e51da175"            ],            "collection_id": "e543505f-be64-46cd-9c55-07117dc85a92",            "format": {                "page_cover_position": 0.6            },            "permissions": [                {                    "role": "editor",                    "type": "user_permission",                    "user_id": "b21a69b3-a19b-438c-b599-e850190836a3"                },                {                    "role": "reader",                    "type": "public_permission"                }            ],            "created_time": 1600223639505,            "last_edited_time": 1605594780000,            "parent_id": "ee7c0178-18cf-474e-a665-83f2432f545f",            "parent_table": "space",            "alive": true,            "created_by_table": "notion_user",            "created_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "last_edited_by_table": "notion_user",            "last_edited_by_id": "b21a69b3-a19b-438c-b599-e850190836a3",            "shard_id": 1004639,            "space_id": "ee7c0178-18cf-474e-a665-83f2432f545f"        }    }}
  • get table ๋ฆฌํ„ด

    • table๋กœ ๋œ ํŽ˜์ด์ง€
      [    {        "id": "11acfd54-2ee8-4640-b3fb-1782ce9b8caa",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Basic Blocks"    },    {        "id": "084bbefe-7f25-481a-bfbb-e8aff2152e4f",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Copy of Basic Blocks"    },    {        "id": "24786a8a-3d7d-4dfd-854d-ac40559c9f82",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Code Blocks"    },    {        "id": "74bbb810-9a68-499f-8f12-25dcce846f02",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Embed Blocks"    },    {        "id": "2df7176f-d58f-4c42-921b-55e9bbf0e92e",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Table Blocks"    },    {        "id": "30894478-96e6-4f95-9095-d84be27a82a9",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Page Blocks"    },    {        "id": "cee84696-242a-4f6e-953a-2c7ecb8b1603",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Advanced Blocks"    },    {        "id": "64c69eaf-268a-4076-bf48-d8ee5f2ca8c8",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Linked Page"    },    {        "id": "6a8383c0-0a12-4859-9edc-2fe41e9cbe75",        "Status": "๐Ÿ–จ Published",        "Category": "Test",        "Name": "Recursive embed Image"    },    {        "id": "d10a7885-58f0-4ba9-b9a4-fb357ab796e8",        "Status": "๐Ÿ–จ Published",        "Category": "Example",        "Name": "Example Pages"    },    {        "id": "1c7c8eb6-ec3b-42fb-b950-63abd3c9bd61",        "Tags": ["hello", "bye"],        "Status": "๐Ÿ›  In Progress",        "Category": "Test",        "Name": "asdf์˜ ์‚ฌ๋ณธ"    },    // ์™„์ „ํžˆ ์•ˆ์ง€์› ์„ ๋•Œ๋Š” ๋นˆ๋ฌธ์ž์—ด๋กœ ์˜ด.    {        "id": "e8b450e4-f686-4d0b-9212-6241e6099a0b",        "Tags": [""],        "Status": "",        "Category": ""    }]
  • blocks

Accept vs Content-Type#

  • Accept : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต ํ˜•์‹์„ ์ง€์ •ํ•จ.

  • Content-Type : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ์ฝ˜ํ…์ธ ์˜ ํ˜•์‹

ยท ์•ฝ 1๋ถ„

๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ#

python3 -m venv .venv

๊ฐ€์ƒ ํ™˜๊ฒฝ ํ™œ์„ฑํ™”#

source .venv/bin/activate

ํ™•์ธํ•˜๊ธฐ#

which python

์ฐธ๊ณ ์ž๋ฃŒ#

ํŒŒ์ด์ฌ์—์„œ venv๋กœ ๊ฐ€์ƒ ํ™˜๊ฒฝ ์‚ฌ์šฉํ•˜๊ธฐ

ยท ์•ฝ 4๋ถ„

์ฝ”๋“œ๋ฆฌ๋ทฐ#

node ๋กœ ๋ฐฑ์—”๋“œ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด shared ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ํ™˜๊ฒฝ์„ ์ž˜ ๊ฐ–์ถ”๊ณ  ๋ฐฑ๊ณผ ํ”„๋ก ํŠธ๊ฐ€ ๊ณต์œ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.


  • HTML์€ ๊ตฌ์กฐ

    • p ํƒœ๊ทธ๋ฅผ ์“ธ ๋•Œ๋Š” paragraph์ธ์ง€

    • ๊ธ€์ž๋ฅผ ํฌ๊ฒŒํ•˜์ž ํ•˜๊ณ  h3๋ฅผ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค.

    • list ํƒœ๊ทธ โ†’ ๋‹ค์Œ ํ™ˆํŽ˜์ด์ง€์˜ ๋‰ด์Šค ๋ฆฌ์ŠคํŠธ

  • CSS๋Š” ์Šคํƒ€์ผ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ#


CSS, JS๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒฝํ–ฅ

ํ˜„๋Œ€์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ, ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ชจ์œผ๊ธฐ๋„ ํ•จ.

๊ฐœ๋ฐœํ•  ๋• ํ•ญ์ƒ ๋‚˜๋ˆ ์„œ

์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•ญ์ƒ ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฐ€์ •์„ ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋ผ. ์„œ๋น„์Šค ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

์ข‹์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•œ ์ฝ”๋“œ. ๋ณ€๊ฒฝ์„ ํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ์ฝ”๋“œ์— ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š๋Š” ์ฝ”๋“œ

๋ณ€๊ฒฝ๋  ๋•Œ ์˜ํ–ฅ์„ ๋œ ์ฃผ๊ณ  ์ˆ˜์ •๋„ ์‰ฝ๊ฒŒ ๋˜๊ณ  ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€๋˜๊ณ  ...

๋‚˜๋ˆ ์„œ ์—ญํ• ๋ณ„๋กœ

CSS ๊ณตํ†ต ๋ถ€๋ถ„ > Global, common ...

๋ชจ๋“  ๋ฆฌํŒฉํ† ๋ง์€ ์ค‘๋ณต๋ถ€ํ„ฐ

  • JS ํŒŒ์ผ ์ž์ฒด๋Š” ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ์—, is ๋“ฑ์ด ๋“ค์–ด๊ฐ€๋ฉด ์–ด์ƒ‰ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

๋งค์ง๋„˜๋ฒ„๋ฅผ ์—†์• ๋ผ - ์ฝ”๋“œ์—์„œ ์ˆซ์ž, ๋ฌธ์ž์—ด์„ ์“ธ ๋•Œ ๋ถ„๋ฆฌํ•ด๋ผ.

JS์—์„œ CSS๋ฅผ ์กฐ์ž‘ํ•  ์ผ์ด ์žˆ์„ ๋•Œ โ†’ classList์— remove, add, toggle ๋“ฑ์œผ๋กœ ์กฐ์ž‘ํ•œ๋‹ค. ์Šคํƒ€์ผ์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š์Œ.

  • ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ

  • ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ

  • ํ…Œ์ŠคํŠธ๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ

  • ์—ญํ• ์ด ๋ช…ํ™•ํ•œ ํ•จ์ˆ˜

  • ์ ‘๊ทผํ•  ์ผ์ด ๋งŽ์œผ๋ฉด ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ

  • ์ด๋ฒคํŠธ๋ฅผ ์–ด๋””์„œ ๋“ฑ๋กํ•ด์•ผ ํ• ๊นŒ?

  • ์กฐ๊ฑด๋„ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ ๋ผ


์บ ํ”„์˜ ๋ชฉ์ #


  • ์–ด๋–ป๊ฒŒ ๋ชจ๋“ˆํ™”๋ฅผ ์ž˜ํ• ๊นŒ

  • ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊นŒ

  • ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์จ๋„ ๋ชจ๋“ˆํ™”๊ฐ€ ์ž๋™์œผ๋กœ ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค

๋ณ€์ˆ˜๋ช…#

  • ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์ž์ฃผ ๋ณด๋ฉด ๋„์›€์ด ๋œ๋‹ค.

  • ์ข‹์€ ํšŒ์‚ฌ๋ฉด ๋™์ž‘ํ•˜๋Š” ์„œ๋น„์Šค ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค


๋‚˜๋งŒ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๊ฑธ ํ•ด๋ณด์„ธ์š”.

  • ํ•จ์ˆ˜๋ฅผ ๋ฒ”์šฉ์ ์œผ๋กœ

  • ์ธํ’‹์ด ์žˆ๊ณ  ์•„์›ƒํ’‹์ด ์žˆ๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ๊ฐ€ ํŽธํ•œ ์ฝ”๋“œ

์ฐพ์•„๋ณด๊ธฐ#

  • setInterval ๋‹จ์ 

  • ์™œ setTimeout์„ ์žฌ๊ท€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€

  • ES ๋ชจ๋“ˆ


  • ๋ Œ๋”๋ง์„ ์ž์ฃผ ์ผ์œผํ‚ค์ง€ ๋ง์•„๋ผ

  • ํ•จ์ˆ˜๊ฐ€ ์งง์•„์„œ ์ข‹๋‹ค

  • ๊ณผ๋„ํ•  ์ •๋„๋กœ ๋‚˜๋ˆ„๋Š”๊ฒŒ ๋‚ซ๋‹ค


ES ๋ชจ๋“ˆ#

  • ํ”„๋ก ํŠธ์—์„œ๋„ import export๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ชจ๋“ˆ ๊ด€๋ฆฌ๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ์ด๋‹ค.

util์€ ๋ฒ”์šฉ์„ฑ ์žˆ๋Š” ๊ฒƒ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฌด๊ด€ํ•œ


๋ฐฑ์—”๋“œ์—์„œ ๋งค์ง๋„˜๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํฌ๋ฆฌํ‹ฐ์ปฌํ•œ ์ด์Šˆ๊ฐ€ ์ƒ๊ธด๋‹ค.

ํšŒ์›๊ฐ€์ž… ๋กœ๊ทธ์ธ

โ†’ ํด๋ผ์ด์–ธํŠธ์—์„œ validation, ์„œ๋ฒ„์—์„œ validation์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.


๋„๊ตฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์จ์•ผํ•œ๋‹ค.

aspective-oriented programming#


์‹ค์ œ๋กœ ์ค‘์š”ํ•œ๊ฑด ์œ ์ง€ ๋ณด์ˆ˜, hotfix๊ฐ€ ์ž์ฃผ ์ผ์–ด๋‚œ๋‹ค.


ยท ์•ฝ 3๋ถ„

ํŒ€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด...#

์Šคํ”„๋ฆฐํŠธ ํšŒ์˜#

  • ํŒ€์˜ ๋ชฉํ‘œ ์ˆ˜๋ฆฝ, ์œ„ํ‚ค ๋“ฑ๋ก

  • ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋‚ด์šฉ์„ feature ๋‹จ์œ„๋กœ ์ถ”๋ฆฌ๊ณ  issue ํ•ญ๋ชฉ์— ๋“ฑ๋ก

์Šคํฌ๋Ÿผ#

  • ์ƒํƒœ, ์–ด์ œ ํ•œ ์ผ, ์˜ค๋Š˜ ํ•œ ์ผ์„ 5๋ถ„ ๋‚ด๋กœ ์งง๊ฒŒ ์ด์•ผ๊ธฐ

  • ์„œ๋กœ์˜ ๊ฑด๊ฐ•, ์‹ฌ๋ฆฌ, ๊ฐœ๋ฐœ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๋‚˜๋ˆ„๊ณ  ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•จ

  • ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ‚ค์— ๋งค์ผ ์ž‘์„ฑ

๋ฐ๋ชจ#

๋ฏธ๋‹ˆ ์„ธ๋ฏธ๋‚˜#

ํŒ€ ์ฃผ๊ฐ„ ํšŒ๊ณ #

  • ์„œ๋กœ ๊ฒฉ๋ คํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ ๋‚˜๋ˆ„๋ฉฐ ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๊ธฐ

  • ์ด๋ฒˆ ์ฃผ์— ์ž˜ํ•œ ์ , ์•„์‰ฌ์šด ์ 

๋ฐฐ๋ฏผ์ƒํšŒ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ๊ตฌํ˜„#

๊ทธ๋ผ์šด๋“œ ๋ฃฐ#

๊นƒ ์…‹์—…#

๋ธŒ๋žœ์น˜#

์ผ€๋ฐฅ ์ผ€์ด์Šค

  • master

  • develop

  • frontend

  • backend

  • feature/issue-#

  • document

ํŒŒ์ผ๋ช… / ํด๋”๋ช…#

์ผ€๋ฐฅ ์ผ€์ด์Šค

  • ์ปค๋ฐ‹ - ํƒ€์ž…๋ณ„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋จธ๋ฆฟ๋ง ๋ถ™์ด๊ธฐ

  • git add . , git commit -m "" ์ตœ๋Œ€ํ•œ ์ž์ œํ•ด๋ณด๊ธฐ

ex) [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]

์ปจ๋ฒค์…”๋„ ์ปค๋ฐ‹์„ ์ฐธ์กฐํ•จ.

Conventional Commits

PR ๋ฐฉ์‹#

  • ๋‚ด๊ฐ€ ๋ณด๋‚ธ PR์€ ์ƒ๋Œ€๋ฐฉ์ด Squash and Merge ํ•˜๊ธฐ

์ด์Šˆ๋กœ ๋‚˜๋ˆ„๊ธฐ#

GitHub๋กœ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ Part1 - ์ด์Šˆ ๋ฐœ๊ธ‰ ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฆฌ๋ทฐ๊นŒ์ง€ | Popit

์œ„ํ‚ค#


๊ธฐ๋Šฅ ๋ช…์„ธํ™”#

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๋ฐฉ๋ฒ•#

์›”์š”์ผ

ํ™”์š”์ผ - ๋ชฝ์ดŒํ† ์„ฑ์—ญ ํฐ์ง‘ 11์ธต, 9์‹œ

์ˆ˜์š”์ผ, ๋ชฉ์š”์ผ - ๋ฒ”๊ณ„์—ญ ์Šคํƒ€๋ฒ…์Šค, 9์‹œ

๋ชฉ์š”์ผ ์™„์„ฑ์„ ๋ชฉํ‘œ๋กœ, ๊ธˆ์š”์ผ ์˜ค์ „์—๋Š” ๋ฌธ์„œ ์ •๋ฆฌ๋‚˜, ๋ฆฌํŒฉํ† ๋ง ์ •๋„๋งŒ

๊ธˆ์š”์ผ ์˜ค์ „ 11์‹œ๊นŒ์ง€


๋ฐฐ๋ฏผ์ƒํšŒ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ#


  1. ์•„์ด๋”” input

ยท ์•ฝ 6๋ถ„

๋‚˜์˜ ๊ฐ์˜ค/๊ณ„ํš#

  1. ์šฐ์•„ํ•œํ…Œํฌ์บ ํ”„ ๋๋‚˜๊ณ  ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธํ•  ์‚ฌ๋žŒ๋“ค ๋งŒ๋‚˜๊ธฐ

  2. ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์˜๊ฒฌ ์ž˜ ๋“ฃ๊ธฐ

  3. ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ ์นœ์ ˆํžˆ ์•Œ๋ ค์ฃผ๊ธฐ

  4. ๋ชจ๋ฅด๋Š” ๊ฒƒ์€ ์ž˜ ์งˆ๋ฌธํ•˜๊ธฐ

  5. ๋ฐฐ์šด ๊ฒƒ์€ ๊ฐœ์ธ์ ์œผ๋กœ ์จ๋จน์–ด ๋ณด๊ธฐ

  6. ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ์€ ์˜ค๋Š˜ ๋ณต์Šตํ•˜๊ธฐ

Git / Github#

Git์— ๊ด€ํ•˜์—ฌ#

Git์€ ๋ฆฌ๋ˆ„์Šค ํ† ๋ฐœ์ฆˆ(Linus Torvalds)๊ฐ€ ๋ฆฌ๋ˆ…์Šค(Linux) ์ปค๋„์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ ์†Œ์Šค๊ด€๋ฆฌ ํˆด์ด๋‹ค. (ใ„ทใ„ท) Git ์ด์ „์˜ ํ˜•์ƒ๊ด€๋ฆฌ ํˆด์€ SVN, CVS ๋“ฑ์ด ์žˆ์—ˆ์Œ.

๊ฐ„๋‹จํ•œ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— Git์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‚œ์ด๋„๋ฅผ ๋†’์ด์ง€๋งŒ, ๋ณต์žกํ•œ ๋Œ€๊ทœ๋ชจํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋‚œ์ด๋„๋ฅผ ์ƒ๋‹นํžˆ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜์ ์ด๋‹ค.

์•ˆํ‹ฐ ํŒจํ„ด#

  • git add . : ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ํ•œ๋ฒˆ์— ์Šคํ…Œ์ด์ง• ํ•˜์ง€ ๋ง์•„๋ผ. ํ•œ ํŒŒ์ผํ•œ ํŒŒ์ผ ์”ฉ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๋ฉด์„œ ์ปค๋ฐ‹ํ•ด๋ผ.

  • git commit -m "" : ์ปค๋ฐ‹์€ git commit ์œผ๋กœ ์ œ๋ชฉ๊ณผ ํ•จ๊ป˜ ๊ฐ„๋‹จํ•œ ์„ค๋ช…๊นŒ์ง€ ๋ง๋ถ™์—ฌ์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค.

์ด๋Ÿฌํ•œ ์•ˆํ‹ฐ ํŒจํ„ด์ด ๋งŒ์—ฐํ•ด ์žˆ์Œ. ์ข‹์€ ์ปค๋ฐ‹ ์Šต๊ด€์„ ๊ธฐ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

Git flow#

Git-flow, Github flow, Gitlab flow ๊ฐ๊ฐ์ด ๋‹ค๋ฅธ ํ˜•์ƒ ๊ด€๋ฆฌ ์ „๋žต์ด๋‹ค. ์ด ์™ธ์—๋„ ์ˆ˜๋งŽ์€ flow ๋“ค์ด ์กด์žฌ. ํ•˜์ง€๋งŒ Git-flow ๋ผ๋Š” ์ด๋ฆ„ ๋•Œ๋ฌธ์— Git flow๊ฐ€ ์ •์„, ํ‘œ์ค€์ด๋ผ๋Š” ์˜คํ•ด๋ฅผ ํ•˜๊ธฐ ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ Git flow๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์กฐ์ง, ํŒ€์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. Git flow ์™ธ์—๋„ ํ›Œ๋ฅญํ•œ flow ์ „๋žต๋“ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— Git flow์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ ๋ฌด์กฐ๊ฑด GIt flow๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ดํ‘œ์ค€์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

Understanding the GitHub flow

์šฐ๋ฆฐ Git-flow๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š” - ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

ํ•˜๋ฃจ์— 1000๋ฒˆ ๋ฐฐํฌํ•˜๋Š” ์กฐ์ง ๋˜๊ธฐ | ๋ฑ…ํฌ์ƒ๋Ÿฌ๋“œ

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด#

  • ๋ฉ”์‹œ์ง€๋Š” ํ•œ๊ธ€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ํŒ€์› ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฏธ๋ž˜์˜ ๋‚˜๋ฅผ ์œ„ํ•ด ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ ๋‹นํ•œ ๋‹จ์–ด๋ฅผ์ฐพ์ง€ ๋ชปํ•œ ์–ด์ƒ‰ํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒƒ๋ณด๋‹ค ํ•œ๊ธ€๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ๋‚ซ๋‹ค.

    ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ์˜คํ”ˆ ์†Œ์Šค๊ฐ€ ์•„๋‹ˆ๋‹ˆ๊นŒ

    ํ•˜์ด๋ธŒ๋ฆฌ๋“œ๋กœ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ œ๋ชฉ์„ ์˜์–ด๋กœ ๋‚จ๊ธฐ๊ณ  ์„ค๋ช…์„ ํ•œ๊ธ€๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

    ์‹ค์ œ๋กœ TDD๋ฅผ ์ž˜ํ•˜๋Š” ํŒ€์—์„  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๋ฉ”์†Œ๋“œ ๋ช…์„ ํ•œ๊ธ€๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํ›จ์”ฌ ๋ช…ํ™•ํ•œ ๋ฉ”์†Œ๋“œ ๋ช…์œผ๋กœ ์ธํ•ด ์ข‹์€ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

  • fork ํ›„ PR๊ณผ branch ํ›„ PR์˜ ์ฐจ์ด

    ๊ธฐ๋ณธ์ ์œผ๋กœ fork๋Š” ๋‚ด๊ฐ€ ์ด ์ €์žฅ์†Œ์— ๊ถŒํ•œ์ด ์—†์„ ๋•Œ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜คํ”ˆ ์†Œ์Šค์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ๋“ฑ..

Git ๋ช…๋ น์–ด์™€ ๋™์ž‘ ์›๋ฆฌ#

Git ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ๋ฐฐ์šด ๊ฒƒ์€ ์ฒ˜์Œ์ด์—ˆ๊ณ  ๊ธฐ์กด ์•Œ๊ณ  ์žˆ๋˜ ๊ฐœ๋…์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š”๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜๋‹ค.

Learn Git Branching

  • git init : ์ˆจ๊ฒจ์ง„ ํด๋”๊ฐ€ ํ•˜๋‚˜ ์ƒ๊น€

    • .git : ๋กœ์ปฌ ์ €์žฅ์†Œ

      • git์˜ ์ €์žฅ ๋‹จ์œ„๋Š” ์ปค๋ฐ‹

        • Working directory โ†’ Stage โ†’ Commit
    • GitHub or GitLab ... - ์›๊ฒฉ ์ €์žฅ์†Œ

    • git reset โ†’ ๋‚ ์•„๊ฐ€์ง€ ์•Š์Œ.

    • ์›Œํ‚น ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์Šค๋ƒ…์ƒท

    • ์ปค๋ฐ‹์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํŠธ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ ํŠธ๋ฆฌ์— ์˜ค๋ธŒ์ ํŠธ๋“ค์ด ๋‹ฌ๋ ค์„œ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์„ ๊ตฌ์„ฑํ•จ

    • git cat-file -t ce013

    • git cat-file blob ce013

    • git cat-file -t HEAD

    • git log -n1

    • git cat-file -t 7da33cf4

    • git cat-file commit 7da33cf4

    • git ls-tree aaa96ced2d9a1c8e ...

    • branch๋Š” ํ—ค๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ์ผ ๋ฟ

    • ์ปค๋ฐ‹์€ ๋ถ€๋ชจ ์ปค๋ฐ‹์ด ์žˆ๋‹ค

    • git checkout C4 vs git checkout hello

    • git์€ diff๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.

    • svn์€ diff๋ฅผ ์ €์žฅํ•œ๋‹ค

    • tree .git

    • ๋ธŒ๋žœ์น˜๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์–ด๋„ ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • git status

    • git checkout master

    • ๋ธŒ๋žœ์น˜๋Š” ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ฐธ์กฐ์ผ ๋ฟ ์•„๋ฌด๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.

    • ๊นƒ์—๋Š” ์ปค๋ฐ‹๋ฐ–์— ์—†๋‹ค. ํƒœ๊ทธ, ๋ธŒ๋žœ์น˜, ์–ด์ฉŒ๊ณ ๋Š” ๋‹ค ์ฐธ์กฐ ๋ณ€์ˆ˜์ผ ๋ฟ์ด๋‹ค ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค.

    • git reset โ€”hard Head~1 ์‹œ์— ๋ณต์›ํ•˜๋Š” ๋ฒ•

    • git branch test ์ฒดํฌ์„ฌ

    • git reflog ๋ชจ๋“  ์ฐธ์กฐ ๋ณ€์ˆ˜๋“ค์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๋Š” ๋ช…๋ น

    • git push ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์žˆ๋Š” ๊ฒƒ์„ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ๋ณด๋ƒ„

ยท ์•ฝ 9๋ถ„

React-Native ์‹คํ–‰ ํ™˜๊ฒฝ์„ค์ •#

๋งฅ(Mac)์— react native ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ

์ด ๋ธ”๋กœ๊ทธ์˜ ์„ค์ • ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ React-Native ์‹คํ–‰ํ™˜๊ฒฝ์„ ์„ค์ •ํ–ˆ๋‹ค.


  ![2020-03-13-200313-image-0](./images/2020-03-13-200313-image-0.png)
  <br />


  ![2020-03-13-200313-image-1](./images/2020-03-13-200313-image-1.png)
  <br />

์„ฑ๊ณต!

JavaScript ๋ฌธ๋ฒ•#

์‚ผํ•ญ์—ฐ์‚ฐ์ž#

condition ? true : false

  • ํ•œ ์ค„์ด ๋„ˆ๋ฌด ๊ธธ ๋•Œ
let text = array.length === 0 ? `๋ฐฐ์—ด์ด ๋น„์–ด์žˆ๋‹ค.` : `๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค`;

Truthy and Falsy#

undefined ์™€ null ์€ ๋ชจ๋‘ false ๋กœ ๊ฐ„์ฃผ๋จ.

Falsy ํ•œ ๊ฐ’

  • undefined

  • null

  • 0

  • 
    
  • NaN

  • false

์ด ์™ธ์—๋Š” ๋ชจ๋‘ true ๋กœ ๊ฐ„์ฃผ๋จ

! , !! ๋ฅผ ํ™œ์šฉํ•ด Falsy ํ•œ ๊ฐ’๊ณผ Truthy ํ•œ ๊ฐ’์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ


๋‹จ์ถ• ํ‰๊ฐ€ ๋…ผ๋ฆฌ ๊ณ„์‚ฐ๋ฒ•#

A && B ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ A๊ฐ€ Truthy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, B๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋˜๊ณ , Falsy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, A๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

console.log(true && 'hello'); // helloconsole.log(false && 'hello'); // falseconsole.log('hello' && 'bye'); // byeconsole.log(null && 'hello'); // nullconsole.log(undefined && 'hello'); // undefinedconsole.log('' && 'hello'); // ''console.log(0 && 'hello'); // 0console.log(1 && 'hello'); // helloconsole.log(1 && 1); // 1

A || B ์—ฐ์‚ฐ์ž๋Š” ๋งŒ์•ฝ A๊ฐ€ Truthy ํ•œ ๊ฐ’์ด๋ผ๋ฉด, A๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋˜๊ณ , Falsy ํ•œ๊ฐ’์ด๋ผ๋ฉด B๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

console.log(true || 'hello'); // trueconsole.log(false || 'hello'); // helloconsole.log('hello' || 'bye'); // helloconsole.log(null || 'hello'); // helloconsole.log(undefined || 'hello'); // undefinedconsole.log('' || 'hello'); // helloconsole.log(0 || 'hello'); // helloconsole.log(1 || 'hello'); // 1console.log(1 || 1); // 1

ํ•จ์ˆ˜์˜ ๊ธฐ๋ณธ ํŒŒ๋ผ๋ฏธํ„ฐ#

ํŒŒ๋ผ๋ฏธํ„ฐ์—์„œ = ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

function calculateCircleArea(r = 1) {    return Math.PI * r * r;}
const area = calculateCircleArea();console.log(area); // 3.141592653589793

์กฐ๊ฑด๋ฌธ ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ ์“ฐ๊ธฐ#

  • ํŠน์ • ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ
function isAnimal(text) {    return (        text === '๊ณ ์–‘์ด' || text === '๊ฐœ' || text === '๊ฑฐ๋ถ์ด' || text === '๋„ˆ๊ตฌ๋ฆฌ'    );}
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

๋ฐฐ์—ด์˜ includes ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

function isAnimal(name) {    const animals = ['๊ณ ์–‘์ด', '๊ฐœ', '๊ฑฐ๋ถ์ด', '๋„ˆ๊ตฌ๋ฆฌ'];    return animals.includes(name);}
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์‚ฌ์šฉ

const isAnimal = (name) => ['๊ณ ์–‘์ด', '๊ฐœ', '๊ฑฐ๋ถ์ด', '๋„ˆ๊ตฌ๋ฆฌ'].includes(name);
console.log(isAnimal('๊ฐœ')); // trueconsole.log(isAnimal('๋…ธํŠธ๋ถ')); // false

  • ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•  ๋•Œ
function getSound(animal) {    if (animal === '๊ฐœ') return '๋ฉ๋ฉ!';    if (animal === '๊ณ ์–‘์ด') return '์•ผ์˜น~';    if (animal === '์ฐธ์ƒˆ') return '์งน์งน';    if (animal === '๋น„๋‘˜๊ธฐ') return '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ';    return '...?';}

switch ์‚ฌ์šฉ

function getSound(animal) {    switch (animal) {        case '๊ฐœ':            return '๋ฉ๋ฉ!';        case '๊ณ ์–‘์ด':            return '์•ผ์˜น~';        case '์ฐธ์ƒˆ':            return '์งน์งน';        case '๋น„๋‘˜๊ธฐ':            return '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ';        default:            return '...?';    }}
console.log(getSound('๊ฐœ')); // ๋ฉ๋ฉ!console.log(getSound('๋น„๋‘˜๊ธฐ')); // ๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ

๊ฐ์ฒด ํ™œ์šฉ

function getSound(animal) {    const sounds = {        ๊ฐœ: '๋ฉ๋ฉ!',        ๊ณ ์–‘์ด: '์•ผ์˜น~',        ์ฐธ์ƒˆ: '์งน์งน',        ๋น„๋‘˜๊ธฐ: '๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ',    };    return sounds[animal] || '...?';}
console.log(getSound('๊ฐœ')); // ๋ฉ๋ฉ!console.log(getSound('๋น„๋‘˜๊ธฐ')); // ๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ

  • ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•  ๋•Œ
function makeSound(animal) {    const tasks = {        ๊ฐœ() {            console.log('๋ฉ๋ฉ');        },        ๊ณ ์–‘์ด() {            console.log('๊ณ ์–‘์ด');        },        ๋น„๋‘˜๊ธฐ() {            console.log('๊ตฌ๊ตฌ ๊ตฌ ๊ตฌ');        },    };    if (!tasks[animal]) {        console.log('...?');        return;    }    tasks[animal]();}
makeSound('๊ฐœ');makeSound('๋น„๋‘˜๊ธฐ');

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น (๊ตฌ์กฐ๋ถ„ํ•ด) ๋ฌธ๋ฒ•#

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const object = {a: 1, b: 2};
const {a, b} = object;
console.log(a); // 1console.log(b); // 2
  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ
const object = {a: 1, b: 2};
function print({a, b}) {    console.log(a);    console.log(b);}
print(object);

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์‹œ ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •#

const object = {a: 1};
const {a, b = 2} = object;
console.log(a); // 1console.log(b); // 2
  • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ
const object = {a: 1};
function print({a, b = 2}) {    console.log(a);    console.log(b);}
print(object);// 1// 2

๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์‹œ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ#

const animal = {    name: '๋ฉ๋ฉ์ด',    type: '๊ฐœ',};
const nickname = animal.name;
console.log(nickname); // ๋ฉ๋ฉ์ด

animal.name ๊ฐ’์„ nickname ๊ฐ’์— ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด,

const animal = {    name: '๋ฉ๋ฉ์ด',    type: '๊ฐœ',};
const {name: nickname} = animal;console.log(nickname);

: ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๋‹ค.


๋ฐฐ์—ด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const array = [1, 2];const [one, two] = array;
console.log(one);console.log(two);

๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉ. ๊ฐ์ฒด ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •์ด ๊ฐ€๋Šฅ.

const array = [1];const [one, two = 2] = array;
console.log(one);console.log(two);

๊นŠ์€ ๊ฐ’ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น#

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};

์—ฌ๊ธฐ์„œ name , languages , value ๊ฐ’์„ ๋ฐ–์œผ๋กœ ๊บผ๋‚ด๊ณ  ์‹ถ์„ ๋•Œ

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};
const {name, languages} = deepObject.state.information;const {value} = deepObject;
const extracted = {    name,    languages,    value,};
console.log(extracted); // {name: "younho9", languages: Array[3], value: 5}

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

const extracted = {    name: name,    languages: languages,    value: value,};

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€

const deepObject = {    state: {        information: {            name: 'younho9',            languages: ['korean', 'english', 'chinese'],        },    },    value: 5,};
const {    state: {        information: {name, languages},    },    value,} = deepObject;
const extracted = {    name,    languages,    value,};
console.log(extracted);

์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋‹ค๋ฃจ๊ธฐ#

2020-03-13-200313-image-2

function work() {    const start = Date.now();    for (let i = 0; i < 10000000; i++) {}    const end = Date.now();    console.log(end - start + 'ms');}
work();console.log('๋‹ค์Œ ์ž‘์—…');

work() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ ์ž‘์—…์ด ์ง„ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค. โ†’ setTImeout() ํ•จ์ˆ˜ ์‚ฌ์šฉ

function work() {    setTimeout(() => {        const start = Date.now();        for (let i = 0; i < 1000000000; i++) {}        const end = Date.now();        console.log(end - start + 'ms');    }, 0);}
console.log('์ž‘์—… ์‹œ์ž‘!');work();console.log('๋‹ค์Œ ์ž‘์—…');

๋จผ์ € work() ์ดํ›„์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  work() ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

๋งŒ์•ฝ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ work() ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ์ดํ›„์— ์–ด๋–ค ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function work(callback) {    setTimeout(() => {        const start = Date.now();        for (let i = 0; i < 1000000000; i++) {}        const end = Date.now();        console.log(end - start + 'ms');        callback();    }, 0);}
console.log('์ž‘์—… ์‹œ์ž‘!');work(() => {    console.log('์ž‘์—…์ด ๋๋‚ฌ์–ด์š”!');});console.log('๋‹ค์Œ ์ž‘์—…');

work() ๊ฐ€ ๋๋‚œ ๋’ค์— ์ˆ˜ํ–‰ํ•  ํ•จ์ˆ˜(์ž‘์—…)๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.


Promise#

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋งŽ์•„์งˆ ๋•Œ, ๋ชจ๋‘ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋‚œ์žกํ•ด์ง€๊ฒŒ๋œ๋‹ค.

function increaseAndPrint(n, callback) {    setTimeout(() => {        const increased = n + 1;        console.log(increased);        if (callback) {            callback(increased);        }    }, 1000);}
increaseAndPrint(0, (n) => {    increaseAndPrint(n, (n) => {        increaseAndPrint(n, (n) => {            increaseAndPrint(n, (n) => {                increaseAndPrint(n, (n) => {                    console.log('๋!');                });            });        });    });});

์ด๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ES6์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด Promise ์ด๋‹ค.

Promise ๋Š” ์„ฑ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์„ฑ๊ณตํ•  ๋•Œ๋Š” resolve ๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๊ณ , ์‹คํŒจํ•  ๋•Œ๋Š” reject ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

const myPromise = new Promise((resolve, reject) => {    setTimeout(() => {        resolve(1);    }, 1000);});
myPromise.then((n) => {    console.log(n);});

ยท ์•ฝ 3๋ถ„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ#

  • ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ var ์ƒ๋žต ๊ฐ€๋Šฅ?

๋ฏธ๋””์–ดํ”„๋กœ์ ํŠธ#

์ž๋ฃŒ ์กฐ์‚ฌ#

  - Tmap + ๋ธ”๋ž™๋ฐ•์Šค ์—ฐ๋™
     - ์˜์ƒ ๋ฐ์ดํ„ฐ์— ์‹œ๊ฐ„ ์ •๋ณด๋Š” ์ž˜ ๋‹ด๊น€
     - `mdls [ํŒŒ์ผ๋ช…]` (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณด๋Š” ๋ช…๋ น์–ด)
     - (๋ฒˆ์™ธ) Tmap ๋ธ”๋ž™๋ฐ•์Šค๋Š” ์˜์ƒ์— ๋‚ ์งœ ์‹œ๊ฐ„์ด ํ‘œ์‹œ ์•ˆ๋จ โ†’ ์‚ฌ๊ณ ์‹œ ๋ฒ•์  ํšจ๋ ฅ X
  - Tmap API ๊ณต๋ถ€ - ๐Ÿ”— [http://tmapapi.sktelecom.com/main.html](http://tmapapi.sktelecom.com/main.html)
  > ์›นํŽ˜์ด์ง€ ๋ณด๊ธฐ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ˆ ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •
  ```html  <div id="side_wrap" class="ui-resizable" style="height: 768px; width: 0px;">  ```


  ![2020-03-09-200310-image-0](./images/2020-03-09-200310-image-0.png)
  <br />

ํ•„์š”ํ•œ ๊ธฐ์ˆ #

Tmap๊ณผ ์—ฐ๋™ํ•œ ์šด์ „ ์Šต๊ด€ ๊ฐœ์„  ํ™•์žฅ ์•ฑ#

  1. pwa๋ฅผ ๋งŒ๋“ค๊ณ  ์˜์ƒ ์ดฌ์˜๊ณผ GPS ๋กœ๊ทธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง„ํ–‰ํ•˜๊ณ  Tmap์„ ์‹คํ–‰ํ•ด์„œ๊ฒฝ๋กœ๋ฅผ ์•ˆ๋‚ดํ•จ Tmap์—์„œ ์šดํ–‰ ์ข…๋ฃŒ๋ฅผ ํ•˜๋ฉด ์˜์ƒ ์ดฌ์˜, ๊ธฐ๋ก์„ ๋ฉˆ์ถค. GPS๋กœ๊ทธ์™€ ์˜์ƒ์„ ๋‹ด์•„ ์„œ๋ฒ„๋กœ ์ „์†กํ•จ.

    PWA์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์‹ฑ์ด ์•ˆ๋˜๋Š” ํ•œ๊ณ„

  2. pwa๋ฅผ ๋งŒ๋“ค๊ณ  ๋ชฉ์ ์ง€๋ฅผ ์ž…๋ ฅ ํ›„ Tmap ์‹คํ–‰ (Tmap์€ ๋ธ”๋ž™๋ฐ•์Šค ์‚ฌ์šฉ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š” ์ƒํƒœ) Tmap ์™„๋ฃŒ ํ›„ gps + ์˜์ƒ ์ถ”์ถœ.

    Tmap ์ฃผํ–‰ ํ›„ GPS ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์œผ๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PWA์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์‹ฑ์ด ์•ˆ๋˜์„œ GPS ๋ฐ์ดํ„ฐ ๋งŒ๋“œ๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•  ๋“ฏ

  3. ์•ฑ์„ ๋งŒ๋“ค๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์˜์ƒ ์ดฌ์˜, GPS ํŠธ๋ž™ํ•˜๋ฉด์„œ (๋ธ”๋ž™๋ฐ•์Šค ์—ญํ• ) Tmap์œผ๋กœ๊ฒฝ๋กœ ์•ˆ๋‚ด.

    ์‚ฌ์‹ค์ƒ ๋ธ”๋ž™๋ฐ•์Šค ์•ฑ?

    ๋‹ค๋ฅธ ์•ฑ๋“ค

์•ฑ ๋งŒ๋“ค๊ธฐ#

  • ionic

    ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณด๊ณ  ๊ตฌ๊ธ€๋ง ๊ฒฐ๊ณผ ๋‚ด์žฅ ์นด๋ฉ”๋ผ, ๋น„๋””์˜ค ๋ ˆ์ฝ”๋”ฉ ํ•˜๋Š” ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊นŒ์ง€ ํ•˜๊ธฐ์—” ์˜ˆ์ œ๋‚˜ ์ž๋ฃŒ๊ฐ€ ๋ถ€์กฑํ–ˆ์Œ.

  • React-Native

    ์ž๋ฃŒ๊ฐ€ ์กฐ๊ธˆ ๋” ๋งŽ์€ ํŽธ์ธ๋“ฏ

์–ด๋–ค ๊ฒƒ์œผ๋กœ ํ•ด์•ผํ•  ์ง€๋Š” ์กฐ๊ธˆ ๋” ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.

๊ทธ์™ธ ๋งŒ๋“ค๊ณ  ์‹ถ์€ ํ”„๋กœ์ ํŠธ๋“ค#

  • ์›นํŽ˜์ด์ง€ ๋ชจ๋“  ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ ํˆด

  • ์ฝ๊ธฐ๋ชจ๋“œ ์ต์Šคํ…์…˜ (chrome)