글자 수 제한을 어디서 해야할까요?
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()
이라는 같은 결과를 내는 함수를 활용할 수도 있다고 한다.
- 예시 코드이다. MySQL에선
- 이 방법을 사용하려면
leftJoinAndSelect()
로 간단히 모든 필드를 SELECT 했을 때와 다르게 모든 필드를 명시적으로select()
에 넣어줘야 한다. - 어떻게 돌아가는 개념인지는 알겠지만 잘 작동이 되지 않아 일단 덮어두었다..^^
This post is licensed under CC BY 4.0 by the author.