간단한 디스코드 프로그램 만들기_ 각 필드에 List 추가해서 기능 추가하기.

2026. 1. 14. 11:30·코드잇 스프린트/실습

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
'코드잇 스프린트/실습' 카테고리의 다른 글
  • BasicUserService내 update 기능 피드백.
  • ReadStatus,UserStatus,BinaryContent 도메인 추가(왜 추가하는거고, 어떤 역할을 하는지?)
  • 피드백) 단건조회는 null 반환 가능성이 있어 Optional로 래핑해라
  • 간단한 디스코드 프로그램 만들기_ 피드백3(매개변수 변경 ,메서드 이관)
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • 위클리페이퍼 (6)
      • 파이썬 (4)
      • 코드잇 스프린트 (48)
        • Spring 이론 (7)
        • Java이론 (11)
        • 실습 (23)
      • 백엔드 개발자 최소기준 (1)
      • 코딩테스트 (5)
        • 알고리즘 (0)
        • SQL (1)
      • Git (5)
      • 스프링부트 핵심가이드 (1)
      • 트러블 슈팅 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
과컴
간단한 디스코드 프로그램 만들기_ 각 필드에 List 추가해서 기능 추가하기.
상단으로

티스토리툴바