본문 바로가기

Spring

항해 99 실전 프로젝트 - 문제발생 및 해결

 금일, 관계의 방향성을 cascade를 통하여 관리하려 하였으나. 

cascade는 영속성을 이용한 관계로 부모 Entity의 변화가 자식에게도 영향을 끼치게 하는 영속성 기능을 활용하여 제공하는 강력한 기능이다. 그러나 너무 유용하기 때문에 너무 남발하면 부작용이 많은 기능이다. 때문에 어중간하면 사용을 미하지만 유저의 상세 정보가 등록 내역에 대하여 완전하게 데이터를 소유하고 있다는 점, 헙업이기 때문에 내 코드를 남이 신경쓰이게 하는 것을 방지하려는 점 이 두가지 이유를 가지고 cascade를 통해 데이터를 관리하려 하였다. 그러나 실제로 사용해보니 아래와 같은 이유로 오류가 발생했다. 

1. cascade.ALL관계로 인하여 Entity를 저장하는 과정에서 문제 발생  
 엔티티에 저장된 데이터와 저장하려는 데이터가 충돌하는 오류 발생

2. 저장 성공 이후 새로운 것을 생성하는 것은 가능하지만, 반대로 수정하는 것은 불가능 해진 상태 
 위와 마찬가지의 이유로 수정을 통한 저장을 하려 하자 엔티티의 데이터를 저장하는 과정에서 충돌이 발생하여 오류 발생 

 즉, 가장 큰 원인은 변경되는 자식 엔티티를 저장하지 못하는 사태가 일어나고 있던 것이다. 그 결과 처음은 저장이 가능하지만 이후 수정이 불가능한 코드가 작성되었다. 

 해결방식

// before
memberDetail.changeAnswer(memberAnswer); 
//after
if (answer.isEmpty()) memberDetail.answer(memberAnswer);
else {
memberDetail.changeAnswer(memberAnswer);  
}


우선, 기존의 위와 같은 코드 하나만 있었다면 이후 아래의 코드로 바꿔 2가지 방식으로 entity를 저장하는 것으로 선택했다. 기존 응답이 없다면 새로 저장하는 것을, 없다면 변경하는 것을 넣어 해결하였다.

// 기존의 응답이 없던 경우
public void answer(MemberAnswer memberAnswer) {
    this.memberAnswer.add(memberAnswer);
    memberAnswer.got(this);
}
// 기존의 응답이 있는 경우 => 그러나 점수제의 관계로 인하여 한번 true이면 true이게 고정 시킴
public void changeAnswer(MemberAnswer memberAnswer) {
        for (MemberAnswer answer : this.memberAnswer) {
            if (memberAnswer.getId().equals(answer.getId())) {
                if (answer.isCorrect() == true) break;
                answer.modify(memberAnswer.isCorrect());
                break;
            }
        }
    }

'Spring' 카테고리의 다른 글

항해 99 - 서비스와 RDB  (1) 2023.10.21
항해 99 실전 프로젝트 - 트러블 (Optional)  (0) 2023.10.19
항해 99 실전 프로젝트 - CRUD  (0) 2023.10.09
항해 99 6주차 - 마무리  (0) 2023.09.25
항해 99 6주차 - 2일  (0) 2023.09.19