강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

woo님의 프로필 이미지
woo

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

게시글 목록 최적화 전략 구현 - 테스트 에서 오류가 발생합니다

해결된 질문

작성

·

111

0

  • 학습 관련 질문을 최대한 상세히 남겨주세요!

  • 고민 과정도 같이 나열해주셔도 좋습니다.

  • 먼저 유사한 질문이 있었는지 검색해보세요.

  • 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요 거의 막바지에 이르러서 테스트 부분을 들으려 하고 있습니다

테스트 부분에서 강의 코드와 같이 맞춰 보아도 에러가 발생하여 어떤 에러인지 감이 잘 잡히지 않아 질문드립니다.

최하단에 에러 로그를 첨부합니다.

 

저장소의 완성 코드 파라미터대로 하면 성공하지만, 강의대로 하면 에러가 납니다

이것은 저장소의 완성본 코드이고

 @Test
    void readAllTest() {
        ArticleReadPageResponse response1 = articleReadRestClient.get()
                .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 3000L, 5))
                .retrieve()
                .body(ArticleReadPageResponse.class);

        System.out.println("response1.getArticleCount() = " + response1.getArticleCount());
        for (ArticleReadResponse article : response1.getArticles()) {
            System.out.println("article.getArticleId() = " + article.getArticleId());
        }

        ArticleReadPageResponse response2 = articleRestClient.get()
                .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 3000L, 5))
                .retrieve()
                .body(ArticleReadPageResponse.class);

        System.out.println("response2.getArticleCount() = " + response2.getArticleCount());
        for (ArticleReadResponse article : response2.getArticles()) {
            System.out.println("article.getArticleId() = " + article.getArticleId());
        }

 

이것은 에러가 발생하는 강의의 코드입니다.

@Test
    void readAllTest(){
        ArticleReadPageResponse response1 = articleReadRestClient.get()
                .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 1L, 5))
                .retrieve()
                .body(ArticleReadPageResponse.class);

        System.out.println("response1 = " + response1);

        for (ArticleReadResponse article : response1.getArticles()) {
            System.out.println("article.getArticleId() = " + article.getArticleId());
        }

        ArticleReadPageResponse response2 = articleRestClient.get()
                .uri("/v1/articles?boardId=%s&page=%s&pageSize=%s".formatted(1L, 1L, 5))
                .retrieve()
                .body(ArticleReadPageResponse.class);

        System.out.println("response2 = " + response2);

        for (ArticleReadResponse article : response2.getArticles()) {
            System.out.println("article.getArticleId() = " + article.getArticleId());
        }
    }

 

이것은 에러 로그입니다

image.png

(본문 제한으로 부득이하게 이미지로 첨부합니다)

답변 2

0

쿠케님의 프로필 이미지
쿠케
지식공유자

woo님, 안녕하세요!

 

"019169492674337349632"를 보면 Long 범위를 넘어가는 숫자인 것 같은데요,

레디스에 직접 잘못된 데이터를 넣으신 적이 있거나 식별자를 변환해서 삽입하는 코드가 잘못 들어가있는걸까요?

강의에서 Snowflake로 자동 생성되는 식별자는 Long으로 articleId를 생성하기 때문에,

"019169492674337349632"라는 숫자가 안 만들어져야 할텐데 이상하네요..!

올려주신 테스트 코드는 페이지 번호만 다를 뿐이라,

테스트 코드 자체의 문제는 아닌 것 같은데,

잘못된 데이터 들어간 원인을 찾아보시거나 제거해보시겠어요?

woo님의 프로필 이미지
woo
질문자

ArticleIdListRepository에서 에러가 납니다

 

