์ธํฐ์ ํฐ(Interceptors)๋? then ๋๋ catch๋ก ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ ์ ์๋ค.
Axios ์ธํฐ์ ํฐ๋ฅผ ์ ์ฉํ๋ ค๋ ์ด์ โ
ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์๋ฒ์ ํ ํฐ ์ธ์ฆ์ ํ์๋ก ํ๋ API ์์ฒญ์ ํ ๋๋ง๋ค HTTP Authorization ์์ฒญ ํค๋์ ํ ํฐ์ ๋ฃ์ด์ค์ผํ๊ณ 401(Unauthorized) ์๋ฌ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ค์ด์ค๋ฉด ํ ํฐ์ ๊ฐฑ์ ํด์ค ํ ์ฌ์์ฒญ์ ๋ณด๋ด๋ ๊ณผ์ ์ ํ ๊ณณ์์ ๋ชจ๋ ์ฒ๋ฆฌํ์ฌ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๊ธฐ ์ํด Axios ์ธํฐ์ ํฐ๋ฅผ ์ ์ฉํ๊ธฐ๋ก ํ๋ค.
์ฌ์ฉ์ ์ง์ config๋ก ์๋ก์ด Axios ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ ๋์ฑ ํธ๋ฆฌํ๋ค. (baseURL, timeout ์ค์ )
์ ์ฉํ๋ ๊ณผ์
1) Axios ์ธ์คํด์ค ์์ฑ
const instance = axios.create({
// ์๋์ ์ธ URL์ ์ธ์คํด์ค ๋ฉ์๋์ ์ ๋ฌํ๋ ค๋ฉด baseURL์ ์ค์ ํ๋ ๊ฒ์ ํธ๋ฆฌํ๋ค.
// URL(์๋ฒ ์ฃผ์) ์์ - http://127.0.0.1:5500
baseURL: URL,
// ์์ฒญ์ด timeout๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์์ฒญ์ด ์ค๋จ๋๋ค.
timeout: 1000,
});
2) ์์ฒญ ์ธํฐ์ ํฐ ์ถ๊ฐํ๊ธฐ
- ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ ์ ์์ ์ํ, ์์ฒญ ์ค๋ฅ๊ฐ ์๋ ์์ ์ํ์ ํ ์ ์๋ 2๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋๋ค.
instance.interceptors.request.use(
(config) => {
// getToken() - ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋์ด ์๋ ์ก์ธ์ค ํ ํฐ์ ๊ฐ์ ธ์ค๋ ํจ์
const accessToken = getToken();
config.headers['Content-Type'] = 'application/json';
config.headers['Authorization'] = `Bearer ${accessToken}`;
return config;
},
(error) => {
console.log(error);
return Promise.reject(error);
}
);
3) ์๋ต ์ธํฐ์ ํฐ ์ถ๊ฐํ๊ธฐ
- ์๋ต ๋ฐ์ดํฐ๊ฐ ์๋ ์์ ์ํ, ์๋ต ์ค๋ฅ๊ฐ ์๋ ์์ ์ํ์ ํ ์ ์๋ 2๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋๋ค.
instance.interceptors.response.use(
(response) => {
if (response.status === 404) {
console.log('404 ํ์ด์ง๋ก ๋์ด๊ฐ์ผ ํจ!');
}
return response;
},
async (error) => {
if (error.response?.status === 401) {
// isTokenExpired() - ํ ํฐ ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ํจ์
// tokenRefresh() - ํ ํฐ์ ๊ฐฑ์ ํด์ฃผ๋ ํจ์
if (isTokenExpired()) await tokenRefresh();
const accessToken = getToken();
error.config.headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
};
// ์ค๋จ๋ ์์ฒญ์(์๋ฌ๋ ์์ฒญ)์ ํ ํฐ ๊ฐฑ์ ํ ์ฌ์์ฒญ
const response = await axios.request(error.config);
return response;
}
return Promise.reject(error);
}
);
๐๐ป ์ ์ฉ ํ ์ ์ฒด ์ฝ๋
axios_interceptor.js
import URL from './server_url.js';
import { getToken, isTokenExpired, tokenRefresh } from './token.js';
const instance = axios.create({
baseURL: URL,
timeout: 1000,
});
instance.interceptors.request.use(
(config) => {
const accessToken = getToken();
config.headers['Content-Type'] = 'application/json';
config.headers['Authorization'] = `Bearer ${accessToken}`;
return config;
},
(error) => {
console.log(error);
return Promise.reject(error);
}
);
instance.interceptors.response.use(
(response) => {
if (response.status === 404) {
console.log('404 ํ์ด์ง๋ก ๋์ด๊ฐ์ผ ํจ!');
}
return response;
},
async (error) => {
if (error.response?.status === 401) {
if (isTokenExpired()) await tokenRefresh();
const accessToken = getToken();
error.config.headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${accessToken}`,
};
const response = await axios.request(error.config);
return response;
}
return Promise.reject(error);
}
);
export default instance;
์๋ฒ์ ํ ํฐ ์ธ์ฆ์ ํ์๋ก ํ๋ API ์์ฒญ์ ํ๋ ์์(๊ธฐ์กด ์ฝ๋ -> ์ ์ฉ ํ ์ฝ๋)
import instance from '../../modules/axios_interceptor.js';
// ๊ธฐ์กด ์ฝ๋
// async function getUser() {
// try {
// const response = await axios.get(`${URL}/api/user`, {
// headers: {
// 'Content-Type': 'application/json',
// Authorization: `Bearer ${accessToken}`,
// },
// });
// console.log(response);
// } catch (error) {
// console.log(error);
// }
// }
// ์ ์ฉ ํ ์ฝ๋
async function getUser() {
try {
// ์์์ ์ง์ ํ baseURL ๋ค์ ๋ค์ URL์ด ๋ถ๋๋ค.
const response = await instance.get('/api/user');
console.log(response);
} catch (error) {
console.log(error);
}
}
๐ ์ฐธ๊ณ ํ ์ฌ์ดํธ
'Frontend > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ๋ฌดํ ์คํฌ๋กค ๊ตฌํํ๊ธฐ(Intersection Observer API) (0) | 2023.05.19 |
---|---|
[JavaScript] ์ ๊ท ํํ์ ์์ ๋์ ์ผ๋ก ๋ณ์๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ (1) | 2023.04.23 |
[JavaScript] ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ํ(Queue) ๊ตฌํํ๋ ๋ฐฉ๋ฒ (0) | 2023.03.21 |
[JavaScript] ํ๋ฒ์ ํ๋ ๋ฐฐ์ด ์์ฑ & ์ด๊ธฐํ (0) | 2022.09.28 |
[JavaScript] ์ค์ฝํ(Scope)๋ ๋ฌด์์ธ๊ฐ? (0) | 2022.09.05 |