1. User에 필드로 List<Channel>,List<Message>추가
2.Channel에 필드로 List<User>,List<Message>추가
-기능-
1. 특정 채널에 참가한 유저 리스트 조회
2.특정 유저가 작성한 메시지 조회
3.채널에 사용자 참가및 탈퇴
등등
1. 채널에 사용자 참가 및 탈퇴 기능
Channel클래스에 List<User>과 List<Message>를 추가했다.
User가 채널에 참가하면 List<User>에서 관리한다.
User 클래스에 List<Channel>을 추가했다.
User가 채널에 참가하면 List<Channel>에서 관리한다.
ChannelSerive에서는
User의 List<Channel>에 channel을 add하는 로직과
Channel의 List<User>에 user를 add하는 로직을 둘다 넣어야한다.
JCFChannelService: 입장기능을 추가하였다.
public List<User> entry(UUID channelId,UUID userId){
Channel channel = findById(channelId);
User user = userService.findById(userId);
channel.setUserList(user);
user.setChannelList(channel);
return channel.getUserList();
}
채널Id와 사용자 Id를 받아서 어느 채널에 어느사용자가 입장할것인지를 판단한다.
Channel과 User 객체를 만들고 각각 List<User>와 List<Channel>에 넣어주었다.
Channel 클래스
public Channel(String channelName, String type, User owner){
//super();
this.channelName = channelName;
this.type = type;
this.owner = owner; //채널의 소유주
this.userList = new ArrayList<>();
this.userList.add(owner); // 소유자는 기본 참여자;
}
Channel이 생성될때 채널을 만든 유저는 기본참여자가 되므로 userList를 ArrayList로 초기화하고 owner를 넣어주었다.
main
//채널 참가
System.out.println("채널1의 유저목록: " + channelService.entry(channel1.getId(),user4.getId()));
System.out.println("채널2의 유저목록: " + channelService.entry(channel2.getId(),user4.getId()));
이런식으로 channel1의 Id와 user4의 Id를 넣는식으로 하고 print하면
[결과]
채널1의 유저목록: [User{id=ff0b6d2e-4678-44bc-abcd-9f511577db24, username='인성', email='kis2690@naver.com', status='online', 생성일자=1768296695154, 수정일자=null}, User{id=980e620c-1f46-4114-9925-f4e079f363cf, username='승택', email='nst@naver.com', status='online', 생성일자=1768296695154, 수정일자=null}]
채널2의 유저목록: [User{id=21acd640-fb89-4680-9c08-ad9bfaffaca1, username='조뿡빵', email='choenbi@gmail.com', status='offline', 생성일자=1768296695154, 수정일자=1768296695178}, User{id=980e620c-1f46-4114-9925-f4e079f363cf, username='승택', email='nst@naver.com', status='online', 생성일자=1768296695154, 수정일자=null}]
user4에 해당하는 "승택"이 채널1,2모두 들어가서 출력되는 결과가 나온다.
2.특정 유저가 참여하고 있는 채널 리스트 조회
ChannelService의 entry()에서 User클래스에 채널을 저장하도록 했음으로
User클래스에서 List<Channel>을 출력하기만 하면 된다.
User 클래스
public List<Channel> getChannelList(){
return channelList;
}
public void setChannelList(Channel channel){
channelList.add(channel);
}
List<Channel>의 Getter/Setter을 만들어주었다.
Setter는 ChannelService에서 추가할때 사용하였고, Getter는 지금 조회 기능에서 사용하면된다.
JCFUserService 클래스
public List<Channel> selectChannel(UUID id){
User user = findById(id);
return user.getChannelList();
}
selectChannel() 이라는 메서드를 만들고 user객체를 생성해서 객체내 Getter를 호출하는 방식으로 하였다.
[결과]
user4의 채널목록: [User{id=085e2eee-0a4a-4407-8d7e-21eaaa9757cf, channelName='코드잇 벡엔드', type='텍스트', ownerId='ff0b6d2e-4678-44bc-abcd-9f511577db24', 생성일자=1768296695155, 수정일자=null}, User{id=ceedbce2-7a99-4e5f-9827-42db1fd6e66a, channelName='코드잇 프론트엔드', type='음성', ownerId='21acd640-fb89-4680-9c08-ad9bfaffaca1', 생성일자=1768296695155, 수정일자=null}]
"승택"에 해당하는 user4가 참여하고있는 채널의 목록을 조회하니
채널1,채널2가 나옴을 알 수 있다.
3.채널에서 나가는 기능
Channel 클래스: leave는 channel의 순수한 기능이다.
public void leave(User user){
if(user.equals(owner)){
throw new IllegalArgumentException("방장은 퇴장할 수 없습니다.");
}
if(!(userList.contains(user))){
throw new IllegalArgumentException(user.getUserName() + "가 채널에 없습니다.");
}
userList.remove(user);
}
- 나가려는 user와 방장이 같으면 예외처리
- 해당 채널에 참여하고있지 않은 user를 삭제하려고할때 예외처리
JCFChannelService
@Override
public List<User> leave(UUID channelId,UUID userId){
Channel channel = findById(channelId);
User user = userService.findById(userId);
channel.leave(user);
user.removeChannel(channel);
return channel.getUserList();
}
채널 id와 사용자 id를 받고 각각의 객체를 만들어서 사용자는 채널List에서 빼고, 사용자 측에서는 채널을 빼도록 하였다.
'코드잇 스프린트 > 실습' 카테고리의 다른 글
| [sprint5] 디스코드 어플리케이션 채널 생성시 NPE 발생 (0) | 2026.02.23 |
|---|---|
| BasicUserService내 update 기능 피드백. (0) | 2026.01.29 |
| ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?) (0) | 2026.01.28 |
| 피드백) 단건조회는 null 반환 가능성이 있어 Optional로 래핑해라 (0) | 2026.01.21 |
| 간단한 디스코드 프로그램 만들기_ 피드백3(매개변수 변경 ,메서드 이관) (1) | 2026.01.15 |
