Node-redis: Hiredis๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 07์›” 11์ผ  ยท  13์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NodeRedis/node-redis

  • ๋ฒ„์ „ : 2.7.1
  • ํ”Œ๋žซํผ : Node.js 8.1.3 / macOS 10.12.5
  • ์„ค๋ช… : ํ”„๋กœ์ ํŠธ์—์„œ yarn ๋˜๋Š” npm install์„ ์‹คํ–‰ํ•œ ํ›„ webpack ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋™์•ˆ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
ERROR in ./node_modules/redis-parser/lib/hiredis.js
Module not found: Error: Can't resolve 'hiredis' in
error Command failed with exit code 2.

์›นํŒฉ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var path = require('path')

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      }
    ]
  },
  target: 'node'
}

ํŒจํ‚ค์ง€.json

{
  "version": "1.0.0",
  "main": "src/index.js",
  "license": "MIT",
  "dependencies": {
    "dotenv": "^4.0.0",
    "koa": "^2.3.0",
    "koa-bodyparser": "^4.2.0",
    "koa-router": "^7.2.1",
    "node-fetch": "^1.7.1",
    "redis": "^2.7.1"
  },
  "devDependencies": {
    "babel-cli": "^6.24.1",
    "babel-loader": "^7.1.1",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-plugin-transform-object-rest-spread": "^6.23.0",
    "babel-preset-env": "^1.5.2",
    "webpack": "^3.0.0"
  },
  "scripts": {
    "start": "node dist/bundle",
    "build": "webpack"
  },
  "babel": {
    "presets": [
      [
        "env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ],
    "plugins": [
      "transform-object-rest-spread",
      "transform-class-properties"
    ]
  }
}

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

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ Webpack์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. redis-parser ๊ฐ€ hiredis $ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ •ํ™•ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” redis-parser 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์›นํŒฉ๊ณผ ๊ด€๋ จ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. webpack ๊ตฌ์„ฑ์—์„œ nodeExternals ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

const nodeExternals = require('webpack-node-externals')

module.exports = {
  ...
  externals: [nodeExternals()],
  target: 'node'
}

nodeExternals๋Š” ์„œ๋ฒ„ ์ธก ๋ฒˆ๋“ค๋ง์—์„œ node_modules ํด๋”์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์›นํŒฉ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ๊ทธ๊ฒƒ์€ Webpack์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. redis-parser ๊ฐ€ hiredis $ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ •ํ™•ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” redis-parser 3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@guidobouman node_redis ๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ๋‹จ์ผ ์ข…์†์„ฑ์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š๊ณ  redis-parser 3.0์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ๋ช‡ ์ฃผ ๋™์•ˆ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@guidobouman ์œ ํšจํ•œ JS ์ฝ”๋“œ๋Š” Webpack ์— ์ ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๊ณ  ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์ œ์ณ๋‘๊ณ : ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Redis์—์„œ Webpack์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ด์œ ๊ฐ€ ๋งค์šฐ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ์ถ•์†Œํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@peterschussheim ํ˜„์žฌ node_redis์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ์šฉ๋Ÿ‰์ด ๋งŽ์ง€ ์•Š์€๋ฐ ์ƒ๋‹นํžˆ ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค. redis-parser๋งŒ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํ•œ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@BridgeAR ์ฐธ์กฐ https://github.com/NodeRedis/node-redis-parser/pull/36

๋ˆ„๋ฝ๋œ ์ฐธ์กฐ๋Š” Webpack์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๊ณ ์šฉ์ž๋ฅผ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น ๋ฒ„๊ทธ๋„ "๋ถ€์ˆ˜์  ์†์ƒ"์œผ๋กœ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๊ด€๋ จ ์ฝ”๋“œ์—์„œ ์›นํŒฉ์„ ์‹คํ–‰ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด: ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์€ ์ด์ „ ๋ฒ„์ „์˜ Node๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๊ฐ™์€ ์ตœ์‹  ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (https://github.com/serverless-heaven/serverless-webpack)

@peterschussheim node-redis redis-parser ๋ฒ„์ „์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. hiredis ์ง์ ‘ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. hiredis ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ redis-parser ๋Š” ๊ทธ๊ฒƒ์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, @BridgeAR : ์ด๊ฒƒ์€ ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋ฏ€๋กœ ํŒจ์น˜ ๋ฒ„์ „ ๋ฒ”ํ”„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ฝค ์˜ค๋žซ๋™์•ˆ EOL์ด์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Node ๋ฒ„์ „์„ 4 ๋ฏธ๋งŒ์œผ๋กœ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.

@guidobouman ๊ทธ ์ œ์•ˆ์— ๋Œ€ํ•ด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. 'ํ•ดํ‚น'์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋ฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋‚˜ ์ž์‹ ์ด๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด 'ํ˜„๋Œ€์ ' ๋ฒ„์ „์„ ์ถœ์‹œํ•  ์ข‹์€ ๊ธฐํšŒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋…ธ๋“œ 4 ์ง€์› ๋•Œ๋ฌธ์— ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ์„ ๋ฏธ๋ฃจ๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋งค์šฐ ์•ˆํƒ€๊น์Šต๋‹ˆ๋‹ค).

๐Ÿ‘Ž

๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? hiredis ๋ฅผ ์ง์ ‘ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋‹จ์ˆœํžˆ hiredis ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?
๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ํŒŒ์„œ๋Š” hiredis ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉ ์ค‘์ด๊ณ  hiredis ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. AWS ๋žŒ๋‹ค ๋Ÿฐํƒ€์ž„์„ ๋ฒˆ๋“ค๋งํ•  ๋•Œ Webpack์ด ๋น„์ฐธํ•˜๊ฒŒ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์กฐ์ •(๋Œ€์ƒ: '๋…ธ๋“œ'๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  'hiredis' ์ถ”๊ฐ€ ์„ค์น˜) ํ›„์—๋„ ์—ฌ์ „ํžˆ
๋ฒˆ๋“ค๋ง ๋ฌธ์ œ. Webpack๊ณผ ํ•จ๊ป˜ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด "Uncaught ReferenceError: require is not defined"๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ด๋ ˆ๋””์Šค๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ๋…ธ๋“œ 12์— ์„ค์น˜ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— redis-parser๊ฐ€ v3.0.0์—์„œ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ์ด ํŒจํ‚ค์ง€๋Š” ์—ฌ์ „ํžˆ v2.6.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‹ค์Œ์„ ํ†ตํ•ด Parceljs์™€ ๋ฒˆ๋“ค์„ ์‹œ๋„ํ•  ๋•Œ ์ด๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค.

parcel build src/index.ts --bundle-node-modules --target node --no-source-maps --no-minify

๋ฒˆ๋“ค๋ง(ํŠธ๋ฆฌ ์‰์ดํ‚น, ์ปจํ…Œ์ด๋„ˆํ™” ์ตœ์ ํ™” ๋“ฑ)ํ•  ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ถ•์†Œ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ npm install ์™€ ์ „์ฒด ๋นŒ๋“œ๋ฅผ ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Hiredis๋Š” ํฌ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋งˆ์ง€๋ง‰ PR์€ 10์ผ ์ „). ๊ทธ๋Ÿฌ๋‚˜ 3.0์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด PR @sookoll ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Hiredis๋Š” ํฌ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋งˆ์ง€๋ง‰ PR์€ 10์ผ ์ „). ๊ทธ๋Ÿฌ๋‚˜ 3.0์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด PR @sookoll ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ณ ์šฉ ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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