๊ฐœ๋ฐœ๋…ธํŠธ/Note

[TIL] Vue์—์„œ์˜ ๋ฐฑ์—”๋“œ ํ†ต์‹ 

Dahoon06 2022. 11. 14. 22:40
728x90
๋ฐ˜์‘ํ˜•
๐Ÿ™‹๐Ÿป‍โ™‚๏ธ ์˜ค๋Š˜ ๋ฐ›์€ ์งˆ๋ฌธ

"Vue์—์„œ axios๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ๋กœ ํ†ต์‹ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” proxy๋ฅผ ์ดํ•ด ๋ชป ํ•˜๊ฒ ์–ด์š”. ์™œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด๊ฐ€์š”.?"

 

์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ๋‚œ๊ฐํ–ˆ๋‹ค...

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ•ญ์ƒ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉํ•ด ์™”๊ธฐ์— ์ „ํ˜€ ์˜๊ตฌ์‹ฌ์„ ํ’ˆ์ง€ ๋ชป ํ–ˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋‹ต์„ ๋ชป ํ•ด๋“œ๋ ธ๋‹ค.

๊ฐ™์ด ๋ชจ๋‹ˆํ„ฐ๋ฅผ ๋ณด๋ฉด์„œ ์–ด๋–ค ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฑด์ง€ ์ด๊ณณ์ €๊ณณ์„ ๊ณ ์ณ๋ณด๋ฉด์„œ ํ๋ฆ„์„ ์ฐพ์•„๋‚˜๊ฐ”๋‹ค.

๊ทธ์น˜๋งŒ ์–ด๋–ค ์‹์œผ๋กœ ํ˜๋Ÿฌ๊ฐ€๋Š”์ง€๋งŒ ํ™•์ธํ•  ๋ฟ ์ •ํ™•ํžˆ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ์ด ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ํ•œ๋‹ค..

 

Vue์—์„œ๋Š” ์ตœ์ƒ๋‹จ(๋ฃจํŠธ) ์œ„์น˜์— vue.config.js๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด proxy ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

module.exports = {
	devServer: {
    	proxy: {
        	'/api': {
            	target: 'http://localhost:3000',
                changeOrigin: true
            }
        }
    }
}

์ด๋ ‡๊ฒŒ ์„ ์–ธ์„ ํ•˜๊ฒŒ๋˜๋ฉด ๋กœ์ปฌ ๋ฐ๋ธŒ ์„œ๋ฒ„์—์„œ API ์š”์ฒญ ์‹œ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

๋งŒ์•ฝ proxy๋ฅผ ์ฃผ์ง€ ์•Š๊ณ  API๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ CORS(Cross-Origin Resource Sharing) ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

 

๐Ÿ’กCORS (Cross-Origin Resource Sharing) ๋ž€

๋”๋ณด๊ธฐ

๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๊ฐ„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž์›์„ ์š”์ฒญํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ

 

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด์•ˆ์ ์ธ ์ด์œ ๋กœ cross-origin HTTP ์š”์ฒญ์„ ์ œํ•œํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— cross-origin ์š”์ฒญ์„ ํ•˜๋ ค๋ฉด ์„œ๋ฒ„์˜ ๋™์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด๋Ÿฌํ•œ ์ ˆ์ฐจ๋ฅผ HTTP-header ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋ฅผ CORS(Cross-Origin Resource Sharing)์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

Cross-Origin์€ ์•„๋ž˜ ์กฐ๊ฑด ์ค‘ ํ•œ๊ฐ€์ง€๋ผ๋„ ๋‹ค๋ฅผ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

1. ํ”„๋กœํ† ์ฝœ - http์™€ https๋Š” ํ”„๋กœํ† ์ฝœ์ด ๋‹ค๋ฅด๋‹ค.

2. ๋„๋ฉ”์ธ - domain.com ๊ณผ other-domin.com ์€ ๋‹ค๋ฅด๋‹ค.

3. ํฌํŠธ ๋ฒˆํ˜ธ - 8080 ํฌํŠธ์™€ 3000 ํฌํŠธ๋Š” ๋‹ค๋ฅด๋‹ค.

proxy๋ฅผ ํ†ตํ•˜๊ฒŒ ๋˜๋ฉด ์šฐํšŒํ•ด์„œ Cors ๋ฌธ์ œ ์—†์ด ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์‚ฌ์šฉ๋œ ๋ฐฉ๋ฒ•์€ ์ด๋Ÿฌํ•˜๋‹ค.

vue.config.js์— proxy๋ฅผ ๋‘์—ˆ๊ณ , axios๋Š” instance๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

(backend์— prefix๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ /api๋กœ ๋งž์ถฐ๋‘์—ˆ๋‹ค.)

import axios, { AxiosInstance } from 'axios';

const baseURL = '/api'/;
const instance :AxiosInstance = axios.create({
    baseURL,
    headers: {
        'Content-Type': 'application/json'
    },
    timeout: 20000
});

instance.interceptors.request.use(config  => {
    .
    .
    return config;
});

instance.interceptors.response.use(response => {
    .
    .
    return response
});
export const ins = instance

axios์˜ baseURL์„ '/api'๋กœ ์„ค์ •ํ•˜์˜€๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด API๋ฅผ ํ˜ธ์ถœํ•˜์˜€๋‹ค. (axios๋Š” ์œ„์— ์ƒ์„ฑํ•œ instance๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.)

const { data } = await this.axios.get('/api/users');

/api/users ๋ฅผ ๋ณด๋ฉด

 

๋จผ์ € axios instance์— ์žˆ๋Š” baseURL์— /api๋กœ ํ–ˆ์—ˆ๋‹ค.

๊ทธ๋Ÿผ /api์— ๋งž์ถฐ์„œ vue.config.js์— ์„ ์–ธํ•ด์ค€ /api๋กœ ์ฐพ์•„์„œ ๊ฐ€๊ฒŒ๋˜๋Š”๋ฐ

์ตœ์ข… ๊ฒฝ๋กœ๋Š” http://localhost:3000/api/users ๋กœ ์šฐํšŒํ•ด์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋งŒ์•ฝ ํ”„๋ก ํŠธ์— ์‚ฌ์šฉ์ค‘์ธ ํฌํŠธ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” http://localhost:8080/api/api/users ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์œ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•