@Transactional(rollbackFor = {Exception.class})
public HashMap<String, Object> saveOrder(OrderDto orderDto){
HashMap<String, Object> returnMap = new HashMap<String, Object>();
try{
String orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
Device device = deviceRepo.findDeviceByDeviceId(orderDto.getDeviceId());
if(ObjectUtils.isEmpty(device)){
returnMap.put("resCode", ResMessage.DeviceNotFound.getResCode());
returnMap.put("resMsg", ResMessage.DeviceNotFound.getResMessage());
return returnMap;
}
...
if(!StringUtils.isEmpty(orderDto.getCouponNum())){
CouponList couponList = couponListRepo.findByCouponNum(orderDto.getCouponNum());
couponList.setUsed(device);
}
returnMap.put("resCode", ResMessage.Success.getResCode());
returnMap.put("resMsg", ResMessage.Success.getResMessage());
return returnMap;
} catch (Exception e) {
e.printStackTrace();
returnMap.put("resCode", ResMessage.SystemError.getResCode());
returnMap.put("resMsg", ResMessage.SystemError.getResMessage());
return returnMap;
}
}
CouponList couponList = couponListRepo.findByCouponNum(orderDto.getCouponNum());
couponList.setUsed(device);
}
public HashMap<String, Object> saveOrder(OrderDto orderDto){
HashMap<String, Object> returnMap = new HashMap<String, Object>();
try{
String orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
Device device = deviceRepo.findDeviceByDeviceId(orderDto.getDeviceId());
if(ObjectUtils.isEmpty(device)){
returnMap.put("resCode", ResMessage.DeviceNotFound.getResCode());
returnMap.put("resMsg", ResMessage.DeviceNotFound.getResMessage());
return returnMap;
}
...
if(!StringUtils.isEmpty(orderDto.getCouponNum())){
CouponList couponList = couponListRepo.findByCouponNum(orderDto.getCouponNum());
couponList.setUsed(device);
}
returnMap.put("resCode", ResMessage.Success.getResCode());
returnMap.put("resMsg", ResMessage.Success.getResMessage());
return returnMap;
} catch (Exception e) {
e.printStackTrace();
returnMap.put("resCode", ResMessage.SystemError.getResCode());
returnMap.put("resMsg", ResMessage.SystemError.getResMessage());
return returnMap;
}
}
주문하는거 api 연습중인데 ㅠㅠ
CouponList couponList = couponListRepo.findByCouponNum(orderDto.getCouponNum());
couponList.setUsed(device);
}
여기서 일부로 없는 쿠폰번호 날려서 NullPointerException 내봤거든 ㅠㅠ 근데 트랜잭션이 롤백이 안됨 ㅠㅠ 왜그러는거야?
unchecked exception이니까 롤백되야하는거 아니야?ㅜㅜ
나 너무 혼란스러움..ㅠㅠ 아는 형님 있음 알려줭 ㅠㅠ
없는 쿠폰이어도 빈 리스트 반환하는거 아님? 몰루 0w0
아 setUsed는 쿠폰 사용 상태를 False에서 True로 바꾸는거고 sql로 update 되겠지 ㅠㅠ 근데 맞는 쿠폰이 없는 상태에서 setUsed를 하니까 nullPointerException이 나는건데 ㅠㅠ 근데 왜 롤백이 안되고 주문내용이 그대로 DB에 적용되는지 모르겠어 ㅠㅠ
이거 그 서비스함수에
기본적으로 repository객체의 메소드에 트랜잭셔널 붙어있어서그럼
그래서 순서대로 서비스함수->리포지토리 메소드호출하면 리포지토리 트랜잭셔널이 서비스함수의 트랜잭셔널로타게돼서
서비스함수트랜잭셔널 어노테이션빼고돌려보삼!
형 내가 제대로 이해한게 맞나싶다 ㅠㅠ 위에 @Transactional(rollbackFor = {Exception.class}) 이거 뺴라는말 같은데 맞아? ㅠㅠ 빼고 해봤는데 그대로야 ㅠㅠ.. 여전히 주문이 DB에 적용됨 ㅠㅠ
https://velog.io/@giantim/5
고마워 형 ㅠㅠ 근데 이문제는 아닌거같엉 ㅠㅠ
마안타내가잘못이해햇네