개인 프로젝트나 팀 프로젝트 할 것 없이 Ajax 를 매우 많은 곳에 사용했는데 그때마다 코드를 작성하려니 contentType 같이 외우기 까다로운 부분도 있고 코드도 길어진다고 판단하여 모듈화를 하여 사용하였다.

개인적으로 post 방식으로 json 데이터를 사용하는 경우가 많아서 기본값으로 두었고, 데이터는 “json / multipart / urlencoded” 에 대한 부분만 고려했다.

코드는 짧지만 불필요한 if 문이라던지(막상 지우려니 잘 안된다..) 깔끔해 보이지 않아서 한참이나 고민했지만 결국 만족할 만큼 다듬지 못한 것 같다.

시도해본 것

  • ajax 통신 이후 결과 여부에 따라 지정한 콜백함수 호출
  • 필요한 전달인자만 입력하면 되도록

코드

'use strict';

/**
 * Vanilla JavaScript Ajax 함수 모듈화
 *
 * @param {string} url - (required) 호출 할 url
 * @param {object} data - (optional) 전송 할 데이터
 * @param {function} confirmCallback - (optional) ajax 통신 완료 후 실행 할 함수
 * @param {function} cancelCallback -  (optional) ajax 통신 실패 시 실행 할 함수
 * @param {string} method -  (optional) post / get / put ...
 * @param {string} contentType -  (optional) json / multipart / urlencoded
 *
 * @example
 * ajax('board/insert',{method: "get"})
 *
 * @author taedi <taedi90@gmail.com>
 */

function ajax(url = '',
              {
                  data = {},
                  callback = (res) => console.log(res),
                  errorCallback = (res) => console.error(res),
                  method = 'post',
                  contentType = 'json'
              } = {}) {

    if(contentType == "json") {
        contentType = "application/json; charset=utf-8";
        data = JSON.stringify(data);
    } else if (contentType == "multipart") {
        //do nothing
    } else {
        contentType = "application/x-www-form-urlencoded; charset=utf-8;";
        url = url + "?" + new URLSearchParams(Object.entries(data)).toString();
        data = null;
    }

    const xhr = new XMLHttpRequest();
    xhr.open(method, url, true);
    if(contentType != "multipart"){
        xhr.setRequestHeader('Content-Type', contentType);
    }
    xhr.send(data);

    xhr.onload = function () {
        if (xhr.status === 200 || xhr.status === 201) { // 통신 성공 시
            callback(xhr.response);
        } else { // 통신 실패 시
            errorCallback(xhr.status);
        }
    }

}