@Transactional
하나의 table이라면 관련없으나
여러개의 table을 작성/수정시에는 중간에 에러날경우 롤백, 처음으로 되돌려야 한다.
Spring에는 애너테이션으로 트랜젝션기능을 제공한다.
@Transactional
controller에서는 service를 실행하고
@RequestMapping(value = "/manpower_edit", method = { RequestMethod.POST })
public ResponseEntity<String> manpowerEdit(@ModelAttribute MpVO mpVO, HttpServletRequest req,
HttpServletResponse res) {
// System.out.println("전체 form정보: " + mpVO);
// System.out.println("form에서 받은 정보입니다: " + mpVO.getCertif());
mpService.updateMpAll(mpVO, mpVO.getEmpId());
// if (true) {throw new RuntimeException("트랜잭션 실험을 위해 예외 발생!");}
return new ResponseEntity<>("success", HttpStatus.OK);
}
service는 update하면서 오류가나면 error를 발생시킨다.
@Transactional
public void updateMpAll(MpVO mpVO, int empId) {
try {
mpMapper.updateInfo(mpVO);
for (MpVO.Certif certif : mpVO.getCertif()) {
if(certif.getCertifId() == 0) {
mpMapper.insertCertif(certif, empId);
}else {
mpMapper.updateCertif(certif, empId);
}
}
for (MpVO.CoHistory coHistory : mpVO.getCoHistory()) {
if(coHistory.getHistoryId() == 0) {
mpMapper.insertCoHistory(coHistory, empId);
}else {
mpMapper.updateCoHistory(coHistory, empId);
}
}
mpMapper.updateExpYears(empId);
mpMapper.updateExpGrade(empId);
for (MpVO.Pjt pjt : mpVO.getPjt()) {
if(pjt.getPjtId() == 0) {
mpMapper.insertPjt(pjt, empId);
}else {
mpMapper.updatePjt(pjt, empId);
}
}
for (MpVO.Edu edu : mpVO.getEdu()) {
if(edu.getEduId() == 0) {
mpMapper.insertEdu(edu, empId);
}else {
mpMapper.updateEdu(edu, empId);
}
}
for (MpVO.School school : mpVO.getSchool()) {
if(school.getSchoolId() == 0) {
mpMapper.insertSchool(school, empId);
}else {
mpMapper.updateSchool(school, empId);
}
}
for (MpVO.Skill skill : mpVO.getSkills()) {
mpMapper.updateSkills(skill, empId);
}
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
트렌젝션 성공시 서버는 성공(트렌젝션 성공)을 알리고 ajax는 이를 success처리한다.
if (data === 'success') 를 통해 success가 아닌경우 경고해주자.
$.ajax({
type: "POST",
url: url,
data: formData,
success: function (data, xhr) {
alert(data);
if (data === 'success') {
alert(msg);
if ("${pageName[0]}" === 'write') {
javascript: pageLoad('${contextPath}/manpower/manpower_main');
}
else {
javascript: pageLoad(
'${contextPath}/manpower/manpower_sub?empId=${selectMpList[0].empId}'
);
}
} else {
alert("에러가 발생했습니다, 새로고침시 입력내용이 사라집니다.");
}
},
error: function (error) {
alert("에러가 발생했습니다, 새로고침시 입력내용이 사라집니다!");
}
});
확인해보자.
정상적인 코드일때는 잘 수정되고,
쿼리를 일부러 망칠경우(일부를 주석처리하여)
롤백되며 에러임을 알린다.
<update id="updateCertif" parameterType="java.util.Map">
UPDATE emp_certif
SET
C<!-- ERTIF_NAME = #{certif.certifName},
COMPLET_DATE =
<if test="certif.completDate != null and certif.completDate != ''">#{certif.completDate}</if>
<if test="certif.completDate == null or certif.completDate == ''">NULL</if>,
CERTIF_INST --> = #{certif.certifInst},
CERTIF_NUM = #{certif.certifNum}
WHERE EMP_ID = #{empId} AND CERTIF_ID = #{certif.certifId}
</update>
controller단에서 억지로 에러를 발생시킨경우에도 마찬가지.
@RequestMapping(value = "/manpower_edit", method = { RequestMethod.POST })
public ResponseEntity<String> manpowerEdit(@ModelAttribute MpVO mpVO, HttpServletRequest req,
HttpServletResponse res) {
// System.out.println("전체 form정보: " + mpVO);
// System.out.println("form에서 받은 정보입니다: " + mpVO.getCertif());
mpService.updateMpAll(mpVO, mpVO.getEmpId());
if (true) {throw new RuntimeException("트랜잭션 실험을 위해 예외 발생!");}
return new ResponseEntity<>("success", HttpStatus.OK);
}
'JAVA > Spring' 카테고리의 다른 글
Controller에서 간단하게 DB 테스트 하기: jdbcTemplate.queryForObject (0) | 2024.07.29 |
---|---|
DbUnit 테스트: dataSource를 불러와 insert/select 확인하기 (0) | 2023.12.04 |
EasyMock + JUnit 테스트 @Before @Test (0) | 2023.11.30 |
JUnit 테스트 : @Before @After @Test (0) | 2023.11.29 |
MVC패턴 게시판 구현하기: 페이징 (0) | 2023.11.28 |