JSP
Ajax - 비동기,동기 차이 및 예제(async/await, Promise, fetch API)
jaycheol
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를 활용해 에러 핸들링을 더 쉽게 할 수 있음.
반응형