게시판 대댓글을 구현하는데 @OneToMany와 @ManyToOne 을 사용하여 양방향 매핑을 하여 구현하는 것을 적어보려 합니다.
먼저 대댓글의 구조는 아래와 같을 것이다.
- 댓글
|- 댓글
|- 댓글
|- 댓글
|- 댓글
|- 댓글
|- 댓글
|- 댓글
이러한 계층 구조로 구현을 해야 한다.
처음 구현한 방법은 아래와 같다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENT_ID")
private Comment parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
private List<Comment> child = new ArrayList<>();
위와 같이 연관관계를 맺고 아래와 같이 메서드를 정의하였다.
이로서 관계설정과 메서드를 정의하여 구현은 끝났다고 볼 수 있다?….
다음으로 데이터를 보내어 본문 내용을 확인해보자.
계층 구조 설계가 잘 된것 같은데……
하지만 제일 상위에 있어야 하는 처음 달린 댓글이 제일 하위에 있다.
다음으로 db를 확인해보자.
parent_id가 거꾸로 저장이 되있는 걸 확인할 수 있다.
원래의 db 값 구조는 아래와 같아야 한다.
COMMENTS_ID. PARENT_ID
1 null
2 1
3 2
4 3
5 4
문제가 되는 메서드를 찾아보자.
위에서 정의한 메서드에서 문제가 있는 것을 확인할 수 있다.
Comment 객체를 매개변수로 받아 parent에 넣어주고 child에 add()를 하는 메서드인데…
순차적으로 매개변수로 들어오는 comment가 parent가 되는 로직이다.
이러한 메서드를 보면 제일 마지막에 들어오는 comment가 parent가 되어 계층구조가 역순으로 되는 현상이 발생한다.
문제를 해결하려면 아래와 같이 메서드를 수정해야 한다.
child에 add()를 진행하고 매개변수로 넘어온 comment에 parent를 자기자신 즉 처음 달린 댓글을 parent를 설정한다는 얘기다.
이렇듯 양방향 매핑시에 각각의 객체의 메서드를 잘 정의 해야한다.
메서드를 수정 하여 db 결과를 확인해보자.
성공했다!
'JPA' 카테고리의 다른 글
[JPA] JPQL에서 limit절을 사용해보자 (0) | 2023.01.10 |
---|---|
[JPA] @OneToMany 단방향 매핑 이슈 (0) | 2022.12.08 |
[Jpa] 테스트는 어느 부분까지 해야할까? (0) | 2022.08.26 |
[Jpa] 단일 테이블 전략의 상속 관계 매핑 이슈 (0) | 2022.08.20 |
[Jpa] Cascade (0) | 2022.08.07 |
[Jpa] Transaction Propagation (0) | 2022.08.06 |
[Jpa] Transaction Scope and Isolation (0) | 2022.08.05 |
[Jpa] Deprecated 된 getById() 대안 getReferenceById() (0) | 2022.08.02 |