FrontEnd

Axios에서 Config 객체를 활용한 적절한 HTTP 요청 방법

재성스 2025. 2. 5. 15:06
반응형

Axios에서는 요청을 보낼 때 config 객체를 활용하여 URL, HTTP 메서드, 헤더, 파라미터 등을 설정할 수 있다.

1. GET 요청 - @RequestParam 및 @PathVariable 사용

GET 요청은 데이터를 가져오는 용도로 사용되며, 본문(RequestBody)을 포함할 수 없다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @RequestParam: 쿼리 파라미터를 받아서 처리 (ex: ?name=Alice&role=admin)
  • @PathVariable: URL 경로의 변수를 받아서 처리 (ex: /users/1)
  • @RequestBody 사용 불가: GET 요청은 본문을 가지지 않기 때문
import interceptor from '@/service/plugins/interceptors.js';

const axiosConfig = {
    url: '/api/v1/users',
    method: 'get'
};

export default {
    /**
     * 특정 사용자의 정보를 조회하는 요청
     * @param {number} userId 조회할 사용자 ID
     * @returns {Promise}
     */
    getUserById(userId) {
        const config = {
            url: `${axiosConfig.url}/${userId}`, // PathVariable 사용
            method: 'get',
        };
        return interceptor(config);
    },

    /**
     * 사용자 목록을 검색하는 요청
     * @param {object} params 검색 조건 (예: { name: 'Alice', role: 'admin' })
     * @returns {Promise}
     */
    getUsers(params) {
        const config = {
            url: axiosConfig.url,
            method: 'get',
            params: params, // Query Parameter 전달
        };
        return interceptor(config);
    }
};

 

2. POST 요청 - @RequestBody 사용

POST 요청은 새로운 데이터를 생성하는 용도로 사용되며, 본문에 JSON 데이터를 포함할 수 있다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @RequestBody: 요청 본문을 JSON 형식으로 받아서 처리
  • @RequestParam 및 @PathVariable 사용 가능하며, 보조적인 데이터 전달 용도로 유용할 수 있음
export default {
    /**
     * 새로운 사용자 정보를 등록하는 요청
     * @param {object} user 사용자 정보 (예: { name: 'Alice', role: 'admin' })
     * @returns {Promise}
     */
    createUser(user) {
        const config = {
            url: axiosConfig.url,
            method: 'post',
            data: user, // JSON 형식으로 RequestBody 전달
            headers: {
                'Content-Type': 'application/json'
            }
        };
        return interceptor(config);
    }
};

 

3. PUT 요청 - 데이터 업데이트

PUT 요청은 기존 데이터를 수정하는 용도로 사용되며, 일반적으로 본문(RequestBody)에 수정할 데이터를 포함한다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @RequestBody: 수정할 데이터를 본문에 포함
  • @PathVariable: 수정할 데이터의 식별자를 URL에서 받음 (ex: /users/{id})
  • @RequestParam 사용 가능하지만 일반적이지 않음 (보조 데이터 전달용)
export default {
    /**
     * 사용자 정보를 업데이트하는 요청
     * @param {number} userId 업데이트할 사용자 ID
     * @param {object} updatedData 변경할 데이터
     * @returns {Promise}
     */
    updateUser(userId, updatedData) {
        const config = {
            url: `${axiosConfig.url}/${userId}`,
            method: 'put',
            data: updatedData, // 수정할 데이터 전달
            headers: {
                'Content-Type': 'application/json'
            }
        };
        return interceptor(config);
    }
};

4. DELETE 요청 - 데이터 삭제

DELETE 요청은 데이터를 삭제하는 용도로 사용되며, 일반적으로 본문을 포함하지 않는다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @PathVariable: 삭제할 대상의 ID를 URL에서 받음 (ex: /users/{id})
  • @RequestBody 사용 불가: DELETE 요청은 일반적으로 본문을 가지지 않지만, 일부 API에서는 본문 데이터를 허용할 수도 있음
  • @RequestParam 사용 가능하지만 잘 사용되지 않음 (삭제 대상이 여러 개인 경우 사용할 수 있음)
