์๋ค ์! ์ฐ์ , ๋๋ ์ต๊ทผ 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 ๊ฒฝ๋ก์ ์ฐ๊ฒฐํ์ฌ ํด๊ฒฐ๋ฉ๋๋ค. ๋ง์ต๋๊น?
๊ณ ๋ง์ต๋๋ค !
๋ด ์๋น์ค์ ๋ํ "์ธ๋ถ" ์ก์ธ์ค๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด 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 ์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํด์๋ ์ด ๋ฌธ์ ์ ๋ํ ๋งํฌ๊ฐ ์๋ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด์ feathers-plus/feathers-hooks-common#disallow ์์ ์ฐพ์ ์ ์์ต๋๋ค.