🙄Ajax가 뭐에요?
Ajax(Asynchronous Javascript and XML)은 비동기 프로그래밍 방식 중 하나입니다.
자바스크립트를 이용해 브라우저가 서버에게 비동기 방식으로 데이터를 요청하고
서버가 응답한 데이터를 수신하여 웹페이지를 동적으로 갱신하는 형태로 이루어집니다.
이런 Ajax는 브라우저에서 제공하는 WEB API인 XMLHttpRequest 객체를 기반으로 동작합니다.
XML객체는 HTTP 비동기 통신을 위한 다양한 프로퍼티와 메서드를 제공해요
이전의 웹페이지는 화면이 바뀌면 변경할 필요가 없는 부분까지 전부 포함된 HTML을 전송받고
새로 페이지를 그려나가기 때문에 비효율적이었습니다.
또한 동기 방식으로 동작했기 때문에 서버의 응답이 오기 전까지 블로킹이 발생하는 문제가 있었습니다.
따라서 Ajax를 통해 불필요한 데이터 통신이 발생하지 않고 렌더링이 필요없는 부분은 하지않으며
블로킹도 발생하지 않는 웹을 만들수가 있는거네요!
🙄 JSON?
JSON(Javascript Object Notation)은 클라이언트와 서버간의 HTTP 통신을 위한 텍스트 데이터 포맷입니다.
자바스크립트가 이름에는 들어가있지만 자바스크립트에 종속되지는 않는 언어 독립형 데이터 포맷으로
다른 프로그래밍 언어에서도 사용할 수 있습니다.
JSON은 객체 리터럴과 비슷하게 키와 값으로 구성되어 있고
JSON의 키는 항상 큰따옴표 ""로 묶어줘야합니다. 밸류의 문자열도 마찬가지로 큰따옴표만 가능합니다.
JSON.stringfy 메서드
객체를 JSON 포맷의 문자열로 변환해주는 메서드입니다.
클라이언트에서 서버로 객체를 전송할때 사용하며
객체를 문자열화하는 직렬화를 해주는 메서드입니다.
const json = JSON.stringfy(object) // 인자로는 자바스크립트의 값, 객체를 넣을수있습니다. //MDN에 나와있는 문법 JSON.stringify(value[, replacer[, space]])
매개변수로는 value, replacer, space를 넣어줄 수 있습니다.
replacer 자리에는 문자열화 동작 방식을 결정하는 함수 혹은 제외하고 싶은 값을 넣을 수 있고
null을 입력해주거나 또는 값을 따로 입력해주지 않으면 모든 값이 JSON화 됩니다.
space 자리에는 string, number 타입이 들어갈 수 있고 공백으로 사용되는 스페이스 수를 나타냅니다.
배열 또한 JSON 화 시킬 수 있습니다.
이렇게 클라이언트에서 stringfy 해서 서버로 전송한 JSON은
JSON.parse라는 메서드를 이용해서 다시 객체로 변환해줍니다.
이렇게 JSON 포맷의 문자열을 객체로 다시 변환하는 것을 역직렬화라고 합니다.
🙄 XMLHttpRequest?
XMLHttpRequest 는 XMLHttpRequest 생성자 함수를 호출하는 것으로 생성할 수 있습니다.
하지만 Node.js환경에서는 실행할 수 없습니다.
let xml = new XMLHttpRequest()
XMLHttpRequest의 프로퍼티와 메서드를 이용해 HTTP 요청을 수행할 수 있습니다.
1. XML의 .open 메서드로 HTTP 요청을 초기화
2. 필요 시 setRequestHeaeder 메서드로 특정 HTTP 요청의 헤더값을 설정해줌
3. send 메서드로 HTTP 요청 전송
// xml 객체 만들기 const xhr = new XMLHttpRequest() // HTTP 요청 초기화 xhr.open('GET' , '/users') //http 요청 헤더 설정 (생략가능) // 클라이언트가 서버로 전송할 데이터의 MIME 타입 지정 xhr.setRequestHeader('content-type','application/json') //http 요청 전송 xhr.send()
open 메서드는 다음과 같은 양식을 가집니다.
xhr.open(method, url[, async])
ㅇㄴㅁ
http 요청 메서드(GET , POST , PUT , DELETE) 등을 첫번째 인자로 넣어주고
HTTP 요청을 전송할 URL과 비동기 요청 여부를 넣어주면 끝입니다.
async는 값을 입력하지 않을 경우 true 로 설정되어 비동기 방식으로 동작합니다.
HTTP 요청 메서드란 다음과 같이 주어진 리소스에 수행하길 원하는 행동을 나타냅니다.
이걸 활용해서 CRUD를 구현할 수 있겠네요 근데 put 자리에 있는 payload는 뭐임?
위키피디아의 설명에 따르면 이렇습니다.
페이로드는 사용에 있어서 전송되는 데이터를 뜻한다. 페이로드는 전송의 근본적인 목적이 되는 데이터의 일부분으로 그 데이터와 함께 전송되는 헤더와 메타데이터와 같은 데이터는 제외한다.
페이로드라는 용어는 큰 데이터 덩어리 중에 '흥미 있는' 데이터를 구별하는 데 사용된다.
이 용어는 운송업에서 비롯하였는데, 지급(pay)해야 하는 적화물(load)을 의미한다.
예를 들어, 유조선 트럭이 20톤의 기름을 운반한다면
트럭의 총 무게는 차체, 운전자 등의 무게 때문에 그것보다 더 될 것이다.
이 모든 무게를 운송하는데 비용이 들지만, 고객은 오직 기름의 무게만을 지급(pay)하게 된다.
그래서 'pay-load'란 말이 나온 것이다.
open을 통해 서버에 전송할 HTTP 요청을 초기화해줬으면
send 메서드는 open 메서드로 초기화된 HTTP 요청을 서버에 전송해줍니다.
이때 서버에 전송하는 데이터는 Get, Post 요청 메서드에 따라 전송 방식에 차이가 존재합니다.
ChatGPT는 이런 답변을 주네요 유용하긴한데 제가 원하는 답변은 아닌듯합니다.
GET 요청 메서드 | 데이터를 URL의 일부분인 쿼리 문자열로 서버에 전송합니다. URL의 일부분인 쿼리문자열이란 것은 우리 chrome같은 브라우저의 주소창에 get 요청한게 드러난다는 뜻 -> 보안성이슈가 생길수 있다는 뜻 또한 길이 제한이 존재합니다. |
POST 요청 메서드 | 데이터를 요청 몸체에 담아 전송합니다. |
Send 메서드?
send 메서드는 요청 몸체에 담아 전송할 데이터(페이로드)를 인수로 받습니다.
만약 페이로드가 객체라면 반드시 stringfy 메서드를 이용해 직렬화해준 형태로 전달해야겠네요!
또한 HTTP 요청 메서드가 GET인 경우에는 send 메서드에 페이로드로 전달한 인수는 무시되고
요청 몸체는 null로 설정됩니다.
🙄setRequestHeader 메서드
setRequestHeader 메서드는 특정 HTTP 요청의 헤더 값을 설정합니다.
또한 반드시 open 메서드를 호출 한 이후에 호출해야합니다.
주로 Content-type 과 Accept를 많이 사용합니다.
chatGPT의 설명은 다음과 같습니다.
헤더 정보를 설정해주고 헤더 이름과 헤더 값을 인자로 받는다
MIME 타입이라는게 생소했는데
MIME 타입이란 MDN에 따르면
클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘
이라고 합니다.
다양한 파일을 잘 전송하기 위해 텍스트파일로 변환해주는 건가보네요
🙄HTTP 응답처리
서버가 전송한 응답을 처리하기 위해서는 XMLHttpRequest 객체가 발생시키는 이벤트를 캐치해야합니다.
xml 객체는 onload, onerror 와 같은 이벤트 핸들러 프로퍼티를 가지며 이 이벤트 핸들러 프로퍼티 중에는
readyState(HTTP 요청의 현재 상태) 프로퍼티 값이 변경 된 경우 발생하는
readyStatechange 이벤트를 캐치해서 HTTP 응답을 처리할 수 있습니다.
그리고 물론 당연한 말이지만 HTTP 요청을 전송하고 응답 받으려면 서버가 필요합니다.
const xhr = new XMLHttpRequest()
//xml 객체 생성
xhr.open('GET' , "https://jsonplaceholder.typicode.com/" )
//http 요청 초기화
//링크는 fake REST API를 제공하는 서비스의 링크
xhr.send()
// HTTP 요청 전송
xhr.onreadystatechange = () => {
//readystatechange 이벤트는 readystate 프로퍼티가 변경될때마다 발생함
//만약 readystate 프로퍼티값이 4(xmlhttprequest.done)이 아니면 서버 응답이 완료되지 않은 상태인것
if(xhr.readyState !== XMLHttpRequest.DONE) return
//서버 응답이 완료되지 않았다면 return한다.
if (xhr.status === 200) {
console.log(JSON.parse(xhr.response))
}
// status 프로퍼티는 응답 상태 코드를 나타내며 200은 정상응답 200이 아니면 에러상태임
// 정상 응답일 경우 응답결과를 반환한다.
else {
console.error('Error' , xhr.status, xhr.statusText)
}
// 그 외에는 에러 콘솔을 찍어줌
}
send 메서드를 통해 HTTP 요청을 서버에 전송하면 서버는 응답을 반환합니다.
하지만 언제 응답이 클라이언트에게 올지는 모릅니다.
따라서 readystatechange 이벤트를 통해 HTTP 요청의 현재 상태를 확인해줍니다.
서버의 응답이 완료되었다면 첫번째 if에서 리턴되지않고 아래 if문으로 넘어가게됩니다.
그 뒤 if절에서는 xhr.status(HTTP 요청에 대한 응답 상태, HTTP 상태 코드)를 확인합니다
만약 이 값이 200이라면 정상적으로 응답이 도착한것이고 아니라면 에러가 발생한 것입니다.
readystatechange 이벤트 대신 load 이벤트를 캐치해도 무방합니다.
load 이벤트는 HTTP 요청이 완료된 경우에 발생하기 때문에 DONE인지 확인할 필요도 없겠네요!
반응형
'javascript' 카테고리의 다른 글
요약 정리는 못 참지 않을까요? (18) 제너레이터와 async/await (0) | 2023.01.27 |
---|---|
요약 정리는 못 참지 않을까요? (17) Rest API와 프로미스 (2) | 2023.01.20 |
요약 정리는 못 참지 않을까요? (15) 비동기 프로그래밍 (0) | 2023.01.20 |
요약 정리는 못 참지 않을까요? (14) DOM (0) | 2023.01.17 |
요약 정리는 못 참지 않을까요? (13) 브라우저의 렌더링 과정 (0) | 2023.01.17 |