ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ajax - 비동기,동기 차이 및 예제(async/await, Promise, fetch API)
    JSP 2025. 3. 26. 14:14
    반응형

    JSP에서 Promise와 async/await를 활용한 AJAX 개발

    1️⃣ 기존 jQuery AJAX 방식 (기본적인 JSP + AJAX)

    $.ajax({
        url: "<c:url value='/checkIdDuplicate.do'/>",
        type: "POST",
        data: { id: $("#id").val() },
        success: function(response) {
            if (response === "YES") {
                alert("중복된 아이디입니다.");
            } else {
                alert("사용 가능한 아이디입니다.");
            }
        },
        error: function() {
            alert("서버 오류 발생");
        }
    });
    • 기존 jQuery 방식으로 AJAX 요청을 보내는 방식입니다.
    • 하지만 콜백 함수가 중첩되거나 코드가 복잡해지는 문제점이 있습니다.

    2️⃣ Promise를 활용한 JSP + AJAX (ES6 이상)

    function checkIdDuplicate(id) {
        return new Promise((resolve, reject) => {
            $.ajax({
                url: "<c:url value='/checkIdDuplicate.do'/>",
                type: "POST",
                data: { id: id },
                success: function(response) {
                    resolve(response); // 성공 시 Promise 해결
                },
                error: function() {
                    reject("서버 오류 발생");
                }
            });
        });
    }
    
    // 사용 예시
    checkIdDuplicate($("#id").val())
        .then(response => {
            if (response === "YES") {
                alert("중복된 아이디입니다.");
            } else {
                alert("사용 가능한 아이디입니다.");
            }
        })
        .catch(error => {
            alert(error);
        });
     

    Promise 사용 장점

    • then()과 catch()를 활용하여 에러 핸들링이 명확합니다.
    • callback이 중첩되지 않아 가독성이 좋아집니다.
    • 여러 개의 AJAX 요청을 Promise.all()로 묶어 동시에 여러 요청을 보낼 수도 있습니다.

    3️⃣ fetch API와 Promise를 활용한 JSP + AJAX

    function checkIdDuplicate(id) {
        return fetch("<c:url value='/checkIdDuplicate.do'/>", {
            method: "POST",
            headers: {
                "Content-Type": "application/x-www-form-urlencoded",
            },
            body: new URLSearchParams({ id: id })
        })
        .then(response => response.text()) // 응답을 텍스트로 변환
        .then(data => data)
        .catch(error => {
            console.error("Error:", error);
            throw new Error("서버 오류 발생");
        });
    }
    
    // 사용 예시
    checkIdDuplicate($("#id").val())
        .then(response => {
            if (response === "YES") {
                alert("중복된 아이디입니다.");
            } else {
                alert("사용 가능한 아이디입니다.");
            }
        })
        .catch(error => {
            alert(error);
        });

    fetch API 사용 장점

    • fetch는 최신 브라우저에서 지원하는 기본 API로, jQuery 없이도 사용 가능
    • then()과 catch()를 활용하여 비동기 요청을 효과적으로 관리
    • XMLHttpRequest보다 코드가 간결하고 사용하기 쉬움

    4️⃣ async/await을 활용한 JSP + AJAX (최신 방식)

    async function checkIdDuplicate(id) {
        try {
            let response = await fetch("<c:url value='/checkIdDuplicate.do'/>", {
                method: "POST",
                headers: {
                    "Content-Type": "application/x-www-form-urlencoded",
                },
                body: new URLSearchParams({ id: id })
            });
    
            let data = await response.text(); // 응답을 문자열로 변환
            return data;
        } catch (error) {
            console.error("Error:", error);
            throw new Error("서버 오류 발생");
        }
    }
    
    // 사용 예시
    async function handleCheck() {
        try {
            let result = await checkIdDuplicate($("#id").val());
            if (result === "YES") {
                alert("중복된 아이디입니다.");
            } else {
                alert("사용 가능한 아이디입니다.");
            }
        } catch (error) {
            alert(error.message);
        }
    }
    
    document.getElementById("checkButton").addEventListener("click", handleCheck);

    async/await 사용 장점

    • then() 대신 await을 사용하여 동기 코드처럼 직관적으로 작성 가능
    • try-catch를 활용하여 에러 핸들링이 간단
    • Promise 기반이므로 기존 fetch 코드와 결합 가능

    서버 측 (JSP 또는 Servlet) 처리

    위의 AJAX 요청을 처리하려면 JSP 또는 Servlet 컨트롤러에서 서버 로직을 구현해야 합니다.

    JSP에서 데이터 처리 (Ajax 요청을 받는 JSP 파일)

    <%@ page language="java" contentType="text/html; charset=UTF-8" %>
    <%@ page import="java.io.PrintWriter" %>
    <%@ page import="java.sql.*" %>
    
    <%
        String id = request.getParameter("id");
    
        // DB에서 아이디 중복 체크하는 로직 (예시)
        boolean isDuplicate = false;
        if (id.equals("existingUser")) {
            isDuplicate = true;
        }
    
        PrintWriter out = response.getWriter();
        out.print(isDuplicate ? "YES" : "NO");
    %>
    • JSP에서도 서버 응답을 YES 또는 NO로 반환하도록 처리할 수 있습니다.
    • 하지만 Servlet을 사용하여 처리하는 것이 더 권장되는 방식입니다.

    Servlet을 활용한 서버 처리

    @WebServlet("/checkIdDuplicate.do")
    public class CheckIdDuplicateServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String id = request.getParameter("id");
    
            // DB에서 중복된 아이디 확인 (가상의 로직)
            boolean isDuplicate = checkIdInDatabase(id);
    
            // 클라이언트에 응답 반환
            response.getWriter().write(isDuplicate ? "YES" : "NO");
        }
    
        private boolean checkIdInDatabase(String id) {
            // 실제 DB 연결을 통해 아이디를 확인하는 로직
            return id.equals("existingUser");  // 예제: "existingUser"라는 ID만 중복 처리
        }
    }

    Servlet을 사용하는 이유

    • JSP보다 MVC 패턴을 따르는 구조로 유지보수 및 확장성이 뛰어남.
    • PrintWriter를 이용하여 JSON 또는 문자열 데이터를 반환할 수 있음.
    • 비즈니스 로직을 JSP에 포함하지 않고 따로 분리할 수 있어 유지보수에 용이.

    정리

    1. 기존 JSP + jQuery AJAX
      • $.ajax()를 사용하여 서버와 통신하는 전통적인 방식.
      • 코드가 복잡해질 수 있으며 콜백 지옥(CallBack Hell) 문제가 발생할 수 있음.
    2. Promise를 활용한 JSP + AJAX
      • Promise를 사용하면 비동기 처리가 더 체계적으로 가능.
      • then()과 catch()로 에러 핸들링이 명확해짐.
    3. fetch API를 활용한 JSP + AJAX
      • fetch()를 사용하면 코드가 더 간결하고 유지보수하기 쉬워짐.
      • XMLHttpRequest보다 최신 방식.
    4. async/await을 활용한 JSP + AJAX
      • 비동기 요청을 await으로 처리하면 동기 코드처럼 직관적으로 작성 가능.
      • try-catch를 활용해 에러 핸들링을 더 쉽게 할 수 있음.
    반응형

    댓글

Designed by Tistory.