public List<Long> readAll(Long boardId, Long offset, Long limit) {
    System.out.println(redisTemplate.opsForZSet()
            .reverseRange(generateKey(boardId), offset, offset + limit - 1)
            .stream().map(Long::valueOf).toList());


로 출력하여 에러를 확인하려 했는데, 이 부분에서 에러가 발생합니다.

파라미터는 이미지에 있는 것과 같으며 브레이크포인트 걸어서 잘 넘어가는 것 확인했습니다.

 

스크린샷 2025-04-15 00-55-24.png

 

쿠케님의 프로필 이미지
쿠케
지식공유자

woo님, 위에 언급드렸듯이 코드 문제가 아니라 데이터가 문제인 것 같습니다!

019169492674337349632가 Long 범위를 초과하는 수 문자열이어서요,

Long::valueOf 코드 호출 과정에 에러가 발생하는 것으로 보입니다.

에러 로그 살펴보시면 NumberFormatException 발생하고 원인이 되는 수 문자열이 나오네요!

이거를 살펴보셔야할 것 같습니다.

정상적인 플로우라면 "019169492674337349632"라는 데이터가 들어갈 일이 없어야할텐데요, 해당 데이터가 들어간 원인을 찾아보시거나 제거해보시겠어요?

woo님의 프로필 이미지
woo
질문자

쿠케님 도와주셔서 감사합니다!

우선 레디스에 데이터가 들어간 원인을 찾을 수 없어 부득이하게 flushall로 초기화한 다음(컨테이너 접속했습니다) 다른 articleApplication, commentApplication 등 구동하여 테스트 성공했습니다.

 

레디스 초기화 후 read 애플리케이션만 켜고 테스트 돌리면 null 값이라고 인식하지 못했는데 다른 애플리케이션들도 전부 구동 후 다시 테스트를 돌리니 잘 됩니다!

 

얼마 안 남았는데 끝까지 해 보겠습니다.

최근 과제 테스트를 앞두고 있고 이력서용 포트폴리오 꾸미고 있는데 분산 처리까지는 아니지만 시스템 설계나 테스트 코드, 특히 인덱스 활용하는 부분 등 많은 도움 받았습니다.

 

힘내서 완강하겠습니다!

쿠케님의 프로필 이미지
쿠케
지식공유자

woo님, 잘 해결하셔서 다행입니다.

직접 실행하며 꼼꼼하게 학습해 주셔서 너무 감사하고 대단하네요!

과제 테스트도 좋은 결과 있으시길 바랍니다.

완강까지도 얼마 안남으셨네요 ㅎㅎㅎ 남은 강의도 화이팅입니다!!

woo님의 프로필 이미지
woo
질문자

그런데 infinitescroll 부분에서 이런 에러가 나서 혹시 이 부분도 어떤 에러인지 여쭤볼 수 있을까요?

 

article의 무한 스크롤은 정상 동작하는데 articleRead에서는 동작하지 않는 것으로 보아 redis가 초기화된 영향 같습니다

image.png


쿠케님의 프로필 이미지
쿠케
지식공유자

에러 로그를 보니 ArticleClient에서 400 에러 응답을 받은 것 같은데요,

Article 서비스 애플리케이션의 에러 로그도 살펴보시겠어요?

0

안녕하세요, 인프런 AI 인턴입니다. woo님.

테스트 코드를 구현하는 과정에서 에러가 발생하고 있어 어려움을 겪고 계신 것 같습니다. 첨부된 에러 로그를 보니 java.lang.NumberFormatException이 발생하고 있으며, 이는 문자열이 예상치 않은 숫자로 변환될 때 주로 발생하는 오류입니다. 이를 해결하기 위해 몇 가지 접근 방법을 제공해드립니다.

문제 해결 접근 방법

  1. URI 파라미터 확인:

    • pageboardId에 숫자가 아닌 값이 들어가고 있는 것 같습니다. 주로 이 부분에서 데이터 완전성이 깨지거나, 서버 측에서 잘못된 형식을 처리하지 못한 경우 발생할 수 있습니다.
  2. 데이터 타입 검토:

    • formatted 함수로 URI 매개 변수를 설정할 때, 매개 변수들이 올바른 형식(E.g., Integer, Long)이 맞는지 확인해보세요. 매개 변수에 문자열 등이 섞여 있는지, formatted 메소드 사용에 문제가 생긴 건 아닌지 점검해야 합니다.
  3. 로그 남기기:

    • 각 파라미터가 기대하는 값인지 로깅을 통해 확인하는 것도 좋습니다. 특히 테스트 실행 전에 매개변수 값을 출력해보면 값이 제대로 초기화되고 전달되는지 명확하게 파악할 수 있습니다.
  4. 문제의 재현 및 식별:

    • ‘저장소의 완성 코드’와 ‘강의의 코드를’ 비교하여 어떤 차이가 있는지를 면밀히 검토해보세요. 페이지 값을 1에서 3000으로 바꾼 이유가 있다면 그 이유가 무엇인지 점검하는 것도 중요합니다. 예를 들어 데이터 범위가 달라졌다면 그에 따라 데이터베이스에서 가져와야 하는 데이터셋도 다를 수 있습니다.

관련하여 유사한 문제를 다루고 있는 인프런의 다른 게시물이 도움이 될 수 있습니다:
- 스프링 애플리케이션의 데이터 타입 문제 해결 방법 (게시글 제목)

위의 방법을 시도해보시고, 전달되는 데이터의 유효성을 검토해보시면 좋겠습니다. 추가적인 문의사항이나 문제 해결에 도움을 원하신다면, 해당 내용을 포함하여 질문을 이어가세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

woo님의 프로필 이미지
woo

작성한 질문수

질문하기