2025. 2. 13. 13:30ㆍBackend/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 발전이 어떻게 되었는지 확인을 해봐도 프로그래머들은 불편한 것을 참을 수 가 없어서
매번 수정을 해서 새로운 프로그램이 나오는다는 것을 잘 알게 된 것 같다.
나도 불편함을 느끼고 하나 만들어 볼 수 있으면 좋겠다
'Backend > Spring' 카테고리의 다른 글
| [Spring] Spring 심화 내용 배운 것 단순 요약. (0) | 2025.02.21 |
|---|---|
| [Spring] 프로젝트 하면서 느낀 아쉬운점 & 배운점 등 (0) | 2025.02.20 |
| [Spring] 환경변수를 설정해서 내 정보가 github에 올라가지 않도록 하기! (0) | 2025.02.11 |
| [Spring] SimpleJdbcInsert로 컬럼 지정하기 (1) | 2025.02.04 |
| [Spring Boot] 프로젝트를 만들어보자. (1) | 2025.01.24 |