항해99/개발일지

20220314 개발일지

paran21 2022. 3. 18. 23:45

새로운 quiz를 만들면서 imgUrl이 추가되었다.

퀴즈 유형마다 필요한 column이 달라서 RDB에서는 어떻게 스키마를 잡아야 할지 고민이 된다.

현재는 필요한 column을 모두 넣어놓고 값이 없는 column은 null이 저장될 수 있게 지정해놓은 상태이다.

만약에 noSQL을 쓴다고 하면 저장은 스키마 상관없이 자유롭게 할 수 있을 것 같은데, 클라이언트에 데이터를 내려줄때는 어떤 형태로 내려주는게 좋을지 고민이 될 것 같다.

(퀴즈마다 아에 다르게 내려주거나, 아니면 지금처럼 모든 걸 포함하는 dto를 만들어서 해당되는 값이 없으면 null을 넣어주거나....?)

noSQL은 SQL과는 많이 다른 것 같아서 사실 어떤 식으로 구성될지 잘 이해가 안간다.

 

Rank 쪽에서도 수정이 있었다.

Rank와 관련된 API는 전체 Rank 조회하기와 게임 종료 후 5개만 보여주는 2가지 기능이 구현되어 있고, 현재는 로직을 위해 임의값 총 4개가 들어가 있는 상태다.

게임 종료 후 5개를 보여줄 때는 이 임의값을 모두 제외하고 내려줬는데 프론트에서 무조건 5개로 내려줄 수 있는지 물어보셨다.

프론트에서 틀을 잡을 때 매번 개수가 다른 것 보다 다 내려주고 조건을 줘서 임의값을 제거하는 게 더 편한 것 같다.

백엔드에서도 임의값을 빼주는 부분만 빼주면 되서 구현은 금방 했다.

 

그런데 여기서 생각하지 못한 문제가 있었다..!!

현재 Rank는 API가 2개이지만 로직이 대부분 겹쳐서 하나의 메소드에 조건문을 걸어서 사용하고 있었는데, 생각없이 임의값 제거 부분을 뺐더니, 전체 랭크 조회에서도 임의값이 모두 내려가는 문제가 발생했다.!!

물론 프론트에 여기도 빼달라고 요청할 수도 있었지만, 게임 종료 후 5개 조회하기는 틀 때문에 어쩔 수 없는 특수한 경우이고, 일반적인 상황에서는 백엔드에서 로직을 줄이기 위해 넣은 임의값은 제거하고 내리는게 맞다고 생각했다.

 

그래서 Rank에 전체 조회하기인 경우(roomId == -1), 임의값을 제거하고 그렇지 않으면 포함시켜는 걸로 수정하였다.

Long check = 1L;
for (int i = 0; i < rankList.size(); i++) { 
    if (rankList.get(i).getTime().equals("00:00:00")) {
        check--;
    }
    // 전체 조회하기인 경우
    if (roomId == -1) {
        if (rankList.get(i).getTime().equals("00:00:00")
                || rankList.get(i).getTime().equals("99:99:99")) {
            continue;
        }
    }

하나의 메소드를 사용하니까 코드도 훨씬 깔끔한 것 같은데 수정을 할 때는 같은 API를 사용하는 다른 경우도 고려를 해주어야 할 것 같다.

2개의 메소드를 사용하고 공통 부분만 추가 메소드로 뺐어도 결국은 3개 다 수정했을 것 같긴하고..?