일기

@Builder패턴 사용시에 nullpointException 고치기

o_b:us 2022. 8. 1. 00:46

//ChatRoomService
        ChatRoom chatRoom = ChatRoom.builder().chatRoomName(user.getName()+"님의 방").build();//id userchatRoomList name
        User userEntity = userService.findUser(user.getEmail());
        UserChatRoom userChatRoom = UserChatRoom.builder().user(userEntity).chatRoom(chatRoom).build();//오류부분
        userEntity.addUserChatRoom(userChatRoom); 

        chatRoom.addUserChatRoom(userChatRoom);
        return chatRoomRepository.save(chatRoom);

해당 서비스 로직에서 NullpointerException이 자꾸 뜨길래
오류 내용은 chatRoom.addUserChatRoom(userChatRoom)에서 생겼다.


@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@ToString
public class ChatRoom extends Audtiable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.PERSIST,fetch = FetchType.EAGER)
    private List<UserChatRoom> userChatRoomList = new ArrayList<>();

    private String chatRoomName;

    @Builder
    public ChatRoom(Long id, List<UserChatRoom> userChatRoomList, String chatRoomName) {
        this.id = id;
        this.chatRoomName = chatRoomName;
        this.userChatRoomList = userChatRoomList;
    }

    public void addUserChatRoom(UserChatRoom userChatRoom){
        this.userChatRoomList.add(userChatRoom);
        if (userChatRoom.getChatRoom() != this){
            userChatRoom.addChatRoom(this);
        }
    }
}

한시간 가량 팀원과 생각하고 하나하나 뜯어보다가 문제점을 발견하였다.


  1. 무분별한 객체 생성을 막기 위해 @NoargsConstructor(AccessLevel.PROTECTED)를 사용하였다.
  2. 클래스 위에 달아 놓은 @Bulder 애노테이션이 문제가 생겼다.
  3. 해결방법으로 @AllArgsConstructor 위에 @Builder 애노테이션을 옮기면 된다.



그저께 생성패턴을 빌더패턴으로 바꾸면서 아무생각없이 따라하다가 생긴 문제였다.
@AllArgsConstructor 내 매개변수로 List userChatRoomList를 변수로 줬지만
서비스 로직에서는 userChatRoomLIst를 변수로 주지 않으니 null값으로 들어간거였다.


    @Builder
    public ChatRoom(Long id, , String chatRoomName) {
        this.id = id;
        this.userChatRoomList = userChatRoomList;
    }

생각을 하면서 코드를 사용해야지...ㅠ