프로젝트를 하면서 객체를 주고 받다보면,
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