#
Express Secure RESTful APIhttps://auth0.com/blog/node-js-and-express-tutorial-building-and-securing-restful-apis/
https://www.stackhoarder.com/2019/07/17/node-js-passport-js-jwt-token-์ด์ฉํด-๋ก๊ทธ์ธ-๊ตฌํ/
notion-py ๋ฅผ ์ฌ์ฉํด์ Python ๊ธฐ๋ฐ์ผ๋ก์งํํ์์ง๋ง Python์ ์ ์ฌ์ฉํ์ง ์๋ค๋ณด๋ ์ ์ง ๋ณด์ํ๊ธฐ ํ๋ค์๋ค.
ts
๊ธฐ๋ฐ notion-api-worker ๊ฐ ์์ด์ ์ด๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค.
CLI๋ก page url ๋๋ database url์ ์ ๋ ฅ ๋ฐ๊ณ notion์ ์ปจํ ์ธ ๋ฅผ ํ์ฑํ์ฌ md ํ์ผ์ ์์ฑํ์. (CMS๋ฅผ ์ํด)
์ดํ ์น ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉด ์ข์ ๋ฏ.
ํ๋ก ํธ์๋์์ 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/
tsconfig
์์ฑ ๋ช
๋ น์ดtsc --init
tsconfig
์ต์
์ ๋ฆฌ8 Best Practices for Future-Proofing Your TypeScript Code
tsconfig ์ปดํ์ผ ์ต์ ์ ๋ฆฌ
[TS / Node] TS + Node.js + Express + Babel(option) + eslint๋ก ๊ฐ๋ฐํ๊ฒฝ ์ธํ ํ๊ธฐ
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" } }}
{ "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 ๋ฆฌํด
[ { "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 : ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ ์ ์๋ ์๋ต ํ์์ ์ง์ ํจ.
Content-Type : ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด๋ ์ฝํ ์ธ ์ ํ์
node ๋ก ๋ฐฑ์๋๋ฅผ ํ๋ค๋ณด๋ฉด shared ํด๋๋ฅผ ๋ง๋ค๊ณ ํ๊ฒฝ์ ์ ๊ฐ์ถ๊ณ ๋ฐฑ๊ณผ ํ๋ก ํธ๊ฐ ๊ณต์ ํ๊ธฐ๋ ํ๋ค.
HTML์ ๊ตฌ์กฐ
p ํ๊ทธ๋ฅผ ์ธ ๋๋ paragraph์ธ์ง
๊ธ์๋ฅผ ํฌ๊ฒํ์ ํ๊ณ h3๋ฅผ ์ฐ๋ฉด ์๋๋ค.
list ํ๊ทธ โ ๋ค์ ํํ์ด์ง์ ๋ด์ค ๋ฆฌ์คํธ
CSS๋ ์คํ์ผ
CSS, JS๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒฝํฅ
ํ๋์ ํ๋ ์์ํฌ๋ ์ปดํฌ๋ํธ ๋ณ๋ก, ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ชจ์ผ๊ธฐ๋ ํจ.
๊ฐ๋ฐํ ๋ ํญ์ ๋๋ ์
์ํํธ์จ์ด๊ฐ ํญ์ ๋ณ๊ฒฝ๋๋ค๋ ๊ฐ์ ์ ํ๊ณ ๊ฐ๋ฐํ๋ผ. ์๋น์ค ์ฝ๋๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค.
์ข์ ์ฝ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ, ๋ณ๊ฒฝ์ด ์ฉ์ดํ ์ฝ๋. ๋ณ๊ฒฝ์ ํ์ ๋ ๋ค๋ฅธ ์ฝ๋์ ์ํฅ์์ฃผ์ง ์๋ ์ฝ๋
๋ณ๊ฒฝ๋ ๋ ์ํฅ์ ๋ ์ฃผ๊ณ ์์ ๋ ์ฝ๊ฒ ๋๊ณ ๊ธฐ๋ฅ๋ ์ถ๊ฐ๋๊ณ ...
๋๋ ์ ์ญํ ๋ณ๋ก
CSS ๊ณตํต ๋ถ๋ถ > Global, common ...
๋ชจ๋ ๋ฆฌํฉํ ๋ง์ ์ค๋ณต๋ถํฐ
๋งค์ง๋๋ฒ๋ฅผ ์์ ๋ผ - ์ฝ๋์์ ์ซ์, ๋ฌธ์์ด์ ์ธ ๋ ๋ถ๋ฆฌํด๋ผ.
JS์์ CSS๋ฅผ ์กฐ์ํ ์ผ์ด ์์ ๋ โ classList์ remove, add, toggle ๋ฑ์ผ๋ก ์กฐ์ํ๋ค. ์คํ์ผ์ ์ง์ ์กฐ์ํ์ง ์์.
์ ์ง๋ณด์๊ฐ ๊ฐ๋ฅํ ์ฝ๋
๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋
ํ ์คํธ๊ฐ ์ฌ์ด ์ฝ๋
์ญํ ์ด ๋ช ํํ ํจ์
์ ๊ทผํ ์ผ์ด ๋ง์ผ๋ฉด ๋ณ์์ ๋ด์์
์ด๋ฒคํธ๋ฅผ ์ด๋์ ๋ฑ๋กํด์ผ ํ ๊น?
์กฐ๊ฑด๋ ํจ์๋ก ๋๋ ๋ผ
์ด๋ป๊ฒ ๋ชจ๋ํ๋ฅผ ์ํ ๊น
์ด๋ป๊ฒ ๋ณ๊ฒฝ์ด ์ฉ์ดํ ์ฝ๋๋ฅผ ๋ง๋ค๊น
ํ๋ ์์ํฌ๋ฅผ ์จ๋ ๋ชจ๋ํ๊ฐ ์๋์ผ๋ก ๋๋๊ฒ ์๋๋ค
์คํ์์ค๋ฅผ ์์ฃผ ๋ณด๋ฉด ๋์์ด ๋๋ค.
์ข์ ํ์ฌ๋ฉด ๋์ํ๋ ์๋น์ค ์์ค๋ฅผ ๋ณผ ์ ์๋ค
๋๋ง์ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋ ๊ฑธ ํด๋ณด์ธ์.
ํจ์๋ฅผ ๋ฒ์ฉ์ ์ผ๋ก
์ธํ์ด ์๊ณ ์์ํ์ด ์๋ ๊ฒ์ด ํ ์คํธ๊ฐ ํธํ ์ฝ๋
setInterval ๋จ์
์ setTimeout์ ์ฌ๊ท์ ์ผ๋ก ์ฌ์ฉํ๋์ง
ES ๋ชจ๋
๋ ๋๋ง์ ์์ฃผ ์ผ์ผํค์ง ๋ง์๋ผ
ํจ์๊ฐ ์งง์์ ์ข๋ค
๊ณผ๋ํ ์ ๋๋ก ๋๋๋๊ฒ ๋ซ๋ค
ํ๋ก ํธ์์๋ import export๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ชจ๋ ๊ด๋ฆฌ๋ ์์กด์ฑ ๊ด๋ฆฌ์ด๋ค.
util์ ๋ฒ์ฉ์ฑ ์๋ ๊ฒ, ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฌด๊ดํ
๋ฐฑ์๋์์ ๋งค์ง๋๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ํฌ๋ฆฌํฐ์ปฌํ ์ด์๊ฐ ์๊ธด๋ค.
ํ์๊ฐ์ ๋ก๊ทธ์ธ
โ ํด๋ผ์ด์ธํธ์์ validation, ์๋ฒ์์ validation์ ํด์ค์ผ ํ๋ค.
๋๊ตฌ๋ฅผ ์ดํดํ๊ณ ์จ์ผํ๋ค.
์ค์ ๋ก ์ค์ํ๊ฑด ์ ์ง ๋ณด์, hotfix๊ฐ ์์ฃผ ์ผ์ด๋๋ค.
ํ์ ๋ชฉํ ์๋ฆฝ, ์ํค ๋ฑ๋ก
๊ฐ๋ฐํด์ผ ํ ๋ด์ฉ์ 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]
์ปจ๋ฒค์ ๋ ์ปค๋ฐ์ ์ฐธ์กฐํจ.
GitHub๋ก ํ๋ก์ ํธ ๊ด๋ฆฌํ๊ธฐ Part1 - ์ด์ ๋ฐ๊ธ ๋ถํฐ ์ฝ๋๋ฆฌ๋ทฐ๊น์ง | Popit
์์์ผ
ํ์์ผ - ๋ชฝ์ดํ ์ฑ์ญ ํฐ์ง 11์ธต, 9์
์์์ผ, ๋ชฉ์์ผ - ๋ฒ๊ณ์ญ ์คํ๋ฒ ์ค, 9์
๋ชฉ์์ผ ์์ฑ์ ๋ชฉํ๋ก, ๊ธ์์ผ ์ค์ ์๋ ๋ฌธ์ ์ ๋ฆฌ๋, ๋ฆฌํฉํ ๋ง ์ ๋๋ง
๊ธ์์ผ ์ค์ 11์๊น์ง
์ฐ์ํํ ํฌ์บ ํ ๋๋๊ณ ํจ๊ป ํ๋ก์ ํธํ ์ฌ๋๋ค ๋ง๋๊ธฐ
๋ค๋ฅธ ์ฌ๋ ์๊ฒฌ ์ ๋ฃ๊ธฐ
๋ด๊ฐ ์๋ ๊ฒ์ ์น์ ํ ์๋ ค์ฃผ๊ธฐ
๋ชจ๋ฅด๋ ๊ฒ์ ์ ์ง๋ฌธํ๊ธฐ
๋ฐฐ์ด ๊ฒ์ ๊ฐ์ธ์ ์ผ๋ก ์จ๋จน์ด ๋ณด๊ธฐ
์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ์ค๋ ๋ณต์ตํ๊ธฐ
Git์ ๋ฆฌ๋์ค ํ ๋ฐ์ฆ(Linus Torvalds)๊ฐ ๋ฆฌ๋ ์ค(Linux) ์ปค๋์ ๊ด๋ฆฌํ๊ธฐ ์ํด์ ๋ง๋ ์์ค๊ด๋ฆฌ ํด์ด๋ค. (ใทใท) Git ์ด์ ์ ํ์๊ด๋ฆฌ ํด์ SVN, CVS ๋ฑ์ด ์์์.
๊ฐ๋จํ ์๊ท๋ชจ ํ๋ก์ ํธ์ Git์ ์ฌ์ฉํ๋ ๊ฒ์ ๋์ด๋๋ฅผ ๋์ด์ง๋ง, ๋ณต์กํ ๋๊ท๋ชจํ๋ก์ ํธ์์๋ ํ๋ก์ ํธ์ ๋์ด๋๋ฅผ ์๋นํ ๋ฎ์ถ ์ ์๊ธฐ ๋๋ฌธ์ ํ์์ ์ด๋ค.
git add .
: ๋ณ๊ฒฝ์ฌํญ์ด ์๋ ๋ชจ๋ ํ์ผ์ ํ๋ฒ์ ์คํ
์ด์ง ํ์ง ๋ง์๋ผ. ํ ํ์ผํ ํ์ผ ์ฉ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ๋ฉด์ ์ปค๋ฐํด๋ผ.
git commit -m ""
: ์ปค๋ฐ์ git commit
์ผ๋ก ์ ๋ชฉ๊ณผ ํจ๊ป ๊ฐ๋จํ ์ค๋ช
๊น์ง ๋ง๋ถ์ฌ์ ์์ฑํ๋ ๊ฒ์ด ์ ์์ด๋ค.
์ด๋ฌํ ์ํฐ ํจํด์ด ๋ง์ฐํด ์์. ์ข์ ์ปค๋ฐ ์ต๊ด์ ๊ธฐ๋ฅด๋ ๊ฒ์ด ์ค์ํ๋ค.
Git-flow, Github flow, Gitlab flow ๊ฐ๊ฐ์ด ๋ค๋ฅธ ํ์ ๊ด๋ฆฌ ์ ๋ต์ด๋ค. ์ด ์ธ์๋ ์๋ง์ flow ๋ค์ด ์กด์ฌ. ํ์ง๋ง Git-flow ๋ผ๋ ์ด๋ฆ ๋๋ฌธ์ Git flow๊ฐ ์ ์, ํ์ค์ด๋ผ๋ ์คํด๋ฅผ ํ๊ธฐ ์ฝ๋ค. ํ์ง๋ง Git flow๊ฐ ๋ณต์กํ๊ณ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฐ๋์งํ์ง ์์ ์กฐ์ง, ํ์ด ์์ ์ ์๋ค. Git flow ์ธ์๋ ํ๋ฅญํ flow ์ ๋ต๋ค์ด ๋ง๊ธฐ ๋๋ฌธ์ Git flow์ ๋ํด ๊ณต๋ถํ๋ ๊ฒ์ ์ข์ง๋ง ๋ฌด์กฐ๊ฑด GIt flow๋ฅผ ์ ์ฉํ๋ ๊ฒ์ดํ์ค์ธ ๊ฒ์ ์๋๋ค.
์ฐ๋ฆฐ Git-flow๋ฅผ ์ฌ์ฉํ๊ณ ์์ด์ - ์ฐ์ํํ์ ๋ค ๊ธฐ์ ๋ธ๋ก๊ทธ
ํ๋ฃจ์ 1000๋ฒ ๋ฐฐํฌํ๋ ์กฐ์ง ๋๊ธฐ | ๋ฑ ํฌ์๋ฌ๋
๋ฉ์์ง๋ ํ๊ธ๋ ๊ฐ๋ฅํ๋ค.
์ปค๋ฐ ๋ฉ์์ง๋ ํ์ ๋ฟ๋ง ์๋๋ผ ๋ฏธ๋์ ๋๋ฅผ ์ํด ๋จ๊ธฐ๋ ๊ฒ์ด๋ค. ์ ๋นํ ๋จ์ด๋ฅผ์ฐพ์ง ๋ชปํ ์ด์ํ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๋จ๊ธฐ๋ ๊ฒ๋ณด๋ค ํ๊ธ๋ก ๋ช ํํ๊ฒ ์์ฑํ๋ ๊ฒ์ด ํจ์ฌ๋ซ๋ค.
์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์คํ ์์ค๊ฐ ์๋๋๊น
ํ์ด๋ธ๋ฆฌ๋๋ก ์ปค๋ฐ ๋ฉ์์ง ์ ๋ชฉ์ ์์ด๋ก ๋จ๊ธฐ๊ณ ์ค๋ช ์ ํ๊ธ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
์ค์ ๋ก TDD๋ฅผ ์ํ๋ ํ์์ ํ ์คํธ ์ฝ๋์ ๋ฉ์๋ ๋ช ์ ํ๊ธ๋ก ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํจ์ฌ ๋ช ํํ ๋ฉ์๋ ๋ช ์ผ๋ก ์ธํด ์ข์ ํจ๊ณผ๊ฐ ์๋ค.
fork ํ PR๊ณผ branch ํ PR์ ์ฐจ์ด
๊ธฐ๋ณธ์ ์ผ๋ก fork๋ ๋ด๊ฐ ์ด ์ ์ฅ์์ ๊ถํ์ด ์์ ๋ ํ๋ ๊ฒ์ด๋ค. ์คํ ์์ค์ ๊ธฐ์ฌํ๋ ๊ฒฝ์ฐ ๋ฑ๋ฑ..
Git ๋์ ์๋ฆฌ๋ฅผ ์ ๋๋ก ๋ฐฐ์ด ๊ฒ์ ์ฒ์์ด์๊ณ ๊ธฐ์กด ์๊ณ ์๋ ๊ฐ๋ ์ด ์๋ชป๋์๋ค๋๊ฒ์ ๊นจ๋ซ๊ณ ๊ฐ์ธ์ ์ผ๋ก ์ถฉ๊ฒฉ์ ๋ฐ์๋ค.
git init : ์จ๊ฒจ์ง ํด๋๊ฐ ํ๋ ์๊น
.git : ๋ก์ปฌ ์ ์ฅ์
git์ ์ ์ฅ ๋จ์๋ ์ปค๋ฐ
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 ๋ก์ปฌ ์ ์ฅ์์ ์๋ ๊ฒ์ ์๊ฒฉ ์ ์ฅ์๋ก ๋ณด๋
๋งฅ(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 />
์ฑ๊ณต!
condition ? true : false
let text = array.length === 0 ? `๋ฐฐ์ด์ด ๋น์ด์๋ค.` : `๋ฐฐ์ด์ด ๋น์ด์์ง ์๋ค`;
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);
์ด๋ ๊ฒ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
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()
๊ฐ ๋๋ ๋ค์ ์ํํ ํจ์(์์
)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ค๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋น๋๊ธฐ ์์ ์ด ๋ง์์ง ๋, ๋ชจ๋ ์ฝ๋ฐฑ ํจ์๋ก ์ฒ๋ฆฌํ๋ฉด ์ฝ๋๊ฐ ๋์กํด์ง๊ฒ๋๋ค.
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);});
๋ณ์ ํค์๋ 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 />
pwa๋ฅผ ๋ง๋ค๊ณ ์์ ์ดฌ์๊ณผ GPS ๋ก๊ทธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์งํํ๊ณ Tmap์ ์คํํด์๊ฒฝ๋ก๋ฅผ ์๋ดํจ Tmap์์ ์ดํ ์ข ๋ฃ๋ฅผ ํ๋ฉด ์์ ์ดฌ์, ๊ธฐ๋ก์ ๋ฉ์ถค. GPS๋ก๊ทธ์ ์์์ ๋ด์ ์๋ฒ๋ก ์ ์กํจ.
PWA์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ฑ์ด ์๋๋ ํ๊ณ
pwa๋ฅผ ๋ง๋ค๊ณ ๋ชฉ์ ์ง๋ฅผ ์ ๋ ฅ ํ Tmap ์คํ (Tmap์ ๋ธ๋๋ฐ์ค ์ฌ์ฉ์ผ๋ก ์ค์ ๋์ด ์๋ ์ํ) Tmap ์๋ฃ ํ gps + ์์ ์ถ์ถ.
Tmap ์ฃผํ ํ GPS ์ถ์ถ์ด ๊ฐ๋ฅํ์ง ์์ผ๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก PWA์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ฑ์ด ์๋์ GPS ๋ฐ์ดํฐ ๋ง๋๋๊ฒ ๋ถ๊ฐ๋ฅํ ๋ฏ
์ฑ์ ๋ง๋ค๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ ์ดฌ์, GPS ํธ๋ํ๋ฉด์ (๋ธ๋๋ฐ์ค ์ญํ ) Tmap์ผ๋ก๊ฒฝ๋ก ์๋ด.
์ฌ์ค์ ๋ธ๋๋ฐ์ค ์ฑ?
๋ค๋ฅธ ์ฑ๋ค
ionic
ํ๋ฒ ์๋ํด๋ณด๊ณ ๊ตฌ๊ธ๋ง ๊ฒฐ๊ณผ ๋ด์ฅ ์นด๋ฉ๋ผ, ๋น๋์ค ๋ ์ฝ๋ฉ ํ๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๊ฒ๊น์ง ํ๊ธฐ์ ์์ ๋ ์๋ฃ๊ฐ ๋ถ์กฑํ์.
React-Native
์๋ฃ๊ฐ ์กฐ๊ธ ๋ ๋ง์ ํธ์ธ๋ฏ
์ด๋ค ๊ฒ์ผ๋ก ํด์ผํ ์ง๋ ์กฐ๊ธ ๋ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ์ ํ๋ ๊ฒ์ผ๋ก ํ๋ค.
์นํ์ด์ง ๋ชจ๋ ์์ค ๋ค์ด๋ก๋ ํด
์ฝ๊ธฐ๋ชจ๋ ์ต์คํ ์ (chrome)