danbibibi
article thumbnail

Ajax (Asynchronous JavaScript and XML)

  • 웹에서 화면을 갱신하지 않고 데이터를 서버로부터 가져와 처리하는 방법 (화면의 일부만 갱신 가능)
  • 화면 갱신이 없으므로 사용자는 편리하지만, 동적으로 DOM을 구성해야 하므로 구현이 복잡
  • 언어나 프레임워크가 아닌 구현하는 방식을 의미
  • CORS error가 발생할 수 있음


💡 일반 요청에 대한 응답

- data를 입력 후 event 발생
- Ajax를 적용하지 않은 요청은 서버에서 data를 이용하여 logic 처리
- logic 처리에 대한 결과에 따라 응답 page를 생성하고 client에 전송 (화면 전환 발생)

💡 Ajax 요청에 대한 응답
- data를 입력 후 event 발생
- Ajax를 적용하면 event 발생시 서버에서 요청을 처리한 후 Text, XML 또는 JSON으로 응답
- client(Browser)는 응답 data를 이용하여 화면 전환없이 현재 페이지에서 동적으로 화면을 재구성

💡 Ajax = 비동기 방식

웹 브라우저는 요청을 보내고 나서, 서버의 응답을 기다릴 필요 없이 다른 작업을 처리할 수 있음

💡 CORS(Cross-Origin Resource Sharing) error
:  요청 브라우저에서 다른 도메인(프로토콜, 포트번호)을 가지는 서버로 요청이 갈때 브라우저에서 발생하는 보안정책

 

Ajax 장단점

장점

  • 웹페이지 속도 향상 (필요한 부분만 리로드 하기 때문!)
  • 서버의 처리가 완료될 때 까지 기다리지 않고 처리 가능

단점

  • 히스토리 관리가 되지 않음
  • 페이지 이동없는 통신으로 인한 보안상 문제가 있을 수 있음
  • 연속으로 데이터를 요청시 서버 부하가 생길 수 있음

 

Ajax 사용 방식

XMLHttpRequest 

  • 자바스크립트가 Ajax 방식으로 통신할 때 사용하는 객체
  • ⇒ 통신 시 전송방식, 경로, 서버로 전송할 data등 전송정보를 담는 역할
  • 실제 서버와의 통신은 브라우저의 Ajax 엔진에서 수행
  • 직접 자바스크립트로 Ajax를 프로그래밍할 경우 브라우저 별로 통신방식이 달라 코드가 복잡해짐
// 1. XMLHttpRequest객체 생성
var httpRequest = new XMLHttpRequest(); 

// 2. onreadystatechange 등록
// : XMLHttpRequest 객체의 readyState 프로퍼티 값이 변할 때마다 자동으로 호출되는 함수를 설정
httpRequest.onreadystatechange = function() {
	
    // XMLXttpRequest 객체의 현재 상태와 서버 상의 문서 존재 유무를 확인
    if (httpRequest.readyState == XMLHttpRequest.DONE && httpRequest.status == 200 ) {
    
        // 서버에 요청하여 응답으로 받은 데이터를 문자열로 반환
    	console.log(httpRequest.responseText);
    }
};

// 3. GET 방식으로 요청을 보내면서 데이터를 동시에 전달
httpRequest.open("GET", "서버URL", true);
httpRequest.send();
HTTP Server는 자바를 돌릴 수 없음 ⇒ 받아서 application을 돌릴 수 있는 서버(tomcat)에 넘겨 줌
HttpRequest의 속성값

💡 readyState
 값  의미   설명
 0  Uninitialized  객체만 생성 (open 메소드 호출 전)
 1  Loading  open 메소드 호출
 2  Loaded  send 메소드 호출
( status의 헤더가 아직 도착되기 전 상태 )
 3  Interactive  데이터 일부를 받은 상태
 4  Completed  데이터를 전부 받은 상태

💡 status
 값  텍스트 (status Text)  설명
 200  OK  요청 성공
 403  Forbidden  접근 거부
 404  Not Found  페이지 없음
 500  Internal Server Error  서버 오류 발생

 

fetch() 이용

  • 실행 결과 ⇒ Promise 타입의 객체를 반환
  • 반환된 Promise 객체는 API 호출이 성공했을 경우 응답객체를 resolve하고, 실패했을 경우 예외 객체를 reject 함
  • DELETE는 GET과, PUT은 POST와 유사 (method 부분만 수정!)

 

GET METHOD

fetch('TARGET URL') // url 입력, GET메서드임
    .then(res => res.json())  //응답 결과를 json으로 파싱
    .then(data => { 
            console.log(data); //응답 결과를 console 창에 출력
              // "data.키값" 형태로 value 추출 가능 
    })
    .catch(err => { // 오류 발생시 오류를 담아서 보여줌
        console.log('Fetch Error', err);
    });

 

POST METHOD

function formData() { //POST 메서드로 전송할 데이터
    let cat = {};
    
    // key-value (키-값)의 형태로 데이터 추가함
    // formData.append('key', value);
    cat.code = document.querySelector("#code").value;
    cat.nickname = document.querySelector("#nickname").value;
    cat.price = document.querySelector("#price").value;
    cat.id = document.querySelector("#id").value;
    return cat;
}

fetch('TARGET URL', { // url 입력 및 [options] 값 설정
     method: 'post', 
     headers: { // header 
       "Content-Type": "application/json", // josn 사용 여부 설정
     },
     body: JSON.stringify(formData())  //전송할 데이터 body에 추가
    })
    .then(res => res.json()) //응답 결과를 json으로 파싱
    .then(data => {
            console.log(data); //응답 결과를 console 창에 출력
              // "data.키값" 형태로 value 추출 가능 
    })
    .catch(err => { // 오류 발생시 오류를 담아서 보여줌
        console.log('Fetch Error', err);
    });

 

Promise 객체
비동기적 처리의 성공/실패 여부와 그 결과값을 대표하는 object
응답 data를 받는 방법

response.text() : 응답을 읽고 text를 반환
response.json() : 응답을 JSON 형식으로 파싱
response.formData() : 응답을 FormData 객체 형태로 반환
response.blob() : 응답을 Blob 형태로 반환
이외에도  JQuery(외부라이브러리) 이용, axios (외부라이브러리) 이용 방법이 존재!

 

 

'WEB > front-end' 카테고리의 다른 글

JSON (JavaScript Object Notation)  (0) 2023.04.27
Event Handler  (0) 2023.04.27
DOM (Document Object Model, 문서 객체 모델)  (0) 2023.04.26
JavaScript 정리  (0) 2023.01.27
HTML 정리  (0) 2023.01.17
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로