Search

toList()는 불변을 반환한다

Status
UPLOADING
Date
2024/05/16
Tags
Spring

1. 개요

영속성 엔티티와 도메인 엔티티를 나누어 개발하다보면 Mapper 클래스가 필수 입니다. Mapper 클래스는 쉽게 말해
두 엔티티 간의 변환을 담당한다고 보시면 됩니다.
하지만 이는 손이 많이 가는 작업일 뿐더러 오류의 원인이 되기도 하는데, 이번 포스팅에서는 이와 관련하여 발생한 오류와 어떻게 해결했는지 알아보도록 하겠습니다.

2. 불변 객체에 값의 변경을 시도

프로젝트에서는 댓글을 다는 기능이 존재합니다. 댓글은 유저와 뉴스레터가 별도의 관계를 맺어 관리하고 있습니다.
위 코드는 쉽게 말해 댓글(Comment) 객체를 생성하고 이를 유저(User)의 List<Comment> comments에 집어 넣는 비즈니스 로직입니다.
그리고 다음과 같은 오류가 발생하였습니다.
쉽게 말해 불변 객체에 값의 변경을 시도했다는 내용입니다.
적합하게 생성 요청을 했고, 코드를 보면 new ArrayList<>(); 로 초기화 하는데 왜 불변 객체에 값의 변경을 시도했다고 나올까요?

3. 트러블 슈팅

문제는 조회 메소드에 있었습니다.
앞서 말했듯이 도메인 엔티티와 영속성 엔티티를 나누다 보니 자연스럽게 JpaMapper 클래스가 필요했는데, 영속성 엔티티를 도메인 엔티티로 바꾸면서 문제가 발생했습니다.
(과정은 다음과 같습니다. Database에서 영속성 엔티티를 조회 → Mapper를 통해 도메인 엔티티로 변환 → 반환)
UserJpaEntity가 가지고 있는 CommentJpaEntityComment로 바꾸고 이를 toList()로 묶어줬는데 이 과정에서 불변 리스트를 반환하였습니다.
이를 해결하는 방법은 변경 가능한 ArrayList를 반환하도록 수정하는 것입니다.