모던 자바스크립트 Deep Dive - 43. Ajax

둡둡·2024년 3월 19일

Modern Javascript Deep Dive

목록 보기
44/49

43.1. Ajax란?

  • 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고 서버가 응답한 데이터를 수신하여, 웹페이지를 동적으로 갱신하는 프로그래밍 방식
  • Web API XMLHttpRequest 객체 기반으로 동작
    • XMLHttpRequest : HTTP 비동기 통신을 위한 메서드와 프로퍼티 제공
  • Ajax 장점
    • 변경되지 않는 부분까지 포함하여 불필요하게 데이터를 통신하고 렌더링하지 않음
    • 클라이언트와 서버와의 통신을 비동기 방식으로 동작하여, 응답을 받을 때까지 블로킹 되지 않음

43.2. JSON

  • 클라이언트와 서버 간 HTTP 통신을 위한 텍스트 데이터 포맷
  • 특정 언어에 종속되지 않는 언어 독립형 데이터 포맷으로, 대부분 프로그래밍 언어에서 사용 가능

43.2.1. JSON 표기 방식

  • 객체 리터럴과 유사하게 키와 값으로 구성된 텍스트
  • 키와 문자열 값은 반드시 큰따옴표("")로 묶어야 함

43.2.2. JSON.stringify

  • JSON.stringify : 객체를 JSON 포맷의 문자열로 변환
  • 직렬화 (serializing) : 클라이언트가 서버로 객체를 전송하기 위해 문자열로 변환

43.2.3. JSON.parse

  • JSON.parse : JSON 포맷의 문자열을 객체로 변환
  • 역직렬화 (deserializing) : 서버로부터 전송된 JSON 문자열 데이터를 객체화 변환
  • 배열이 문자열로 변환되어 있는 경우 배열 객체로 변환
    • 배열의 요소가 객체인 경우 요소까지 객체로 변환

43.3. XMLHttpRequest

  • 브라우저는 HTTP 요청 통신하기 위해 Web API XMLHttpRequest 객체 기반으로 동작
    • XMLHttpRequest : HTTP 비동기 통신을 위한 메서드와 프로퍼티 제공
  • 브라우저에서 제공하는 Web API이므로 반드시 브라우저 환경에서만 실행해야 함

43.3.1. 객체 생성

  • XMLHttpRequest : 생성자 함수 호출하여 생성
  • 브라우저에서 제공하는 Web API로 브라우저 환경에서만 정상 실행

43.3.2. 프로퍼티와 메서드

프로토타입 프로퍼티

  • readyState : 요청의 현재 상태를 나타내는 정수
  • status : 요청에 대한 응답 상태를 나타내는 정수 (200, 400, 500 등)
  • statusText : 요청에 대한 응답 메시지를 나타내는 문자열
  • responseType : 응답 타입 (document, json 등)
  • response : 요청에 대한 응답 몸체 (response body)
    • responseType에 따라 다른 타입
  • responseText : 서버가 전송한 요청에 대한 응답 문자열

이벤트 핸들러 프로퍼티

  • onreadystatechange : readyState 프로퍼티 값이 변경된 경우
  • onerror : 요청에 에러가 발생한 경우
  • onload : 요청을 성공적으로 완료한 경우
  • onloadstart, onprogress, onabort

메서드

  • open : 요청 초기화
  • send : 요청 전송
  • abort : 전송된 요청 중단
  • setRequestHeader : 특정 요청 헤더 값 설정
  • getRequestHeader : 특정 요청 헤더 값 문자열 반환

정적 프로퍼티

  • UNSENT, OPENED, HEADERS_RECEIVED, LOADING
  • DONE : 서버 응답 완료

43.3.3. HTTP 요청 전송

  • HTTP 요청 전송 순서
      1. XMLHttpRequest.prototype.open 메서드로 HTTP 요청 초기화
      1. 필요한 경우 XMLHttpRequest.prototype.setRequestHeader 메서드로 헤더 값 설정
      1. XMLHttpRequest.prototype.send 메서드로 HTTP 요청 전송

XMLHttpRequest.prototype.open

  • xhr.open(method, url[, async])
    • method : HTTP 요청 메서드("GET", "POST" 등)
      • 클라이언트가 서버에게 요청의 종류와 목적을 알리는 방법
      • 5가지 요청
        1. GET : 모든/특정 리소스 취득
        2. POST : 리소스 생성
        3. PUT : 리소스 전체 교체
        4. PATCH : 리소스 일부 교체
        5. DELETE : 모든/특정 리소스 삭제
    • url : HTTP 요청 전송할 URL
    • async : 비동기 요청 여부, 기본 값 true = 비동기 방식

XMLHttpRequest.prototype.send

-open 메서드로 초기화된 HTTP 요청을 서버에 전송

  • GET : 쿼리 문자열로 데이터 전송
    • 요청 메서드가 GET인 경우 페이로드는 무시되고 요청 몸체가 null로 설정됨
  • POST : 요청 몸체(request body)에 담아 데이터(payload) 전송
    • 페이로드가 객체인 경우 JSON.stringify로 직렬화하여 전달해야 함

XMLHttpRequest.prototype.setRequestHeader

  • 특정 HTTP 요청의 헤더 값 설정
  • open 메서드 호출 이후에 호출해야 함
    • Content-type : 전송할 데이터의 MIME 타입 정보 표현
      • ex) xhr.setRequestHeader('content-type', 'application/json');
    • Accept : 서버로부터 응답받을 데이터의 MIME 타입 지정
      • 설정하지 않으면 */* 로 전송됨
      • ex) xhr.setRequestHeader('accept-type', 'application/json');

43.3.4. HTTP 응답 처리

  • readyState 프로퍼티와 readystatechange 이벤트 사용하여 HTTP 응답 처리
    • readystatechange 메서드를 통해 HTTP 요청의 현재 상태 확인
      • onload 로도 사용 가능
    • 현재 상태를 나타내는 프로퍼티(readyState)가 변경될 때마다 이벤트 발생
// 1. XMLHttpRequest 객체 생성
const xhr = new XMLHttpRequest();

// 2. HTTP 요청 초기화
xhr.open('GET', 'https://...');

// 3. HTTP 요청 전송
xhr.send();

// 4. readyState 프로퍼티 변경될 때마다 이벤트 발생
xhr.onreadystatechange = () => {
  // 서버 응답이 완료되지 않은 경우 리턴
  if (xhr.readyState !== XMLHttpRequest.DONE) return;
  
  if (xhr.status === 200) {
    // 서버 응답이 정상적으로 완료된 상태
    console.log(JSON.parse(xhr.response));
  } else {
    // 서버 응답이 에러가 발생한 상태
    console.log('Error', xhr.status, xhr.statusText);
  }
};

[출처] 모던 자바스크립트, Deep Dive

profile
괴발개발라이프

0개의 댓글