객체의 필드값 변화를 그래프로 만들기 위해서 Spring boot event 를 적용한 Snapshot 객체를 만들어 그래프를 구현하고 있었다.
객체 구조
Memeber -< MemberSnapshot (Member 하나당 7개의 객체만 존재해야함)
@Transactional
public void initDbSnapshotCreate(Member member, BaekJoonDto dto, String dayOfWeek) {
MemberSnapshot snapshot = MemberSnapshot.initDbCreate(member, dto, dayOfWeek.substring(0, 3));
memberSnapshotRepository.save(snapshot);
List<MemberSnapshot> snapshotList = member.getSnapshotList();
MemberSnapshot snapshot1 = snapshotList.get(snapshotList.size() - 1);
memberSnapshotRepository.delete(snapshot1);
}
MemberSnapshotRepository.delete()
가 작동하지 않는 문제가 발생했다.@Transactional
public void initDbSnapshotCreate(Member member, BaekJoonDto dto, String dayOfWeek) {
MemberSnapshot snapshot = MemberSnapshot.initDbCreate(member, dto, dayOfWeek.substring(0, 3));
memberSnapshotRepository.save(snapshot);
}
@Transactional
public void deleteSnapshot(Member member) {
List<MemberSnapshot> snapshotList = member.getSnapshotList();
MemberSnapshot snapshot1 = snapshotList.get(snapshotList.size() - 1);
memberSnapshotRepository.delete(snapshot1);
}
Member 객체와 Snapshot 객체는 부모 자식 관계로 join 되어 있는데,
이 때 Snapthot 을 삭제할 경우 매핑되어있는 Member 에서는 변화가 없어 변경감지가 작동하지 않고,
DB 를 변경하지 않게 될 수 있다.
- 이 경우 Snapshot 객체의 삭제도 이루어지지 않는다.
알아보니 deleteById
를 사용하면 해결할 수 있다고한다.
@Transactional
public void initDbSnapshotCreate(Member member, BaekJoonDto dto, String dayOfWeek) {
MemberSnapshot snapshot = MemberSnapshot.initDbCreate(member, dto, dayOfWeek.substring(0, 3));
memberSnapshotRepository.save(snapshot);
this.deleteSnapshot(member);
}
public void deleteSnapshot(Member member) {
List<MemberSnapshot> snapshotList = member.getSnapshotList();
Long snapshotId = (long) (snapshotList.size() - 1);
memberSnapshotRepository.deleteById(snapshotId);
}
@Transactional
public void initDbSnapshotCreate(Member member, BaekJoonDto dto, String dayOfWeek) {
MemberSnapshot snapshot = MemberSnapshot.initDbCreate(member, dto, dayOfWeek.substring(0, 3));
memberSnapshotRepository.save(snapshot);
this.deleteSnapshot(member);
}
public void deleteSnapshot(Member member) {
List<MemberSnapshot> snapshotList = member.getSnapshotList();
MemberSnapshot snapshot = snapshotList.get(snapshotList.size() - 1);
snapshotList.remove(snapshot);
memberSnapshotRepository.delete(snapshot);
}