문제상황
- servlet/mybatis/oracle을 이용한 프로젝트 진행 중에
마이페이지에서 본인의 쿠폰 목록을 조회하거나, 상품을 주문 할 때 쿠폰 리스트를 불러오는 메서드를 service에서 만들어야 했다.
여기서 문제가 됐던 부분은
1) List<Map<String, Object>> 로 dao에서 select해서 꺼내온 객체들이 있는데, 이 중에서 created_date라는 컬럼 값이 created_date + 7일이 지나면 만료된 쿠폰이다. 그래서 쿠폰 리스트를 불러올 때 현재 시간 기준으로 만료된 쿠폰이 있다면, status=만료 로 변경하는 메서드를 하나 더 불러서 분기처리하고 사용가능한 쿠폰 목록만 불러와야 했다.
created_date이라는 key값에 해당하는 value인 date를 받아와야했다.String date = couponList.get(i).get("CREATED_DATE") : date에 아무것도 담기지 않았음String date = couponList.get(i).get("CREATED_DATE") 만으로는 받아올 수 없고, toString() 메서드를 이용해서 가져올 수 있었다.String date = couponList.get(i).get("CREATED_DATE").toString()get(" ") ""안에 컬럼값은 console에서 나오는 문자형식(대,소문자 모두 구별)해줘야 한다.!!!!!2) 두번째 문제. 현재 시간을 어떻게 받아올 것이고, String 으로 받아온 컬럼값을 어떻게 date로 변환해서 7일을 더해서 계산하고 이 둘을 비교하지.....?
yy-MM-dd HH:mm:ss.S 형식으로 되어있길래 이걸로 바꿔봤더니.... 그제서야 날짜를 받아왔다.....🫠🫠-1 을 안해줘서.... 값을 못받아 왔던 것 ㅠㅠ 에러메시지라도 띄워줘라!!! 제발..!마지막으로 완성한 코드
@RequiredArgsConstructor
public class CouponService {
CouponDAO dao = new CouponDAOOracle();
// 본인 쿠폰 목록 조회 (마이페이지, 주문시)
public List<Map<String, Object>> findCouponList(String userId) throws FindException {
List<Map<String, Object>> couponList = dao.selectCouponByUserId(userId);
// 사용가능한 쿠폰만 담을 map list
List<Map<String, Object>> availableCoupon = new ArrayList<Map<String, Object>>();
// oracle에서 뽑아오는형식 그대로 가져와야함.. 그냥 yyyy-MM-dd나 HH:mm:ss.SSS 처럼 내가 원하는 형식으로는 안받아와짐..
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
String now = LocalDateTime.now().format(formatter);
LocalDateTime today = LocalDateTime.parse(now, formatter);
// dao에서 받아온 쿠폰 리스트 중에 만료된 쿠폰은 status = 2 로 변경해주는 메서드를 불러와서 처리해줌
for (int i = 0; i <= couponList.size()-1; i++) {
String date = couponList.get(i).get("CREATED_DATE").toString();
LocalDateTime couponDate = LocalDateTime.parse(date, formatter);
LocalDateTime couponExpired = couponDate.plusDays(7);
System.out.println("couponExpiredDate : " + couponExpired);
if (couponExpired.isBefore(today)) {
int couponNum = Integer.parseInt(couponList.get(i).get("NUM").toString());
System.out.println(couponNum + "번 쿠폰이 만료됨");
modifyCouponStauts(userId, couponNum, 2);
}
// status = 0 인것만 새로운 객체에 담아주기
int status = Integer.parseInt(couponList.get(i).get("STATUS").toString());
if (status == 0) {
Map<String, Object> coupon = couponList.get(i);
availableCoupon.add(coupon);
}
}
return availableCoupon;
}
// 쿠폰 status 변경
public void modifyCouponStauts(String userId, int num, int status) throws FindException {
CouponVo cVo = new CouponVo();
UserVo uVo = new UserVo();
uVo.setId(userId);
cVo.setUser(uVo);
cVo.setNum(num);
cVo.setStatus(status);
dao.updateCouponStatus(cVo);
}
}