프로젝트의 객체들에 Builder를 추가하고 테스트하는 중 에러가 발생하였다.
에러의 문구는 아래와 같았다...
java.lang.NullPointerException: Cannot invoke "java.util.List.add(Object)" because the return value of "HelpTodo.helptodoBackend.domain.Team.getJoinTeams()" is null
에러 발생 코드
//Team 클래스
@Entity
@Builder
@Table(name = "team")
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class Team {
@Id
@Column(name = "team_name")
private String name;
private String teamCode;
private String password;
private String creator;
@CreatedDate
private LocalDateTime createDate;
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
private List<JoinTeam> joinTeams = new ArrayList<>();
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
private List<TodoList> todolists = new ArrayList<>();
...
}
// 에러 발생의 원인
// joinTeams 가 null이 된다
Team team = new Team().builder()
.name("asdf")
.password("createTeamForm.getMemberId()")
.creator("createTeamForm.getTeamPassword()")
.build();
teamService.createTeam(creatorId, team);
원인 설명
Team 클래스는 name, teamCode, password, joinTeams 등의 멤버 변수를 가진다.
근데, 나는 team 객체를 빌더로 생성할 때, name, password, creator 만을 생성해 주었다.
이후, teamService의 createTeam 메서드에서 team의 joinTeams 멤버를 사용해 에러가 나타났다.
해결법
1. @Builder.Default
...
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL)
@Builder.Default // 이 부분 추가
private List<JoinTeam> joinTeams = new ArrayList<>();
꼭 생성해되어야 하는 멤버에 @Builder.Default를 추가해준다.
2. Builder 사용 시 명시해 주기 (권장 X)
Team team = new Team().builder()
.name("asdf")
.password("password")
.creator("creator")
.joinTeams(new ArrayList<>()) // 이 부분
.build();
builder로 생성할 때, 직접 명시해 준다.
'활동들~ > Help Todo (개인프로젝트)' 카테고리의 다른 글
[문제 기록] NEXT.JS(SSR) Error: Text content does not match server-rendered HTML. (0) | 2023.04.02 |
---|---|
react JWT 토큰 저장, 가져오기 (0) | 2023.03.23 |
[문제 기록] 클라이언트에 응답 시, JPA 양방향 객체 무한 참조 (0) | 2023.03.21 |
[개발 기록] 백엔드 Spring Security 리팩토링 (0) | 2023.03.20 |
Help Todo 프로젝트 (0) | 2023.03.15 |