프로젝트를 하다가, 분류삭제 기능을 맡게 되었습니다.
상위분류를 삭제하면 연관된 하위분류도 같이 삭제되어야 하지요. 하지만 DB테이블에 PK를 복합키로 잡아놨기 때문에 CASCADE와 같은 간편한 기능을 쓰지 못합니다.
그래서 짠 로직이 다음과 같습니다. (HashMap의 유용함을 며칠전 발견하여;; 죽어라 이것만 쓰고있음)
public class CareerActivityDelete_Logic {
public List<CategoryModel> elaborationDelete(List<CategoryModel> tempList,CategoryModel cm){
HashMap delTemp = new HashMap(); //삭제할 레코드 no를 담는다. 키값은 0부터 시작
HashMap vig = new HashMap();
int cas_seqnum = cm.getCategories_seqNum(); //분류체계일련번호
// System.out.println("카스넘"+cas_seqnum);
int ca_seqnum = cm.getNo(); //삭제하려는 분류 일련번호
// System.out.println("카넘"+ca_seqnum);
int listSize = tempList.size();
int keyvalue = 0;
해쉬맵이 유용하지만, 유의할 점은 이것을 컬렉션 List와 value비교에 사용할 경우 맵객체에 List의 모든 값들로 초기화를 시켜주어야 한다는 것입니다.
ArrayList<CategoryModel> wList = new ArrayList<CategoryModel>();
CategoryModel cdl;
//먼저 해당하는 분류체계만을 정제해서 리스트를 다시 만듬
for(int i=0; i<listSize; i++){
CategoryModel ct = tempList.get(i);
cdl = new CategoryModel();
if(ct.getCategories_seqNum() == cas_seqnum){
cdl.setNo(ct.getNo());
cdl.setCategories_seqNum(ct.getCategories_seqNum());
cdl.setUp_category_seqnum(ct.getUp_category_seqnum());
vig.put(cdl.getNo(), -1);
}
wList.add(cdl);
}
int wsize = wList.size();
int[] delSave = new int[wsize];
// System.out.println("wList사이즈"+wsize);
for(int i = 0; i<wsize; i++){
CategoryModel ct = wList.get(i);
//루프돌면서 no가 삭제하려는 no와 같은경우
if(ct.getNo() == ca_seqnum){
delSave[keyvalue] = ct.getNo();
delTemp.put(keyvalue, ct.getNo());
keyvalue = keyvalue + 1;
// System.out.println("delTemp현재"+delTemp.get(keyvalue-1));
}
// System.out.println("지금싸이즈"+delTemp.size());
//삭제하려는 객체를 담는delTemp의 사이즈가 0이 아니라면 로직을 수행
if(delTemp.size() != 0){
for(int j=0; j<delTemp.size(); j++){
for(int k=0; k<wsize; k++){
CategoryModel gm = wList.get(k);
if( (int)gm.getUp_category_seqnum() == (Integer)delSave[j]){
if((Integer)vig.get(gm.getNo()) != -1){
// System.out.println("이미존재합니다");
}else if((Integer)vig.get(gm.getNo()) == -1){
delTemp.put(keyvalue, gm.getNo());
vig.put(gm.getNo(), gm.getNo());
delSave[keyvalue] = gm.getNo();
System.out.println("delTemp진짜나와라"+delTemp.get(keyvalue));
keyvalue = keyvalue + 1;
}
}else{
}
}
}
}
}
//최종적으로 DAO로 보내기 위한 List객체를 만든다
List<CategoryModel> retList = new ArrayList<CategoryModel>();
CategoryModel cry;
for(int i=0; i<delTemp.size(); i++){
cry = new CategoryModel();
cry.setCategories_seqNum(cas_seqnum);
cry.setNo((Integer)delTemp.get(i));
retList.add(cry);
}
// System.out.println("retList사이즈"+retList.size());
return retList;
}
}
제가 짜놓고도 오늘 다시보니 잘 모르겠네요ㅋㅋ 주석을 더 달았어야 했나 봅니다.
자료구조를 공부한 적이 없습니다. 위의 로직보다 더 깔끔한 코드로 짤 수도 있겠죠...
뭐 아무튼 중요한것은 제 스스로 짰다는 것,ㅋ 로직을 스케치하고 생각한대로 구현해 냈다는 점..
자신감이 조금씩 생깁니다.