๐๐ปโ๏ธ ์ค๋ ๋ฐ์ ์ง๋ฌธ
"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 ๋ก ์ ๊ทผํ๋ฉด ์์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์ ์ ์๋ค.
'๊ฐ๋ฐ๋ ธํธ > Note' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฌ์ด๋ ํ๋ก์ ํธ - Dotto ๊ฐ๋ฐ ์ผ์ง - ํ๋ก ํธ ๋ฐฐํฌ (0) | 2023.02.13 |
---|---|
์ฌ์ด๋ ํ๋ก์ ํธ - ๋ทํฌ (Dotto) (0) | 2023.02.13 |
[TIL] Vue Router Guard (2022-08-01 ๋ด์ฉ ์ด์ ) (0) | 2022.09.13 |
[TIL] JavaScript Function (2022-08-10 ๋ด์ฉ ์ด์ ) (0) | 2022.09.08 |
[WEB] JSON (JavaScript Object Notation) (0) | 2021.06.07 |