빌터패턴으로인한 리스트 null 초기화 문제 해결을 위해 @Builder, mapper 지우기

jungnoeun·2023년 2월 1일
0

kiri

목록 보기
8/13

문제

프로젝트를 하면서 객체를 주고 받다보면,
entity -> dto
dto -> entity
로의 변경이 필수적이다.

나는 이번 프로젝트에서 이 과정을 좀 더 편하게 하기 위해 mapper를 사용해보려 하였고, 사용중이었다.

하지만, test코드를 작성하면서, 계속 연관관계 편의메서드로 양방향 연관관계를 설정해주는 과정에서 에러가 발생하였다.

public void changeMember(Member member) {
        this.member = member;
        member.getPostList().add(this); // 이부분에서 에러 발생!!
    }

바로 member.getPostList()가 null로 생성되어서 add()를 할 수 없다는 것이었다.



해결과정

단순히, new ArrayList<>()로 초기화를 해주지 않아서 그런 것인가 고민했지만, 그런 문제가 아닌 것을 알 수 있었다.
바로 빌더 패턴(@Builder)을 이용할 경우, 미리 지정해준 값은 무시되고 자동 초기값으로 생성되는 것이다.
그래서 member.getPostList()의 값이 null로 나오는 것을 확인할 수 있었다.

// @Builder 를 통한 list 생성
member.getPostList() = null

이를 해결하려면 entity 에 있는 @Builder를 삭제해줘야 했고, @Builder가 없으면, mapper 를 사용하기 어려워지므로, @Builder와 mapper 모두 다 지워주기로 하였다.
mapper를 사용하지 않은 결정적인 이유는 entity를 방어하기 위해서는 최대한 생성자를 방어적으로 만드는게 좋다고 현재 내가 보고있는 김영한님의 강의에서 봤기 때문이다.
@Builder를 삭제하고, mapper를 위해 만들었던 @AllArgsConstructor를 삭제하고, mapper 관련 코드 또한 삭제해주었다.

대신 dto를 분리하였고, response의 경우, 더 쉽게 entity를 dto로 변환해주기 위해 of()메서드를 생성하여 사용해주었다.




결과

빌더패턴과 mapper를 삭제하고, test 코드를 돌리자 아래와 같이 list가 null이 아닌 []로 초기화된 것을 볼 수 있었다.

// @Builder 를 없앤 list 생성
member.getPostList() = []

참고>
https://velog.io/@hsbang_thom/Lombok-Builder.Default
https://cheese10yun.github.io/spring-builder-pattern/
https://choibulldog.tistory.com/43
https://bbeomgeun.tistory.com/m/174

profile
개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN