1. ์ฑ๋ฅ ์ต์ ํ ๊ณ๊ธฐ
ํ์ฌ ๊ด๋ฆฌ์ ํ์ด์ง์์ ์์ฝ ๋ด์ญ์ ํ์ด์ง ์ฒ๋ฆฌํ์ฌ ์กฐํํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ค.
limit๋ 20์ผ๋ก ํ ํ์ด์ง๋น 20๊ฐ์ ์์ฝ ์ปจํ
์ธ ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ ์ฒด ์์ฝ ๋ฐ์ดํฐ๋ 354,200๊ฐ์ธ ์ํฉ์ด๊ณ ํด๋น API์ ์ฑ๋ฅ์ด ํ๊ท ์ ์ผ๋ก 1.74์ด์ ์๊ฐ์ด ๊ฑธ๋ ธ๊ณ ์ต๋ 1.99์ด๊น์ง ๊ฑธ๋ฆผ์ผ๋ก์จ ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ๋ค. ํด๋น ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชจ์ํ๊ธฐ ์์ํ๋ค.
๋ฏธ๋ฆฌ ๋งํ์๋ฉด, ํ๊ท 56.2%์ ์ฑ๋ฅํฅ์์ ๋ง๋ณด๊ฒ ๋์๋ค!
2. ๋ฐ๋ณต๋๋ Count Query๋ฅผ ๊ฐ์ ํด๋ณด์!
ํด๋น ๋ถ๋ถ์์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ ๋ถ๋ถ์ผ๋ก ๊ฐ์ฅ ๋์ ๋๊ฒ์ ๋งค๋ฒ ๋ฐ๋ณต๋๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์๋ฅผ ์ธก์ ํ๋ Count Query์๋ค.
"๊ตณ์ด Count Query๊ฐ ํ์ด์ง๋ง๋ค ๋งค๋ฒ ๋ฐ๋ณต๋ ํ์๊ฐ ์์๊น?" ์๊ฐํ๊ณ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ๊ฒ ๋์๋ค.
- ํ๋ฒ ์กฐํ ์์ฒญ์ด ๋ค์ด์์ ๋ totalCount๋ฅผ Redis ์บ์์ ์ ์ฅํด๋์๋ค๊ฐ, ์์ฝ์ด ์๋ก ๋ค์ด์ค๊ธฐ์ ์๋ ์บ์์์ totalCount๋ฅผ ๊บผ๋ด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ๋๋ค.
- ๋ง์ฝ, ์๋ก์ด ์์ฝ์ด ๋ฐ์ํ๋ฉด ์บ์์ ์๋ totalCount์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ฌ ์ ํฉ์ฑ์ด ๋ง์ง ์์ ์ ์๋ ๋ฌธ์ ๋ ํด๊ฒฐํ ์ ์๋ค.
์ฐ์ ์ฝ๋๋ฅผ ๋ณด์!
public Page<SearchReservationByPagingRes> findAllByConditionAndPageable(ReservationSearchCondition condition, Pageable pageable) {
List<SearchReservationByPagingRes> content = queryFactory
.select(xxx)
.from(reservation)
... join
... where
.orderBy(reservation.startAt.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
JPAQuery<Long> countQuery = queryFactory
.select(reservation.count())
.from(reservation)
... join
... where
return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
}
๊ธฐ์กด์๋ findAllByConditionAndPageable() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ์์กฐ๊ฑด์ ๋ง๋ ๐๐ปcontents๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ์ธํธ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
3. ํด๊ฒฐ ๊ณผ์
(1) ์ฐ์ , ์๋์ ๊ฐ์ด countQuery๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํ์๋ค.
(2) ๋ค์์ผ๋ก Look-Aside ์ ๋ต์ ์ด์ฉํ์ฌ ์์ฝ ๋ด์ญ ํ์ด์ง ์กฐํ ์๋น์ค ๊ณ์ธต์์ ์๋์ ๊ฐ์ด Redis ์บ์์ totalCount ๊ฐ์ด ์์ผ๋ฉด ์บ์์์ ์ฝ์ด์ค๊ณ , ๋ง์ฝ totalCount๊ฐ ์์ด์ Cache Miss๊ฐ ๋ฐ์ํ๋ค๋ฉด ์์ countQuery๋ฅผ ์คํํ์ฌ RDB์์ ๊ฐ์ ์ฝ์ด์์ ์บ์์๋ ์ ์ฅํด์ฃผ๋ ์ ๋ต์ ์ฌ์ฉํ๋ค.
(์ฌ๊ธฐ์๋ ๋์ ๊ฒ์ ์กฐ๊ฑด์ด ํฌํจ๋ ๊ธฐ๋ฅ์ด์ด์ ํค ๊ฐ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋ ๊ฒ์
๋๋ค!)
(3) ์ด์ Repository์ ํ์ด์ง ์ฟผ๋ฆฌ ๋ฉ์๋์ ์ธ์๋ก totalCount๋ฅผ ๋๊ฒจ์ฃผ์ด์ Page ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ PageImpl์ ์์ฑํ๋๋ฐ ์ฌ์ฉํ๋ค.
public Page<SearchReservationByPagingRes> findAllByConditionAndPageable(ReservationSearchCondition condition, Pageable pageable, Long count) {
.... ์ปจํ
์ธ ์กฐํ ์ฟผ๋ฆฌ
return new PageImpl<>(content, pageable, count);
}
(4) ์์ฝ์ด ๋ฐ์ํ๋ฉด ์บ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด์ฃผ๋ ์์ ๋ง ์ถ๊ฐํ๋ฉด ๋์ด๋ค.
4. ์ฑ๋ฅ์ ๋น๊ตํด๋ณด์
์ฐ์ ํ๋ฒ ์คํํด๋ดค๋๋ฐ ์์ ๊ฐ์ด ์คํ ์๊ฐ์ด 1173ms๋ก ๋ํญ ๊ฐ์ํ ๊ฒ์ ๋ณผ ์ ์์๋ค.
ํ๋ฒ์ผ๋ก๋ ๋ถ์กฑํ๋ค. ์ฌ๋ฌ๋ฒ ๋ ์ธก์ ํด๋ณด๊ณ ๋น๊ตํด๋ณด์๋ค.
์ ์ฒด ์์ฝ ๋ฐ์ดํฐ๋ 354,200๊ฐ, limit๋ 20์ด๋ค.
๋นจ๊ฐ์ ์ totalCount๋ฅผ ์บ์ฑํ์ง ์์์ ๋, ํ๋์ ์ totalCount๋ฅผ ์บ์ฑํ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ธ๋ค.
๊ฐ 10ํ์ฉ ๋ฐ๋ณตํด๋ณด์์๋,
- ํ๊ท ๋น๊ต : 56.2% ์ฑ๋ฅํฅ์
- Redis O์ ์ต์๊ฐ๊ณผ Redis X์ ์ต๋๊ฐ ๋น๊ต : 105% ์ฑ๋ฅํฅ์
- ์๋ก ์ต๋๊ฐ๋ผ๋ฆฌ ๋น๊ต : 64.5% ์ฑ๋ฅํฅ์
์ด๋ ๊ฒ ์ฑ๋ฅ์ด ํฅ์๋ ๊ฒ์ ๊ฒฝํํ ์ ์์๋ค.
5. ๋์ ์ฟผ๋ฆฌ๋ก ํํฐ๋ง ์กฐ๊ฑด์ ์ถ๊ฐ
ํ์ง๋ง, ๊ทธ๋๋ ํ๊ท ์ ์ผ๋ก 1113.6ms ๊ฐ ์๋ชจ ๋๋ค.
๊ฒฐ์ฝ ์งง์ ์๊ฐ์ด ์๋๊ธฐ์ ๊ด๋ฆฌ์๊ฐ ๋๋ผ๋ ๋๋ ์ด๋ฅผ ๋ ์ค์ด๊ธฐ ์ํด ํธ๋ฒ?์ ์๋์ง๋ง ํํฐ๋ง ์กฐ๊ฑด๋ค์ ์ฌ๋ฌ๊ฐ ๋ ์ถ๊ฐํ์๋ค.
์์ ๊ฐ์ด ๊ด๋ฆฌ์ ํ์ด์ง์์๋ ๊ธฐ๊ฐ๋ณ๋ก, ํ์์ ์ด๋ฆ, ์์ด๋๋ณ๋ก, ํ์์ค ์ด๋ฆ๋ณ๋ก, ์์ฝ ์ํ๋ณ๋ก ๊ฒ์ํ ์ ์๋ ์กฐ๊ฑด์ ์ถ๊ฐํ์๋ค.
Querydsl์ ์ฌ์ฉํ์ฌ ํด๋น ์กฐ๊ฑด์ ๋์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๊ตฌํํจ์ผ๋ก์จ ๋ ์ ์ฐํ๊ฒ ๊ตฌํํ์๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ์กฐ๊ฑด์ ๋ํด์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ ์ ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์นด๋๋๋ฆฌํฐ, ์ ํ๋, ํ์ฉ๋, ์์ ๋น๋๋ฅผ ๊ณ ๋ คํด์
์ถ๊ฐํ๋ฉด ๋ ์ข์ ์ฑ๋ฅ์ ์ป์ ์ ์๋ค.
์ค์ ๋ก, Member ํ
์ด๋ธ์ name(ํ์์ด๋ฆ) ์ปฌ๋ผ์ ์ธ๋ฑ์ฑํ์ฌ
ํ์์ด๋ฆ์ ์กฐ๊ฑด์ผ๋ก ๊ด๋ฆฌ์์ ์์ฝ ๋ด์ญ ์กฐํ ๊ธฐ๋ฅ์ ์คํ ์๊ฐ์ 563ms -> 78ms๋ก ์ค์ด๋ค๊ฒ ๋์๋ค.
'๐จโ๐ฉโ๐งโ๐ฆ Project > ๐บ KIOSEK' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Redis๋ฅผ ์ด์ฉํด์ ํ ํฐ ์ฌ๋ฐ๊ธ ๊ธฐ๋ฅ ์ฑ๋ฅ ์ต์ ํ (0) | 2023.08.21 |
---|---|
Index๋ฅผ ์ด์ฉํ์ฌ ์กฐํ ์ฟผ๋ฆฌ 1374% ์ฑ๋ฅ ํฅ์๊ธฐ (with MySQL) (0) | 2023.08.16 |
๋ฐฐํฌ ์๋ํ ๊ตฌ์ถ๊ธฐ (0) | 2023.07.31 |
๊ฐ๋ฐ ์๋ฒ AWS ํด๋ผ์ฐ๋ ์๋น์ค๋ก ์ด์ฃผ๊ธฐ (0) | 2023.07.31 |
ํ๋ก์ ํธ ํ๊ณ (0) | 2023.07.13 |