[JPA] 연관관계가 있는 객체를 한번에 없애보자.

2025. 2. 13. 13:30Backend/Spring

개요

https://github.com/mixedsider/ScheduleProjectVer2

 

프로젝트를 진행을 하면서 JPA가 연결 관계를 설정을 해두면 자동으로 삭제를 해주는 기능에 대해서 찾아보고 사용을 해보았다.

 

사용을 하다보면 @OneToMany, @ManyToOne에 대한 것을 사용을 하게 된다.

 

한 객체에만 해당 내용이 있으면 단방향이 되고,

연결된 객체에 @OneToMany, @ManyToOne이 있게 되면 양방향이 된다.

 

이제 알은 것에 대해서 이야기를 해볼까 한다.

 


 

발단

public class CommentService {

//내용 생략

    @Transactional
    public CommentResponseDto save(Long scheduleId, Long userId, String comments) {

        CommentEntity comment = new CommentEntity(comments);

        ScheduleEntity schedule = scheduleService.findByIdToEntity(scheduleId);

        UserEntity user = userService.findByIdToEntity(userId);

        comment.setSchedule(schedule);
        comment.setUser(user);

        CommentEntity savedComment = commentRepository.save(comment);

        return savedComment.toDto();
    }
    
    //내용 생략
}

 

CommentService에서 저장을 할 때 CommentEntity만 설정을 하는 모습을 볼 수 있다.

 

CommentEntity 는 전부 다 대 1 관계이다.

 

한 유저가 많은 댓글을 만들 수 있고, 한 일정 밑에 많은 댓글이 달릴 수 있기 때문이다.

 

이제 만드는 모습을 보면 ScheduleEntity, UserEntity를 전부 조회를 한다음에 관계를 설정을 해준다.

 

이제 여기서 삭제를 할 때 어떻게 전부 삭제를 해야되나 고민을 하였다.

 

 


 

해결 방법

@OneToMany(mappedBy = "schedule", cascade = CascadeType.REMOVE, orphanRemoval = true)

 

CascadeType.REMOVE : 엔티티를 제거할 때, 연관된 하위 엔티티도 모두 제거한다.

orphanRemoval = true : 부모 엔티티의 리스트에서 제거하면 해당 엔티티도 삭제되도록 설정한다.

mappedBy = "테이블이름" : 어느쪽이 부모(주인)이고, 어느 쪽이 읽기 전용인지 설정할 수 있다.

 

 

각 엔티티를 양방향으로 연결을 하고

각 부모 객체에 위의 내용을 추가를 하면

외래키는 자식 객체가 관리를 하게 되고 JPA에서 추가적인 조인 테이블을 생성하지 않게 된다.

 

이제 각 부모 객체가 삭제가 된다면, 자식 객체도 한번에 같이 삭제되는 모습을 확인을 할 수 있다.

 

 

해결 된 모습

 

 

조회를 해보면 Page 형식으로 데이터가 오는 모습을 확인 할 수 있다.

 

이제 회원 탈퇴를 진행을 하고 데이터가 조회가 되는지 확인을 해보겠다.

 

 

 

 

전부 삭제되어서 content가 빈 배열인 모습을 확인할 수 있다.

 


찾아보면서 느낀점

Spring은 배우면 배울수록 프로그램을 진짜 편하게 만드려고 노력한 부분이 많이 보인다.

JPA도 그렇고 JDBC 발전이 어떻게 되었는지 확인을 해봐도 프로그래머들은 불편한 것을 참을 수 가 없어서

매번 수정을 해서 새로운 프로그램이 나오는다는 것을 잘 알게 된 것 같다.

 

나도 불편함을 느끼고 하나 만들어 볼 수 있으면 좋겠다