2024. 11. 14. 11:19ㆍ내일배움캠프/Spring Plus
'Level 2-1' 의 요구사항을 반영한 내용을 기록한 포스팅이다. 어떠한 생각과 과정을 통해 요구사항을 반영했는지 알 수 있도록 작성해 보았다.
0. 요구사항
이전 개발자의 의도대로 일정 생성 요청시 요청 사용자가 자동으로 해당 일정의 매니저로 등록될 수 있도록 코드를 수정해야 한다. 여기서 말하는 '매니저 등록' 은 DB 의 MANAGERS 테이블에 매니저(일정 생성 사용자) 및 일정 정보가 반영되는 것을 말한다. 해당 문제 해결시 JPA 의 Cascade 를 활용해 보자.
1. 문제 원인 파악
프로젝트를 살펴보니 현재 일정 생성시 생성을 요청한 사용자(작성자)의 정보까지 포함해 일정을 생성하고 있다는 것을 확인했다. 하지만 아래와 같이 테스트를 위해 계속해서 일정을 추가했음에도 현재 MANAGERS 테이블에는 단 하나의 행조차 존재하지 않았다.
또한 현재 상태에서 일정 생성에 대한 디버깅을 수행해보니 아래와 같이 요청 사용자의 정보가 Todo 객체 생성시 전달되는 것도 확인했지만 쿼리는 요청 사용자 정보 조회와 일정 생성에 대한 2개의 쿼리만이 사용된 것을 확인할 수 있었다.
위 과정을 통해 Todo 객체에는 요청 사용자의 정보가 매니저(managers 요소)로 가지고는 있지만 DB 의 MANAGERS 테이블에 해당 내용이 반영되지 않고 있다는 것을 파악할 수 있었다.
2. 문제 해결
요구사항을 만족하기 위해서는 TODOS 테이블에 새로운 행이 추가될 때, MANAGERS 테이블에도 새로운 행이 추가 되어야 한다. 이 조건을 만족하기 위해 JPA 의 Cascade 를 활용하라는 내용이 있던 것 같다.
JPA 에서의 Cascade(영속성 전이) 는 엔티티의 영속성 상태가 변경될 때 연관 엔티티 또한 영향을 받도록 도와준다. 즉, 엔티티 A, B 가 있을 때 두 엔티티가 양방향 연관관계를 맺고 A 에 Cascade 를 사용했다면, A 의 영속성 상태에 변화가 생긴다면 B 도 영향을 받는다.
'cascade' 의 옵션을 통해 연관 엔티티가 영향을 받을 영속성 상태 변화를 지정할 수 있다. 그리고 물론 모든 변화에 대해서 영향을 받게 할 수도 있다. 하지만 나의 경우 일정 생성시 매니저 또한 생성되게 하는 것이 목적이므로 아래와 같이 'CascadeType.PERSIST' 를 사용해 엔티티의 '영속화' 에 대한 부분만 Manager 엔티티가 영향을 받도록 하였다.
@Getter
@Entity
@NoArgsConstructor
@Table(name = "todos")
public class Todo extends Timestamped {
...
@OneToMany(mappedBy = "todo", cascade = CascadeType.PERSIST)
private final List<Manager> managers = new ArrayList<>();
public Todo(String title, String contents, String weather, User user) {
this.title = title;
this.contents = contents;
this.weather = weather;
this.user = user;
this.managers.add(new Manager(user, this));
}
}
수정 후 Postman 을 통해 일정 생성 요청을 테스트 해보니 아래와 같은 결과를 확인할 수 있었다.
TODOS 테이블에는 'id=15, user_id=1' 인 새로운 행이 추가되었으며, MANAGERS 테이블에는 'todo_id = 15, user_id = 1' 인 행이 추가되었다. 그리고 해당 요청으로 인해 작성되는 쿼리를 확인해보니 기존에 있던 사용자 조회, 일정 추가 쿼리 외에도 매니저 추가 쿼리 또한 작성되는 것을 확인할 수 있었다.
'내일배움캠프 > Spring Plus' 카테고리의 다른 글
[Spring Plus] Level 2-3 요구사항 반영 (0) | 2024.11.15 |
---|---|
[Spring Plus] Level 2-2 요구사항 반영 (0) | 2024.11.14 |
[Spring Plus] Level 1-5 요구사항 반영 (0) | 2024.11.13 |
[Spring Plus] Level 1-4 요구사항 반영 (0) | 2024.11.13 |
[Spring Plus] Level 1-3 요구사항 반영 (0) | 2024.11.12 |