{"id":20276880,"url":"https://github.com/cheese10yun/loopback-boards","last_synced_at":"2026-05-12T14:05:57.230Z","repository":{"id":109028595,"uuid":"90888080","full_name":"cheese10yun/loopback-boards","owner":"cheese10yun","description":"loopback-boards","archived":false,"fork":false,"pushed_at":"2017-05-27T08:33:24.000Z","size":12,"stargazers_count":1,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-14T06:46:02.886Z","etag":null,"topics":["api","loopback","node","rest-api"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/cheese10yun.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":"2017-05-10T16:57:15.000Z","updated_at":"2020-07-30T11:54:04.000Z","dependencies_parsed_at":"2023-03-16T19:30:20.808Z","dependency_job_id":null,"html_url":"https://github.com/cheese10yun/loopback-boards","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheese10yun%2Floopback-boards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheese10yun%2Floopback-boards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheese10yun%2Floopback-boards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cheese10yun%2Floopback-boards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cheese10yun","download_url":"https://codeload.github.com/cheese10yun/loopback-boards/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241768394,"owners_count":20017117,"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":["api","loopback","node","rest-api"],"created_at":"2024-11-14T13:15:57.421Z","updated_at":"2026-05-12T14:05:52.205Z","avatar_url":"https://github.com/cheese10yun.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# loopback-boad\n\n```\n.\n├── Dockerfile\n├── README.md\n├── client\n│   └── README.md\n├── package.json\n└── server\n    ├── boot\n    │   └── root.js\n    ├── component-config.json\n    ├── config.json\n    ├── datasources.json\n    ├── middleware.development.json\n    ├── middleware.json\n    ├── model-config.json\n    └── server.js\n```\n\n* 메모리디비\n* 유저 모댈 생성\n\n# loopback-boad\n\n## Loopback 게시판 만들기 (1)\n\nLoopback 으로 게시판을 만드는 프로젝트를 진행하겠습니다. 앞선 포스팅에서 설명 드렸다시피 Loopback은 정말 빠르게 REST API를 만들어 낼 수 있습니다. 회원 가입, 로그인, 로그아웃, ACL, 설정 등 매번 구현해야 하는 귀찮은 로직들을 내부 Model을 사용해서 빠르게 만들 수 있습니다. 하지만 이렇게 말로 설명해 드리는 것보다 웹에 가장 간단한 게시판으로 포스팅을 진행하겠습니다.\n\n\n\n## Loopback 설치\n```\n$ npm install -g loopback-cli\n```\n\n\n\n* 메모리디비\n* 유저 모댈 생성\n\n## 게시판 프로젝트 생성\n\n```\n$ lb\n? 애플리케이션 이름은 무엇입니까? loopback-board\n? 프로젝트를 포함시킬 디렉토리 이름 입력: loopback-board\n   create loopback-board/\n     info 작업 디렉토리를 loopback-board(으)로 번경\n\n? 사용하려는 LoopBack 버전은 무엇입니까? 3.x (current)\n? 예상하는 애플리케이션 종류는 무엇입니까? api-server (A LoopBack API server with local User auth)\n```\n* 터미널에서 원하시는 디렉토리 이동 이후 lb 명령어를 입력하고 프로젝트 설정을 이어 갑니다.\n* 버전은 최신 버전 3.X 버전을 선택합니다.\n* 애플리케이션 종류로는 `api-server (A LoopBack API server with local User auth)`를 택합니다.\n* 해당 종류를 택하면 내부 `User` 기반으로 로그인, 로그아웃, 회원 가입 등등 로직을 구현 해줍니다.\n\n\n## 데이터베이스 연결\n\n```\n\"db\": {\n    \"name\": \"db\",\n    \"connector\": \"memory\",\n    \"file\": \"memoryDBFile\"\n  }\n```\n* `datasources.json` 파일에 위의 내용을 추가합니다.\n* 본 포스팅에서는 설치 없이 사용할수 있는 메모리 `In-memory db`를 이용하겠습니다.\n* 데이터베이스를 `memoryDBFile` 파일에 저장하여 `In-memory db`를 편리하게 사용할 수 있습니다.\n\n## 게시판 모델 생성\n\n```\n? 모델 이름 입력: board\n? board을(를) 첨부할 데이터 소스 선택: db (memory)\n? 모델 기본 클래스 선택 PersistedModel\n? REST API를 통해 board을(를) 공개합니까? Yes\n? 사용자 정의 복수형 양식(REST URL 빌드에 사용됨):\n? 공통 모델 또는 서버만 해당? 공통\n지금 일부 board 특성을 추가하십시오.\n\n완료된 경우 비어 있는 특성 이름을 입력하십시오.\n? 특성 이름: title\n   invoke   loopback:property\n? 특성 유형: string\n? 필수 여부 Yes\n? 기본값[없는 경우 공백으로 두기]:\n\n다른 board 특성을 추가하십시오.\n완료된 경우 비어 있는 특성 이름을 입력하십시오.\n? 특성 이름: content\n   invoke   loopback:property\n? 특성 유형: string\n? 필수 여부 Yes\n```\n\n* Loppback의 핵심 개념인 Model을 생성합니다.\n* 위에서 설정한 `db`를 선택합니다.\n* 기타 설정들은 위의 예시와 동일하게 설정합니다.\n* 위의 작업을 진행하면 `board.json`의 `properties` 항목에 추가 됩니다.\n\n### board.json\n```\n....\n\"properties\": {\n  \"title\": {\n    \"type\": \"string\",\n    \"required\": true\n  },\n  \"content\": {\n    \"type\": \"string\",\n    \"required\": true\n  },\n  \"createdDt\": {\n    \"type\": \"date\",\n    \"required\": false,\n    \"description\": \"생성 날짜\",\n    \"defaultFn\": \"now\"\n  }\n}\n...\n```\n* 위에서 작성한 `title`, `content` 프로퍼티가 추가되었습니다.\n* 모델을 생성할 때 프로퍼티를 생성할 수 있고, 직접 해당 모델의 json 파일에 작성할 수 있습니다.\n* `createdDt` 프로퍼티는 직접 작성합니다.\n* `\"defaultFn\": \"now\"` 옵션을 주면 현재 시간이 자동으로 입력됩니다.\n\n\n## 게시판 ACL 설정\n```\n$ lb acl\n? ACL 항목을 적용할 모델 선택: (all existing models)\n? ACL 범위 선택: 모든 메소드 및 특성\n? 액세스 유형 선택: All (match all types)\n? 역할 선택 All users\n? 적용할 권한 선택 Explicitly deny access\n```\n* Loopback은 ACL 설정도 간편합니다.\n* `lb acl` 명령어로 작업을 진행합니다.\n* 위 설정은 모든 모델에 대한 ACL 거부하는 설정입니다.\n* 일단 막아 놓고 하나하나 풀어주는게 보안에 안전합니다.\n\n\n```\n$ lb acl\n? ACL 항목을 적용할 모델 선택: board\n? ACL 범위 선택: 모든 메소드 및 특성\n? 액세스 유형 선택: Read\n? 역할 선택 All users\n? 적용할 권한 선택 Explicitly grant access\n```\n* `board`에 대한 ACL 설정을 진행합니다.\n* 모든 사용자는 `board`를 읽을 수 있습니다.\n* 로그인하지 않은 사용자도 게시글을 볼 수 있게하는 설정입니다.\n\n```\n$ lb acl\n? ACL 항목을 적용할 모델 선택: board\n? ACL 범위 선택: 단일 메소드\n? 메소드 이름 입력 create\n? 역할 선택 Any authenticated user\n? 적용할 권한 선택 Explicitly grant access\n```\n* 로그인한 사용자만이 `board`를 작성할 수 있습니다.\n\n\n## 게시판 ACL 설정 코드\n```\n...\n\"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$authenticated\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"create\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    },\n    {\n      \"accessType\": \"WRITE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$owner\",\n      \"permission\": \"ALLOW\"\n    }\n  ],\n...\n```\n* 위의 ACL 작업을 진행하면 `board.json` 파일에 `\"acls\"` 위와 같이 추가된것을 확인할 수 있습니다.\n* `\"accessType\": \"WRITE\",`은 수동으로 작성합니다.\n* 해당 조건은 해당 글의 소유자만이 접근할 수 있는 설정입니다.\n* 해당 글에 수정, 삭제에 관련 ACL 설정으로 보시면 편합니다.\n\n## 회원 가입\n![](http://i.imgur.com/Enk0Eic.png)\n```\n{\n  \"username\": \"yun\",\n  \"email\": \"yun@test.com\",\n  \"password\":\"123123\"\n}\n```\n* 해당 회원 가입을 Swagger 문서를 통해서 진행합니다.\n\n## 로그인\n![](http://i.imgur.com/tHepa6F.png)\n```\n{\n  \"email\": \"yun@test.com\",\n  \"password\":\"123123\"\n}\n```\n* 로그인에 성공하면 AccessToken 값을 리턴 받습니다.\n* 상단의 토큰 화면에 이 값을 입력합니다.\n\n## 게시글 작성\n\n![](http://i.imgur.com/G60l3fm.png)\n```\n{\n  \"title\": \"게시글\",\n  \"content\": \"내용 블라....\"\n}\n```\n\n## 비 로그인 사용자가 게시글을 작성할 경우\n```\n{\n  \"error\": {\n    \"statusCode\": 401,\n    \"name\": \"Error\",\n    \"message\": \"Authorization Required\",\n    \"code\": \"AUTHORIZATION_REQUIRED\",\n    \"stack\": \"Error: Authorization Required...\n  }\n}\n```\n* 접근권한에 대한 에러 메세지를 포함하여 `statusCode` 401를 리턴 합니다.\n\n\n## 게시글 조회\n![](http://i.imgur.com/8Klt8zq.png)\n\n## 마무리\nLoopback을 통해서 정말 간단하게 게시판을 만들어 보았습니다. 처음 Loopback을 공부할때는 `In-memory DB`를 추천합니다. 별다른 설정없이 데이터베이스 설정을 완료 할수 있습니다. 또한 ORM을 지원하기 때문에 이후에 다른 데이터베이스로 크게 무리 없이 변경 가능합니다. 앞으로도 Loopback 관련된 주제를 포스팅 진행해보겠습니다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcheese10yun%2Floopback-boards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcheese10yun%2Floopback-boards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcheese10yun%2Floopback-boards/lists"}