ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?)

2026. 1. 28. 15:23·코드잇 스프린트/실습

 

ReadStatus(읽음 상태)

  • 사용자가 채널별 마지막으로 메시지를 읽은 시간을 표현하는 도메인
  • 사용자별 각 채널에 읽지않은 메시지를 확인하기 위해 활용
  • (userId,channelId) 당 1개 생성되는 도메인

 

왜 ReadStatus를 추가해야하는가?

 

1. User에 넣을경우: 어떤 채널의 마지막 읽음인지 알 수 없음

User.lastReadAt

 

2. Channel에 넣을경우: 사용자별 읽음 상태를 구분할 수 없음.

 

3. Message 마다 읽음 처리: 사용자 x 메시지 수  =  너무 많은 데이터

 

User 1 ─── * ReadStatus * ─── 1 Channel

 

  • 한 사용자는 여러 채널을 읽는다
  • 한 채널은 여러 사용자에게 읽힌다
  • 각 (사용자, 채널) 조합마다 읽음 상태가 하나씩 존재

 

[ReadStatus 정리]

User 1
 ├─ ReadStatus (Channel 1)
 ├─ ReadStatus (Channel 2)
 └─ ReadStatus (Channel 3)
  • 한 유저는 여러 채널을 가진다.
  • 여러 채널 각각의 메시지 읽음 상태를 확인하기 위해 여러 읽음 상태를 가질 수 있다.
Channel 1
 ├─ ReadStatus (User A)
 ├─ ReadStatus (User B)
 └─ ReadStatus (User C)
  • 한개의 채널은 여러 사용자를 가진다.
  • 여러 사용자 각각의 메시지 읽음 상태를 확인하기 위해 여러 읽음 상태를 가질 수 있다.

UserStatus(사용자 온라인 상태)

  • 사용자 별 마지막으로 확인된 접속 시간을 표현하는 도메인 모델
  • 한 사용자당 하나의 UserStatus(1대1 관계)

createdAt: 최초 로그인 시간

updateAt: 재접속 시간

 

updateAt을 이용해서 사용자의 온라인상태를 확인할 수 있다.

ex) (현재시간 - 마지막 접속시간) <= 5  = 온라인이다

 


BinaryContent

  • 사용자 프로필 이미지
  • 메세지에 첨부될 파일
  • 수정이 불가능한 모델 : updateAt 필드는 정의하지 않는다.
  • 사용자는 프로필 이미지를 0개이상 갖는다.
  • 메세지는 파일을 0개 이상 갖는다.

User, Message 도메인 모델과의 의존 관계 방향성을 잘 고려하여 id 참조 필드를 추가해라

  • BinaryContent에 User나 Message 객체를 필드로 받으면 결합도가 올라간다.
  • ex) User 구조 변경되면 BinaryContent에도 영향이간다.

 

-BinaryContent에 User,Message 객체를 필드로 받을시,

[문제점1]

binaryContent.getUser().getEmail();
binaryContent.getMessage().getChannelId();
  • BinaryContent의 책임이 커진다.
  • SRP 붕괴

 

[문제점2]

public class User {
    private UUID id;
    private LoginInfo loginInfo; // 구조 변경
}

 

  • 구조변경시, BinaryContent 수정이 발생한다 -> 결합도 높음.

 

[문제점3]

BinaryContent content = new BinaryContent();
content.setUser(new User(...));      // 필요
content.setMessage(new Message(...)); // 필요
  • BinaryContent 하나 테스트하려고할때 User,Message를 전부 만들어야한다.

 

[따라서 ID 참조만 하는게 좋다.]

public class BinaryContent {

    private UUID id;
    private Instant createdAt;

    // ID 참조만
    private UUID userId;
    private UUID messageId;
}

 

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

[sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생  (0) 2026.02.23
BasicUserService내 update 기능 피드백.  (0) 2026.01.29
피드백) 단건조회는 null 반환 가능성이 있어 Optional로 래핑해라  (0) 2026.01.21
간단한 디스코드 프로그램 만들기_ 피드백3(매개변수 변경 ,메서드 이관)  (1) 2026.01.15
간단한 디스코드 프로그램 만들기_ 각 필드에 List 추가해서 기능 추가하기.  (0) 2026.01.14
'코드잇 스프린트/실습' 카테고리의 다른 글
  • [sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생
  • BasicUserService내 update 기능 피드백.
  • 피드백) 단건조회는 null 반환 가능성이 있어 Optional로 래핑해라
  • 간단한 디스코드 프로그램 만들기_ 피드백3(매개변수 변경 ,메서드 이관)
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (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
과컴
ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?)
상단으로

티스토리툴바