Plumber: Tips & Tricks ๋ฌธ์„œ์— 'Random Port' ํŠธ๋ฆญ ์ถ”๊ฐ€

์— ๋งŒ๋“  2020๋…„ 07์›” 31์ผ  ยท  6์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rstudio/plumber

๋ฌธ์ œ

์šฐ๋ฆฌ ํŒ€์€ ์ตœ๊ทผ Azure VM์— ๋ฐฐํฌ๋œ Rstudio ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋ฐฐ๊ด€๊ณต API๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Rstudio์—์„œ "API ์‹คํ–‰" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‚ด๊ฐ€ ์ „์—ญ ์˜ต์…˜์—์„œ ํŠน์ • ํฌํŠธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฐฐ๊ด€๊ณต์ด 3k์—์„œ 10k ์‚ฌ์ด์—์„œ ์ž„์˜๋กœ ์„ ํƒ๋œ ํฌํŠธ์—์„œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์—”์ง€๋‹ˆ์–ด๋“ค์€ Windows ์ ์‘ ๋ฐฉํ™”๋ฒฝ์—์„œ ํฌํŠธ ์ „๋‹ฌ ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. : ์šธ๋‹ค :. ๋ฐฐ๊ด€๊ณต์ด ์„ ํƒํ•  ํฌํŠธ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋” ์ž‘์€ ๋ฒ”์œ„์˜ ํฌํŠธ๋กœ ์‚ฌ์šฉ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ž ์žฌ์  ์†”๋ฃจ์…˜

์ž ์žฌ์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ getRandomPort ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ 3k์—์„œ 10k ๋ฒ”์œ„๋กœ ์„ค์ •ํ•˜๊ธฐ ์ „์— getOption("plumber.port_range")์ด ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

novice help wanted

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

Pro ์ œํ’ˆ๊ณผ์˜ ํ†ตํ•ฉ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

# plumber.R
options("plumber.port" = httpuv::randomPort(min = 4000, max = 7000, n = 100))

### define the rest of your plumber router...

์•„๋‹ˆ๋ฉด ๋ฐฐ๊ด€๊ณผ ์‹คํ–‰ ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋™์‹œ API๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?


๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 4000:7000 ์™€ ๊ฐ™์€ ํฌํŠธ ๊ฐ’ ๋ฒ”์œ„๋ฅผ ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๋ฐ”๊พธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ณดํ—˜๊ณ„๋ฆฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ์˜ˆ, ์˜ต์…˜์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. getRandomPort์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น๋ถ„๊ฐ„์€ findPort ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜์—ฌ run ๋ฉ”์†Œ๋“œ๋‚˜ ๋ฐฐ๊ด€๊ณต ํฌํŠธ ์˜ต์…˜์— ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

options(plumber.port = XYZ) ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ plumber.R ํŒŒ์ผ ๋‚ด์—์„œ ๋˜๋Š” $run() ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@schloerke , ํฌํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ž ์žฌ์ ์ธ ์Šคํ†ฑ ๊ฐญ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ํŒ€์„ rstudio ์„œ๋ฒ„๋กœ ๊ฐ€์ ธ์˜ด์— ๋”ฐ๋ผ ํฌํŠธ ์‚ฌ์šฉ ์กฐ์ •์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€๋งŒ ํฌํŠธ๊ฐ€ ๊ฐœ๋ณ„ ๋ฐฐ๊ด€๊ณต ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋น„๊ต์  ์ž‘์€ ํ’€์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

@meztez ๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ์ฃผ๋ง์— PR ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ํ•ญ๋ชฉ์ธ plumber.port_range์— ๋Œ€ํ•ด ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ์˜ต์…˜ plumber.port_range.min ๋ฐ plumber.port_range.max๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ์˜ต์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์˜ต์…˜์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

options("plumber.port" = 4000:7000)

rstudio ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋ฐฐ๊ด€๊ณต API๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋  ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด rstudio ์„œ๋ฒ„ ํฌํŠธ์— ํ”„๋ก์‹œ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๊ท€ํ•˜์™€ ์œ ์‚ฌํ•œ ์„ค์ •์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋„คํŠธ์›Œํฌ ๋ฐฉํ™”๋ฒฝ์—์„œ ํ•˜๋‚˜์˜ ๋ฐœ์‹  ํฌํŠธ๋งŒ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋งŽ์€ API๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pro ์ œํ’ˆ๊ณผ์˜ ํ†ตํ•ฉ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

# plumber.R
options("plumber.port" = httpuv::randomPort(min = 4000, max = 7000, n = 100))

### define the rest of your plumber router...

์•„๋‹ˆ๋ฉด ๋ฐฐ๊ด€๊ณผ ์‹คํ–‰ ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ๋™์‹œ API๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ?


๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 4000:7000 ์™€ ๊ฐ™์€ ํฌํŠธ ๊ฐ’ ๋ฒ”์œ„๋ฅผ ์ˆ˜๋ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๋ฐ”๊พธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ธฐ๋Šฅ ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ #569์— ์„ค๋ช…๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋‚˜๋Š” ํŠน์ • ์ œํ•œ ๋ฒ”์œ„ httpuv๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, @schloerke์˜ ์ œ์•ˆ์„ ํ•„์š”ํ–ˆ๋˜ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์„ ์ƒ๊ฐ :: randomPort ์ข‹์€ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ {๋ฐฐ๊ด€} ํŒ€์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ณด์ง€ ์•Š๋Š” ํ•œ ์ด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ์ข…๋ฃŒํ•˜๊ณ  packagedown ์‚ฌ์ดํŠธ์˜ "ํŒ ๋ฐ ์š”๋ น" ๋ฌธ์„œ์— @schloerke ์Šค๋‹ˆํŽซ์„ ํฌํ•จํ•˜๋„๋ก ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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