항해99/개발일지

20220302 개발일지 #유저 이름 랜덤으로 구현하기

paran21 2022. 3. 4. 01:08

socket.io는 별도로 구현하기 때문에 이것과 상관없이 spring은 계획한대로 진행하기로 했다.

API 명세 중 우선 방 만들기와 방 참여하기 부분을 구현했다.

 

로그인이 없이 게임을 참여할 때만 유저를 임시로 만들기로 했기 때문에 이 부분을 어떻게 처리해야 할지 고민이 많았다.

우선은 유저의 nickName을 임의로 주기로 했는데, 로직을 어떻게할지 고민이 많았다.

처음 생각했던 것은 별도의 엔티티를 생성해서 거기서 가져와 쓰는 것이었는데 이렇게 하면 유저가 추가될 때마다 DB가 조회되고, 유저샘플로 저장할 데이터가 많은 것도 아니라 그냥 방을 생성할 때 배열을 만들고 거기서 닉네임을 랜덤으로 꺼내오는 메소드를 만들었다.

private String getNickName() {
    // User에 nickNameList 만들기
    List<String> nickNameList = new ArrayList<>(Arrays.asList("red", "blue", "yellow", "green"));

    // nickNameList에서 랜덤으로 nickName 가져오기
    Random random = new Random();
    int num = random.nextInt(nickNameList.size());
    return nickNameList.get(num);
}

유저의 이름을 어떻게 할지는 아직 확정된 게 아니지만 저걸로 방탈출 문제를 만들어도 재미있을 것 같다.

 

방을 만들때는 만든 사람을 User로 만들어 방과 함께 저장해주고 createdUser에 nickName을 저장하였다.

public void createRoom(RoomRequestDto roomRequestDto) {
    // roomRepository.save(teamName, createdUser:방장이야 user의 nickName을 저장)
    String teamName = roomRequestDto.getTeamName();
    String userId = roomRequestDto.getUserId();
    // nickName 부여
    String nickName = getNickName();
    String img = "";

    // 방 저장
    Room room = roomRepository.save(new Room(teamName, nickName)); // createdUser, 생성자 사용하는 방법 , 순서대로 간다. 이름달라도 된다.

    // 방장 User 저장
    User user = User.addUser(room, nickName, img, userId);
    userRepository.save(user);
}

방에 참여할 때도 동일한 메소드를 사용해서 추가해주었다.

// 방 참여하기
public void addMember(Long roomId, RoomAddRequestDto roomAddRequestDto) {
    // 방 찾기
    Room room = roomRepository.findById(roomId)
            .orElseThrow(() -> new CustomException(ROOM_NOT_FOUND));
    
    // 방의 인원을 확인하고
    if(room.getUserList().size() == ROOM_CAPACITY) {
        throw new CustomException(ROOM_MEMBER_FULL);
    } else {
        // nickName 부여
        String userId = roomAddRequestDto.getUserId();
        String nickName = getNickName();
        String img = "";

        // user 정보를 해당 room에 추가
        // user 저장
        User user = User.addUser(room, nickName, img, userId);
        userRepository.save(user);
    }
}

문제는 이렇게 할 경우 방을 만들고 유저를 추가할 때마다 배열을 다시 만들게 된다.

이 반복을 피하기 위해 DB에 저장을 하려고 했는데 그러면 매번 DB를 조회해야하고, 배열이기 때문에 entity를 별도로 만들어서 연결해야한다.

유저 부분은 추가로 수정하면서 어떤 방법이 더 효율적일지 고민해봐야겠다.

 

또, 이미지의 경우 나중에 서버에서 S3를 연결해서 url만 내려주는 방식으로 진행하기로 했다.

'항해99 > 개발일지' 카테고리의 다른 글

20220304 개발일지  (0) 2022.03.05
20220303 개발일지 #socket.io  (0) 2022.03.04
20220301 개발일지 #webRTC!!??  (0) 2022.03.03
20220228 개발일지 #실전프로젝트  (1) 2022.02.28
20220223 개발일지  (0) 2022.02.23