β οΈ μ 리ν λ΄μ©μ μ€νλ μλͺ»λ μ λ³΄κ° μμ μ μμ΅λλ€. λκΈλ‘ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
APIλ₯Ό μ¬κΈ°μ κΈ°μ μΌμ ν νμ μμ΄ λΆλ¬μ€κ³ μ¬μ¬μ©μ±μ΄ λ§μ΄ λΆμ‘±νλ μ½λλ₯Ό λ§μ΄ μμ±νμμ΅λλ€. λν μ€μ μ¬μ©νλ νμΌμμ λ§μ λ‘μ§μ ꡬννλ€λ³΄λ μ½λμ κ°λ μ±μ ν΄μΉλ κ² κ°μμ λͺ¨λνλ₯Ό μ§νν νμ νλ‘μ νΈλ₯Ό μμνλ©΄ μ’μ κ² κ°μμ APIλ₯Ό λͺ¨λν ν΄λ³΄μμ΅λλ€!
리ν©ν λ§_API λͺ¨λ λΆλ¦¬ λΈλ‘κ·Έλ₯Ό μ°Έκ³ νμμ΅λλ€.
π¦ apis
β£ π api(api μμ²/μλ΅ μ½λλ§ μμ±)
β β πuser.js
β£ π services(λ°μ΄ν°λ₯Ό μ μ ν΄μ£Όλ ν¨μ λͺ¨μ)
β β πuser.js
β£ π utils(μΈμ€ν΄μ€/κ³΅ν΅ ν¨μ μμ±)
β β πinstance.js
β π index.js(λͺ¨λ export)
.create(config)
λ©μλλ₯Ό μ΄μ©ν΄μ μ¬μ©μ μ μ ꡬμ±μ μ¬μ©νλ axios μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
const instance = axios.create({
baseURL: 'https://some-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
μΈμ€ν΄μ€λ₯Ό λ§λ€κΈ° μν΄μ create
μμ λ£μ configλ₯Ό μ§μ ν΄μ£Όμμ΅λλ€. μ¬κΈ°μ autorizationμ ν ν°κ°μ λ£κΈ° μν΄ μΈμ€ν΄μ€λ₯Ό baseInstance
μ authInstance
λ‘ λΆλ¦¬νμ¬ μμ
νμμ΅λλ€.
import axios from 'axios'
import { getItem } from '@utils/storage'
const baseAPI = (url, options) => {
return axios.create({ baseURL: url, ...options })
}
const authAPI = (url, options) => {
const token = getItem('jwt_token')
return axios.create({
baseURL: url,
headers: {
Authorization: `bearer ${token}`,
},
...options,
})
}
export const baseInstance = baseAPI(REACT_APP_BASE_URL)
export const authInstance = authAPI(REACT_APP_BASE_URL)
κΈ°λ³Έ apiλ baseInstance
λ₯Ό μ¬μ©νκ³ μΈμ¦μ΄ νμν apiλ authInstance
λ₯Ό μ¬μ©ν΄μ ꡬννμμ΅λλ€.
// login ꡬν
import { baseInstance, authInstance } from '../utils/instance'
const login = async (userInfo) => {
try {
const { data } = await baseInstance.post(`/login`, userInfo)
return data
} catch (error) {
console.error(error)
}
}
api μμ² μ λ°μμ¨ λͺ¨λ λ°μ΄ν°μμ νμν λ°μ΄ν°λ§ λ°λ‘ μ¬μ©νκΈ° μν΄μ μ μ©μμΌ°μ΅λλ€. μ¬μ©νμ§ μλ λ°μ΄ν°λ€μ νν°λ§ν΄μ μ¬μ©ν μ μμ΅λλ€.
// κ°λ¨νκ² λ³΄μ¬μ£ΌκΈ° μν΄μ μμ±ν΄λ³΄μμ΅λλ€.
const getCleanUserInfo = (rawUserInfo) => {
const { email, userName, notifications } = rawUserInfo.user
return {
email,
name: userName,
notifications: notifications.length > 0 ? notifications : null,
}
}
export { getCleanUserInfo }
μ¬μ©νλ λ°©λ²μ μ€μ λ‘ μ¬μ©νλ μλΉμ€λ§λ€ λ€λ₯΄κ² μ μ©λ κ² κ°μ΅λλ€. μ λ μλμ²λΌ ꡬννμμ΅λλ€.
const [userInfo, setUserInfo] = useState({})
const login = async () => {
const rawUserData = await login(userInfo)
const userData = await getCleanUserInfo(rawUserData)
setUserInfo(userData)
}
axios interceptorλ₯Ό λ°μνμ§ λͺ»νλ μ μ΄ μμ½μ΅λλ€. λͺ¨λ apiμμ try, catchλ¬Έμ μ¬μ©ν΄μΌνκ³ μλ¬ μ²λ¦¬λ₯Ό λν μΌνκ² μ²λ¦¬νμΌλ©΄ μ’μμ κ² κ°μ΅λλ€! 리ν©ν λ§ ν λ κΌ axios μΈν°μ ν°λ₯Ό μ¬μ©ν΄μ μ μ©ν΄λ³΄λ €κ³ ν©λλ€.
axios μΈμ€ν΄μ€λΌλ κ²μ μ²μ μμμ΅λλ€. νμ€ν μ μ©νκ³ λμ μ¬μ¬μ©μ±μ΄ μμ² νμ₯λμλ€κ³ λκΌμ΅λλ€. μ΄λμ λ€λ€ λͺ¨λνλ₯Ό νκ³ μ¬μ¬μ©μ±μ κ³ λ―Όνλ ꡬλ κΉ¨λ¬μμ΅λλ€.
μ΄ λΏλ§ μλλΌ λ€λ₯Έ μ»΄ν¬λνΈμμλ κ³μ μ¬μ¬μ©μ κ³ λ―Όνκ² λκ³ μ΄λ»κ² λͺ¨λ λΆλ¦¬λ₯Ό ν μ§ μκ°νκ² λλ κ² κ°μ΅λλ€!! μ½λλ₯Ό μμ±νλ κ²μ λ§μ μκ°μ νκ² λλ©΄μ μ’μ μͺ½μΌλ‘ λ°μ νκ³ μλ€κ³ λκ»΄μ§λλ€!!
μ§κΈκΉμ§ νλ‘μ νΈ κΈ°κ°μ΄ μ λ°μ λ μ§λ¬λλ° λ무λ무 μ λ°λΌμμ£Όκ³ μλ νμλ€κ» λ무 κ°μ¬νλ€κ³ λ§μλλ¦¬κ³ μΆμ΄μ! 첫 νμ₯μ΄μ΄μ λ§μ λΆλ΄μ΄ μμλλ° νμ μλ‘, μμ, μΉμ°¬μ ν΄μ£Όμ μ λ μμΌλ‘ λμκ°κ³ μλ κ² κ°μ΅λλ€! 1μ£ΌμΌμ΄λΌλ μκ°λμ μ λ§ λ§μ΄ λ°°μ°κ³ μμ΅λλ€. κ°μ¬ν©λλ€.
μ¬μ©μ μ 보λ₯Ό contextμμ κ°μ Έμ μμ μ ν λ apiμμ ν ν°μΌλ‘ μ¬μ©μ μ 보 μμ²μ νλ©΄ κ³μ κ·Έ μ μ μ μνλ μ¬μ©μμ μ 보λ₯Ό κ°μ Έμ€λ μ΄μκ° λ°μνμμ΅λλ€.
μμ²μ ν λλ§λ€ μ μ μ μ ν ν°μ κ°μ Έμμ μΈμ¦ μμ²μ ν νμ μ μ λ₯Ό μ μμ μ μ₯νκ³ μ 보λ₯Ό κ°μ Έμμ μ¬μ©νλ€κ³ μκ°νμκΈ° λλ¬Έμ λλ¬΄μ§ μ΄ν΄κ° κ°μ§ μμμ΅λλ€. λ°λΌμ contextλΆν°, λ λλ§ μ /νλ‘ λͺ¨λ λλ²κΉ μ ν΄λ³΄μμ§λ§ μ΄ λ‘μ§ μμμλ μμΈμ μ°Ύμ μ μμμ΅λλ€.
κ²°κ΅, apiκΉμ§ λλ²κΉ μ λλ €λ³Έ νμ μμΈμ λ°κ²¬νμμ΅λλ€.
μμ authAPI
λ₯Ό λ€μ μ΄ν΄λ³΄κ² μ΅λλ€.
const authAPI = (url, options) => {
const token = getItem('jwt_token')
return axios.create({
baseURL: url,
headers: {
Authorization: `bearer ${token}`,
},
...options,
})
}
μ΄ λ‘μ§μμ μΉλͺ μ μΈ λ¨μ μ΄ μ‘΄μ¬ν©λλ€..γ γ κ·Έκ²μ ν ν°μ μΈμ€ν΄μ€λ₯Ό λ§λλ μμ μ κ°μ Έμ¨λ€λ κ²μ λλ€.
λ°λΌμ μΈμ€ν΄μ€κ° λ§λ€μ΄μ§ λμλ μμ§ μ¬μ©μ μΈμ¦ μμ²μ νμ§ μμκΈ° λλ¬Έμ μ΄λ° μν©μ΄ λ§λ€μ΄μ‘μ΅λλ€. μ λ μ΄ μν©μ ν΄κ²°νκΈ° μν΄μ κ²°κ΅ μμ μμ¬μ΄ μ μ μ μλ λΆλΆμ μ¬κΈ°μ μ μ©νμμ΅λλ€.
κΈ°λ³Έ urlλ‘ μ°μ μΈμ€ν΄μ€λ₯Ό λ§λ€μμ΅λλ€.
const authAPI = (url, options) => {
const instance = axios.create({ baseURL: url, ...options })
interceptors(instance)
return instance
}
μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ interceptorμ instanceλ₯Ό μ λ¬μμΌ°μ΅λλ€. κ·Έ νμ μλμκ°μ΄ ν ν°μ APλ₯Ό μμ² ν λ localstorageμμ κ°μ Έμ μ μ©μν¬ μ μλλ‘ κ΅¬ννμμ΅λλ€.
import { getItem } from '@utils/storage'
export const interceptors = (instance) => {
instance.interceptors.request.use(
(config) => {
const token = getItem('jwt_token')
config.headers = {
authorization: token ? `bearer ${token}` : null,
}
return config
},
(error) => Promise.reject(error.response)
)
return instance
}
μλ¬ μ²λ¦¬λ₯Ό νλ μΈν°μ
ν°λ μλμ§λ§ μ€κ°μ μμ²μ κ°λ‘μ±μ μ²λ¦¬νλ λ°©λ²μ μ μ©μμΌ°μ΅λλ€.
μ΄λ κ² ν° μ΄μλ₯Ό λ§λ¬κ³ λλ²κΉ
μ νλ λ°©λ²λ λ°°μ°λ κ²½νμ΄ λμμ΅λλ€. μ΄ μλ¬λ§ λ¬΄λ € ν루λ₯Ό λκ² ν€λ§€μ μ§μ§ νλ€μμ§λ§ ν΄κ²° νμλ μ λ§ λΏλ―νμμ΅λλ€.
μλ¬ μ²λ¦¬λ₯Ό μΈν°μ
ν°λ‘ μ μ©ν κ²μ μλμμ§λ§ μ΄λ κ²λΌλ μ¬μ©νκ² λμ΄ μ’μ κ²½νμ΄ λμμ΅λλ€.
리ν°ν λ§_API λͺ¨λ λΆλ¦¬
Axios μΈμ€ν΄μ€
νλ‘κ·Έλλ¨Έμ€ λ°λΈμ½μ€
νΉμ μλ¬μ λν λ°μ΄ν° μ μ λ μ΄λ»κ² νμ ¨λμ?