권주희

Merge branch 'feature/kakaomap_setting' into 'develop'

Feature/kakaomap setting

- setting the basic layout of frontend
- display the kakao map in main page
   - display the kakao map in main page
   - add search location box
   - create the marker to each map
- implement InfoWindow 
   - add display infowindow function for each marker

See merge request !3
...@@ -1274,6 +1274,24 @@ ...@@ -1274,6 +1274,24 @@
1274 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", 1274 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
1275 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" 1275 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
1276 }, 1276 },
1277 + "@emotion/is-prop-valid": {
1278 + "version": "0.8.8",
1279 + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
1280 + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
1281 + "requires": {
1282 + "@emotion/memoize": "0.7.4"
1283 + }
1284 + },
1285 + "@emotion/memoize": {
1286 + "version": "0.7.4",
1287 + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
1288 + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
1289 + },
1290 + "@emotion/unitless": {
1291 + "version": "0.7.5",
1292 + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
1293 + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
1294 + },
1277 "@hapi/address": { 1295 "@hapi/address": {
1278 "version": "2.1.4", 1296 "version": "2.1.4",
1279 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", 1297 "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
...@@ -1487,6 +1505,25 @@ ...@@ -1487,6 +1505,25 @@
1487 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", 1505 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
1488 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" 1506 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
1489 }, 1507 },
1508 + "@popperjs/core": {
1509 + "version": "2.4.0",
1510 + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.4.0.tgz",
1511 + "integrity": "sha512-NMrDy6EWh9TPdSRiHmHH2ye1v5U0gBD7pRYwSwJvomx7Bm4GG04vu63dYiVzebLOx2obPpJugew06xVP0Nk7hA=="
1512 + },
1513 + "@restart/context": {
1514 + "version": "2.1.4",
1515 + "resolved": "https://registry.npmjs.org/@restart/context/-/context-2.1.4.tgz",
1516 + "integrity": "sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q=="
1517 + },
1518 + "@restart/hooks": {
1519 + "version": "0.3.25",
1520 + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.3.25.tgz",
1521 + "integrity": "sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==",
1522 + "requires": {
1523 + "lodash": "^4.17.15",
1524 + "lodash-es": "^4.17.15"
1525 + }
1526 + },
1490 "@sheerun/mutationobserver-shim": { 1527 "@sheerun/mutationobserver-shim": {
1491 "version": "0.3.3", 1528 "version": "0.3.3",
1492 "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", 1529 "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz",
...@@ -1702,6 +1739,8 @@ ...@@ -1702,6 +1739,8 @@
1702 }, 1739 },
1703 "@testing-library/jest-dom": { 1740 "@testing-library/jest-dom": {
1704 "version": "4.2.4", 1741 "version": "4.2.4",
1742 + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz",
1743 + "integrity": "sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg==",
1705 "requires": { 1744 "requires": {
1706 "@babel/runtime": "^7.5.1", 1745 "@babel/runtime": "^7.5.1",
1707 "chalk": "^2.4.1", 1746 "chalk": "^2.4.1",
...@@ -1726,6 +1765,8 @@ ...@@ -1726,6 +1765,8 @@
1726 }, 1765 },
1727 "@testing-library/react": { 1766 "@testing-library/react": {
1728 "version": "9.5.0", 1767 "version": "9.5.0",
1768 + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz",
1769 + "integrity": "sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg==",
1729 "requires": { 1770 "requires": {
1730 "@babel/runtime": "^7.8.4", 1771 "@babel/runtime": "^7.8.4",
1731 "@testing-library/dom": "^6.15.0", 1772 "@testing-library/dom": "^6.15.0",
...@@ -1733,7 +1774,9 @@ ...@@ -1733,7 +1774,9 @@
1733 } 1774 }
1734 }, 1775 },
1735 "@testing-library/user-event": { 1776 "@testing-library/user-event": {
1736 - "version": "7.2.1" 1777 + "version": "7.2.1",
1778 + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz",
1779 + "integrity": "sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA=="
1737 }, 1780 },
1738 "@types/babel__core": { 1781 "@types/babel__core": {
1739 "version": "7.1.7", 1782 "version": "7.1.7",
...@@ -1965,6 +2008,11 @@ ...@@ -1965,6 +2008,11 @@
1965 } 2008 }
1966 } 2009 }
1967 }, 2010 },
2011 + "@types/warning": {
2012 + "version": "3.0.0",
2013 + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz",
2014 + "integrity": "sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI="
2015 + },
1968 "@types/yargs": { 2016 "@types/yargs": {
1969 "version": "13.0.9", 2017 "version": "13.0.9",
1970 "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", 2018 "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
...@@ -2818,6 +2866,22 @@ ...@@ -2818,6 +2866,22 @@
2818 "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", 2866 "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz",
2819 "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" 2867 "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA=="
2820 }, 2868 },
2869 + "babel-plugin-styled-components": {
2870 + "version": "1.10.7",
2871 + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz",
2872 + "integrity": "sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg==",
2873 + "requires": {
2874 + "@babel/helper-annotate-as-pure": "^7.0.0",
2875 + "@babel/helper-module-imports": "^7.0.0",
2876 + "babel-plugin-syntax-jsx": "^6.18.0",
2877 + "lodash": "^4.17.11"
2878 + }
2879 + },
2880 + "babel-plugin-syntax-jsx": {
2881 + "version": "6.18.0",
2882 + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
2883 + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
2884 + },
2821 "babel-plugin-syntax-object-rest-spread": { 2885 "babel-plugin-syntax-object-rest-spread": {
2822 "version": "6.13.0", 2886 "version": "6.13.0",
2823 "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", 2887 "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
...@@ -3130,6 +3194,11 @@ ...@@ -3130,6 +3194,11 @@
3130 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 3194 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
3131 "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 3195 "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
3132 }, 3196 },
3197 + "bootstrap": {
3198 + "version": "3.4.1",
3199 + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
3200 + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA=="
3201 + },
3133 "brace-expansion": { 3202 "brace-expansion": {
3134 "version": "1.1.11", 3203 "version": "1.1.11",
3135 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 3204 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
...@@ -3417,6 +3486,11 @@ ...@@ -3417,6 +3486,11 @@
3417 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 3486 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
3418 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 3487 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
3419 }, 3488 },
3489 + "camelize": {
3490 + "version": "1.0.0",
3491 + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz",
3492 + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs="
3493 + },
3420 "caniuse-api": { 3494 "caniuse-api": {
3421 "version": "3.0.0", 3495 "version": "3.0.0",
3422 "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", 3496 "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
...@@ -3585,6 +3659,11 @@ ...@@ -3585,6 +3659,11 @@
3585 } 3659 }
3586 } 3660 }
3587 }, 3661 },
3662 + "classnames": {
3663 + "version": "2.2.6",
3664 + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
3665 + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
3666 + },
3588 "clean-css": { 3667 "clean-css": {
3589 "version": "4.2.3", 3668 "version": "4.2.3",
3590 "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", 3669 "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
...@@ -4052,6 +4131,11 @@ ...@@ -4052,6 +4131,11 @@
4052 "postcss": "^7.0.5" 4131 "postcss": "^7.0.5"
4053 } 4132 }
4054 }, 4133 },
4134 + "css-color-keywords": {
4135 + "version": "1.0.0",
4136 + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
4137 + "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU="
4138 + },
4055 "css-color-names": { 4139 "css-color-names": {
4056 "version": "0.0.4", 4140 "version": "0.0.4",
4057 "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", 4141 "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
...@@ -4135,6 +4219,23 @@ ...@@ -4135,6 +4219,23 @@
4135 "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", 4219 "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
4136 "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" 4220 "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
4137 }, 4221 },
4222 + "css-to-react-native": {
4223 + "version": "2.3.2",
4224 + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz",
4225 + "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==",
4226 + "requires": {
4227 + "camelize": "^1.0.0",
4228 + "css-color-keywords": "^1.0.0",
4229 + "postcss-value-parser": "^3.3.0"
4230 + },
4231 + "dependencies": {
4232 + "postcss-value-parser": {
4233 + "version": "3.3.1",
4234 + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
4235 + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
4236 + }
4237 + }
4238 + },
4138 "css-tree": { 4239 "css-tree": {
4139 "version": "1.0.0-alpha.37", 4240 "version": "1.0.0-alpha.37",
4140 "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", 4241 "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
...@@ -4326,6 +4427,11 @@ ...@@ -4326,6 +4427,11 @@
4326 } 4427 }
4327 } 4428 }
4328 }, 4429 },
4430 + "daum-map-api": {
4431 + "version": "1.0.2",
4432 + "resolved": "https://registry.npmjs.org/daum-map-api/-/daum-map-api-1.0.2.tgz",
4433 + "integrity": "sha1-3hbrEB11Ea5dZC/CZsl/lHmJiqQ="
4434 + },
4329 "debug": { 4435 "debug": {
4330 "version": "2.6.9", 4436 "version": "2.6.9",
4331 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4437 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
...@@ -4585,6 +4691,15 @@ ...@@ -4585,6 +4691,15 @@
4585 "utila": "~0.4" 4691 "utila": "~0.4"
4586 } 4692 }
4587 }, 4693 },
4694 + "dom-helpers": {
4695 + "version": "5.1.4",
4696 + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz",
4697 + "integrity": "sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==",
4698 + "requires": {
4699 + "@babel/runtime": "^7.8.7",
4700 + "csstype": "^2.6.7"
4701 + }
4702 + },
4588 "dom-serializer": { 4703 "dom-serializer": {
4589 "version": "0.2.2", 4704 "version": "0.2.2",
4590 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", 4705 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
...@@ -7347,6 +7462,11 @@ ...@@ -7347,6 +7462,11 @@
7347 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 7462 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
7348 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 7463 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
7349 }, 7464 },
7465 + "is-what": {
7466 + "version": "3.8.0",
7467 + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.8.0.tgz",
7468 + "integrity": "sha512-UKeBoQfV8bjlM4pmx1FLDHdxslW/1mTksEs8ReVsilPmUv5cORd4+2/wFcviI3cUjrLybxCjzc8DnodAzJ/Wrg=="
7469 + },
7350 "is-windows": { 7470 "is-windows": {
7351 "version": "1.0.2", 7471 "version": "1.0.2",
7352 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 7472 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
...@@ -8258,6 +8378,11 @@ ...@@ -8258,6 +8378,11 @@
8258 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 8378 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
8259 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 8379 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
8260 }, 8380 },
8381 + "lodash-es": {
8382 + "version": "4.17.15",
8383 + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.15.tgz",
8384 + "integrity": "sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ=="
8385 + },
8261 "lodash._reinterpolate": { 8386 "lodash._reinterpolate": {
8262 "version": "3.0.0", 8387 "version": "3.0.0",
8263 "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", 8388 "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
...@@ -8404,6 +8529,11 @@ ...@@ -8404,6 +8529,11 @@
8404 "p-is-promise": "^2.0.0" 8529 "p-is-promise": "^2.0.0"
8405 } 8530 }
8406 }, 8531 },
8532 + "memoize-one": {
8533 + "version": "5.1.1",
8534 + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz",
8535 + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA=="
8536 + },
8407 "memory-fs": { 8537 "memory-fs": {
8408 "version": "0.4.1", 8538 "version": "0.4.1",
8409 "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", 8539 "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
...@@ -8442,6 +8572,14 @@ ...@@ -8442,6 +8572,14 @@
8442 } 8572 }
8443 } 8573 }
8444 }, 8574 },
8575 + "merge-anything": {
8576 + "version": "2.4.4",
8577 + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz",
8578 + "integrity": "sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ==",
8579 + "requires": {
8580 + "is-what": "^3.3.1"
8581 + }
8582 + },
8445 "merge-deep": { 8583 "merge-deep": {
8446 "version": "3.0.2", 8584 "version": "3.0.2",
8447 "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", 8585 "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz",
...@@ -10624,6 +10762,15 @@ ...@@ -10624,6 +10762,15 @@
10624 "react-is": "^16.8.1" 10762 "react-is": "^16.8.1"
10625 } 10763 }
10626 }, 10764 },
10765 + "prop-types-extra": {
10766 + "version": "1.1.1",
10767 + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
10768 + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
10769 + "requires": {
10770 + "react-is": "^16.3.2",
10771 + "warning": "^4.0.0"
10772 + }
10773 + },
10627 "proxy-addr": { 10774 "proxy-addr": {
10628 "version": "2.0.6", 10775 "version": "2.0.6",
10629 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 10776 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
...@@ -10782,6 +10929,8 @@ ...@@ -10782,6 +10929,8 @@
10782 }, 10929 },
10783 "react": { 10930 "react": {
10784 "version": "16.13.1", 10931 "version": "16.13.1",
10932 + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
10933 + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
10785 "requires": { 10934 "requires": {
10786 "loose-envify": "^1.1.0", 10935 "loose-envify": "^1.1.0",
10787 "object-assign": "^4.1.1", 10936 "object-assign": "^4.1.1",
...@@ -10801,6 +10950,26 @@ ...@@ -10801,6 +10950,26 @@
10801 "whatwg-fetch": "^3.0.0" 10950 "whatwg-fetch": "^3.0.0"
10802 } 10951 }
10803 }, 10952 },
10953 + "react-bootstrap": {
10954 + "version": "1.0.1",
10955 + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-1.0.1.tgz",
10956 + "integrity": "sha512-xMHwsvDN7sIv26P9wWiosWjITZije2dRCjEJHVfV2KFoSJY+8uv2zttEw0XMB7xviQcW3zuIGLJXuj8vf6lYEg==",
10957 + "requires": {
10958 + "@babel/runtime": "^7.4.2",
10959 + "@restart/context": "^2.1.4",
10960 + "@restart/hooks": "^0.3.21",
10961 + "@types/react": "^16.9.23",
10962 + "classnames": "^2.2.6",
10963 + "dom-helpers": "^5.1.2",
10964 + "invariant": "^2.2.4",
10965 + "prop-types": "^15.7.2",
10966 + "prop-types-extra": "^1.1.0",
10967 + "react-overlays": "^3.1.2",
10968 + "react-transition-group": "^4.0.0",
10969 + "uncontrollable": "^7.0.0",
10970 + "warning": "^4.0.3"
10971 + }
10972 + },
10804 "react-dev-utils": { 10973 "react-dev-utils": {
10805 "version": "10.2.1", 10974 "version": "10.2.1",
10806 "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz", 10975 "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.2.1.tgz",
...@@ -11033,6 +11202,8 @@ ...@@ -11033,6 +11202,8 @@
11033 }, 11202 },
11034 "react-dom": { 11203 "react-dom": {
11035 "version": "16.13.1", 11204 "version": "16.13.1",
11205 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
11206 + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
11036 "requires": { 11207 "requires": {
11037 "loose-envify": "^1.1.0", 11208 "loose-envify": "^1.1.0",
11038 "object-assign": "^4.1.1", 11209 "object-assign": "^4.1.1",
...@@ -11050,6 +11221,39 @@ ...@@ -11050,6 +11221,39 @@
11050 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 11221 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
11051 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 11222 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
11052 }, 11223 },
11224 + "react-kakao-maps": {
11225 + "version": "0.0.13",
11226 + "resolved": "https://registry.npmjs.org/react-kakao-maps/-/react-kakao-maps-0.0.13.tgz",
11227 + "integrity": "sha512-1ZHGbdvucFpq3rPSee1UB8cY/61QloQeH2Kh1SMSvIoL2kIUIo1lbF8FnwkHo3zrbpqcS4kIFPvvDB5xs27MdA==",
11228 + "requires": {
11229 + "@babel/runtime-corejs3": "^7.6.2",
11230 + "babel-runtime": "^6.26.0",
11231 + "react": "^16.9.0",
11232 + "react-dom": "^16.9.0",
11233 + "scriptjs": "^2.5.9",
11234 + "styled-components": "^4.3.2"
11235 + }
11236 + },
11237 + "react-lifecycles-compat": {
11238 + "version": "3.0.4",
11239 + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
11240 + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
11241 + },
11242 + "react-overlays": {
11243 + "version": "3.2.0",
11244 + "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-3.2.0.tgz",
11245 + "integrity": "sha512-YTgCmw6l4uBOYylSnc3V8WLX+A0EoGnzDrqkYz0K7MUKbMBZFpaxLXH4EF9eZbspd+syZHQ5XAABI7n/zak1EA==",
11246 + "requires": {
11247 + "@babel/runtime": "^7.4.5",
11248 + "@popperjs/core": "^2.0.0",
11249 + "@restart/hooks": "^0.3.12",
11250 + "@types/warning": "^3.0.0",
11251 + "dom-helpers": "^5.1.0",
11252 + "prop-types": "^15.7.2",
11253 + "uncontrollable": "^7.0.0",
11254 + "warning": "^4.0.3"
11255 + }
11256 + },
11053 "react-router": { 11257 "react-router": {
11054 "version": "5.2.0", 11258 "version": "5.2.0",
11055 "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", 11259 "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
...@@ -11098,6 +11302,8 @@ ...@@ -11098,6 +11302,8 @@
11098 }, 11302 },
11099 "react-scripts": { 11303 "react-scripts": {
11100 "version": "3.4.1", 11304 "version": "3.4.1",
11305 + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz",
11306 + "integrity": "sha512-JpTdi/0Sfd31mZA6Ukx+lq5j1JoKItX7qqEK4OiACjVQletM1P38g49d9/D0yTxp9FrSF+xpJFStkGgKEIRjlQ==",
11101 "requires": { 11307 "requires": {
11102 "@babel/core": "7.9.0", 11308 "@babel/core": "7.9.0",
11103 "@svgr/webpack": "4.3.3", 11309 "@svgr/webpack": "4.3.3",
...@@ -11175,6 +11381,17 @@ ...@@ -11175,6 +11381,17 @@
11175 } 11381 }
11176 } 11382 }
11177 }, 11383 },
11384 + "react-transition-group": {
11385 + "version": "4.4.1",
11386 + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz",
11387 + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==",
11388 + "requires": {
11389 + "@babel/runtime": "^7.5.5",
11390 + "dom-helpers": "^5.0.1",
11391 + "loose-envify": "^1.4.0",
11392 + "prop-types": "^15.6.2"
11393 + }
11394 + },
11178 "read-pkg": { 11395 "read-pkg": {
11179 "version": "2.0.0", 11396 "version": "2.0.0",
11180 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 11397 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
...@@ -11752,6 +11969,11 @@ ...@@ -11752,6 +11969,11 @@
11752 "ajv-keywords": "^3.4.1" 11969 "ajv-keywords": "^3.4.1"
11753 } 11970 }
11754 }, 11971 },
11972 + "scriptjs": {
11973 + "version": "2.5.9",
11974 + "resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz",
11975 + "integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg=="
11976 + },
11755 "select-hose": { 11977 "select-hose": {
11756 "version": "2.0.0", 11978 "version": "2.0.0",
11757 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", 11979 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
...@@ -12702,6 +12924,36 @@ ...@@ -12702,6 +12924,36 @@
12702 } 12924 }
12703 } 12925 }
12704 }, 12926 },
12927 + "styled-components": {
12928 + "version": "4.4.1",
12929 + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-4.4.1.tgz",
12930 + "integrity": "sha512-RNqj14kYzw++6Sr38n7197xG33ipEOktGElty4I70IKzQF1jzaD1U4xQ+Ny/i03UUhHlC5NWEO+d8olRCDji6g==",
12931 + "requires": {
12932 + "@babel/helper-module-imports": "^7.0.0",
12933 + "@babel/traverse": "^7.0.0",
12934 + "@emotion/is-prop-valid": "^0.8.1",
12935 + "@emotion/unitless": "^0.7.0",
12936 + "babel-plugin-styled-components": ">= 1",
12937 + "css-to-react-native": "^2.2.2",
12938 + "memoize-one": "^5.0.0",
12939 + "merge-anything": "^2.2.4",
12940 + "prop-types": "^15.5.4",
12941 + "react-is": "^16.6.0",
12942 + "stylis": "^3.5.0",
12943 + "stylis-rule-sheet": "^0.0.10",
12944 + "supports-color": "^5.5.0"
12945 + },
12946 + "dependencies": {
12947 + "supports-color": {
12948 + "version": "5.5.0",
12949 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
12950 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
12951 + "requires": {
12952 + "has-flag": "^3.0.0"
12953 + }
12954 + }
12955 + }
12956 + },
12705 "stylehacks": { 12957 "stylehacks": {
12706 "version": "4.0.3", 12958 "version": "4.0.3",
12707 "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", 12959 "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
...@@ -12724,6 +12976,16 @@ ...@@ -12724,6 +12976,16 @@
12724 } 12976 }
12725 } 12977 }
12726 }, 12978 },
12979 + "stylis": {
12980 + "version": "3.5.4",
12981 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz",
12982 + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q=="
12983 + },
12984 + "stylis-rule-sheet": {
12985 + "version": "0.0.10",
12986 + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz",
12987 + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw=="
12988 + },
12727 "supports-color": { 12989 "supports-color": {
12728 "version": "6.1.0", 12990 "version": "6.1.0",
12729 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 12991 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
...@@ -13232,6 +13494,17 @@ ...@@ -13232,6 +13494,17 @@
13232 "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 13494 "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
13233 "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 13495 "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
13234 }, 13496 },
13497 + "uncontrollable": {
13498 + "version": "7.1.1",
13499 + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.1.1.tgz",
13500 + "integrity": "sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==",
13501 + "requires": {
13502 + "@babel/runtime": "^7.6.3",
13503 + "@types/react": "^16.9.11",
13504 + "invariant": "^2.2.4",
13505 + "react-lifecycles-compat": "^3.0.4"
13506 + }
13507 + },
13235 "unicode-canonical-property-names-ecmascript": { 13508 "unicode-canonical-property-names-ecmascript": {
13236 "version": "1.0.4", 13509 "version": "1.0.4",
13237 "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 13510 "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
...@@ -13523,6 +13796,14 @@ ...@@ -13523,6 +13796,14 @@
13523 "makeerror": "1.0.x" 13796 "makeerror": "1.0.x"
13524 } 13797 }
13525 }, 13798 },
13799 + "warning": {
13800 + "version": "4.0.3",
13801 + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
13802 + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
13803 + "requires": {
13804 + "loose-envify": "^1.0.0"
13805 + }
13806 + },
13526 "watchpack": { 13807 "watchpack": {
13527 "version": "1.7.2", 13808 "version": "1.7.2",
13528 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", 13809 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz",
......
...@@ -6,8 +6,12 @@ ...@@ -6,8 +6,12 @@
6 "@testing-library/jest-dom": "^4.2.4", 6 "@testing-library/jest-dom": "^4.2.4",
7 "@testing-library/react": "^9.3.2", 7 "@testing-library/react": "^9.3.2",
8 "@testing-library/user-event": "^7.1.2", 8 "@testing-library/user-event": "^7.1.2",
9 + "bootstrap": "^3.4.1",
10 + "daum-map-api": "^1.0.2",
9 "react": "^16.13.1", 11 "react": "^16.13.1",
12 + "react-bootstrap": "^1.0.1",
10 "react-dom": "^16.13.1", 13 "react-dom": "^16.13.1",
14 + "react-kakao-maps": "0.0.13",
11 "react-router-dom": "^5.2.0", 15 "react-router-dom": "^5.2.0",
12 "react-scripts": "3.4.1" 16 "react-scripts": "3.4.1"
13 }, 17 },
......
...@@ -10,6 +10,16 @@ ...@@ -10,6 +10,16 @@
10 content="Web site created using create-react-app" 10 content="Web site created using create-react-app"
11 /> 11 />
12 <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> 12 <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
13 + <script
14 + type="text/javascript"
15 + src="//dapi.kakao.com/v2/maps/sdk.js?appkey=61abec34d0855ba1d434ea222263d4a5&libraries=services,clusterer,drawing"
16 + ></script>
17 + <link
18 + rel="stylesheet"
19 + href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
20 + integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
21 + crossorigin="anonymous"
22 + />
13 <!-- 23 <!--
14 manifest.json provides metadata used when your web app is installed on a 24 manifest.json provides metadata used when your web app is installed on a
15 user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ 25 user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
...@@ -24,7 +34,7 @@ ...@@ -24,7 +34,7 @@
24 work correctly both with client-side routing and a non-root public URL. 34 work correctly both with client-side routing and a non-root public URL.
25 Learn how to configure a non-root public URL by running `npm run build`. 35 Learn how to configure a non-root public URL by running `npm run build`.
26 --> 36 -->
27 - <title>React App</title> 37 + <title>HowsTheWeather</title>
28 </head> 38 </head>
29 <body> 39 <body>
30 <noscript>You need to enable JavaScript to run this app.</noscript> 40 <noscript>You need to enable JavaScript to run this app.</noscript>
......
...@@ -15,13 +15,14 @@ ...@@ -15,13 +15,14 @@
15 15
16 .App-header { 16 .App-header {
17 background-color: #282c34; 17 background-color: #282c34;
18 - min-height: 100vh; 18 + min-height: 13vh;
19 display: flex; 19 display: flex;
20 flex-direction: column; 20 flex-direction: column;
21 align-items: center; 21 align-items: center;
22 justify-content: center; 22 justify-content: center;
23 font-size: calc(10px + 2vmin); 23 font-size: calc(10px + 2vmin);
24 color: white; 24 color: white;
25 + font-weight: bold;
25 } 26 }
26 27
27 .App-link { 28 .App-link {
......
1 +.Home {
2 + text-align: center;
3 +}
4 +
5 +.Home-logo {
6 + height: 40vmin;
7 + pointer-events: none;
8 +}
9 +
10 +@media (prefers-reduced-motion: no-preference) {
11 + .Home-logo {
12 + animation: Home-logo-spin infinite 20s linear;
13 + }
14 +}
15 +
16 +.Home-header {
17 + background-color: #282c34;
18 + min-height: 13vh;
19 + display: flex;
20 + flex-direction: column;
21 + align-items: center;
22 + justify-content: center;
23 + font-size: calc(10px + 2vmin);
24 + color: white;
25 + font-weight: bold;
26 +}
27 +
28 +.Home-link {
29 + color: #61dafb;
30 +}
31 +
32 +@keyframes Home-logo-spin {
33 + from {
34 + transform: rotate(0deg);
35 + }
36 + to {
37 + transform: rotate(360deg);
38 + }
39 +}
40 +
41 +.strong {
42 + font-size: calc(10px + 1vmin);
43 + font-weight: bold;
44 +}
45 +.map_wrap,
46 +.map_wrap * {
47 + margin: 0;
48 + padding: 0;
49 + font-family: "Malgun Gothic", dotum, "돋움", sans-serif;
50 + font-size: 12px;
51 +}
52 +.map_wrap a,
53 +.map_wrap a:hover,
54 +.map_wrap a:active {
55 + color: #000;
56 + text-decoration: none;
57 +}
58 +.map_wrap {
59 + position: relative;
60 + width: 100%;
61 + height: 500px;
62 +}
63 +
64 +#menu_wrap {
65 + position: absolute;
66 + top: 0;
67 + left: 0;
68 + bottom: 0;
69 + width: 250px;
70 + margin: 10px 0 30px 10px;
71 + padding: 5px;
72 + overflow-y: auto;
73 + background: rgba(53, 53, 53, 0.8);
74 + z-index: 1;
75 + font-size: 12px;
76 + border-radius: 10px;
77 +}
78 +.bg_white {
79 + background: #fff;
80 +}
81 +x #menu_wrap hr {
82 + display: block;
83 + height: 1px;
84 + border: 0;
85 + border-top: 2px solid #5f5f5f;
86 + margin: 3px 0;
87 +}
88 +#menu_wrap .option {
89 + text-align: center;
90 + color: #ffffff;
91 + font-weight: bold;
92 +}
93 +#menu_wrap .option p {
94 + margin: 10px 0;
95 +}
96 +#menu_wrap .option button {
97 + margin-left: 5px;
98 +}
99 +
100 +#placesList li {
101 + list-style: none;
102 +}
103 +#placesList .item {
104 + position: relative;
105 + border-bottom: 1px solid #888;
106 + overflow: hidden;
107 + cursor: pointer;
108 + min-height: 65px;
109 +}
110 +#placesList .item span {
111 + display: block;
112 + margin-top: 4px;
113 +}
114 +#placesList .item h5,
115 +#placesList .item .info {
116 + text-overflow: ellipsis;
117 + overflow: hidden;
118 + white-space: nowrap;
119 +}
120 +#placesList .item .info {
121 + padding: 10px 0 10px 55px;
122 + color: #ffffff;
123 +}
124 +#placesList .info .gray {
125 + color: #eaeaea;
126 +}
127 +#placesList .info .jibun {
128 + padding-left: 26px;
129 + background: url(http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/places_jibun.png)
130 + no-repeat;
131 +}
132 +#placesList .info .tel {
133 + color: #ffbb00;
134 + font-weight: bold;
135 +}
136 +#placesList .item .markerbg {
137 + float: left;
138 + position: absolute;
139 + width: 36px;
140 + height: 37px;
141 + margin: 10px 0 0 10px;
142 + background: url(http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/marker_number_blue.png)
143 + no-repeat;
144 +}
145 +#placesList .item .marker_1 {
146 + background-position: 0 -10px;
147 +}
148 +#placesList .item .marker_2 {
149 + background-position: 0 -56px;
150 +}
151 +#placesList .item .marker_3 {
152 + background-position: 0 -102px;
153 +}
154 +#placesList .item .marker_4 {
155 + background-position: 0 -148px;
156 +}
157 +#placesList .item .marker_5 {
158 + background-position: 0 -194px;
159 +}
160 +#placesList .item .marker_6 {
161 + background-position: 0 -240px;
162 +}
163 +#placesList .item .marker_7 {
164 + background-position: 0 -286px;
165 +}
166 +#placesList .item .marker_8 {
167 + background-position: 0 -332px;
168 +}
169 +#placesList .item .marker_9 {
170 + background-position: 0 -378px;
171 +}
172 +#placesList .item .marker_10 {
173 + background-position: 0 -423px;
174 +}
175 +#placesList .item .marker_11 {
176 + background-position: 0 -470px;
177 +}
178 +#placesList .item .marker_12 {
179 + background-position: 0 -516px;
180 +}
181 +#placesList .item .marker_13 {
182 + background-position: 0 -562px;
183 +}
184 +#placesList .item .marker_14 {
185 + background-position: 0 -608px;
186 +}
187 +#placesList .item .marker_15 {
188 + background-position: 0 -654px;
189 +}
190 +#pagination {
191 + margin: 10px auto;
192 + text-align: center;
193 +}
194 +#pagination a {
195 + display: inline-block;
196 + margin-right: 10px;
197 +}
198 +#pagination .on {
199 + font-weight: bold;
200 + cursor: default;
201 + color: #777;
202 +}
203 +
204 +.wraps {
205 + position: absolute;
206 + left: 0;
207 + bottom: 40px;
208 + width: 288px;
209 + height: 132px;
210 + margin-left: -144px;
211 + text-align: left;
212 + overflow: hidden;
213 + font-size: 12px;
214 + font-family: "Malgun Gothic", dotum, "돋움", sans-serif;
215 + line-height: 1.5;
216 +}
217 +.wraps * {
218 + padding: 0;
219 + margin: 0;
220 +}
221 +.wraps .infos {
222 + width: 286px;
223 + height: 120px;
224 + border-radius: 5px;
225 + border-bottom: 2px solid #ccc;
226 + border-right: 1px solid #ccc;
227 + overflow: hidden;
228 + background: #fff;
229 +}
230 +.wraps .infos:nth-child(1) {
231 + border: 0;
232 + box-shadow: 0px 1px 2px #888;
233 +}
234 +.infos .title {
235 + padding: 5px 0 0 10px;
236 + height: 30px;
237 + background: #eee;
238 + border-bottom: 1px solid #ddd;
239 + font-size: 18px;
240 + font-weight: bold;
241 +}
242 +.infos .close {
243 + position: absolute;
244 + top: 10px;
245 + right: 10px;
246 + color: #888;
247 + width: 17px;
248 + height: 17px;
249 + background: url("http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/overlay_close.png");
250 +}
251 +.infos .close:hover {
252 + cursor: pointer;
253 +}
254 +.infos .body {
255 + position: relative;
256 + overflow: hidden;
257 +}
258 +.infos .desc {
259 + position: relative;
260 + margin: 13px 0 0 90px;
261 + height: 75px;
262 +}
263 +.desc .ellipsis {
264 + overflow: hidden;
265 + text-overflow: ellipsis;
266 + white-space: nowrap;
267 +}
268 +.desc .jibun {
269 + font-size: 11px;
270 + color: #888;
271 + margin-top: -2px;
272 +}
273 +.infos .img {
274 + position: absolute;
275 + top: 6px;
276 + left: 5px;
277 + width: 73px;
278 + height: 71px;
279 + border: 1px solid #ddd;
280 + color: #888;
281 + overflow: hidden;
282 +}
283 +.infos:after {
284 + content: "";
285 + position: absolute;
286 + margin-left: -12px;
287 + left: 50%;
288 + bottom: 0;
289 + width: 22px;
290 + height: 12px;
291 + background: url("http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/vertex_white.png");
292 +}
293 +.infos .link {
294 + color: #5085bb;
295 +}
296 +
297 +#footer {
298 + position: absolute;
299 + bottom: 0;
300 + width: 100%;
301 + height: 100px;
302 + background: #ccc;
303 +}
304 +
305 +.left-box {
306 + float: left;
307 + width: 20%;
308 +}
309 +.left-box h5 {
310 + font-size: 1rem;
311 + font-style: italic;
312 + padding-left: 10px;
313 +}
314 +.right-box {
315 + float: right;
316 + width: 80%;
317 +}
318 +.right-box h5 {
319 + font-size: 1rem;
320 + font-style: italic;
321 + padding-left: 10px;
322 +}
323 +#middle {
324 + text-align: center;
325 +}
326 +.info-button {
327 + border-radius: 4px;
328 + background-color: #4641d9;
329 + width: 100px;
330 + color: white;
331 +}
1 import React, { Component } from "react"; 1 import React, { Component } from "react";
2 import logo from "./logo.svg"; 2 import logo from "./logo.svg";
3 import "./App.css"; 3 import "./App.css";
4 +import Button from "react-bootstrap/Button";
5 +import "./home.css";
6 +import { Map, Marker, MarkerClusterer, Polyline } from "react-kakao-maps";
7 +import "bootstrap/dist/css/bootstrap.min.css";
8 +
9 +/* global kakao */
10 +
4 export default class Home extends Component { 11 export default class Home extends Component {
5 constructor(props) { 12 constructor(props) {
6 super(props); 13 super(props);
7 - this.state = {}; 14 + this.state = {
15 + map: null,
16 + markers: [],
17 + markers: [],
18 + curMarker: new kakao.maps.Marker({
19 + position: new kakao.maps.LatLng(37.503716, 127.044844),
20 + }),
21 + placeSearch: new kakao.maps.services.Places(),
22 + infoWindow: new kakao.maps.CustomOverlay({}),
23 + region: "은평구청",
24 +
25 + // curAirCondition: null,
26 + // routeInformation: null,
27 + };
28 + this.removeAllChildNods = this.removeAllChildNods.bind(this);
29 + this.displayInfowindow = this.displayInfowindow.bind(this);
30 + }
31 +
32 + searchPlaces() {
33 + var keyword = document.getElementById("keyword").value;
34 +
35 + if (!keyword.replace(/^\s+|\s+$/g, "")) {
36 + alert("키워드를 입력해주세요!");
37 + return false;
38 + }
39 + // 장소검색 객체를 통해 키워드로 장소검색을 요청합니다
40 + this.state.placeSearch.keywordSearch(
41 + keyword,
42 + this.placesSearchCB.bind(this)
43 + );
44 + }
45 +
46 + // 장소검색이 완료됐을 때 호출되는 콜백함수 입니다
47 + placesSearchCB(data, status, pagination) {
48 + if (status === kakao.maps.services.Status.OK) {
49 + // 정상적으로 검색이 완료됐으면
50 + // 검색 목록과 마커를 표출합니다
51 + this.displayPlaces(data);
52 +
53 + // 페이지 번호를 표출합니다
54 + this.displayPagination(pagination);
55 + } else if (status === kakao.maps.services.Status.ZERO_RESULT) {
56 + alert("검색 결과가 존재하지 않습니다.");
57 + return;
58 + } else if (status === kakao.maps.services.Status.ERROR) {
59 + alert("검색 결과 중 오류가 발생했습니다.");
60 + return;
61 + }
62 + }
63 +
64 + displayPlaces(places) {
65 + var listEl = document.getElementById("placesList"),
66 + menuEl = document.getElementById("menu_wrap"),
67 + fragment = document.createDocumentFragment(),
68 + bounds = new kakao.maps.LatLngBounds(),
69 + listStr = "";
70 +
71 + // 검색 결과 목록에 추가된 항목들을 제거합니다
72 + // 페이지별로 보여주기 때문에 추가한 것 같음.
73 + this.removeAllChildNods(listEl);
74 +
75 + // 지도에 표시되고 있는 마커를 제거합니다
76 + this.removeMarker();
77 +
78 + for (var i = 0; i < places.length; i++) {
79 + // 마커를 생성하고 지도에 표시합니다
80 + var placePosition = new kakao.maps.LatLng(places[i].y, places[i].x),
81 + marker = this.addMarker(placePosition, i),
82 + itemEl = this.getListItem(i, places[i]); // 검색 결과 항목 Element를 생성합니다
83 +
84 + // 검색된 장소 위치를 기준으로 지도 범위를 재설정하기위해
85 + // LatLngBounds 객체에 좌표를 추가합니다
86 + bounds.extend(placePosition);
87 +
88 + // 마커와 검색결과 항목에 mouseover 했을때
89 + // 해당 장소에 인포윈도우에 장소명을 표시합니다
90 + // mouseout 했을 때는 인포윈도우를 닫습니다
91 + ((marker, title) => {
92 + kakao.maps.event.addListener(marker, "click", () => {
93 + this.displayInfowindow(marker, title);
94 + });
95 + kakao.maps.event.addListener(marker, "mouseover", () => {
96 + this.displayInfowindow(marker, title);
97 + });
98 +
99 + itemEl.onmouseover = () => {
100 + this.displayInfowindow(marker, title);
101 + };
102 + })(marker, places[i].place_name);
103 + // 함수를 조건문처럼 사용하여 해당 함수가 true일때 marker,places[i].place_name함수가 불리워짐.
104 +
105 + fragment.appendChild(itemEl);
106 + }
107 +
108 + // 검색결과 항목들을 검색결과 목록 Elemnet에 추가합니다
109 + listEl.appendChild(fragment);
110 + menuEl.scrollTop = 0;
111 +
112 + // 검색된 장소 위치를 기준으로 지도 범위를 재설정합니다
113 + this.state.map.setBounds(bounds);
114 + }
115 + // 커스텀 오버레이를 닫기 위해 호출되는 함수입니다
116 + closeOverlay() {
117 + this.state.infoWindow.setMap(null);
118 + }
119 +
120 + getListItem(index, places) {
121 + var el = document.createElement("li"),
122 + itemStr =
123 + '<span class="markerbg marker_' +
124 + (index + 1) +
125 + '"></span>' +
126 + '<div class="info">' +
127 + " <h5>" +
128 + places.place_name +
129 + "</h5>";
130 +
131 + if (places.road_address_name) {
132 + itemStr +=
133 + " <span>" +
134 + places.road_address_name +
135 + "</span>" +
136 + ' <span class="jibun gray">' +
137 + places.address_name +
138 + "</span>";
139 + } else {
140 + itemStr += " <span>" + places.address_name + "</span>";
141 + }
142 +
143 + itemStr += ' <span class="tel">' + places.phone + "</span>" + "</div>";
144 +
145 + el.innerHTML = itemStr;
146 + el.className = "item";
147 +
148 + return el;
149 + }
150 +
151 + addMarker(position, idx, title) {
152 + var imageSrc =
153 + "http://t1.daumcdn.net/localimg/localimages/07/mapapidoc/marker_number_blue.png", // 마커 이미지 url, 스프라이트 이미지를 씁니다
154 + imageSize = new kakao.maps.Size(36, 37), // 마커 이미지의 크기
155 + imgOptions = {
156 + spriteSize: new kakao.maps.Size(36, 691), // 스프라이트 이미지의 크기
157 + spriteOrigin: new kakao.maps.Point(0, idx * 46 + 10), // 스프라이트 이미지 중 사용할 영역의 좌상단 좌표
158 + offset: new kakao.maps.Point(13, 37), // 마커 좌표에 일치시킬 이미지 내에서의 좌표
159 + },
160 + markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize, imgOptions),
161 + marker = new kakao.maps.Marker({
162 + position: position, // 마커의 위치
163 + image: markerImage,
164 + });
165 +
166 + marker.setMap(this.state.map); // 지도 위에 마커를 표출합니다
167 + this.setState({ curMarker: marker });
168 + this.state.markers.push(marker); // 배열에 생성된 마커를 추가합니다
169 +
170 + return marker;
171 + }
172 +
173 + // 지도 위에 표시되고 있는 마커를 모두 제거합니다
174 + removeMarker() {
175 + for (var i = 0; i < this.state.markers.length; i++) {
176 + this.state.markers[i].setMap(null);
177 + }
178 + this.setState({
179 + markers: [],
180 + });
181 + }
182 +
183 + // 검색결과 목록 하단에 페이지번호를 표시는 함수입니다
184 + displayPagination(pagination) {
185 + var paginationEl = document.getElementById("pagination"),
186 + fragment = document.createDocumentFragment(),
187 + i;
188 +
189 + // 기존에 추가된 페이지번호를 삭제합니다
190 + while (paginationEl.hasChildNodes()) {
191 + paginationEl.removeChild(paginationEl.lastChild);
192 + }
193 +
194 + for (i = 1; i <= pagination.last; i++) {
195 + var el = document.createElement("a");
196 + el.href = "#";
197 + el.innerHTML = i;
198 +
199 + if (i === pagination.current) {
200 + el.className = "on";
201 + } else {
202 + el.onclick = (function (i) {
203 + return function () {
204 + pagination.gotoPage(i);
205 + };
206 + })(i);
207 + }
208 +
209 + fragment.appendChild(el);
210 + }
211 + paginationEl.appendChild(fragment);
212 + }
213 +
214 + removeAllChildNods(el) {
215 + while (el.hasChildNodes()) {
216 + el.removeChild(el.lastChild);
217 + }
218 + }
219 +
220 + // 검색결과 목록 또는 마커를 클릭했을 때 호출되는 함수입니다
221 + // 인포윈도우에 장소명을 표시합니다
222 + displayInfowindow(marker, title) {
223 + console.log(marker);
224 +
225 + let content = document.createElement("div");
226 + content.className = "wraps";
227 +
228 + let info = document.createElement("div");
229 + info.className = "infos";
230 +
231 + let titles = document.createElement("div");
232 + titles.className = "title";
233 + titles.innerHTML = title;
234 +
235 + let close = document.createElement("div");
236 + close.className = "close";
237 + close.onclick = () => {
238 + this.state.infoWindow.setMap(null);
239 + };
240 +
241 + let body = document.createElement("div");
242 + body.className = "body";
243 + let desc = document.createElement("div");
244 + let list = document.createElement("list");
245 + let second = document.createElement("LI");
246 + let br = document.createElement("div");
247 + br.innerHTML += "<br>";
248 + let second_ = document.createElement("LI");
249 +
250 + let getMise = document.createElement("Button");
251 + getMise.innerHTML = "미세먼지 정보";
252 + getMise.className = "info-button";
253 + getMise.onclick = () => {
254 + let position = marker.getPosition();
255 + console.log(marker.getPosition());
256 + console.log(position["Ga"]);
257 + };
258 + let setDepart = document.createElement("Button");
259 + setDepart.innerHTML = "출발지로 설정하기";
260 + setDepart.onclick = () => {
261 + this.setState({
262 + departure: marker.getPosition(),
263 + departureTitle: title,
264 + });
265 + };
266 + setDepart.className = "info-button";
267 + let setArrive = document.createElement("Button");
268 + setArrive.innerHTML = "도착지로 설정하기";
269 + setArrive.onclick = () => {
270 + this.setState({
271 + arrival: marker.getPosition(),
272 + arrivalTitle: title,
273 + });
274 + };
275 + setArrive.className = "info-button";
276 + second.appendChild(getMise);
277 + second.appendChild(br);
278 + second_.appendChild(setDepart);
279 + second_.appendChild(setArrive);
280 +
281 + list.appendChild(second);
282 + list.appendChild(second_);
283 + desc.appendChild(list);
284 + body.appendChild(desc);
285 + titles.appendChild(close);
286 + info.appendChild(titles);
287 + info.appendChild(body);
288 + content.appendChild(info);
289 +
290 + this.state.infoWindow.setContent(content);
291 + this.state.infoWindow.setPosition(marker.getPosition());
292 + this.state.infoWindow.setMap(this.state.map);
293 + }
294 +
295 + componentDidMount() {
296 + // 컴포넌트가 만들어지고, render 함수가 호출된 이후에 호출되는 메소
297 + // AJAX나 타이머를 생성하는 코드를 작성하는 파트이다.
298 + let el = document.getElementById("map");
299 + this.setState({
300 + map: new kakao.maps.Map(el, {
301 + //map option 설정
302 + center: new kakao.maps.LatLng(37.503716, 127.044844),
303 + level: 3,
304 + }),
305 + });
306 + this.searchPlaces();
307 + // marker.setMap(map);
8 } 308 }
9 309
10 render() { 310 render() {
311 + let currentAirCondition = null;
312 + let routeAirCondition = null;
313 +
11 return ( 314 return (
12 - <div className="App"> 315 + <section id="home">
13 - <header className="App-header"> 316 + <div className="cover">
14 - <img src={logo} className="App-logo" alt="logo" /> 317 + <div className="Home-header">How's the Weather?!</div>
15 - <p> 318 + </div>
16 - Edit <code>src/App.js</code> and save to reload. 319 + <div className="map_wrap">
17 - </p> 320 + <div
18 - <a 321 + id="map"
19 - className="App-link" 322 + style={{
20 - href="https://reactjs.org" 323 + width: "1000px",
21 - target="_blank" 324 + height: "600px",
22 - rel="noopener noreferrer" 325 + align: "middle",
23 - > 326 + }}
24 - Learn React 327 + ></div>
25 - </a> 328 + <div id="menu_wrap" className="bg_white">
26 - </header> 329 + <div className="option">
330 + 지역 검색 :{" "}
331 + <input
332 + type="text"
333 + value={this.state.region}
334 + id="keyword"
335 + size="15"
336 + onChange={(e) => this.setState({ region: e.target.value })}
337 + />
338 + <Button variant="light" type="submit" onClick={this.searchPlaces}>
339 + 검색하기
340 + </Button>
341 + </div>
342 + <ul id="placesList"></ul>
343 + <div id="pagination"></div>
344 + </div>
345 + <ul id="placesList"></ul>
346 + <div id="pagination"></div>
347 + </div>
348 + <div id="footer">
349 + <div className="left-box">
350 + <h5> 현재위치 : {this.state.region} </h5>
351 + <br />
352 + <div id="middle">{currentAirCondition}</div>
353 + </div>
354 + <div className="right-box">
355 + <h5>
356 + 출발지 : {this.state.departureTitle} <br />
357 + 도착지 : {this.state.arrivalTitle} <br />
358 + <Button variant="secondary" onClick={this.getRouteAirCondition}>
359 + {" "}
360 + 경로별 미세먼지 정보 알아보기{" "}
361 + </Button>{" "}
362 + <br /> <br />
363 + </h5>
364 + <div id="middle">{routeAirCondition}</div>
365 + </div>
27 </div> 366 </div>
367 + </section>
28 ); 368 );
29 } 369 }
30 } 370 }
......