Search

40장 Ajax

대분류
언어
서적
소분류
JS DeepDive
주요 레퍼런스
https://velog.io/@hustle-dev/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive-4144%EC%9E%A5#42%EC%9E%A5---%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
태그
Ajax
JSON
XMLHttpRequest
최종 편집 일시
2024/10/27 15:38
생성 일시
2024/02/08 00:20
13 more properties

Ajax란?

JS를 사용해서 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고, 서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 프로그래밍 방식
Web Api인 XMLHttpRequest 객체를 기반으로 동작하며 이 객체는 HTTP 비동기 통신을 위한 메서드와 프로퍼티를 제공
Ajax 통신의 장점
필요한 데이터만 서버로부터 전송 받아서 효율적
변경할 필요가 없는 부분 재 랜더링X -> 순간적으로 깜박이는 현상 없음
클라이언트와 서버의 통신이 비동기적으로 동작하여 요청을 보낸 후에 블로킹 발생 X

JSON

JSON은 클라이언트와 서버 간의 HTTP 통신을 위한 텍스트 데이터 포맷

JSON의 표기 방식

JS의 객체 리터럴과 유사하게 키와 값으로 구성된 순수한 텍스트
키는 무조건 큰 따옴표로 묶고, 값 중에서 문자열은 반드시 큰 따옴표로 묶어야함.
{ "name": "식빵", "family": "웰시코기", "age": 1, "weight": 2.14 }
JSON
복사

JSON.stringify

객체를 JSON 포맷의 문자열로 변환
직렬화 : 클라이언트가 서버로 객체를 전송하려고 할 때 객체를 문자열화 시키는 것
JSON.stringify(value[, replacer[, space]])
value
JSON 문자열로 변환할 값.
replacer - Optional
문자열화 동작 방식을 변경하는 함수, 이 값이 null 이거나 제공되지 않으면, 객체의 모든 속성들이 JSON 문자열 결과에 포함된다.
space - Optional
가독성을 목적으로 JSON 문자열 출력에 공백을 삽입하는데 사용되는 String 또는 Number 객체. 이것이 Number 라면, 공백으로 사용되는 스페이스(space)의 수를 나타낸다; 이 수가 10 보다 크면 10 으로 제한된다. 1 보다 작은 값은 스페이스가 사용되지 않는 것을 나타낸다. 이것이 String 이라면, 그 문자열(만약 길이가 10 보다 길다면, 첫번째 10 개의 문자)이 공백으로 사용된다. 이 매개 변수가 제공되지 않는다면(또는 null 이면), 공백이 사용되지 않는다.

JSON.parse

JSON 포맷의 문자열을 객체로 변환
서버로부터 받은 JSON 데이터를 객체로 사용하려면 JSON문자열을 객체화 하여 사용
JSON.parse(text[, reviver])
text
JSON으로 변환할 문자열.
reviver - Optional
함수라면, 변환 결과를 반환하기 전에 이 인수에 전달해 변형함.

깊은 복사

JSON.parse(JSON.stringify(객체))

XMLHtppRequest

JS를 사용하여 HTTP 요청을 전송하려면 XMLHttpRequest 객체를 사용
이 객체는 HTTP 요청 전송 및 응답 수신을 위한 다양한 메서드와 프로퍼티를 제공

XMLHttpRequest 객체 생성

Web API 이므로 브라우저 환경에서만 정상적으로 실행
const xhr = new XMLHttpRequest();
Plain Text
복사

XMLHttpRequest 객체의 프로퍼티와 메서드

