이 프로젝트에서 axios를 사용한 API 통신을 위한 설정 가이드입니다.
src/
├── utils/
│ └── api.js # axios 기본 설정 및 API 메서드
├── services/
│ └── transactionService.js # 실제 API 연동 서비스 예시
.env # 환경변수 설정
.env.example # 환경변수 예시 파일
.env 파일에서 API URL을 설정합니다:
VITE_API_URL=http://localhost:3000/api
VITE_ENABLE_MOCK=true
VITE_DEBUG=truesrc/utils/api.js에서 axios 인스턴스가 설정되어 있습니다:
- 기본 URL: 환경변수에서 설정
- 타임아웃: 10초
- 자동 인증: localStorage의 토큰 자동 추가
- 에러 처리: 401 에러 시 자동 로그아웃
- 응답 처리: response.data 자동 반환
import { authAPI, transactionsAPI } from '@/utils/api'
// 로그인
const response = await authAPI.login({ email, password })
// 거래 내역 조회
const transactions = await transactionsAPI.getAll()
// 거래 내역 생성
const newTransaction = await transactionsAPI.create({
type: 'expense',
amount: 50000,
categoryId: 1,
description: '점심식사'
})import transactionService from '@/services/transactionService'
// 필터링된 거래 내역 조회
const transactions = await transactionService.fetchTransactions({
type: 'expense',
dateRange: { start: '2024-01-01', end: '2024-01-31' }
})// stores/transactions.js
import transactionService from '@/services/transactionService'
export const useTransactionsStore = defineStore('transactions', {
actions: {
async fetchTransactions() {
this.loading = true
try {
// Mock API 대신 실제 API 사용
if (import.meta.env.VITE_ENABLE_MOCK === 'false') {
this.transactions = await transactionService.fetchTransactions()
} else {
// 기존 Mock API 사용
this.transactions = await this.mockFetchTransactions()
}
} catch (error) {
this.error = error.message
} finally {
this.loading = false
}
}
}
})# .env
VITE_ENABLE_MOCK=false # Mock 비활성화
VITE_API_URL=https://your-api-server.com/api// 기존 Mock 코드
const transactions = await this.mockFetchTransactions()
// 실제 API 코드로 변경
const transactions = await transactionService.fetchTransactions()- 로그인 시 토큰이 localStorage에 저장됨
- 모든 API 요청에 자동으로 Authorization 헤더 추가
- 401 에러 시 자동 로그아웃 및 로그인 페이지 리다이렉트
try {
const data = await transactionsAPI.getAll()
} catch (error) {
// error.message에 표준화된 에러 메시지
console.error('API 호출 실패:', error.message)
}login(credentials)- 로그인register(userData)- 회원가입logout()- 로그아웃forgotPassword(email)- 비밀번호 찾기updateProfile(userData)- 프로필 수정
getAll(params)- 거래 내역 조회create(data)- 거래 내역 생성update(id, data)- 거래 내역 수정delete(id)- 거래 내역 삭제getCategories()- 카테고리 조회
getAll(params)- 예산 조회create(data)- 예산 생성update(id, data)- 예산 수정delete(id)- 예산 삭제
getAll()- 목표 조회create(data)- 목표 생성contribute(id, amount, description)- 목표 기여pause(id)/resume(id)- 목표 일시정지/재개
// src/utils/api.js
api.interceptors.request.use(config => {
// 요청 로깅
if (import.meta.env.VITE_DEBUG === 'true') {
console.log('API Request:', config)
}
return config
})api.interceptors.response.use(
response => response.data,
error => {
// 커스텀 에러 처리
if (error.response?.status === 403) {
// 권한 없음 처리
}
return Promise.reject(error)
}
)이제 axios가 완전히 설정되었습니다! 🎉