[MongoDB]String ID로 인한 @RequestParam의 defaultValue 문제 해결하기

LeeYulhee·2023년 8월 21일
0

👉 오류 개요


  • 기존에는 MariaDB를 사용해서 DM 메세지의 Id가 Long 형태
    • ⇒ @RequestParam(defaultValue = 0)으로 설정하면 Null 값이 들어가지 않아 로직이 제대로 작동
  • MongoDB를 사용하니 Id가 String 형태라 defaultValue를 설정하기가 어려웠고, Null 발생으로 로직 미작동 혹은 오류 발생



👉 오류 메세지 내용


'Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON'
  • fetch(/dm/rooms/${dmId}/messages?fromMessageId=${fromMessageId} 부분에 fromMessageId가 Null이라 오류 발생
    • ⇒ JSON을 파싱 해야 되는데 오류가 남 → 404에 오류에 설정한 페이지가 출력되어 HTML 파일이 반환 → 해당 오류 발생



👉 해결


  • 📌 Controller

    @GetMapping("/dm/rooms/{dmId}/messages")
    @ResponseBody
    public List<DmMessageDto> findAll(
            @PathVariable Long dmId, @AuthenticationPrincipal SecurityUser user, @RequestParam(defaultValue = "000000000000000000000000") String fromMessageId) {
    
        List<DmMessageDto> dmMessageDtos =
                dmMessageService.getByDmIdAndUserIdAndFromId(dmId, user.getId(), fromMessageId);
    
        return dmMessageDtos;
    }
    • @RequestParam(defaultValue = "000000000000000000000000")로 설정해 ObjectId에서 안 쓰는 값을 기본으로 넣어주어 Null이 발생하지 않게 설정

  • 📌 Service

    public List<DmMessageDto> getByDmIdAndUserIdAndFromId(Long dmId, Long userId, String fromMessageId) {
    
          Dm dm = dmService.findByDmId(dmId);
    
          DmUser dmuser = dm.getDmUsers().stream()
                  .filter(dmUser -> dmUser.getUser().getId().equals(userId))
                  .findFirst()
                  .orElseThrow(() -> new IllegalArgumentException("오류 발생"));
    
          List<DmMessage> dmMessages = dmMessageRepository.findByDmId(dmId);
    
          List<DmMessage> list = dmMessages.stream()
                  .filter(dmMessage -> new ObjectId(dmMessage.getId()).compareTo(new ObjectId(fromMessageId)) > 0)
                  .sorted(Comparator.comparing(DmMessage::getId))
                  .collect(Collectors.toList());
    
          return DmMessageDto.fromDmMessages(list);
    }
    • stream과 org.bson.types.ObjectId를 이용해 MongoDB에서 부여되는 데이터의 Id를 비교해서 필터링 후 List로 변환

  • 📌 View(JavaScript)

    let fromMessageId = "000000000000000000000000";
    
    function getChatMessages() {
        fetch(`/dm/rooms/${dmId}/messages?fromMessageId=${fromMessageId}`, {
            method: "GET",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            }})
            .then(response => {
                return response.text().then(text => {
                    try {
                        return JSON.parse(text);
                    } catch (e) {
                        console.error("Failed to parse JSON:", text);
                        throw e;
                    }
                });
            })
            .then(body => {
                drawMessages(body);
                console.log(body);
            });
    }
    • JavaScript 파일에도 fromMessageId의 기본 값을 "000000000000000000000000"으로 넣어 fetch의 파라미터에 Null이 들어가서 발생하는 오류 방지
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글