FE

[Vue] devServer κ΅¬μ„±ν•˜κ³  proxy μ„€μ •ν•˜κΈ°

soogoori 2024. 9. 6. 12:50

λ‘œμ»¬μ—μ„œ μ‹€ν–‰μ‹œν‚¬ λ•Œ κ°„ν˜Ή μ•ˆ λŒμ•„κ°ˆ λ•Œκ°€ μžˆμ—ˆλ‹€. (400λ²ˆλŒ€ μ—λŸ¬)

그럴 λ•Œλ§ˆλ‹€ 항상 μš”μ²­ν•˜λŠ” url둜 잘 λ‚ μ•„κ°€κ³  μžˆλŠ”μ§€, ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ˜ 연결이 잘 μ„€μ •λ˜μ–΄μžˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•œλ‹€.


vue.config.jsλŠ” Webpack 섀정을 ν™•μž₯ν•˜κ±°λ‚˜ μ‚¬μš©μž μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ꡬ성 νŒŒμΌμ΄λ‹€.

πŸ”” vue.config.jsκ°€ ν•„μš”ν•œ 경우 

- κΈ°λ³Έ 섀정을 λ„˜μ–΄ ν”„λ‘œμ νŠΈμ— νŠΉμ • μš”κ΅¬μ‚¬ν•­μ΄ μžˆμ„ λ•Œ
- 개발 μ„œλ²„ 섀정을 λ³€κ²½ν•˜κ±°λ‚˜ webpack ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•  λ•Œ
- API ν”„λ‘μ‹œλ₯Ό μ„€μ •ν•˜κ±°λ‚˜ μ™ΈλΆ€ CSS/JS 라이브러리λ₯Ό μΆ”κ°€ν•  λ•Œ 

μœ„μ™€ 같이 ν•΄λ‹Ή νŒŒμΌμ„ 톡해 기본적인 섀정을 λ³€κ²½ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ‹€. 

이 νŒŒμΌμ—μ„œ μ„€μ •ν•  수 μžˆλŠ” μ˜΅μ…˜λ“€μ€ λ‹€μŒκ³Ό κ°™λ‹€. 

 

 

πŸ”Ή μ£Όμš” μ„€μ • μ˜΅μ…˜λ“€ 

  • publicPath 
    • 앱이 배포될 κΈ°λ³Έ URL 경둜 지정 πŸ‘‰ ν•΄λ‹Ή 경둜둜 ν˜ΈμŠ€νŒ…λ¨
module.exports = {
  publicPath: '/my-app/'
};
  • outputDir
    • λΉŒλ“œλœ 파일이 μ €μž₯될 디렉토리 μ„€μ •
module.exports = {
  outputDir: 'dist'
};
  • assetsDir
    • static resourceκ°€ μ €μž₯될 디렉토리 μ„€μ •
module.exports = {
  assetsDir: 'static'
};
  • devServer
    • 개발 μ„œλ²„ μ„€μ • μ •μ˜
module.exports = {
  devServer: {
    port: 8080, // 개발 μ„œλ²„ 포트
    proxy: 'http://backend.example.com' // API ν”„λ‘μ‹œ μ„€μ •
  }
};
  • lintOnSave
    • 개발 쀑 lint 였λ₯˜ 처리 방법 μ„€μ •
module.exports = {
  lintOnSave: false // ESLint 였λ₯˜ λ¬΄μ‹œ
};
  • configureWebpack
    • Webpack μ„€μ • μΆ”κ°€ ν˜Ήμ€ μˆ˜μ •
module.exports = {
  configureWebpack: {
    plugins: [
      new MyAwesomeWebpackPlugin()
    ]
  }
};
  • productionSourceMap
    • 배포 μ‹œ μ†ŒμŠ€ 맡 생성 μ—¬λΆ€ κ²°μ •
module.exports = {
  productionSourceMap: false
};

 

 

개발 μ„œλ²„ ꡬ성 및 ν”„λ‘μ‹œ μ„€μ •

devServer: {
		host: 'localhost',
		port: 8081,
		proxy: {
			'^/sys': {
				target: 'http://localhost:9320',
				changeOrigin: true,
				logLevel: 'debug',
			},
			'ws://localhost:8080/*': {
				// WebSocket ν”„λ‘μ‹œ μ„€μ •
				target: 'ws://localhost:8080',
				ws: true, // WebSocket ν”„λ‘μ‹œ ν™œμ„±ν™”
			},
			'^/abcapi': {
				//target: 'https://dev-api.abc.com',
				target: 'http://localhost:8989',
				pathRewrite: { '^/abcapi': '/' },
				changeOrigin: true,
				logLevel: 'debug',
			},
			'^/fileapi': {
				target: 'https://dev-file.abc.com',
				pathRewrite: { '^/fileapi': '/' },
				changeOrigin: true,
				logLevel: 'debug',
			},
		},
	},

 

 

  • proxy 객체 : νŠΉμ • μœ ν˜•μ˜ HTTP μš”μ²­μ„ λ‹€λ₯Έ λ°±μ—”λ“œ μ„œλ²„λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈ πŸ‘‰ CORS 문제 처리 
    • `/sys`, `/abcapi`, `/fileapi` 둜 μ‹œμž‘ν•˜λŠ” μš”μ²­μ„ ν•΄λ‹Ήν•˜λŠ” target으둜 ν”„λ‘μ‹œλ¨
    • changeOrigin : 호슀트 ν—€λ”μ˜ 좜처λ₯Ό λŒ€μƒ URL둜 λ³€κ²½ν•˜μ—¬ CORS 문제 ν•΄κ²° πŸ‘‰ cross origin ν—ˆμš©
    • pathRewrite : ν•΄λ‹Ήν•˜λŠ” 경둜둜 λ°”κΎΈκΈ°