export default {
    /**
     * 특정 사용자를 삭제하는 요청
     * @param {number} userId 삭제할 사용자 ID
     * @returns {Promise}
     */
    deleteUser(userId) {
        const config = {
            url: `${axiosConfig.url}/${userId}`,
            method: 'delete'
        };
        return interceptor(config);
    },
    
        /**
     * 여러 사용자 삭제 요청
     * @param {number[]} userIds 삭제할 사용자 ID 목록
     * @returns {Promise}
     */
    deleteUsers(userIds) {
        const config = {
            url: `/api/v1/users`,
            method: 'delete',
            params: { ids: userIds }, // Query Parameter로 전달
            headers: {
                'Content-Type': 'application/json'
            }
        };
        return interceptor(config);
    },
    
        /**
     * 특정 사용자를 삭제하는 요청 (본문 포함)
     * @param {number} userId 삭제할 사용자 ID
     * @param {object} data 추가 데이터 (예: { reason: "User requested deletion" })
     * @returns {Promise}
     */
    deleteUser(userId, data) {
        const config = {
            url: `/api/v1/users/${userId}`,
            method: 'delete',
            data: data, // 본문 포함
            headers: {
                'Content-Type': 'application/json'
            }
        };
        return interceptor(config);
    }
};

 

 

5. @RequestHeader를 포함한 요청

특정 요청에서 인증 토큰이나 사용자 정보를 헤더에 포함해야 할 때 사용한다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @RequestHeader: 요청 헤더에서 특정 값을 가져올 때 사용
export default {
    /**
     * 인증 토큰을 포함하여 사용자 정보를 조회하는 요청
     * @param {number} userId 사용자 ID
     * @param {string} token 인증 토큰
     * @returns {Promise}
     */
    getUserWithAuth(userId, token) {
        const config = {
            url: `${axiosConfig.url}/${userId}`,
            method: 'get',
            headers: {
                Authorization: `Bearer ${token}`
            }
        };
        return interceptor(config);
    }
};

 

6. 파일 업로드 - @RequestPart 사용

파일 업로드 요청은 multipart/form-data 형식을 사용해야 한다.

Spring Boot에서 사용할 수 있는 어노테이션:

  • @RequestPart: Multipart 요청에서 특정 파일을 처리할 때 사용하며, JSON 데이터와 함께 multipart 요청을 처리할 수도 있음
export default {
    /**
     * 파일 업로드 요청
     * @param {File} file 업로드할 파일 객체
     * @returns {Promise}
     */
    uploadFile(file) {
        const formData = new FormData();
        formData.append('file', file);

        const config = {
            url: `${axiosConfig.url}/upload`,
            method: 'post',
            data: formData,
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        };
        return interceptor(config);
    }
};

 

7. 파일 다운로드 - HttpServletResponse 활용

파일 다운로드 요청은 responseType: 'blob'으로 설정해야 한다.

export default {
    /**
     * 파일 다운로드 요청
     * @returns {Promise}
     */
    downloadFile() {
        const config = {
            url: `${axiosConfig.url}/download`,
            method: 'get',
            responseType: 'blob' // 바이너리 데이터로 받기
        };

        return interceptor(config).then(response => {
            const url = window.URL.createObjectURL(new Blob([response.data]));
            const link = document.createElement('a');
            link.href = url;
            link.setAttribute('download', 'file.pdf'); // 파일 이름 설정
            document.body.appendChild(link);
            link.click();
        });
    }
};

 

정리

요청 유형 Axios 설정 방법
@RequestParam (쿼리 파라미터) params: { key: value }
@PathVariable (경로 변수) url: \/api/{id}``
@RequestBody (JSON 본문) data: { key: value }
@RequestHeader (헤더 데이터) headers: { 'Authorization': 'Bearer token' }
@RequestPart (파일 업로드) data: FormData, headers: { 'Content-Type': 'multipart/form-data' }
HttpServletResponse (파일 다운로드) responseType: 'blob'

 

 

반응형