AJAX

  • 비동기식 자바스크립트 XML(Asynchronous Javascript And XML)의 약자이다.
  • javScript를 사용한 비동기 통신, 클라이언트와 서버 간에 XML 데이터를 주고받는 기술이다.

동기식 통신과 비동기식 통신의 차이

  • 동기식 통신
    • 일반적인 http 통신
    • 요청을 보내는 순간부터 응답이 올 때까지 새 요청을 보낼 수 없다
    • 화면 전체가 리로딩된다
    • 응답이 올 때까지 대기 상태이다
    • 요청 -> 응답 순서로만 동작한다
    • html이 주로 응답으로 온다
    • 브라우저가 요청을 주고 응답을 받는 주체가 된다

  • 비동기식 통신
    • html 페이지 전체가 아닌, 일부분만 갱신하기 위한 통신 방식
    • 컨텐츠가 화면에 표시되지 않는 구간이 존재하지 않는다
    • 응답에 상관없이 언제든 새로운 요청을 할 수 있다 (기존의 서버는 응답이 올 때까지 기다려야 했다)
    • 사용자가 동작(마우스 클릭, 이동, 값 입력 등등)하면 event가 발생한다
    • XHR(XMLHttpRequest)가 요청을 주고 응답을 받는 주체가 된다
    • xml, json, 텍스트가 주로 응답으로 온다
    • ajax는 XHR 객체를 통해 서버에 request를 한다.
      Json이나 xml 형태로 필요한 데이터만 받아 갱신하기 때문에, 웹페이지의 속도 향상되며 자원 또한 아낄 수 있다.

AJAX 예제

@WebServlet("/product/list.hta")
public class ProductListController extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List<Product> productList = List.of(new Product(100, "갤럭시", "삼성", 15000000, 1300000, true),
				new Product(200, "Iphone 13 Pro", "애플", 16000000, 1400000, true),
				new Product(300, "apple watch", "애플", 600000, 500000, false));
        
    Gson gson = new Gson();
    // 위에서 생성한 더미데이터 전달
    String jsonText = gson.toJson(productList);
    response.setContentType("application/json; charset=UTF-8");
    
    PrintWriter writer = response.getWriter():
    writer.write(jsonText);
    writer.flush();
  }
}
<div class="container">    
  <div>
    <div class="row mb-3">
      <div class="col">
        <h1>상품 리스트</h1>
      </div>
    </div>
  </div>
  <div class="row mb-2">
    <div class="col text-end">
      <button class="btn btn-primary" onclick="runAjax()">조회</button>
    </div>
  </div>
  <div class="row mb-3">
    <div class="col">
      <table class="table" id="table-products">
        <thead>
          <tr>
            <th>번호</th>
            <th>상품명</th>
            <th>제조회사</th>
            <th>가격</th>
            <th>할인가격</th>
          </tr>
        </thead>
        <tbody>
        </tbody>
      </table>
    </div>
  </div>
</div>
<script>
  // XMLHttpRequest로 웹서버와 비동기식 통신하기
  function runAjax() {
    // 1. XMLHttpRequest 객체를 생성한다
    var xhr = new XMLHttpRequest();
    
    // 2. xhr 객체의 상태가 변할 때마다 실행할 메소드를 등록한다
    xhr.onreadystatechange = function() {
      if (xhr.readyState == 4 && xhr.state == 200) {
        // 5. XMLHttpRequest의 responseText 프로퍼티에 저장된 응답데이터 가져오기
	// 서버가 보낸 텍스트 데이터는 XMLHttpRequest의 responseText 프로퍼티에 저장된다
        var jsonText = xhr.responseText;
        
        // 6. jsonText를 자바스크립트 객체/배열로 변환하기
        var products = JSON.parse(jsonText);
        
        // 7. 응답데이터로 HTML 컨텐츠 생성하기
        var htmlContent = "";
        products.forEach(item => {
          htmlContent += "<tr>";
          htmlContent += "<td>"+item.no+"</td>";
          htmlContent += "<td>"+item.name+"</td>";
          htmlContent += "<td>"+item.company+"</td>";
          htmlContent += "<td>"+item.price+"</td>";
          htmlContent += "<td>"+item.discountPrice+"</td>";
          htmlContent += "</tr>";
        });
        
        var tbody = document.querySelector("#table-products tbody");
        tbody.innerHTML = htmlContent;
      }
    };
    
    // 3. XMLHttpRequest 객체 초기화 (요청방식과 요청URL을 설정하는 것이다)
    xhr.open("GET", "/script2/product/list.hta");
    
    // 4. 웹서버로 요청 보내기
    xhr.send();
</script>

XMLHttpRequest의 readyState 프로퍼티

  • readyState 프로퍼티는 HTTP 요청의 처리 상태에 따라서 0~4까지 값이 변한다.
  • onreadystatechange는 readyState 프로퍼티의 값이 변할 때마다 발생하는 이벤트이다.
  • xhr.onreadystatechange = function()은 이벤트가 발생할 때마다 실행될 함수를 등록한 것이다.
  • readyState : 진행상태
    • 0: open() 메소드를 수행하기 전 (객체 생성)
    • 1: loading 중 (객체 초기화 완료)
    • 2: loading 완료 (서버에게 요청 보냄)
    • 3: Server 처리중 (서버에서 요청을 처리하기 시작함)
    • 4: Server 처리완료 (응답 완료)
  • status
    • 200: 성공
    • 403: 접근 금지
    • 404: 없음.
    • 500: 구문 에러
  • 응답코드 구분하기