문제: 채널 생성시, 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 |