Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- mybatis
- 과정평가형
- was
- eGov
- CSS
- controller
- Ajax
- 함수
- 암호화
- select
- sql
- 태그
- Database
- 개념
- Java
- 오류
- spring
- array
- json
- jQuery
- 배열
- eGovFramework
- javascript
- input
- web.xml
- Oracle
- POI
- html
- JVM
- TO_DATE
Archives
- Today
- Total
web developer
[java] AJAX 통신에서 Impl의 트랜잭션 예외 발생 시 예외 처리와 롤백 처리 본문
728x90
728x90
1. 예외처리
serviceImpl.java
serviceImpl.java 에서 update가 실패한 경우 throw new IllegalArgumentException 시킨다.
// 데이터베이스 업데이트 메서드 (예시)
@Override
@Transactional(rollbackFor = Exception.class)
private int updateDatabase(DataType data) {
int flag = 0;
try {
...
if(list!=null && list.size()>0) {
for(int=0; i<list.size(); i++) {
data = list.get(i);
// 데이터베이스 업데이트 로직
int update_status = 0;
if(list_count != null) {
update_status = dao.update(data);
}
if(update_status == 0) {
throw new IllegalArgumentException("update failed : " + data.getId());
}
}
}
...
flag = 1;
}catch() {
...
}
// 업데이트 성공 시 1 반환, 실패 시 0 반환
return flag;
}
controller에서 String 타입의 메서드가 return 을 가지고 있는 상황이다. Impl 에서 updateDatabase 메서드가 update가 실패한 경우 controller의 catch 블록으로 들어가게 된다.
MyController.java
이때 return 으로 보내줄 result 변수를 사용하려면 해당 변수를 메서드의 범위 내에서 선언해야 하며, 예외 발생 시에도 항상 결과를 반환해야 합니다. result 변수가 제대로 선언되고 반환되지 않고 있으면 컴파일 오류가 발생할 수 있습니다.
(java.lang.IllegalStateException: 응답이 이미 커밋된 후에는, sendRedirect()를 호출할 수 없습니다.)
@Controller
public class MyController {
@PostMapping("/update")
public @ResponseBody String updateData(@RequestBody DataType data, HttpServletResponse response) {
try {
int updateResult = updateDatabase(data); // 데이터베이스 업데이트 시도
String result = (updateResult > 0) ? "Y" : "N"; // 업데이트 성공 여부에 따라 결과 설정
// 잘못된 데이터 예외 발생 시
} catch (IllegalArgumentException e) {
/* (1) response.setStatus 호출
response.setStatus(HttpServletResponse.SC_BAD_REQUEST); // 400 Bad Request
*/
// (2) response.setStatus 호출 X
System.out.println("update failed1");
return result;
// 기타 예외 발생 시
} catch (Exception e) {
/* (1) response.setStatus 설정
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // 500 Internal Server Error
*/
// (2) response.setStatus 호출 X
System.out.println("update failed2");
return result;
}
return result; // JSON 형태로 성공 결과 반환
}
예외 발생 시 catch 블록에서 처리방식에 따른 차이
- 예외가 발생하여 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);를 호출하면 서버는 클라이언트에게 HTTP 400 Bad Request 응답을 반환하게 됩니다. 이 경우, AJAX 요청을 보낸 클라이언트는 서버의 응답 상태 코드를 확인하고, 상태 코드가 400인 경우 error 콜백 함수를 호출합니다.
- 예외가 발생했지만 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);를 호출하지 않으면, 서버는 기본적으로 HTTP 응답 상태 코드를 200 OK로 간주합니다. 이 경우, AJAX 요청을 보낸 클라이언트는 응답을 성공적으로 처리했다고 판단하고 success 콜백 함수를 호출하게 됩니다.
HTML 스크립트 작동X
AJAX 요청의 경우, 서버에서 직접 HTML 스크립트를 반환하더라도 클라이언트가 이를 실행하지 않기 때문에
PrintWriter out = response.getWriter
out.println("<script>alert('잘못된 데이터'); window.location.href='/errorPage';</script>");
해당 부분이 정상적으로 작동하지 않습니다.
AJAX 요청에 대한 응답은 일반적으로 JSON 형식으로 처리하여 클라이언트 측에서 결과에 따라 적절한 동작을 수행해야 합니다.
javaScript
function updateData(data) {
$.ajax({
type: "POST",
url: "/update",
contentType: "application/json",
data: JSON.stringify(data),
success: function(response) {
if (response === "Y") {
alert("업데이트 성공");
window.location.href = "/successPage";
} else {
alert("업데이트 실패");
}
},
error: function(xhr, status, error) {
console.error("AJAX 요청 중 오류 발생: " + error);
}
});
}
success 에서 else문 안에서 alert창이 실행된다.
2. 요약
- AJAX 요청:
- 클라이언트에서 updateData 함수를 호출합니다.
- AJAX 요청을 통해 서버의 /update 엔드포인트에 데이터가 전송됩니다.
- 서버 측 처리:
- 서버의 updateData 메서드가 호출되고, updateDatabase(data) 메서드가 실행됩니다.
- 만약 update가 실패하여 update_status가 0인 경우 IllegalArgumentException이 발생합니다.
- 이 예외는 catch 블록에 의해 처리됩니다. 여기서 HTTP 응답의 상태 코드를 설정하는 데 사용되는 메서드인 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);가 실행되면, HTTP 응답 상태 코드가 400 Bad Request로 설정됩니다.
- 반면에 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);을 설정하지 않고, System.out.println()으로만 처리하여 시스템에 표출시키면 서버는 여전히 응답 상태를 200 OK로 간주합니다.
- 응답 처리:
- 클라이언트 측에서 AJAX 요청의 success 콜백 함수가 실행됩니다. 하지만 AJAX 요청의 success 함수는 HTTP 응답 상태 코드가 200 OK일 때만 실행됩니다.
- 예외가 발생하였지만, response.setStatus(HttpServletResponse.SC_BAD_REQUEST);를 호출하지 않았다면, 서버는 여전히 응답 상태를 200 OK로 간주합니다. 그러므로 success 콜백이 호출되고, 이 안에서 response 값이 "Y"가 아닌 경우에 else문이 실행됩니다.
- 결과:
- 따라서, success의 else 블록이 실행되고, 클라이언트는 alert("업데이트 실패");를 띄우게 됩니다.
- 서버에서 에러를 발생시켰음에도 불구하고, HTTP 응답 상태가 200 OK로 처리되었기 때문에 클라이언트는 이를 성공적인 요청으로 인식하게 됩니다.
728x90
728x90
'Language > Java' 카테고리의 다른 글
[java] Form 전송 시 트랜잭션 예외 발생에 따른 PrintWriter를 통한 업데이트 실패 알림 및 페이지 이동 처리 (0) | 2024.10.29 |
---|---|
[java] try-catch를 이용한 직접 예외 처리와 @ControllerAdvice를 통한 공통 예외 처리 (1) | 2024.09.19 |
[java] JSON 데이터 파싱 (1) | 2024.09.10 |
[java] custom 페이징 처리와 페이지 네비게이션 구현 (0) | 2024.08.09 |
[java] SHA-256 암호화 [단방향] (0) | 2024.07.23 |