XMLHttpRequest 객체의 프로토타입 프로퍼티
프로토타입 프로퍼티
설명
readyState
HTTP 요청의 현재 상태를 나타내는 정수. (UNSENT: 0, OPENED: 1, HEADERS_RECEIVED: 2, LOADING: 3, DONE: 4)
status
HTTP 요청에 대한 응답 상태를 나타내는 정수
statusText
HTTP 요청에 대한 응답 메시지를 나타내는 문자열
responseType
HTTP 응답 타입
response
HTTP 요청에 대한 응답 몸체. responseType에 따라 타입이 다름
XMLHttpRequest 객체의 이벤트 핸들러 프로퍼티
이벤트 핸들러 프로퍼티
설명
onreadystatechange
readyState 프로퍼티 값이 변경된 경우
onerror
HTTP 요청에 에러가 발생한 경우
onload
HTTP 요청이 성공적으로 완료한 경우
XMLHttpRequest 객체의 메서드
메서드
설명
open
HTTP 요청 초기화
send
HTTP 요청 전송
abort
이미 전송된 HTTP 요청 중단
setRequestHeader
특정 HTTP 요청 헤더의 값을 설정
XMLHttpRequest 객체의 정적 프로퍼티
정적 프로퍼티
설명
DONE
4
서버 응답 완료

HTTP 요청 전송

1.
open 메서드로 HTTP 요청 초기화
2.
setRequestHeader 메서드로 특정 HTTP 요청의 헤더 값 설정
3.
send 메서드로 HTTP 요청 전송
const xhr = new XMLHttpRequest(); xhr.open('GET', '/users'); xhr.setRequestHeader('content-type', 'application/json'); xhr.send();
JavaScript
복사
XMLHttpRequest.prototype.open
-> 서버에 전송할 HTTP 요청 초기화
xhr.open(method, url[, async])
method --> GET/POST/PUT/DELETE (HTTP 요청 메서드)
url --> HTTP 요청을 전송할 URL
async --> 비동기 요청 여부, 옵션은 기본값은 true
HTTP 요청 메서드는 클라이언트가 서버에게 요청의 종류와 목적을 알리는 방법
HTTP 요청 메서드
종류
목적
페이로드
GET
index/retrieve
모든/특정 리소스 취득
X
POST
create
리소스 생성
O
PUT
replace
리소스의 전체 교체
O
PATCH
modify
리소스의 일부 수정
O
DELETE
delete
모든/특정 리소스 삭제
X
XMLHttpRequest.prototype.send
send 메서드는 open 메서드로 초기화된 HTTP 요청을 서버에 전송한다.
GET 요청 메서드의 경우 데이터를 URL의 일부분인 쿼리 문자열로 서버에 전송한다.
POST 요청 메서드의 경우 데이터(페이로드)를 요청 몸체에 담아 전송한다.
페이로드가 객체인 경우 반드시 JSON.stringify 메서드를 사용하여 직렬화한 다음 전달!
HTTP 요청 메서드가 GET 인 경우 send 메서드에 페이로드로 전달한 인수는 무시되고 요청 몸체는 null로 설정
XMLHttpRequest.prototype.setReuqestHeader
특정 HTTP 요청의 헤더 값을 설정
Content-type은 요청 몸체에 담아 전송할 데이터의 MIME 타입의 정보를 표현
자주 사용 되는 MIME(식별) 타입
MIME 타입
서브타입
text
text/plain, text/html, text/css, text,javascript
application
application/json, application/x-www-form-urlencode
multipart
multipart/formed-data
HTTP 클라이언트가 서버에 요청할 때 서버가 응답할 데이터의 MIME 타입을 accept로 지정 가능
만약 설정되지 않으면 send 메서드 호출 시 */* 로 설정

HTTP 응답 처리

readystatechange 이벤트 활용
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <script> const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1'); xhr.send(); xhr.onreadystatechange = () => { if (xhr.readyState !== XMLHttpRequest.DONE) return; if (xhr.status === 200) { console.log(JSON.parse(xhr.response)); } else { console.error('Error', xhr.status, xhr.statusText); } }; </script> </body> </html>
HTML
복사
예제 실행 결과 아래와 같은 상태를 확인할 수 있음
load 이벤트 사용시 HTTP 요청이 성공적으로 완료된 경우 발생하므로 xhr.readyState가 XMLHttpRequest.DONE인지 확인할 필요 X