Skip to content

Latest commit

ย 

History

History
496 lines (292 loc) ยท 27.4 KB

File metadata and controls

496 lines (292 loc) ยท 27.4 KB

Backend App

[]({'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์„ ์„ค์ •ํ•˜์—ฌ ๋ณด์•ˆ์— ๋ฌธ์ œ๊ฐ€ ์—†๋„๋ก ์œ ์˜ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Entity

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": "๊ถŒ์ •ํ˜"
}

Property

ํ•˜๋‚˜์˜ Entity๋Š” ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์†์„ฑ๋“ค์„ Porperty๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "์ฒ ์ˆ˜"๋ผ๋Š” ์‚ฌ๋žŒ์€, '์ด๋ฆ„', '๋‚˜์ด', '์ฃผ์†Œ', '์™ธ๋ชจ' ๋“ฑ์˜ Property๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Property๊ฐ€ ๋งŽ์œผ๋ฉด ๋งŽ์„ ์ˆ˜๋ก ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ Entity์˜ ํŠน์ง•์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Property๋Š” baas.io์—์„œ ์ด๋ฏธ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Predefined Property(๊ธฐ๋ณธ ์†์„ฑ)๋“ค๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Custom Property(์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ)๋“ค๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

Predefined vs. 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๊ฐ€ ๊ฐ™์€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Predefined vs. Custom Type

[]({'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

Collection์€ ๊ฐ™์€ Type์˜ Entity๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์„ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค. Collection์˜ ์ด๋ฆ„์€ Entity Type์˜ ๋ณต์ˆ˜ํ˜•์œผ๋กœ ์ •ํ•ด์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด 'person'์ด๋ผ๋Š” Type์˜ Collection ์ด๋ฆ„์€ 'people'์ด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ๋“ค๋ ค๋Š” ์ด๋ฆ„์˜ Collection์ด ์—†๋”๋ผ๋„ Entity๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ƒ์„ฑํ•˜๋ ค๋Š” Entity Type์˜ ๋ณต์ˆ˜ํ˜•์œผ๋กœ Collection์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Predefined vs. Custom 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 (์˜ˆ์•ฝ)๋œ ์ปฌ๋ ‰์…˜

ํ˜„์žฌ๋Š” ์ œ๊ณต๋˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ์•ž์œผ๋กœ ์ œ๊ณต๋  ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ปฌ๋ ‰์…˜์ž…๋‹ˆ๋‹ค.

Relationship

Entity์™€ Entity์‚ฌ์ด์— ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Relationship ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ, Twitter์˜ Following/Follower ๊ธฐ๋Šฅ์ด๋‚˜ Facebook์˜ Like ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Following/Followers

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๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Custom Relationship

[]({'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์ด ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

Data Model

[]({'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) ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Property ์†์„ฑ์ด๋ž€

[]({'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 > ์ปฌ๋ ‰์…˜ ์ƒ์„ฑ, ์ˆ˜์ •๋ž€์„ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ด๋ฏธ์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Predefined Collection Property ์†์„ฑ

[]({'id':'predefined-property-metadata', 'data-menu':'Predefined Collection Property ์†์„ฑ'})

Users

Property ์œ ์ผ๊ฐ’์—ฌ๋ถ€ ํ•„์ˆ˜์ •๋ณด ๊ฒ€์ƒ‰์—ฌ๋ถ€ ์ „๋ฌธ๊ฒ€์ƒ‰์—ฌ๋ถ€
username O O O O
email 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'})

Groups

Property ์œ ์ผ๊ฐ’์—ฌ๋ถ€ ํ•„์ˆ˜์ •๋ณด ๊ฒ€์ƒ‰์—ฌ๋ถ€ ์ „๋ฌธ๊ฒ€์ƒ‰์—ฌ๋ถ€
path O O O O
[]({'class':'table table-striped table-bordered'})

Devices

Property ์œ ์ผ๊ฐ’์—ฌ๋ถ€ ํ•„์ˆ˜์ •๋ณด ๊ฒ€์ƒ‰์—ฌ๋ถ€ ์ „๋ฌธ๊ฒ€์ƒ‰์—ฌ๋ถ€
name O X O X
token O X O X
[]({'class':'table table-striped table-bordered'})

Files

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'})

Authentication

baas.io ์˜ Authentication ์€ OAuth 2.0 ์— ๊ธฐ๋ฐ˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. OAuth ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋ฐ”์ผ ์•ฑ ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์›น์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ธ์ฆ๊ธฐ์ˆ  ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ถŒํ•œ๋งŒ์„ ์ œํ•œํ•ด์„œ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์ œํ•œ๋œ ๊ถŒํ•œ์˜ ์—ด์‡ ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ข…์ข… ํŠธ๋ ํฌ๋ฅผ ์—ด ์ˆ˜ ์—†๋Š” ๋ฐœ๋ ›ํŒŒํ‚น ์ „์šฉ ์—ด์‡ ์— ๋น„์œ ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. Application์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹ ์— OAuth ๋Š” ๋””๋ฐ”์ด์Šค์˜ ์•ฑ์— ํ• ๋‹น๋œ, ์ธ์ฆํ† ํฐ ์ด๋ผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด์„œ ์ธ์ฆ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

๋ฐ˜๋“œ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” OAuth 1.0๊ณผ ๋‹ฌ๋ฆฌ OAuth 2.0์€ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์•ˆ์ „ํ•œ ์ธ์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. OAuth 2.0์€ Google ์ด๋‚˜ Facebook๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€ oauth.net ์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Access Token

[]({'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์„ ๋‹จ๋ง์— ์„ค์น˜๋˜๋Š” ์•ฑ์˜ ์†Œ์Šค์ฝ”๋“œ์— ๋„ฃ์–ด์„œ ์ „์ฒด๊ถŒํ•œ์„ ๊ฐ–๋„๋ก ํ•˜์ง€๋งˆ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Policy

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๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Security

baas.io๋Š” Role(์—ญํ• )๊ณผ Permission(๊ถŒํ•œ)์„ ํ†ตํ•˜์—ฌ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ baas.io API ๋ฅผ ํ˜ธ์ถœํ• ๋•Œ, Client ID ์™€ Client Secret์„ ํ†ตํ•˜์—ฌ ์–ป์€, Application ๊ถŒํ•œ์˜ Access Token์œผ๋กœ ์ ‘๊ทผํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, Role์— ์„ค์ •๋œ Permission์— ๋”ฐ๋ผ ์ ‘๊ทผ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. Role๊ณผ Permission์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ฐฑ์•ค๋“œ์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ธŒ๋ผ์šฐ์ € > Role์„ ํ†ตํ•˜์—ฌ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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์ด๋‹ˆ ์‚ญ์ œํ•˜์ง€ ์•Š๋„๋ก ์œ ์˜ ๋ฐ”๋ž๋‹ˆ๋‹ค.