[]({'id':'backend-app','data-menu':'Backend App'})
baas.io์์ ์์ฑํ Backend Application์ ์ง์นญํฉ๋๋ค. ๊ฐ์ ํ๋ฉด ๊ธฐ๋ณธ Backend App์ธ "sandbox"๊ฐ ์์ฑ์ด ๋์ด ์์ผ๋ฉฐ, ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ๊ฐ์ Backend App์ ์์ฑํ ์ ์์ต๋๋ค. "sandbox" Backend App์ ๋ณด์์ด ์ฒ๋ฆฌ๋์ด ์์ง ์์ Backend App์ผ๋ก ๊ฐ๋ฐ ์ฉ๋๋ก ๊ธฐ๋ณธ ์์ฑ๋ฉ๋๋ค. ๊ฐ๊ฐ์ Backend App์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด, ์๋ก ๊ณต์ ํ ์ ์์ต๋๋ค.
caution "sandbox" Backend App
"sandbox" ์ฑ์ ๊ฐ๋ฐ์์ ์ฌ์ฉํ๋ ์ฑ์ผ๋ก, ๋ชจ๋ ๊ถํ์ด ์ด๋ ค์์ด ์์ ๋กญ๊ฒ ์์ ํ ์ ์์ต๋๋ค. ๋ค๋ง, ๋ชจ๋ ๊ถํ์ด ์ด๋ ค์์ด ๊ทธ๋๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ, ์ฌ๊ฐํ ๋ณด์๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค ๋ฐ๋ผ์, ๋ฐฐํฌํ ๋๋ ์๋ก์ด Backend App์ ์์ฑํ๊ณ Role๊ณผ Permission์ ์ค์ ํ์ฌ ๋ณด์์ ๋ฌธ์ ๊ฐ ์๋๋ก ์ ์ํ์๊ธฐ ๋ฐ๋๋๋ค.
baas.io์์ ์ ์ฅ๋๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ Entity(์ํฐํฐ)๋ผ๊ณ ์ง์นญ๋ฉ๋๋ค.
๊ฐ Entity๋ค์ Key(์ด๋ฆ)์ Value(๊ฐ)์ ์์ผ๋ก ๊ตฌ์ฑ๋ Property(์์ฑ)๋ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Entity๋ Type(ํ์ )์ด๋ผ๋ ์์ฑ์ ํ์๋ก ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๊ฐ์ Type์ Entity๋ค์ ์งํฉ์ Collection(์ปฌ๋ ์ )์ด๋ผ๊ณ ํฉ๋๋ค.
์๋๋ ๊ฐ๋จํ Entity์ ์ํ ์ ๋๋ค.
{
"uuid": "40bbbd26-1c46-11e2-b6ff-020026de0053",
"type": "user",
"created": 1350909883387,
"modified": 1350909883387,
"activated": true,
"username": "xguru",
"email": "xguru@baas.io",
"name": "๊ถ์ ํ"
}
ํ๋์ Entity๋ ์ฌ๋ฌ ์์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด ์์ฑ๋ค์ Porperty๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, "์ฒ ์"๋ผ๋ ์ฌ๋์, '์ด๋ฆ', '๋์ด', '์ฃผ์', '์ธ๋ชจ' ๋ฑ์ Property๊ฐ ์์ต๋๋ค. ์ด Property๊ฐ ๋ง์ผ๋ฉด ๋ง์ ์๋ก ์ข ๋ ๋ช ํํ๊ฒ Entity์ ํน์ง์ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
Property๋ baas.io์์ ์ด๋ฏธ ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ Predefined Property(๊ธฐ๋ณธ ์์ฑ)๋ค๊ณผ ์ฌ์ฉ์๊ฐ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ Custom Property(์ฌ์ฉ์ ์ ์ ์์ฑ)๋ค๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
[]({'id':'entity-predefined-property','data-menu':'Predefined vs. Custom Property'})
Entity๊ฐ ๊ฐ์ง ์ ์๋ Custom Property์ ๊ฐฏ์๋ ์ด๋ก ์ ์ผ๋ก ์ ํ์ด ์์ต๋๋ค. ๋ค๋ง, Custom Property์ Key์ ์ด๋ฆ์ ์ ํ ๋, Predefined Property์ Key์ ๋์ผํ๊ฒ ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
Custom Property์ Value๋ JSON์์ Value๊ฐ ๋ ์ ์๋ String, Number, Object, Array, Boolean, null๋ก ์ค์ ํ ์ ์์ต๋๋ค. JSON์ ๋ค์ํ ๋ฐ์ดํฐ ํํ๋ฅผ ์ ์ฅํ๋๋ฐ ๋๊ฒ ์ฐ์ด๊ณ ์์ด, ์ฌ์ฉ์ ์ ์ฝ์ ๊ฑฐ์ ์์ต๋๋ค.
Predefined Property๋ ์๋์ ๊ฐ์ ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
| Property | Type | Description |
|---|---|---|
| uuid | uuid | Entity์ ๊ณ ์ ํ ID์ด๋ฉฐ baas.io๋ก๋ถํฐ ๋ถ์ฌ๋ฉ๋๋ค. |
| type | string | Entity์ ํ์ ์ด๋ฉฐ ๊ผญ ์ ์๋์ด์ผ ํฉ๋๋ค. (e.g. "user") |
| created | long | Entity์ ์์ฑ ์๊ฐ์ด๋ฉฐ baas.io๋ก๋ถํฐ ์์ฑ๋ฉ๋๋ค.(UNIX timestamp - milisec ํฌํจ) |
| modified | long | Entity์ ์ต์ข ์์ ์๊ฐ์ด๋ฉฐ baas.io๋ก๋ถํฐ ์์ฑ๋ฉ๋๋ค. (UNIX timestamp - milisec ํฌํจ) |
| name | string | Entity์ ๊ณ ์ ํ ์ด๋ฆ |
| []({'class':'table table-striped table-bordered'}) |
Warning "name" Property
"users" Collection์ ์ ์ธํ ๋ชจ๋ Collection์ "name" Property๋ฅผ ์ถ๊ฐ๋ก ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผํฉ๋๋ค. ์ด Property์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ ๋ฐ๋์ ์๋ ์ฉ๋๋ก ์ฌ์ฉํ์ง ์๋๋ก ์ฃผ์ ๋ฐ๋๋๋ค. "users" Collection์ "username" Property๊ฐ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
[]({'id':'entity-type','data-menu':'Predefined vs. Custom Type'})
์์ ๋งํ ๋ฐ์ ๊ฐ์ด, Entity๋ Type์ด๋ผ๋ ํ์ Property๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํฉ๋๋ค. ์ด Type์ Collection์ ์ด๋ฆ์ ๊ฒฐ์ ํ๋ฉฐ, Type์ ๋ณต์ํ์ผ๋ก ๊ฒฐ์ ๋ฉ๋๋ค. ์ฆ, 'user'๋ผ๋ Type์ ๊ฐ์ง Entity๋ 'users' ๋ผ๋ Collection์ ์ํ๊ฒ ๋ฉ๋๋ค.
Type๋ Property์ ๋น์ทํ๊ฒ baas.io์์ ์ด๋ฏธ ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ Predefined Type(๊ธฐ๋ณธ ํ์ )๊ณผ ์ฌ์ฉ์๊ฐ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ Custom Type(์ฌ์ฉ์ ์ ์ ํ์ )์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. Custom Type์ ์ ์ํ ๋๋ Predefined Type๊ณผ ๋์ผํ๊ฒ ์ ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
Predefined Type์ ์ข ๋ฅ๋ ์๋์ ๊ฐ์ต๋๋ค.
| Predefined Type | Predefined Collection ์ด๋ฆ ๋ฐ ์์น | ์ฉ๋ |
|---|---|---|
| user | /users | ํ์์ ๋ณด |
| group | /groups | ํ์๊ทธ๋ฃน |
| role | /roles | ์ญํ |
| activity | /activities | Activity Stream |
| device | /devices | ๋จ๋ง์ ๋ณด |
| file | /files | ํ์ผ |
| event | /events | (์์ฝ)์ด๋ฒคํธ |
| help | helps | ๊ณ ๊ฐ์ผํฐ |
| push | /pushes | ํธ์์ ๋ณด |
| location | /locations | (์์ฝ)์์น์ ๋ณด |
| script | /scripts | (์์ฝ)์คํฌ๋ฆฝํธ |
| service | /services | (์์ฝ)์๋น์ค |
| []({'class':'table table-striped table-bordered'}) |
Note (์์ฝ)๋ ์ปฌ๋ ์
ํ์ฌ๋ ์ ๊ณต๋๊ณ ์์ง ์์ง๋ง, ์์ผ๋ก ์ ๊ณต๋ ๊ธฐ๋ฅ์ ์ํด ๋ฏธ๋ฆฌ ์ ์๋ ์ปฌ๋ ์ ์ ๋๋ค.
Collection์ ๊ฐ์ Type์ Entity๋ค์ ๋ชจ์๋์ ๊ฒ์ ์ง์นญํฉ๋๋ค. Collection์ ์ด๋ฆ์ Entity Type์ ๋ณต์ํ์ผ๋ก ์ ํด์ง๋๋ค. ์๋ฅผ๋ค์ด 'person'์ด๋ผ๋ Type์ Collection ์ด๋ฆ์ 'people'์ด ๋ฉ๋๋ค. ๋ง๋ค๋ ค๋ ์ด๋ฆ์ Collection์ด ์๋๋ผ๋ Entity๋ฅผ ์์ฑํ๋ฉด, ์์ฑํ๋ ค๋ Entity Type์ ๋ณต์ํ์ผ๋ก Collection์ด ์์ฑ๋ฉ๋๋ค.
[]({'id':'collection-predefined','data-menu':'Predefined vs. Custom Collection'})
Collection์, Entity Type์ ๋ณต์ํ์ด Collection์ ์ด๋ฆ์ด๋ฏ๋ก, baas.io์์ ์ด๋ฏธ ์ ์ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ Predefined Collection(๊ธฐ๋ณธ ์ปฌ๋ ์ )๊ณผ ์ฌ์ฉ์๊ฐ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ Custom Collection(์ฌ์ฉ์ ์ ์ ์ปฌ๋ ์ )์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. Custom Collection์ ์ ์ํ ๋๋ Predefined Collection๊ณผ ๋์ผํ๊ฒ ์ ์ํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
Predefined Collection์ ์ข ๋ฅ๋ ์๋์ ๊ฐ์ต๋๋ค
| Predefined Type | Predefined Collection ์ด๋ฆ ๋ฐ ์์น | ์ฉ๋ |
|---|---|---|
| user | /users | ํ์์ ๋ณด |
| group | /groups | ํ์๊ทธ๋ฃน |
| role | /roles | ์ญํ |
| activity | /activities | Activity Stream |
| device | /devices | ๋จ๋ง์ ๋ณด |
| file | /files | ํ์ผ |
| event | /events | (์์ฝ)์ด๋ฒคํธ |
| help | /helps | ๊ณ ๊ฐ์ผํฐ |
| push | /pushes | ํธ์์ ๋ณด |
| location | /locations | (์์ฝ)์์น์ ๋ณด |
| script | /scripts | (์์ฝ)์คํฌ๋ฆฝํธ |
| service | /services | (์์ฝ)์๋น์ค |
| []({'class':'table table-striped table-bordered'}) |
note (์์ฝ)๋ ์ปฌ๋ ์
ํ์ฌ๋ ์ ๊ณต๋๊ณ ์์ง ์์ง๋ง, ์์ผ๋ก ์ ๊ณต๋ ๊ธฐ๋ฅ์ ์ํด ๋ฏธ๋ฆฌ ์ ์๋ ์ปฌ๋ ์ ์ ๋๋ค.
Entity์ Entity์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด Relationship ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ, Twitter์ Following/Follower ๊ธฐ๋ฅ์ด๋ Facebook์ Like ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
baas.io๋ "user" Entity ๊ฐ์ "following"์ด๋ผ๋ ํน๋ณํ Relationship์ ์ ๊ณตํฉ๋๋ค. ์ด "following"๊ด๊ณ๋ฅผ ํ์ฑํ๋ฉด, ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก "followers"๋ผ๋ ๊ฐ์ ๊ด๊ณ๊ฐ ํจ๊ป ์์ฑ์ด ๋ฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฆ, user A๊ฐ user B๋ฅผ following ํ ๊ฒฝ์ฐ, user A์ following์ ์กฐํํ๋ฉด user B๊ฐ ๋์ค์ง๋ง, user B์ following ๋ชฉ๋ก์๋ user A๊ฐ ๋์ค์ง ์์ต๋๋ค. user B๋ followers๋ฅผ ์กฐํํด์ผ user A๊ฐ ๋์ค๋ ๊ฒ์ ๋๋ค.
[]({'id':'relationship-custom','data-menu':'Custom Relationship'})
์ง์ ๊ด๊ณ๋ฅผ ์ ์ํ์ฌ, Custom Relationship์ ๋ง๋ค ์๋ ์์ต๋๋ค. ์ด Custom Relationship์ "following/followers"์๋ ๋ค๋ฅด๊ฒ, "user" Entity๊ฐ ์๋ ๋ค๋ฅธ Custom Type์ Entity๋ผ๋ฆฌ๋ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค๋ง, "followers" ๊ฐ์, ๋ฐ๋ ๋ฐฉํฅ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ง๋ค์ด ์ฃผ์ง๋ ์์ต๋๋ค. ๋ค์๋งํ๋ฉด, Following/Followers Relationship์ ๊ทธ๋ฆผ์์ ๋ณด์๋ฏ์ด following ๊ด๊ณ๊ฐ ๋ง๋ค์ด์ง๋ฉด, followers๋ผ๋ ๋ฐ๋ ๋ฐฉํฅ์ ๊ฐ์๊ด๊ณ๊ฐ ๋ง๋ค์ด ์ง์ง๋ง, "like"๋ผ๋ Custom Relationship์ ๊ทธ๋ ์ง ์์ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฆ, ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Relationship์ด ๋ง๋ค์ด์ง๋๋ค.
[]({'id':'data-model', 'data-menu':'Data Model'})
์์ ์ดํด๋ณธ Backend App, Entity, Collection ์น์ ์ ์ฝ์ด๋ณด์๋ค๋ฉด, ๋ฐ์ดํฐ ๋ชจ๋ธ์ด Backend App > Collection > Entity > Property ์์๋ก ๊ตฌ์กฐํ ๋์ด์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ์ค์์ด์ค์์๋ MySQL, Oracle, PostgreSQL๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDBMS)์ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ฆ, ๋ฐ์ค์์ด์ค์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์๋น์ค๋ ์ ์ฝ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ดํดํ๊ณ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
[]({'id':'you-should-know', 'data-menu':'๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์ ์์๋์ด์ผ ํ ์ '})
- Collection, Property ์์ฑ์ ๋ฏธ๋ฆฌ ์ ์ ํด์ผ ํจ
- Property ์์ฑ(์ฐ๊ฒฐ๊ฒ์์ฌ๋ถ, ์ ๋ฌธ๊ฒ์์ฌ๋ถ)์ ์ ์ํด์ผ ํจ
- Property ์์ฑ์ด ์ ์๋์ด์์ง ์์ ์ ๊ธฐ๋ณธ๊ฐ(๊ฒ์์ํจ, ์ ๋ฌธ๊ฒ์์ํจ)์ผ๋ก ์ค์ ๋จ
- Property ์์ฑ์ Predefined ๋ง๋ค ๋ค๋ฅด๊ฒ ์ ์๋์ด ์์
- Custom Collection ์ ๊ธฐ๋ณธ Property ์์ฑ
- uuid = ๊ฒ์ X, ์ ๋ฌธ๊ฒ์ X, ์ ์ผ๊ฐ O
- name = ๊ฒ์ O, ์ ๋ฌธ๊ฒ์ O, ์ ์ผ๊ฐ O
- created = ๊ฒ์ O, ์ ๋ฌธ๊ฒ์ X, ์ ์ผ๊ฐ X
- modified = ๊ฒ์ O, ์ ๋ฌธ๊ฒ์ X, ์ ์ผ๊ฐ X
- Relationship ์์ฑ์ Property ์์ฑ๊ณผ ๋์ผํจ
- Property, Relationship ์์ฑ ๋ณ๊ฒฝ์๋ ์ ์ฝ์ฌํญ์ด ์์
- ์๋์ ๋ฐ์ดํฐ๋ ์ฆ์ ๋ฐ์ (์์คํ ์ด ํ๋จ - ์ํฐํฐ ์๊ฐ 1000๊ฑด ์ดํ์ด๊ณ , ํ๋กํผํฐ ์๊ฐ ๋ง์ง ์์ ๋)
- ๋๋์ ๋ฐ์ดํฐ๊ฐ ์์ ์ ๊ธฐ์กด ๋ฐ์ดํฐ๊น์ง ๋ณ๊ฒฝํด์ผํ๋ฏ๋ก ์ ์ฒด ์์คํ ์ ๋ถํ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ก ์ ์ง์ ์ธ ๋ณ๊ฒฝ ์งํ
- ๋๋์ ๋ฐ์ดํฐ ์์ ์์ ์ ์ ์ฒด ์์คํ ์ ๋ถํ๋ฅผ ๊ณ ๋ คํ์ฌ ๋ด๋ถ์์ ์กฐ์ ๋จ, ๋ณ๊ฒฝ์์ ์ ํ ์ ์์ ๋ ์ฌ์ฉ์์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ ธ์ถ ํจ
note ์ ๋ฌธ๊ฒ์์ฌ๋ถ(Full Text Search) : Property์ ๋ชจ๋ text์ ๋ํด ๋จ์ด ๋๋ ๊ตฌ๋ฌธ์ ๊ฒ์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ๋ด์ฉ์ ๋ํด์ ๊ตฌ๋ถ์(Space) ๋จ์๋ก ์ฒ๋ฆฌํฉ๋๋ค.
[]({'id':'property-metadata', 'data-menu':'Property ์์ฑ์ด๋'})
Property๋ name, value๋ก ๊ตฌ์ฑ๋ ๊ฐ๋จํ ๊ตฌ์กฐ์ ๋๋ค. Property ์์ฑ์ ๊ฒ์์ฌ๋ถ, ์ ๋ฌธ๊ฒ์์ฌ๋ถ, ์ ์ผ๊ฐ์ฌ๋ถ๋ก ๊ตฌ์ฑ๋๋๋ฐ, ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์ํฅ์ ๋ฐ์ต๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ id, price, item_type 3๊ฐ์ง Property๋ฅผ ๊ฐ์ง items ์ปฌ๋ ์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๊ทธ๋ฆฌ๊ณ 3๊ฐ์ง ํ๋กํผํฐ์ ์์ฑ์ ์๋์ ๊ฐ์ด ์ค์ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
id = ๊ฒ์ O, ์ ๋ฌธ๊ฒ์ X, ์ ์ผ๊ฐ O
price = ๊ฒ์ X, ์ ๋ฌธ๊ฒ์ X, ์ ์ผ๊ฐ X
item_type = ๊ฒ์ O, ์ ๋ฌธ๊ฒ์ O, ์ ์ผ๊ฐ X
์ด๋, Property ์์ฑ์ ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์์ง ์์์ง๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
| ์กฐํ ๊ฐ๋ฅ์ฌ๋ถ | ์์ฒญ | ๋น๊ณ |
|---|---|---|
| ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where id = 10 | ย |
| ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where id = '10adf' | ย |
| ๋ถ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where id contains %10 | ์ ๋ฌธ๊ฒ์์ด ๋นํ์ฑํ๋ผ ์๋จ |
| ๋ถ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where price = 30 | ๊ฒ์์ฌ๋ถ๊ฐ ๋นํ์ฑํ๋ผ ์๋จ |
| ๋ถ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where price > 30 | ๊ฒ์์ฌ๋ถ๊ฐ ๋นํ์ฑํ๋ผ ์๋จ |
| ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where item_type = '100' | ย |
| ๊ฐ๋ฅ | /{baasid}/{app}/items?ql=select * where item_type = '100%' | ย |
| []({'class':'table table-striped table-bordered'}) |
์ด ๋ชจ๋ ๊ณผ์ ์ ํฌํ > MyPage > Backend App > Data Browser > ์ปฌ๋ ์ ์์ฑ, ์์ ๋์ ํตํด์ ํ ์ ์์ต๋๋ค. ์๋ ์ด๋ฏธ์ง๋ฅผ ์ฐธ๊ณ ํ์ธ์.
[]({'id':'predefined-property-metadata', 'data-menu':'Predefined Collection Property ์์ฑ'})
| Property | ์ ์ผ๊ฐ์ฌ๋ถ | ํ์์ ๋ณด | ๊ฒ์์ฌ๋ถ | ์ ๋ฌธ๊ฒ์์ฌ๋ถ |
|---|---|---|---|---|
| username | O | O | O | O |
| O | X | O | X | |
| activated | X | X | O | X |
| deactivated | X | X | O | X |
| confirmed | X | X | O | X |
| disabled | X | X | O | X |
| picture | X | X | X | X |
| []({'class':'table table-striped table-bordered'}) |
| Property | ์ ์ผ๊ฐ์ฌ๋ถ | ํ์์ ๋ณด | ๊ฒ์์ฌ๋ถ | ์ ๋ฌธ๊ฒ์์ฌ๋ถ |
|---|---|---|---|---|
| path | O | O | O | O |
| []({'class':'table table-striped table-bordered'}) |
| Property | ์ ์ผ๊ฐ์ฌ๋ถ | ํ์์ ๋ณด | ๊ฒ์์ฌ๋ถ | ์ ๋ฌธ๊ฒ์์ฌ๋ถ |
|---|---|---|---|---|
| name | O | X | O | X |
| token | O | X | O | X |
| []({'class':'table table-striped table-bordered'}) |
| Property | ์ ์ผ๊ฐ์ฌ๋ถ | ํ์์ ๋ณด | ๊ฒ์์ฌ๋ถ | ์ ๋ฌธ๊ฒ์์ฌ๋ถ |
|---|---|---|---|---|
| owner | X | O | O | X |
| dir | X | X | O | X |
| filename | X | O | X | X |
| size | X | O | O | X |
| path | X | O | O | X |
| []({'class':'table table-striped table-bordered'}) |
baas.io ์ Authentication ์ OAuth 2.0 ์ ๊ธฐ๋ฐํ๊ณ ์์ต๋๋ค. OAuth ๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ฐ์ผ ์ฑ ๋ฑ์ ์ฌ์ฉํด์ ์น์๋น์ค๋ฅผ ์ฌ์ฉํ ๋, ํจ์ค์๋๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ฉด์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ์ธ์ฆ๊ธฐ์ ์ ๋๋ค. ์ํ๋ ๊ถํ๋ง์ ์ ํํด์ ๋ถ์ฌํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ํ๋ ๊ถํ์ ์ด์ ๋ผ๊ณ ์๊ฐํ์๋ฉด ํธ๋ฆฌํฉ๋๋ค. ์ข ์ข ํธ๋ ํฌ๋ฅผ ์ด ์ ์๋ ๋ฐ๋ ํํน ์ ์ฉ ์ด์ ์ ๋น์ ๋๊ธฐ๋ ํฉ๋๋ค. Application์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ๋ ๋์ ์ OAuth ๋ ๋๋ฐ์ด์ค์ ์ฑ์ ํ ๋น๋, ์ธ์ฆํ ํฐ ์ด๋ผ๋ ๊ฒ์ ํตํด์ ์ธ์ฆ ํ ์ ์๋๋ก ํด์ค๋๋ค.
๋ฐ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์ผ ํ๋ OAuth 1.0๊ณผ ๋ฌ๋ฆฌ OAuth 2.0์ ๊ฐ๋จํ๋ฉด์๋ ์์ ํ ์ธ์ฆ์ ์ ๊ณตํฉ๋๋ค. OAuth 2.0์ Google ์ด๋ Facebook๋ฑ์์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์์ธํ ๋ด์ฉ์ oauth.net ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
[]({'id':'authentication-accesstoken','data-menu':'Access Token'})
baas.io๋ OAuth 2.0์ ํ์ค์ ๋ฐ๋ฅด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์์ ์์ Access Token(์ธ์ฆํ ํฐ)์ ์๊ตฌํฉ๋๋ค. ์ด Access Token์ ์ด์ฉํ์ฌ baas.io๋ ์ ๊ทผ ๊ถํ์ ํ์ธํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
Authentication Type
์ธ์ฆํ ํฐ์ ์ป๊ธฐ ์ํด์๋ ์๋์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ ์์ ์ ์ธ์ฆํด์ผ ํฉ๋๋ค. ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ ๊ทผํ๋ ค๋ ๊ถํ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง์ ์ธ์ฆ ํ์ ์ด ์์ต๋๋ค.
| ์ธ์ฆ ํ์ | ์ค๋ช |
|---|---|
| Application | ํด๋น Application์ ๋ชจ๋ ๊ถํ์ ๊ฐ์ง๋ ์ธ์ฆ์ ๋๋ค. |
| Application User | Application์ ์ฌ์ฉํ๋ ํ์์ด ๊ฐ์ง๋ ์ธ์ฆ์ ๋๋ค. (Role ์ค์ ์ ๋ฐ๋ฅธ ์ ๊ทผ ์ ํ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.) |
| []({'class':'table table-striped table-bordered'}) |
Application ์ธ์ฆ ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก Application ๋ด์์ ๊ฑฐ์ ์ ์ฝ์ด ์๋ ์ํผ์ ์ ์ ๊ฐ์ ๊ถํ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ ๊ธฐ๋ฐ์ Application์ ์ํ ๋ฐฉ๋ฒ ์ ๋๋ค. OAuth ๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ์ธํ ๋, Application์ client ID ์ client secret์ ์ธ์ฆ ์ ๋ณด๋ก ์ฌ์ฉํฉ๋๋ค.
Application User๋ Application์ ์ฌ์ฉ์ ๊ณ์ ์ ์ํ ์ ๊ทผ ํ์ ์ ๋๋ค. ์ด ์ ๊ทผ ํ์ ์ผ๋ก OAuth ๋ก๊ทธ์ธํ๊ธฐ ์ํด์๋ ์ฌ์ฉ์์ ์ ์ ๋ค์๊ณผ ํจ์ค์๋๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ์ธ ํ์ค ์ ์์ต๋๋ค.
Application ๊ถํ์ ์ป๊ธฐ์ํ ๋ฐฉ๋ฒ์ SDK๋ก๋ ์ ๊ณต๋์ง ์์ผ๋ฉฐ, REST API๋ฅผ ํตํด ์ด์ฉํ์ค ์ ์์ต๋๋ค.
Warning Application์ Client ID ์ Client Secret
Client ID์ Client Secret์ ์ด์ฉํ์ฌ ์ป๊ฒ๋๋ Application ๊ถํ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ด Client ID, Client Secret์ด ์ ์ถ๋์ง ์๋๋ก ๊ฐ๋ณํ ์ ์ํ์๊ธฐ ๋ฐ๋ผ๋ฉฐ, ์ ์ถ๋ ๊ฒฝ์ฐ Dashboard๋ฅผ ํตํ์ฌ ์ฌ๋ฐ๊ธ ๋ฐ์ผ์๊ธฐ ๋ฐ๋๋๋ค. ํนํ ์ ์ํ์ค ์ ์, Client ID, Client Secret์ ๋จ๋ง์ ์ค์น๋๋ ์ฑ์ ์์ค์ฝ๋์ ๋ฃ์ด์ ์ ์ฒด๊ถํ์ ๊ฐ๋๋ก ํ์ง๋ง์๊ธฐ ๋ฐ๋๋๋ค.
Access Token์ ์ ํจ์๊ฐ์ด ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ์ค์ ์ 24์๊ฐ์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค. ์ ํจ์๊ฐ์ด ์ง๋ Access Token์ ์ฌ์ฉํ์ฌ baas.io์ ์์ฒญํ๋ฉด, HTTP 401์ ์์ ํ๊ฒ ๋ฉ๋๋ค. HTTP 401์ Unauthorized(์ธ์ฆ๋์ง ์์)๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด ์๋ต์ ๋ฐ๊ฒ๋๋ฉด ์ฌ์ฉํ๋ Access Token์ ํ๊ธฐํ๊ณ ์๋ก์ด Token์ ๋ค์ ๋ฐ๊ธ ๋ฐ์์ผํฉ๋๋ค. ์ ํจ์๊ฐ์ Access Token ์์ฒญ ์ ์ํ๋ ์ ํจ์๊ฐ์ผ๋ก ์์ฒญํ์ฌ ๋ฐ์ ์ ์์ต๋๋ค. ์ ํจ์๊ฐ์ผ๋ก ์ค์ ๋๋ ๊ฐ์ msec(๋ฐ๋ฆฌ์ธ์ปจ๋)์ด๋ฉฐ ์ต๋ 604800000msec, ์ฆ, 7์ผ ๊น์ง ์ค์ ํ ์ ์์ต๋๋ค.
note ์ฑ์ ์คํํ ๋๋ง๋ค ๋ค์ ๋ก๊ทธ์ธ?
Access Token์ ์ฑ์ด ์คํ๋ ๋ ๋ง๋ค ๋ฐ๊ธ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. Twitter๋ Facebook๊ณผ ๊ฐ์ ์ฑ๋ค๋ OAuth์ ์ฑ ์ ๋ฐ๋ผ ์ ํจ์๊ฐ์ด ์กด์ฌํ๋ฉฐ, ์ด ์ ํจ์๊ฐ์ด ์ง๋๋ฉด ์ฌ์ฉ์๋ก๋ถํฐ ID, Password๋ฅผ ์ ๋ ฅ๋ฐ์ ์ง์ ๋ก๊ทธ์ธํ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์์ ID, Password๋ฅผ ์ ์ฅํ์ฌ ์๋์ผ๋ก ๋ก๊ทธ์ธํ๋ ๋ฐฉ๋ฒ์ ID, Password๊ฐ ์ ์ถ๋ ์ ์์ผ๋ฏ๋ก ๊ถ์ฅํ์ง ์์ต๋๋ค.
baas.io๋ Role(์ญํ )๊ณผ Permission(๊ถํ)์ ํตํ์ฌ ๊ฐ๋ ฅํ ๋ณด์ ์์คํ ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๊ฐ baas.io API ๋ฅผ ํธ์ถํ ๋, Client ID ์ Client Secret์ ํตํ์ฌ ์ป์, Application ๊ถํ์ Access Token์ผ๋ก ์ ๊ทผํ์ง ์๋๋ค๋ฉด, Role์ ์ค์ ๋ Permission์ ๋ฐ๋ผ ์ ๊ทผ์ด ์ ํ๋ฉ๋๋ค. Role๊ณผ Permission์ ์ค์ ํ๊ธฐ ์ํด์๋ ํด๋น ๋ฐฑ์ค๋์ฑ์ ๋ฐ์ดํฐ๋ธ๋ผ์ฐ์ > Role์ ํตํ์ฌ ์์ ํ ์ ์์ต๋๋ค.
๋ฐฑ์๋์ฑ์ ์์ฑํ๋ฉด, ์ธ ๊ฐ์ง์ ๊ธฐ๋ณธ Role์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ฐ๊ฐ์ Role์ Permission์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, Permission์ ์ด๋ป๊ฒ ์ค์ ํ๋๋์ ๋ฐ๋ผ ์ ๊ทผํ ์ ์๋ ๋ฒ์๊ฐ ์ ํ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ธ๋ผ์ฐ์ ์ Role์๋ ์๋์ ๊ฐ์ด ์ธ ๊ฐ์ง Role์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๊ฐ Role์ ์๋์ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
| ๊ธฐ๋ณธ Role | ์ค๋ช | ๋น๊ณ |
|---|---|---|
| Guest | ์ธ์ฆ๋ฐ์ง ์์ ํ์ | ๊ฐ์ , ํธ์๋ฅผ ์ํ ๋จ๋ง ๋ฑ๋ก/ํด์ ๊ถํ๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค. |
| Default | ์ธ์ฆ๋ฐ์ ํ์ ์์ ์ ํ์ | ์ ๋ณด ์ ๊ทผ ๋ฐ ํธ์๋ฅผ ์ํ ๋จ๋ง ๋ฑ๋ก/ํด์ ๊ถํ๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค. |
| Administrator | Administrator๋ก ์ง์ ๋ ํ์ ๋๋ ๊ทธ๋ฃน | ์๋ฌด๋ฐ ๊ถํ์ด ์์ผ๋ฉฐ, ํ์ํ ๊ถํ๋ง ์ง์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค. |
| []({'class':'table table-striped table-bordered'}) |
๋ชจ๋ Role์ ์๋ก์ด Permission์ ์์ฑํ๊ฑฐ๋, ์์ ๋๋ ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ฆ, ๋ก๊ทธ์ธ์ ํ์ง ์์ ํ์์ ์ ๊ทผ ๋ฒ์์ ๋ก๊ทธ์ธํ ํ์์ ์ ๊ทผ ๋ฒ์๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ ํํ์ฌ, ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
Warning ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ
๊ฐ์ ๊ณผ ๋์์ ์ด๋ฏธ ์์ฑ๋์ด ์๋ "sandbox" Backend App์ Default Role ๋ฟ๋ง ์๋๋ผ, Guest Role์๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ Permission์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์, ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ์ค์๋ "sandbox" Backend App์ ์ด์ฉํ์ฌ ๊ฐ๋ฐํ๋ ๊ฒ์ด ํธํฉ๋๋ค. ๋ค๋ง, ๋ฐฐํฌํ ๋๋ ๋ณด์์ ๋ฌธ์ ๊ฐ ์๋๋ก, ์๋ก Backend App์ ์์ฑํ๊ณ , Role๊ณผ Permission์ ์ค์ ํ์ฌ "sandbox"๋ก ๋ฐฐํฌํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
Permission์ ์ ๊ทผ ์์น์ Pattern(ํจํด)๊ณผ Operation(๋์)์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๋์์ Read(์ฝ๊ธฐ), Create(์์ฑ), Update(์์ ), Delete(์ญ์ )๋ฅผ ์ค๋ณตํ์ฌ ์ ํํ ์ ์์ผ๋ฉฐ, ์ ๊ทผ Path์ Pattern์ Apache Ant์ Pattern ๋งค์นญ ๊ท์ฝ์ ๋ฐ๋ฆ ๋๋ค.
์ ๊ทผ Path๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ํด์๋ URI(Uniform Resource Identifier)๋ฅผ ์ดํดํ ํ์๊ฐ ์๋๋ฐ, ์ด๋ค ์ปฌ๋ ์ ์ Entity์ uuid๋ฅผ uuidA๋ผ๊ณ ํ ๋, ์ด Entity์ URI๋ "/{collection}/uuidA"๊ฐ ๋๋ฉฐ, ์ด๋ฅผ ์ ๊ทผํ๊ธฐ ์ํด์๋ Permission์ Path๊ฐ Collection์ ๋ชจ๋ Entity, ์ฆ, "/{collection}/*"์ด ๋์ด์ผ ์ ๊ทผ์ด๋ฉ๋๋ค.
๋ํ, ์ด๋ค Collection์ Entity์ uuid๋ฅผ uuidA๋ผ๊ณ ํ๋ฉด, ์ด Entity์ Relationship์ผ๋ก ์ฐ๊ฒฐ๋ Entity์ URI๋ "/{collection}/uuidA/relationship"๋ก ํ์๋๊ณ , ์ด๋ฅผ ์ ๊ทผํ๊ธฐ์ํ Permission์ Path๋ "/{collection}/**"๊ฐ ๋ฉ๋๋ค.
์ฆ, "*"์ด ์ค๋ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ํ์ ์์น๊น์ง ํ์ฉํ๋ Path์ด๋ฉฐ, "**"์ด ์ค๋ ๊ฒฝ์ฐ๋ ํ์์ ๋ชจ๋ ํ์ ์์น๊น์ง ํ์ฉํ๋ Path์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ฌ์ง์ Guest Role์ ๊ธฐ๋ณธ Permission์ด๋ฉฐ, ์ธ ๊ฐ์ Permission์ด ์ค์ ๋์ด ์๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค. ์ด Permission๋ค์ Backend App์ ์์ฑํ๋ฉด Guest Role์ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋๋ Permission์ ๋๋ค.
์ด Permission์ ์ดํด๋ณด๋ฉด, "/users"์๋ Create Operation๋ง ์ฒดํฌ๋์ด ์์ต๋๋ค. ์ด๋ ์ธ์ฆ์ ๋ฐ์ง ์์ ํ์, ์ฆ, ๋ก๊ทธ์ธํ์ง ์์ ์ํ์ ํ์์ด ๊ฐ์ ("users" Collection์ "user" Entity๋ฅผ ์์ฑ)์ ํ ์ ์๋๋ก ์ค์ ๋์ด ์๋ ๊ฒ์ ๋๋ค.
๋ํ, "/devices"์๋ Create, "/devices/*"์๋ Update, Delete Operation์ด ๋ฑ๋ก๋์ด ์์ต๋๋ค.
"/devices" ์์น๋ "devices" Collection์ ๊ฐ๋ฆฌํค๋ฉฐ, ํธ์์๋น์ค๋ฅผ ์ํด ๋จ๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ์ฆ, "/devices"์ Create๋ง ๋์ด ์๋ Permission์ ๋ก๊ทธ์ธํ์ง ์์ ํ์๋ค๋ ๊ณต์ง์ฌํญ ๋๋ ํ๋ก๋ชจ์ ์ฉ๋์ ํธ์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์๋๋ก, ๋จ๋ง์ ๋ฑ๋กํ ์ ์๋ ๊ถํ์ ์ค ๊ฒ์ ๋๋ค.
"/devices/*"์ ์๋ฏธ๋, ์ด๋ฏธ ๋ฑ๋ก๋ ๋จ๋ง ์ ๋ณด๋ฅผ ์ ๊ทผํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ, Update์ Delete Operation์ ํตํด, ๋จ๋ง ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๊ฑฐ๋ ์ญ์ ํ๊ธฐ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง Permission์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| Permission ์ค๋ช | Path | Operation | |||
|---|---|---|---|---|---|
| Create | Read | Update | Delete | ||
| ํน์ ํ์์ ํ์์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ ๊ถํ | /users/john.doe | O | |||
| ๋ก๊ทธ์ธ๋ ํ์ฌ ํ์์ด ์์ ์ ํ์์ ๋ณด๋ฅผ ์์ฑ/์กฐํ/์์ /์ญ์ ํ ์ ์๋ ๊ถํ | /users/${user}/** | O | O | O | O |
| ํน์ Collection์ ์๋ก์ด Entity๋ฅผ ์์ฑํ ์ ์๋ Permission | /{collection} | O | |||
| ํน์ Collection์ Entity๋ฅผ ์กฐํํ ์ ์๋ Permission | /{collection}/* | O | |||
| ํน์ Collection์ Entity๋ฅผ ์์ /์ญ์ ํ ์ ์๋ Permission | /{collection}/* | O | O | ||
| ํน์ Collection๊ณผ ์ฐ๊ฒฐ๋์ด Relationship์ ๊ฐ์ง Entity๋ฅผ ์กฐํ/์์ /์ญ์ ํ ์ ์๋ Permission | /{collection}/** | O | O | O | |
| []({'class':'table table-striped table-bordered'}) |
Warning ํธ์ ์๋น์ค์ Role
Backend App์ ์์ฑํ๋ฉด Guest์ Default Role์ ๊ธฐ๋ณธ ์ค์ ๋์ด ์๋ Permission์ด ์์ต๋๋ค. ๊ทธ ์ค, "/devices"์ Create Operation, "/devices/*"์ Update, Delete Operation์ ํธ์๋ฅผ ์ํ Permission์ผ๋ก baas.io์ ํธ์์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์ ์ธ๋์ด์์ด์ผ ํ๋ Permission์ด๋ ์ญ์ ํ์ง ์๋๋ก ์ ์ ๋ฐ๋๋๋ค.







