mongoose mongoose로 지리 정보 처리 (aggregate().near()) MongoDB Server가 로컬에서 실행되고 있다고 가정 동작 확인 환경 Windows10, VSCode Node v8.11.3 "mongodb": "3.1.6", "mongoose": "5.3.1", 참고 여러 가지가 있지만 Aggregate의 $ geoNear를 사용하면 거리도 얻을 수있어 좋은 느낌 Mongoose에서는 near이므로 주의. 왜 geoNear가 아닌지 알 수 없습니다.... mongoosegeojsonMongoDB 몽구스 모델만으로 GraphQL 서버 만들기 소개 Mongoose는 MongoDB 및 Node.js용 ODM(개체 데이터 모델링) 라이브러리이며 NodeJ 개발자에게 가장 친숙한 라이브러리 중 하나입니다. Mongoose는 REST 응용 프로그램에 널리 사용되었습니다. 이 등장했습니다. 이 언어는 필요한 것을 정확히 얻기 위한 API용 쿼리 언어로 두 가지를 연결하는 간단한 인터페이스가 없는 것 같습니다. 이 격차를 메우고 몽구스 모델... mongodbnodegraphqlmongoose Azure Cosmos DB를 MongoDB로 Node.js에서 사용해보십시오. MongoDB 이용을 검토해 조사하고 있어 발견했으므로 시험에 사용해 보겠습니다. macOS High Sierra Node.js v9.5.0 Mongoose v5.0.6 입니다. 우주감 있고 멋있다. 기능은 같다. AWS계도 GCP계도 이 손의 불평은 비슷하기 때문에 거기까지 신경쓰지 않는 녀석입니다() 작성은 Azure 사용하고 있는 사람이라면 통상의 포털 화면으로부터 자원 작성으로 갈 수... mongooseCosmosDBAzureMongoDBNode.js Create Account #01 이번에는 계정을 생성하는 페이지를 만들어 보겠다. 그리고 여기에 인증(Authentication)도 추가해 볼거다. 유저가 로그인 하는걸 구현해 보면서 로그인이 어떤 의미를 가지고 있는지 알아 보겠다. 그리고 어떻게 로그인한 유저를 기억하게 만들 수 있는지도 알아 볼거다. GitHub로 로그인 하는것도 구현해 볼거다. 그러니까 이메일, 비밀번호로 로그인하는거랑 깃허브 로그인을 구현해 볼거다.... mongoosemongodbnode.jsschemaJavaScriptJavaScript Create Account #02 그리고 User모델도 만들어 봤다. 그리고 console에서 에러는 봤다.(현재는 안 생기는것 같다.) 업데이트 하라고 알려주는 거다. 그러면 새로운 버전을 쓰게 되고 경고가 나타나지 않게 된다. 이런 경고가 나타나면 그냥 진행해도 된다. 이제 userController 에서 유저 생성 하는걸 만들어 본다. 현재 지금은 join을 클릭하면 백엔드에 요청을 보내고 데이터를 console.log... mongoosemongodbJavaScriptnode.jsJavaScript Creating Account #03 절대 DB에 password를 저장하면 안된다. 어떤 회사든지 해킹 당하면 이런 식으로 DB에 password를 저장한걸 후회하게 된다. 그리고 보통 사람들은 같은 password를 여러 사이트에서 사용하기에 대부분의 사람들은 같은 password를 사용하기 때문이다. 만약 서비스에서 password를 관리하는 사람이라면 이런식으로 DB에 password를 저장하지 않으면 된다. 그래서 pa... hashmongoosemongodbnode.jssaltRoundsJavaScriptpre("save")bcryptHashingpasswordHashing Status Codes 그래서 status code(상태코드)라는걸 알 필요가 있다. 응답의 상태 코드가 200이라고 나와 있다. 위키피디아에서 상태 코드 200이 뭘 의미 하는지 응답으로 200을 받으면 구글 크롬이 계정 생성이 성공적이었다고 판단하는거다. 그래서 패스워드를 저장할거냐고 물어보는거다. 계정 생성이 성공적으로 됐다고 판단하면 패스워드를 저장 할거냐고 물어보는거다. 바로 상태 코드 200을 응답으로 ... mongoosemongodbnode.jsJavaScriptstatusJavaScript Login #01 이미 사용중인 username과 password가 일치 하는지 확인하고 있다. videoController에서 했던 것처럼 try~catch를 사용해서 에러를 방지 할수 있다. User를 만들때도 try~catch를 쓰고 있는거다. 이제 로그인 페이지를 만들어 보도록 한다. 로그인 하세요 ->" 까지 잘 나온다. 이제 login을 클릭하면 /login으로 넘어가게 된다. 순서를 바꿔 주고 r... mongoosemongodbJavaScriptnode.jsJavaScript Login #02 보다시피 이 모든걸 같이 구현하게 되면 정말 멋진 기능을 만들어 낼수 있다. 이런 것들을 다 쓰고 있다. DB를 보면 해싱된 패스워드가 있다. 그래서 DB에 있는 패스워드를 해석할 수 없다. 그런데 그 패스워드의 해시값을 알고 있다. 뭘 하면 되냐면 로그인할 때 유저가 입력한 패스워드를 가져다가 해싱을 하면 되는거다. 그러면 패스워드를 해싱하고 나온 해시값을 비교하면 되는거다. 그리고 만약 ... mongoosemongodbnode.jsJavaScriptComparebcryptCompare Sessions and Cookies #01 이 로그인 개념을 설명할 필요도 없을 거다. 그런데 이게 작동하려면 백엔드와 브라우저가 서로에 대한 정보를 가지고 있어야 한다. 이 둘 사이 연결에 state가 없는 거다. 그래서 유저한테 어떤 정보를 남겨줘야 한다. 그래서 유저가 로그인 할때마다 유저한테 뭔가 줘야 한다. 유저가 요청을 보낼때 마다 그 텍스트를 같이 보내달라고 하는 거다. 헷갈린다면 세션을 직접 써보고 이 텍스트가 뭔지에 ... mongoosecookiemongodbnode.jsSessionsJavaScriptJavaScript Sessions and Cookies #02 백엔드의 각 세션들은 id를 가지고 있었고 그 id를 브라우저한테 보냈다. 그러면 브라우저가 요청을 보낼때마다 그 id를 같이 보내준다. 백엔드에 요청을 보낼때 마다 id를 같이 보내줘야 한다. 그리고 세션 id를 가지고 있으면 세션 object에 정보를 추가 할수 있다. 다른 세션 id가 나오고 있다. 브라우저마다 서로 다른 세션 id를 가진 텍스트를 보내고 있다. 서버가 브라우저한테 세션... mongoosemongodbnode.jsSessionsJavaScriptcookiesJavaScript Logged In User #01 잠에 들고 다시 일어나더라도 핸드폰 번호을 기억하고 있는 것처럼 이걸 다 기억할 수는 없으니까 예를 들어, 누군가가 "너의 핸드폰 번호는 뭐니?" 라고 물어봤는데 누군지 모르겠다면 id카드를 받아서 "이게 너의 핸드폰 번호구나!" 라고 알수 있다. 그리고 잠에 들었다 다시 일어나서 핸드폰 번호가 뭐냐고 다시 물어보면 이제 여길 보면 세션 DB가 있는데 유저가 로그인하면 그 유저에 대한 정보를... mongoosemongodbnode.jssessionloggedInJavaScriptJavaScript Logged In User #02 새로고침을 하니까 에러가 있다. node를 보면 console.log된게 많이 있다. pug template에서 locals에 접근할수 있다. locals를 공유 할수 있도록 설정되어 있다. 모든 pug파일들은 locals object에 접근할수 있다. 모든 template에서 쓸수 있다. 보다시피 이 title은 바뀌지 않고 있다. 그리고 locals는 template의 모든 곳에 있다. ... mongoosemongodbnode.jssessionbooleanloggedInJavaScriptmiddlewareJavaScript Mongo Store 우선 Note 를 보면 session data 가 쿠키 안에 저장 되지 않는다고 적혀있다. session ID만 저장 된다고 되어 있다. session data는 서버쪽에 저장된다. session id는 쿠키에 저장하지만 데이터 자체는 그리고 다른 주의 사항으로 서버에 저장되는 default session storage는 그래서 session store를 사용해야 한다. 다양한 databas... mongoosemongodbnode.jssessionMongoStoreJavaScriptJavaScript Uninitialized Sessions 보이고 있는 쿠키를 지운다. 다시 쿠키를 지워 본다. 쿠키를 하나 받았고, DB에도 하나 더 생겼다. 이말은 방문하는 모든 사용자에 대해 쿠키를 만들어주고 세션을 만든다는 거다. 사용자에게 쿠키를 주고 session은 DB에 저장 하는거다. 해결책은 모든 방문자에 대해서 쿠키를 주지 않는 거다. 기억하고 싶은 사용자에 대해서만 쿠키를 주는 거다. 뭘 하든지간에 기억할 필요가 없기 때문에 쿠키... mongoosemongodbnode.jssessioninitializeJavaScriptUninitializedsecretJavaScript Expiration and Secrets Name,Value,Domain,Path,Expires / Max-Age가 있다. 그리고 Size,HttpOnly,Secure,SameSite,Priority등이 있다. 쿠키에 sign하는 이유는 백엔드가 쿠키를 줬다는걸 보여주기 위함이다. 왜냐하면 session hijack(납치)라는 공격유형이 있다. 이걸 잘 보호햐아 하는데 누군가 쿠키를 훔쳐서 마치 그 사람인척 할수 있다. 이 stri... MaxAgemongodbmongoosenode.js.envJavaScriptdomainsecret.env Mongoose에서 nested field의 ObjectId 타입의 자동 변환이 안 돼요 분명히 mongoose 스키마 상에서는 똑같은 ObjectId 타입의 필드인데, 어떤 놈은 string으로 저장되고, 다른 놈은 ObjectId로 DB에 저장되고 있었다. mongoose 스키마에서 nested field로 지정된 필드가 ObjectId 필드인 경우, mongoose가 hex string을 ObjectId로 자동 변환해주지 않는다. mongoose는 기본적으로 스키마 상에서 ... mongoosemongodbmongodb Github Login #02 예를 들자면 여기 나와 있는 모든 scope을 보면 여기에서 admin scope을 가져 올수 있다. 이제 Personal user data라고 명시되어 있다. 그러면 이제 모든 Personal data에 접근 가능하다. 보다시피 전부 URL에 기반하고 있다. 그리고 이것들은 전부 URL에 공백으로 구분해서 쓰면 된다. 여기에 " 이 어플리케이션은 어떤 repository든 삭제 할수 있다"... mongoosemongodbnode.jsuser:emailscoperead:userJavaScriptgithubJavaScript Github Login #01 깃헙 로그인을 사용해보려고 한다. 하지만 다른 SNS랑 흐름은 비슷하다. 물론 구글 같은 곳은 더 많은 걸 요청 하게 될거다. 왜냐하면 구글은 더 많은 정ㅂ조를 가지고 있고, 많은 정보를 받아 올수 있기 때문이다. 그리고 그 흐름은 다음과 같다. 해야하는건 사용자를 깃헙으로 보내는거다. 그리고 정보를 공유하는 것을 승인하게 될거다. 그러면 깃헙은 사용자를 웹사이트로 돌려보낼거다. 그 단계가 ... mongoosemongodbnode.jsJavaScriptgithubJavaScript
mongoose로 지리 정보 처리 (aggregate().near()) MongoDB Server가 로컬에서 실행되고 있다고 가정 동작 확인 환경 Windows10, VSCode Node v8.11.3 "mongodb": "3.1.6", "mongoose": "5.3.1", 참고 여러 가지가 있지만 Aggregate의 $ geoNear를 사용하면 거리도 얻을 수있어 좋은 느낌 Mongoose에서는 near이므로 주의. 왜 geoNear가 아닌지 알 수 없습니다.... mongoosegeojsonMongoDB 몽구스 모델만으로 GraphQL 서버 만들기 소개 Mongoose는 MongoDB 및 Node.js용 ODM(개체 데이터 모델링) 라이브러리이며 NodeJ 개발자에게 가장 친숙한 라이브러리 중 하나입니다. Mongoose는 REST 응용 프로그램에 널리 사용되었습니다. 이 등장했습니다. 이 언어는 필요한 것을 정확히 얻기 위한 API용 쿼리 언어로 두 가지를 연결하는 간단한 인터페이스가 없는 것 같습니다. 이 격차를 메우고 몽구스 모델... mongodbnodegraphqlmongoose Azure Cosmos DB를 MongoDB로 Node.js에서 사용해보십시오. MongoDB 이용을 검토해 조사하고 있어 발견했으므로 시험에 사용해 보겠습니다. macOS High Sierra Node.js v9.5.0 Mongoose v5.0.6 입니다. 우주감 있고 멋있다. 기능은 같다. AWS계도 GCP계도 이 손의 불평은 비슷하기 때문에 거기까지 신경쓰지 않는 녀석입니다() 작성은 Azure 사용하고 있는 사람이라면 통상의 포털 화면으로부터 자원 작성으로 갈 수... mongooseCosmosDBAzureMongoDBNode.js Create Account #01 이번에는 계정을 생성하는 페이지를 만들어 보겠다. 그리고 여기에 인증(Authentication)도 추가해 볼거다. 유저가 로그인 하는걸 구현해 보면서 로그인이 어떤 의미를 가지고 있는지 알아 보겠다. 그리고 어떻게 로그인한 유저를 기억하게 만들 수 있는지도 알아 볼거다. GitHub로 로그인 하는것도 구현해 볼거다. 그러니까 이메일, 비밀번호로 로그인하는거랑 깃허브 로그인을 구현해 볼거다.... mongoosemongodbnode.jsschemaJavaScriptJavaScript Create Account #02 그리고 User모델도 만들어 봤다. 그리고 console에서 에러는 봤다.(현재는 안 생기는것 같다.) 업데이트 하라고 알려주는 거다. 그러면 새로운 버전을 쓰게 되고 경고가 나타나지 않게 된다. 이런 경고가 나타나면 그냥 진행해도 된다. 이제 userController 에서 유저 생성 하는걸 만들어 본다. 현재 지금은 join을 클릭하면 백엔드에 요청을 보내고 데이터를 console.log... mongoosemongodbJavaScriptnode.jsJavaScript Creating Account #03 절대 DB에 password를 저장하면 안된다. 어떤 회사든지 해킹 당하면 이런 식으로 DB에 password를 저장한걸 후회하게 된다. 그리고 보통 사람들은 같은 password를 여러 사이트에서 사용하기에 대부분의 사람들은 같은 password를 사용하기 때문이다. 만약 서비스에서 password를 관리하는 사람이라면 이런식으로 DB에 password를 저장하지 않으면 된다. 그래서 pa... hashmongoosemongodbnode.jssaltRoundsJavaScriptpre("save")bcryptHashingpasswordHashing Status Codes 그래서 status code(상태코드)라는걸 알 필요가 있다. 응답의 상태 코드가 200이라고 나와 있다. 위키피디아에서 상태 코드 200이 뭘 의미 하는지 응답으로 200을 받으면 구글 크롬이 계정 생성이 성공적이었다고 판단하는거다. 그래서 패스워드를 저장할거냐고 물어보는거다. 계정 생성이 성공적으로 됐다고 판단하면 패스워드를 저장 할거냐고 물어보는거다. 바로 상태 코드 200을 응답으로 ... mongoosemongodbnode.jsJavaScriptstatusJavaScript Login #01 이미 사용중인 username과 password가 일치 하는지 확인하고 있다. videoController에서 했던 것처럼 try~catch를 사용해서 에러를 방지 할수 있다. User를 만들때도 try~catch를 쓰고 있는거다. 이제 로그인 페이지를 만들어 보도록 한다. 로그인 하세요 ->" 까지 잘 나온다. 이제 login을 클릭하면 /login으로 넘어가게 된다. 순서를 바꿔 주고 r... mongoosemongodbJavaScriptnode.jsJavaScript Login #02 보다시피 이 모든걸 같이 구현하게 되면 정말 멋진 기능을 만들어 낼수 있다. 이런 것들을 다 쓰고 있다. DB를 보면 해싱된 패스워드가 있다. 그래서 DB에 있는 패스워드를 해석할 수 없다. 그런데 그 패스워드의 해시값을 알고 있다. 뭘 하면 되냐면 로그인할 때 유저가 입력한 패스워드를 가져다가 해싱을 하면 되는거다. 그러면 패스워드를 해싱하고 나온 해시값을 비교하면 되는거다. 그리고 만약 ... mongoosemongodbnode.jsJavaScriptComparebcryptCompare Sessions and Cookies #01 이 로그인 개념을 설명할 필요도 없을 거다. 그런데 이게 작동하려면 백엔드와 브라우저가 서로에 대한 정보를 가지고 있어야 한다. 이 둘 사이 연결에 state가 없는 거다. 그래서 유저한테 어떤 정보를 남겨줘야 한다. 그래서 유저가 로그인 할때마다 유저한테 뭔가 줘야 한다. 유저가 요청을 보낼때 마다 그 텍스트를 같이 보내달라고 하는 거다. 헷갈린다면 세션을 직접 써보고 이 텍스트가 뭔지에 ... mongoosecookiemongodbnode.jsSessionsJavaScriptJavaScript Sessions and Cookies #02 백엔드의 각 세션들은 id를 가지고 있었고 그 id를 브라우저한테 보냈다. 그러면 브라우저가 요청을 보낼때마다 그 id를 같이 보내준다. 백엔드에 요청을 보낼때 마다 id를 같이 보내줘야 한다. 그리고 세션 id를 가지고 있으면 세션 object에 정보를 추가 할수 있다. 다른 세션 id가 나오고 있다. 브라우저마다 서로 다른 세션 id를 가진 텍스트를 보내고 있다. 서버가 브라우저한테 세션... mongoosemongodbnode.jsSessionsJavaScriptcookiesJavaScript Logged In User #01 잠에 들고 다시 일어나더라도 핸드폰 번호을 기억하고 있는 것처럼 이걸 다 기억할 수는 없으니까 예를 들어, 누군가가 "너의 핸드폰 번호는 뭐니?" 라고 물어봤는데 누군지 모르겠다면 id카드를 받아서 "이게 너의 핸드폰 번호구나!" 라고 알수 있다. 그리고 잠에 들었다 다시 일어나서 핸드폰 번호가 뭐냐고 다시 물어보면 이제 여길 보면 세션 DB가 있는데 유저가 로그인하면 그 유저에 대한 정보를... mongoosemongodbnode.jssessionloggedInJavaScriptJavaScript Logged In User #02 새로고침을 하니까 에러가 있다. node를 보면 console.log된게 많이 있다. pug template에서 locals에 접근할수 있다. locals를 공유 할수 있도록 설정되어 있다. 모든 pug파일들은 locals object에 접근할수 있다. 모든 template에서 쓸수 있다. 보다시피 이 title은 바뀌지 않고 있다. 그리고 locals는 template의 모든 곳에 있다. ... mongoosemongodbnode.jssessionbooleanloggedInJavaScriptmiddlewareJavaScript Mongo Store 우선 Note 를 보면 session data 가 쿠키 안에 저장 되지 않는다고 적혀있다. session ID만 저장 된다고 되어 있다. session data는 서버쪽에 저장된다. session id는 쿠키에 저장하지만 데이터 자체는 그리고 다른 주의 사항으로 서버에 저장되는 default session storage는 그래서 session store를 사용해야 한다. 다양한 databas... mongoosemongodbnode.jssessionMongoStoreJavaScriptJavaScript Uninitialized Sessions 보이고 있는 쿠키를 지운다. 다시 쿠키를 지워 본다. 쿠키를 하나 받았고, DB에도 하나 더 생겼다. 이말은 방문하는 모든 사용자에 대해 쿠키를 만들어주고 세션을 만든다는 거다. 사용자에게 쿠키를 주고 session은 DB에 저장 하는거다. 해결책은 모든 방문자에 대해서 쿠키를 주지 않는 거다. 기억하고 싶은 사용자에 대해서만 쿠키를 주는 거다. 뭘 하든지간에 기억할 필요가 없기 때문에 쿠키... mongoosemongodbnode.jssessioninitializeJavaScriptUninitializedsecretJavaScript Expiration and Secrets Name,Value,Domain,Path,Expires / Max-Age가 있다. 그리고 Size,HttpOnly,Secure,SameSite,Priority등이 있다. 쿠키에 sign하는 이유는 백엔드가 쿠키를 줬다는걸 보여주기 위함이다. 왜냐하면 session hijack(납치)라는 공격유형이 있다. 이걸 잘 보호햐아 하는데 누군가 쿠키를 훔쳐서 마치 그 사람인척 할수 있다. 이 stri... MaxAgemongodbmongoosenode.js.envJavaScriptdomainsecret.env Mongoose에서 nested field의 ObjectId 타입의 자동 변환이 안 돼요 분명히 mongoose 스키마 상에서는 똑같은 ObjectId 타입의 필드인데, 어떤 놈은 string으로 저장되고, 다른 놈은 ObjectId로 DB에 저장되고 있었다. mongoose 스키마에서 nested field로 지정된 필드가 ObjectId 필드인 경우, mongoose가 hex string을 ObjectId로 자동 변환해주지 않는다. mongoose는 기본적으로 스키마 상에서 ... mongoosemongodbmongodb Github Login #02 예를 들자면 여기 나와 있는 모든 scope을 보면 여기에서 admin scope을 가져 올수 있다. 이제 Personal user data라고 명시되어 있다. 그러면 이제 모든 Personal data에 접근 가능하다. 보다시피 전부 URL에 기반하고 있다. 그리고 이것들은 전부 URL에 공백으로 구분해서 쓰면 된다. 여기에 " 이 어플리케이션은 어떤 repository든 삭제 할수 있다"... mongoosemongodbnode.jsuser:emailscoperead:userJavaScriptgithubJavaScript Github Login #01 깃헙 로그인을 사용해보려고 한다. 하지만 다른 SNS랑 흐름은 비슷하다. 물론 구글 같은 곳은 더 많은 걸 요청 하게 될거다. 왜냐하면 구글은 더 많은 정ㅂ조를 가지고 있고, 많은 정보를 받아 올수 있기 때문이다. 그리고 그 흐름은 다음과 같다. 해야하는건 사용자를 깃헙으로 보내는거다. 그리고 정보를 공유하는 것을 승인하게 될거다. 그러면 깃헙은 사용자를 웹사이트로 돌려보낼거다. 그 단계가 ... mongoosemongodbnode.jsJavaScriptgithubJavaScript