[sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생

2026. 2. 23. 18:13·코드잇 스프린트/실습

문제: 채널 생성시, NPE 발생


java.lang.NullPointerException: Cannot invoke "java.util.UUID.equals(Object)" because the return value of "com.sprint.mission.discodeit.entity.ReadStatus.getUserId()" is null

 

[JCFReadStatusRepository]

@Override
    public List<ReadStatus> findAllByUserId(UUID userId) {
        return this.data.values().stream()
                .filter(readStatus -> readStatus.getUserId().equals(userId))
                .toList();
    }
  • findAllByUserId 메서드에서 readStatus.getUserId() is null이라는 ERROR
  • 채널 생성시, ReadStatus에 방장 저장이 안된것으로 추정.

[ReadStatus Entity]

public class ReadStatus implements Serializable {
    private static final long serialVersionUID = 1L;
    private UUID id;
    private Instant createdAt;
    private Instant updatedAt;
    //
    private UUID userId;
    private UUID channelId;
    private Instant lastReadAt;

    public ReadStatus(UUID userId, UUID channelId, Instant lastReadAt) {
        this.id = UUID.randomUUID();
        this.createdAt = Instant.now();
        //
        this.userId = userId;
        this.channelId = channelId;
        this.lastReadAt = lastReadAt;
    }

ReadStatus내 userId가 null로 들어간것으로 추정.

 

[BasicChannelService]

@Override
    public Channel create(PublicChannelCreateRequest request) {
        String name = request.name();
        String description = request.description();
        Channel channel = new Channel(ChannelType.PUBLIC, name, description);
        ReadStatus readStatus = new ReadStatus(request.creatorId(),channel.getId(), Instant.now());

        System.out.println("유저 id: " + readStatus.getUserId());//readStatus 객체에 userId값 잘 들어갔는지 check
        System.out.println("readStatus객체: " + readStatus); //readStatus 객체 확인

        readStatusRepository.save(readStatus);

        return channelRepository.save(channel);
    }

 

채널 생성하고, readStatus가 저장되는 부분에서 readStatus의 userId 값 확인.

유저 id: null
readStatus객체: ReadStatus{id=91332ef0-f8ae-4fa9-9813-1e51d07b09bc, createdAt=2026-02-23T08:24:32.717373900Z, updatedAt=null, userId=null, channelId=e8431423-d804-4850-9323-00cc6419a87f, lastReadAt=2026-02-23T08:24:32.717373900Z}

userId가 null로 나온다.

 

[강사님의 피드백]

public channel은 모든 사용자가 참여됨을 가정하는 채널이다. -> 비즈니스 로직이 변경되었다.

@Override
    public Channel create(PublicChannelCreateRequest request) {
        String name = request.name();
        String description = request.description();
        Channel channel = new Channel(ChannelType.PUBLIC, name, description);
        List<User> users = userRepository.findAll();
        for (User user : users) {
            ReadStatus readStatus = new ReadStatus(user.getId(),channel.getId(), Instant.now());
            readStatusRepository.save(readStatus);
        }
        return channelRepository.save(channel);
    }

따라서 user List를 만들고

순회하면서 public channel이 생성됐을때 모든 사용자에 readStatus가 만들어지게 하면된다.

 

 

문제 해결

'코드잇 스프린트 > 실습' 카테고리의 다른 글

JPA ERROR : user는 PostgreSQL 예약어라서 테이블명을 따로 정해야한다.  (0) 2026.03.03
PostgreSQL DB 와 Spring Boot(InteliJ) 연동하기  (0) 2026.03.03
BasicUserService내 update 기능 피드백.  (0) 2026.01.29
ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?)  (0) 2026.01.28
피드백) 단건조회는 null 반환 가능성이 있어 Optional로 래핑해라  (0) 2026.01.21
'코드잇 스프린트/실습' 카테고리의 다른 글
  • JPA ERROR : user는 PostgreSQL 예약어라서 테이블명을 따로 정해야한다.
  • PostgreSQL DB 와 Spring Boot(InteliJ) 연동하기
  • BasicUserService내 update 기능 피드백.
  • ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?)
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • 위클리페이퍼 (6)
      • 파이썬 (4)
      • 코드잇 스프린트 (48)
        • Spring 이론 (7)
        • Java이론 (11)
        • 실습 (23)
      • 백엔드 개발자 최소기준 (1)
      • 코딩테스트 (5)
        • 알고리즘 (0)
        • SQL (1)
      • Git (5)
      • 스프링부트 핵심가이드 (1)
      • 트러블 슈팅 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준2576
    파이썬기초
    백준1075번
    문자열
    파이썬
    혼공파
    백준1152
    파이썬입문
    백준브론즈
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
과컴
[sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생
상단으로

티스토리툴바