1. jQuery로 AJAX(비동기 통신) 처리하기

  • jQuery는 AJAX 처리를 위한 다양한 메소드를 지원한다.
  • jQuery의 AJAX는 text, html, xml, json, jsop 타입의 응답데이터를 처리할 수 있다.

주요 메소드

  • url과 function은 필수적인 매개변수이고, data와 responseDataType은 생략 가능하다
  • $.get(URL, data, function(data, status, xhr) { … }, dataType)
  • $.post(URL, data, function(data, status, xhr) { … }, dataType)
  • $.getJSON(URL, data, function(data, status, hxr) { … })
  • $.ajax({name:value, name:value, …})

메소드의 매개변수 (data와 dataType은 상황에 따라 생략 가능하다)

  • url: 요청된 url
  • data: 응답데이터를 보내는 두가지 방식
    • {page:1, no:14}
    • “page=1&no=14”
  • function(responseData): 성공적인 응답이 왔을 때 실행될 콜백함수
    • responseData에는 서버에서 응답으로 보낸 데이터가 전달된다
    • jQuery는 이 데이터를 자바스크립트 객체/배열, XML DOM 객체로 변환 후 전달한다
  • dataType: 응답데이터의 컨텐츠 타입
    • text: plain text
    • json: json 형식의 데이터 -> javascript 배열, 객체로 변환 후 반환
    • xml: xml 형식의 데이터 -> XML Documnet 객체로 변환 후 반환
    • jsonp: 다른 사이트의 서버로부터 데이터를 요청할 때 사용

2. $.get()을 활용한 AJAX 예제

localhost에서 프로젝트명/product/list.hta url로 접속하면 아래 사진과 같은 텍스트 형식의 데이터가 전달된다.
이 더미데이터가 곧 서버에서 전송되는 데이터이다.

image

@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();
  }
}

서버에서 보내는 데이터(productList의 텍스트)를 ajax를 통해 화면에 뿌려보자.

image

아래의 코드를 입력하면 사진과 같은 화면이 뜨고,
데이터 불러오기 버튼을 클릭하면 서버에서 받아온 json 데이터를 화면에 뿌릴 수 있다.

<div>
    <div class="row mb-3">
        <div class="col">
            <h1>상품 리스트<button class="btn btn-dark btn-sm float-end mt-3" id="btn-load-products">데이터 불러오기</button></h1> 
        </div>
    </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>

  • $.get(url, function(data)) 메소드에 요청할 url과 요청된 데이터로 실행할 함수를 정의한다.
  • function(data)에서 data 안에는 url에서 가져온 데이터가 들어있다.
    console.log로 data를 찍어서 확인해 보면 배열의 형태로 들어가 있는 것을 확인할 수 있다.

image

  • $.each(배열, function(index, item) {}) 메소드는 배열에 저장된 개수만큼 함수를 실행한다.
    product에는 배열에 저장된 값이 순서대로 전달된다.
    <script>
      $('#btn-load-products').click(function() {
          // 데이터를 불러올 곳은 아이디가 table-products인 tbody 안이다. 
          var $tbody = $('#table-products tbody');
    
          $.get("/script2/product/list.hta", function(data) {
              $.each(data, function(index, product) {
                  var row = "<tr>";
                  row += "<td>"+product.no+"</td>";
                  row += "<td>"+product.name+"</td>";
                  row += "<td>"+product.company+"</td>";
                  row += "<td>"+product.price.toLocaleString()+" 원</td>";
                  row += "<td><strong>"+product.discountPrice.toLocaleString()+"</strong> 원</td>";
                  row += "</tr>";
    				
                  $tbody.append(row);
              });
          }, "json");
      });
    </script>
    

    위와 같이 입력 후, 데이터 불러오기 버튼을 클릭하면 아래 사진과 같아진다!

image

가격을 잘못 적었다 ^~^..


3. $.ajax()을 활용한 AJAX 예제

  • $.ajax()
    • type: ‘GET’ or ‘POST’ -> 요청방식
    • url : ‘요청 url’ -> 요청URL
    • data: {no:14, page:1} or “no=14&page=1” -> 서버로 보내는 데이터
    • contentType: ‘application/json’ or ‘text/xml’
      -> 서버로 보내는 데이터의 컨텐츠 타입, 기본값은 “application/x-www-form-unlencoded”다.
    • dataType: ‘text’ or ‘json’ or ‘xml’ or ‘jsonp’
    • success: function(responseData) { … }
    • error: function() { … }
<script>
$('#btn-load-products').click(function() {
    // 서버와 HTTP 통신하고 데이터 받아와서 표현하기
    $.ajax({
        type: 'get',
        url: '/script2/product/list.hta',
        dataType: 'json',
        success: function(products) {
            var $tbody = $('#table-products tbody');
            $.each(products, function(index, product) {
                var row = "<tr>";
                row += "<td>"+product.no+"</td>";
                row += "<td>"+product.name+"</td>";
                row += "<td>"+product.company+"</td>";
                row += "<td>"+product.price.toLocaleString()+" 원</td>";
                row += "<td><strong>"+product.discountPrice.toLocaleString()+" 원</strong> </td>";
                row += "</tr>";
                
                $tbody.append(row);
            })
        }
    });
});
</script>