-
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에 포함하지 않고 따로 분리할 수 있어 유지보수에 용이.
정리
- 기존 JSP + jQuery AJAX
- $.ajax()를 사용하여 서버와 통신하는 전통적인 방식.
- 코드가 복잡해질 수 있으며 콜백 지옥(CallBack Hell) 문제가 발생할 수 있음.
- Promise를 활용한 JSP + AJAX
- Promise를 사용하면 비동기 처리가 더 체계적으로 가능.
- then()과 catch()로 에러 핸들링이 명확해짐.
- fetch API를 활용한 JSP + AJAX
- fetch()를 사용하면 코드가 더 간결하고 유지보수하기 쉬워짐.
- XMLHttpRequest보다 최신 방식.
- async/await을 활용한 JSP + AJAX
- 비동기 요청을 await으로 처리하면 동기 코드처럼 직관적으로 작성 가능.
- try-catch를 활용해 에러 핸들링을 더 쉽게 할 수 있음.
반응형'JSP' 카테고리의 다른 글
[JSP] - Ajax 파일 업로드 (0) 2025.03.25 Ajax(Asynchronous JavaScript and XML) - 비동기,동기 차이 및 예제 1편 (0) 2025.03.24 JSP - JSTL에서 ArrayLIst출력하기 (0) 2025.02.11 JSP - JSTL 배열 반복문으로 출력하기 (0) 2025.02.11 JSP - JSTL 반복문 사용하기 (0) 2025.02.11