Feathers: ๊ณต๊ณต / ๋ฏผ๊ฐ„ ์„œ๋น„์Šค

์— ๋งŒ๋“  2017๋…„ 10์›” 08์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: feathersjs/feathers

์–˜๋“ค ์•„! ์šฐ์„ , ๋‚˜๋Š” ์ตœ๊ทผ feathersjs๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์ •๋ง ์ข‹๋‹ค๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
rest ๋˜๋Š” socket์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ •๋ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.
React ํ”„๋ก ํŠธ์—”๋“œ์šฉ REST API๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์–ด ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ํ—ค๋งค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด "๋น„๊ณต๊ฐœ" ์„œ๋น„์Šค๋ฅผ ์–ด๋””์— ๋‘˜์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒˆ์—ญ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ์—ญ๋œ ์ด๋ฉ”์ผ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฉ”์ผ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋“ฑ๋กํ•  ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค...). ์ด ์„œ๋น„์Šค๋Š” ๋‚˜๋จธ์ง€ API๋กœ ์ ˆ๋Œ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ˆœ์ „ํžˆ ๋‚ด๋ถ€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉ์ž๋Š” /mailer์— POST๋ฅผ ๋ณด๋‚ด ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋‚ด ์„œ๋น„์Šค๋ฅผ ๊ฒฝ๋กœ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๊ณ  ์„œ๋น„์Šค ๋ฐ•๋žŒํšŒ๊ฐ€ ๊ธฐ๋ณธ ๋™์ž‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ์„œ๋น„์Šค์— ๋Œ€ํ•œ "์™ธ๋ถ€" ์•ก์„ธ์Šค๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‚ด ์„œ๋น„์Šค์˜ ํ›„ํฌ ์ „์— ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ hooks.disallow('external')์™€ ๊ฐ™์€ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๊ฐœ์ธ ์„œ๋น„์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ๋™์ผํ•œ ํด๋”(src/services)์— ๋ชจ๋“  ์„œ๋น„์Šค(๋น„๊ณต๊ฐœ ๋ฐ ๊ณต๊ฐœ)๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด "๊ฐœ์ธ ์„œ๋น„์Šค"๋ฅผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด app.set('mailer', mailer)์™€ ๊ฐ™์€ ์•ฑ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์„œ๋น„์Šค ํ›„ํฌ์˜ ์ด์ ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•ฑ์—์„œ ๊ฐ€์ ธ์˜ค์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? app.service('xxx')๊ฐ€ ์ข‹์•„์š”?
๋˜ํ•œ cli๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ. ๋ชจ๋“  ์„œ๋น„์Šค์—๋Š” ์ด๋ฆ„ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์˜ ์šฉ๋„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? app.service(xxx)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์„œ๋น„์Šค๊ฐ€ xxx ๊ฒฝ๋กœ์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

๊ณ ๋ง™์Šต๋‹ˆ๋‹ค !

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด์ œ feathers-plus/feathers-hooks-common#disallow ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

๋‚ด ์„œ๋น„์Šค์— ๋Œ€ํ•œ "์™ธ๋ถ€" ์•ก์„ธ์Šค๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด hooks.disallow('external')์™€ ๊ฐ™์€ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

app.use('/mypath', myservice)
app.service('/mypath').hooks({
  before: { all: [hooks.disallow('external')] } 
})

์ด "๊ฐœ์ธ ์„œ๋น„์Šค"๋ฅผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด ์ œ์•ˆ์€ ๊ฐœ์ธ ์ด๋ฆ„ ๊ณต๊ฐ„๊ณผ ๊ฐ™์€ ๋‹ค์Œ ์ „์—ญ ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ ์„œ๋น„์Šค๋ฅผ ์›ํ•  ๋•Œ๋งˆ๋‹ค /private/svc1 /private/svc2 ์™€ ๊ฐ™์ด ์ด๋ฆ„์„ ์ง€์ •ํ•œ ๋‹ค์Œ ์กฐ๊ฑด๋ถ€๋กœ disallow('external') ์ ์šฉํ•˜๋Š” ์ „์—ญ ์•ฑ ํ›„ํฌ๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

์›ํ•˜๋Š” ๋Œ€๋กœ ํด๋” ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์„œ๋น„์Šค ์ด๋ฆ„๋ฟ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ๋‘˜ ๋‹ค ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ชจ๋“  DB ์„œ๋น„์Šค๊ฐ€ DB ํด๋”์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ db/users ...


์˜ˆ๋ฅผ ๋“ค์–ด, ์ด app.set('mailer', mailer)์™€ ๊ฐ™์€ ์•ฑ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์„œ๋น„์Šค ํ›„ํฌ์˜ ์ด์ ์„ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค. app.use() ๊ณ„์† ๊ณ ์ •


์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•ฑ์—์„œ ๊ฐ€์ ธ์˜ค์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? app.service('xxx')๊ฐ€ ์ข‹์•„์š”?

๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ œ๊ฐ€ ๊ณ ์ˆ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์„œ๋น„์Šค์— ES6 ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ app ๊ฐœ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„ค์ • ๋ฐฉ๋ฒ•์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

export default class Service {
 setup(app) {
    this.app = app;
    this.svc2 = app.service('svc2');
  }

  create(data) {
    // use this.svc2 here now 
  }
}

app.use('/service', new Service());

๋˜ํ•œ cli๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ. ๋ชจ๋“  ์„œ๋น„์Šค์—๋Š” ์ด๋ฆ„ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์˜ ์šฉ๋„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? app.service(xxx)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์„œ๋น„์Šค๊ฐ€ xxx ๊ฒฝ๋กœ์— ์—ฐ๊ฒฐํ•˜์—ฌ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ cli๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฒƒ๋ณด๋‹ค ์ต์Šคํ”„๋ ˆ์Šค์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด app.service('xyz') ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ •์˜ํ•œ ๊ฒฝ๋กœ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. app.use('xyz', new Xyz())

@subodhpareek18 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค , ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๐Ÿ˜„

์ด์ œ feathers-plus/feathers-hooks-common#disallow ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•ด์„œ๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ๋Š” ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