{"id":18907669,"url":"https://github.com/swhors/findspace","last_synced_at":"2026-05-08T13:17:21.090Z","repository":{"id":178525803,"uuid":"349320740","full_name":"swhors/findspace","owner":"swhors","description":"find location by keyword using daum/naver open api.","archived":false,"fork":false,"pushed_at":"2021-03-25T23:57:10.000Z","size":125,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2024-12-31T11:57:09.333Z","etag":null,"topics":["daumapi","h2-database","jwt-authentication","kotlin","naver-api","open-api","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/swhors.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-19T06:15:47.000Z","updated_at":"2023-01-14T15:17:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"baf0be56-0251-47f7-bf26-3e2697bec986","html_url":"https://github.com/swhors/findspace","commit_stats":null,"previous_names":["swhors/findspace"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swhors%2Ffindspace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swhors%2Ffindspace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swhors%2Ffindspace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/swhors%2Ffindspace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/swhors","download_url":"https://codeload.github.com/swhors/findspace/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239891277,"owners_count":19714102,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["daumapi","h2-database","jwt-authentication","kotlin","naver-api","open-api","spring-boot"],"created_at":"2024-11-08T09:22:43.165Z","updated_at":"2026-03-05T23:30:24.322Z","avatar_url":"https://github.com/swhors.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# findspace\n\n## 소개\n- 이 프로젝트는 사용자의 키워드를 입력 받아서 위치를 검색하는 것입니다.\n- 검색은 다음과 네이버의 Open-Api를 이용하며, 두 개의 API를 통해 검색한 결과를 합하여 사용자에게 전달 합니다.\n\n- 사용자 관리와 검색을 위하여 다음과 같은 API를 제공합니다.\n  - User-Join\n  - User-Login\n  - Serach-Place\n  - Search-History\n  - Search-Favorite\n\n## 실행 방법\n- 실행 환경\n  -  JAVA 1.8 이상 및 Kotlin 1.4\n  -  maven 최신\n\n- 실행 방법\n  - 환경 설정 파일을 수정\n    - 환경 설정 파일 위치 : src/main/resources/application.properties\n    - 수정 할 환경 설정 : 아래의 값은 본인이 Daum이나 Naver의 개발자 계정으로 발급 받은 값을 넣는다.\n      - apps.naver.client-id\n      - apps.naver.client-secret\n      - apps.daum.rest-api-key\n  - mvn clean;mvn package\n  - java -jar target/findspace-0.0.1-SNAPSHOT.jar\n\n- API 사용 주의\n  - 이 프로그램의 Security를 위하여 JWT를 사용합니다.\n  - User-Login을 제외한 나머지 API를 호출하기 위해서는 사용자 로그인 후에 얻은 JWT-Token을 헤더의 \"X-AUTH-TOKEN\"에 추가하여야 합니다.\n\n## 상세 설명\n- User-Join\n  - 설명\n    - 사용자를 추가 합니다.\n    - 이 API는 \"admin@test.com / password\"으로 로그인하고 얻은 JWT-Token을 이용하여야 사용자 추가가 가능합니다.\n  - API\n    ```\n    /join\n    body : {\"userName\": 사용자ID, \"password\": 암호}\n    ```\n  - 결과\n    ```\n    { \"id\" : 사용자 ID }\n    ```\n\n- User-Login\n  - 설명\n    - 사용자를 인증하고, JWT Tag를 발급하여 검색 서비스 이용시에 사용자 인증을 하도록 합니다.\n  - API\n    ```\n    /login\n    body : {\"userName\": 사용자ID, \"password\": 암호}\n    ```\n  - 결과\n    ```\n    {\n     \"id\": 사용자 ID,\n     \"token\" : JWT_Token\n    }\n    ```\n  - 주의\n    - Search API를 호출할 경우에는 헤더의 \"X-AUTH-TOKEN\"을 추가하고 위의 \"token\"을 입력하여야 합니다.\n\n- Search-Place\n  - 설명\n    - 사용자의 검색어를 입력 받아서, 다음과 네이버의 검색 엔진으로 조회를 한 후에 결과를 합하여 결과를 전송 합니다.\n  - API\n    ```\n    /api/search/place?\"keyword=키워드\"\n    ```\n  - 결과\n    ```\n    {\n     \"keyword\":\"키워드\",\n     \"length\": int 타입의 검색 결과의 수,\n     \"places\":[\n              {\"place\":상호명1},\n              {\"place\":상호명2},\n              ...\n              ]\n    }\n    ```\n\n- Search-History\n  - 설명\n    - 사용자 본인이 입력한 검색어 히스토리를 전송 합니다.\n  - API\n    ```\n    /api/search/history\n    ```\n  - 결과\n    ```\n    {\n     \"length\": int 타입의 히스토리 수,\n     \"histories\":[\n                  {\"keyword\":키워드1,\"created\":조회시간1},\n                  {\"keyword\":키워드2,\"created\":조회시간2},\n                  ...\n                 ]\n    }\n    ```\n\n- Search-Favorite\n  - 설명\n    - 가장 많이 검색되는 키워드 전송 합니다.\n  - API\n    ```\n    /api/search/favorite\n    ```\n  - 결과\n    ```\n    {\n     \"length\": int 타입의 favorite의 결과 수,\n     \"favorities\":[\n                   {\"keyword\":키워드1,\"hitCount\":조회수1},\n                   {\"keyword\":키워드2,\"hitCount\":조회수2}\n                   ...\n                  ]\n    }\n    ```\n\n## 테스트\n- CURL을 통한 테스트 방법\n  - User-Join\n    ```\n    curl -H \"Content-Type:application/json\"  -H \"X-AUTH-TOKEN: JWT_Token\" -d \"{\\\"userName\\\":\\\"사용자이름\\\",\\\"password\\\":\\\"암호\\\"}\" -X POST http://서버주소:서버포트/join\n    ```\n\n  - User-Login\n    ```\n    curl -H \"Content-Type:application/json\" -d \"{\\\"userName\\\":\\\"사용자이름\\\",\\\"password\\\":\\\"암호\\\"}\" -X POST http://서버주소:서버포트/login\n    ```\n\n  - Search-Place\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: JWT_Token\" -G -X GET http://서버주소:서버포트/api/search/place --data-urlencode \"keyword=키워드\"\n    ```\n\n  - Search-History\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: JWT_Token\" -X GET http://서버주소:서버포트/api/search/history\n    ```\n\n  - Search-Favorite\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: JWT_Token\" -X GET http://서버주소:서버포트/api/search/favorite\n    ```\n\n- 예제\n  - User-Join\n    ```\n    curl -H \"Content-Type:application/json\" -H \"X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhLXVzZXJAdGVzdC5jb20iLCJyb2xlcyI6ImphdmEudXRpbC5zdHJlYW0uUmVmZXJlbmNlUGlwZWxpbmUkSGVhZEAzMzI2MTViYyIsImlhdCI6MTYxNjY1MDEyMywiZXhwIjoxNjE2NjUxOTIzfQ.o4e5M4kWy0lmcGmh2UwQn0hkVTHkW3WiEiWcsG_voDE\" -d \"{\\\"userName\\\":\\\"a-user@test.com\\\",\\\"password\\\":\\\"password\\\"}\" -X POST http://127.0.0.1:7060/join\n    ```\n\n  - User-Login\n    ```\n    curl -H \"Content-Type:application/json\" -d \"{\\\"userName\\\":\\\"a-user@test.com\\\",\\\"password\\\":\\\"password\\\"}\" -X POST http://127.0.0.1:7060/login\n    ```\n\n  - Search-Place\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhLXVzZXJAdGVzdC5jb20iLCJyb2xlcyI6ImphdmEudXRpbC5zdHJlYW0uUmVmZXJlbmNlUGlwZWxpbmUkSGVhZEAzMzI2MTViYyIsImlhdCI6MTYxNjY1MDEyMywiZXhwIjoxNjE2NjUxOTIzfQ.o4e5M4kWy0lmcGmh2UwQn0hkVTHkW3WiEiWcsG_voDE\" -G -X GET http://127.0.0.1:7060/api/search/place --data-urlencode \"keyword=seoul\"\n    ```\n\n  - Search-History\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhLXVzZXJAdGVzdC5jb20iLCJyb2xlcyI6ImphdmEudXRpbC5zdHJlYW0uUmVmZXJlbmNlUGlwZWxpbmUkSGVhZEAzMzI2MTViYyIsImlhdCI6MTYxNjY1MDEyMywiZXhwIjoxNjE2NjUxOTIzfQ.o4e5M4kWy0lmcGmh2UwQn0hkVTHkW3WiEiWcsG_voDE\" -X GET http://127.0.0.1:7060/api/search/history\n    ```\n\n  - Search-Favorite\n    ```\n    curl -H \"Accept: */*\" -H \"Connection: keep-alive\" -H \"X-AUTH-TOKEN: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhLXVzZXJAdGVzdC5jb20iLCJyb2xlcyI6ImphdmEudXRpbC5zdHJlYW0uUmVmZXJlbmNlUGlwZWxpbmUkSGVhZEAzMzI2MTViYyIsImlhdCI6MTYxNjY1MDEyMywiZXhwIjoxNjE2NjUxOTIzfQ.o4e5M4kWy0lmcGmh2UwQn0hkVTHkW3WiEiWcsG_voDE\" -X GET http://127.0.0.1:7060/api/search/favorite\n    ```\n\n- 결과 샘플\n  - User-Join\n    ```\n    {\"id\":2}\n    ```\n  - User-Login\n    ```\n    {\"id\":2, \"token\":\" eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhLXVzZXJAdGVzdC5jb20iLCJyb2xlcyI6ImphdmEudXRpbC5zdHJlYW0uUmVmZXJlbmNlUGlwZWxpbmUkSGVhZEA2OTFjZGRlYiIsImlhdCI6MTYxNjY1MTMxOSwiZXhwIjoxNjE2NjUzMTE5fQ.GbbpXhqN37MQwQ5qFE-r3RtsMKWaCCAbnrdN9C62l2E\"\n    ```\n  - Search-Place\n    ```\n    {\"keyword\":\"seoul\",\"length\":15,\"places\":[{\"place\":\"포시즌스호텔서울\"},{\"place\":\"롯데호텔서울 무궁화\"},{\"place\":\"롯데호텔서울 모모야마\"},{\"place\":\"롯데호텔서울 도림\"},{\"place\":\"아라리오갤러리 서울\"},{\"place\":\"NEO SEOUL GUESTHOUSE\"},{\"place\":\"Hoods Seoul\"},{\"place\":\"dna SEOUL\"},{\"place\":\"I Art Seoul Space\"},{\"place\":\"uh suite the seoul\"},{\"place\":\"CHERTOI SEOUL\"},{\"place\":\"YDP seoul\"},{\"place\":\"CGS SEOUL\"},{\"place\":\"SVA SEOUL OFFICE\"},{\"place\":\"라마다서울호텔\"}]}\n    ```\n  - Search-History\n    ```\n    {\"length\":7,\"histories\":[{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:52:03.288295\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:35:23.705477\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:34:23.291119\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:34:22.136783\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:34:21.279446\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:34:16.018\"},{\"keyword\":\"seoul\",\"created\":\"2021-03-25T14:34:12.805273\"}]}\n    ```\n  - Search-Favorite\n    ```\n    {\"length\":2,\"favorities\":[{\"keyword\":\"seoul\",\"hitCount\":7},{\"keyword\":\"인천횟집\",\"hitCount\":2}]}\n    ```\n\n## contact\n  - swhors@naver.com\n\n## 기타\n  -  JWT 관련 일부 코드는 다음 사이트의 자바 코드를 참조하여 작성하였습니다.\n    - https://daddyprogrammer.org/post/636/springboot2-springsecurity-authentication-authorization/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswhors%2Ffindspace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswhors%2Ffindspace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswhors%2Ffindspace/lists"}