Post

글자 수 제한을 어디서 해야할까요?

social-feed-hub의 게시물 목록 조회, 상세 조회 API를 구현하며, 더 좋은 방법이 없을까 하는 것들

글자 수 제한을 어디서 해야할까요?

글자 수 제한을 어디서 해야할까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  ...
  // 입력된 값대로 정렬해 페이지네이션
  const postings = await queryBuilder
    .orderBy(`posting.${orderBy}`, sortOrder)
    .skip(page * pageCount)
    .take(pageCount)
    .getMany();

  // hashtag depth 정리 & content 글자 수 제한 적용해 반환
  return postings.map((posting) => {
    const arrangedPosting = this.getPostingObjWithHashtags(posting);
    arrangedPosting.content = arrangedPosting.content.substring(0, 20);

    return arrangedPosting;
  });

코드 설명

  • 전체 코드 보기
  • 게시물 목록 조회 API에서, 쿼리 파라미터에 따른 디비 쿼리를 날리고 가져온 데이터 객체를 정제해 넘겨주는 부분이다.
  • 1번에서 설명한 getPostingObjWithHashtags 함수로 hashtag의 depth를 정리하고, content에 글자 수 제한을 적용한다.

문제라고 느끼는 점

  • 현재 코드에선 일단 content를 모두 불러온 뒤, map을 돌려 20자 제한을 적용하고 있다.
  • 20자 이후의 데이터들은 불필요한데도 불구하고 DB에서 가져오고 있기 때문에 비효율적이라는 생각이 들어 이것보다 더 좋은 방법이 있는지 궁금했다.

결론

쿼리단에서 하는 방법도 있을 것 같아 찾아보았다.

  • SELECT 할 때 SUBSTRING() 함수를 사용하는 방법
    1
    2
    3
    4
    5
    6
    
    const postings = await queryBuilder
      .select([
        'posting.id', 
        `SUBSTRING(posting.content, 1, 20) AS content`
      ])
      .getMany();
    
    • 예시 코드이다. MySQL에선 LEFT(), PostgreSQL에선 substring() 이라는 같은 결과를 내는 함수를 활용할 수도 있다고 한다.
  • 이 방법을 사용하려면 leftJoinAndSelect()로 간단히 모든 필드를 SELECT 했을 때와 다르게 모든 필드를 명시적으로 select()에 넣어줘야 한다.
  • 어떻게 돌아가는 개념인지는 알겠지만 잘 작동이 되지 않아 일단 덮어두었다..^^
This post is licensed under CC BY 4.0 by the author.