DonationRepository#findDonationByCreatorOrderByCreatedAtDesc()
1. OrderBy ๊ฐ์
workbench ์์ ํผํฌ๋จผ์คdb๋ก ์ฟผ๋ฆฌ์ ํ๊ท 7์ด๋ ๊ฑธ๋ฆผ (์คํ์
์์ด).
creator_id=1 ์ผ ๋ 7-9s, creator_id=2 ์ผ ๋ 3-4s.
creator_id ๊ฐ 1์ธ donation์ row 1,000,000 ๊ฐ, 2๋ row 618,338 ๊ฐ์ผ.
๋์
- id๋ก ์ ๋ ฌ -> 6ms
- created_at desc ์ธ๋ฑ์ค -> creator_id๊ฐ 1์ด๋ฉด 2s, 2๋ฉด 6ms
- created_at์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๊ฑธ๋ฉด creator_id ์ ๋ฐ๋ผ Duration์ด ๋ฌ๋ผ์ ธ.
- 1,2 ๋ชจ๋ ์คํ๊ณํ์ ๋์ผํจ.
์ผ๋จ id ์ ๋ ฌ๋ก ํด๋จ๋๋ฐ ๊ผญ createdAt์ผ๋ก ์ ๋ ฌํด์ผํ๋ ์ด์ ๊ฐ ์๋ค๋ฉด ์ฝ๋ฉํธ๋ก ์๋ ค์ค.
2. paging ์ฟผ๋ฆฌ ๊ฐ์
limit offset ๋ฐฉ์์ ๊ฐ์
๊ธฐ์กด์๋ ํผํฌ๋จผ์คdb ๊ธฐ์ค offset 40,000๋ถํฐ 0.1s, 280,000๋ถํฐ 1s ๋์ด๊ฐ. (์ ๋ ฌ์ id๋ก ๊ฑธ์์ ๋ ๊ธฐ์ค)
๋ค๋ค ์๋ ๋ด์ฉ์ด๊ฒ ์ง๋ง offset์ ์์ row ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ์ฝ์ํ์ ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์์๋ ์ฟผ๋ฆฌ์์
์ด ์ปค์ ์ฑ๋ฅ์ด ์ข์ง ์์.
๊ทธ๋์ offset ๋์ where ๋ก id๋ก ์กฐ๊ฑด์ ๊ฑธ์ด์ ์ฟผ๋ฆฌ ํ๋๋ก ๊ฐ์ ํ์ด. ์์ผ๋ก ์ด๊ฑธ no offset
๋ฐฉ์์ด๋ผ๊ณ ๋งํ ๊ฒ.
no offset
๋ฐฉ์์ ๋๋ณด๊ธฐ ๋ฐฉ์์ผ๋ก๋ง ๊ตฌํ์ด ๊ฐ๋ฅํด. ์ผ๋ฐ์ ์ธ ํ์ด์ง()์ ์ ์ฉํ ์ ์๋ ์ ๋ง ๋ง์ด ์๊ฐํด๋ดค๋๋ฐ, ๊ฒฐ๋ก ์ ๋ถ๊ฐ๋ฅํ๊ฑธ๋ก ๋์์ด.
์ฐ๋ฆฌ ํ์ด์ง์ ๋๋ณด๊ธฐ ๋ฐฉ์์ด๋๊น ๊ทธ๋๋ก ์งํํ๋ฉด ๋ ๋ฏ. ๋์ API ์์ ์ด ํ์ํด (/donations/me
).
API ๋ณ๊ฒฝ์
AS-IS
# ์์ฒญ url
/donations/me?size=2&page=1
# ์๋ต json
[
{
"donationId" : 1,
"name" : "name1",
"message" : "message1",
"pageName" : "pagename",
"amount" : 1000,
"createdAt" : "2021-10-21T10:47:44.620008"
},
{
...
}
]
TO-BE
์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ lastPageId
= ์ ํ์ด์ง์ ๋ง์ง๋ง ๋๋ค์ด์
์ id. ๋ค๋ฅธ์ด๋ฆ๋ ์ถ์ฒ๋ฐ์
lastPageId
๊ฐ 0์ด๋ฉด ๊ฐ์ฅ ์ต์ , 0์ด ์๋๊ฒฝ์ฐ์ where id < lastPageId
๋ก ์กฐ๊ฑด์ ๊ฑธ์ด ํด๋น ๋๋ค์ด์
๋ถํฐ ์กฐํ.
- 1์: ์๋ตjson์ "lastPageId" ํ๋๋ฅผ ๋ฐ๋ก ์ค์ ํ๋ก ํธ๊ฐ ๋ค์ ์์ฒญํ ๋ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ. ์๋ตjson ํ์์ด ๋ฐ๋๋ค๋ ๋จ์ .
- 2์: ์๋ตjson ๊ธฐ์กด๊ณผ ๋์ผ. JS์์ ๋ง์ง๋ง ์์์ donatioId๋ฅผ ๋นผ์ ์์ฒญ.
์์ฒญ url (1,2์ ๋์ผ)
/donations/me?lastPageId=1
์๋ต json
# 1์
{
"lastPageId": 5
"result": [
{
"donationId" : 1,
"name" : "name1",
"message" : "message1",
"pageName" : "pagename",
"amount" : 1000,
"createdAt" : "2021-10-21T10:47:44.620008"
},
{
...
}
]
}
# 2์
# AS-IS ์ ๊ฐ์
์กฐ์กธ๋๋์ ํ์ด์ง ์ฑ๋ฅ ๊ฐ์ ์ํฐํด์ ์ฐธ๊ณ ํ์ด.
3. ์ด๋ฆ ๋ณ๊ฒฝ: find5NewestDonationsPage()
์ด๋ฆ์๋ paging ์ฟผ๋ฆฌ๋ผ๋ ๋ป, ์ต์ ๊ฒ๋ถํฐ 5๊ฐ์ฉ ๊ฐ์ ธ์จ๋ค๋ ๋ป์ด ์์์ผ๋ฉด ์ข๊ฒ ์ด์ ์ผ๋จ ์ด๋ ๊ฒ ์ง์๋๋ฐ ๋ ์ข์ ์๊ฒฌ์์ผ๋ฉด ์๊ธฐํด์ค!
๊ธฐํ
- DonationRepository ์
donationOwner()
-> donationReceiver()
ํ๋ก์ ํธ์์ DonationOwner๋ผ๋ ํํ์ด ๋ ๊ณณ์์ ์ฐ์ด๋๋ฐ, ์๋ก ์๋ฏธ๊ฐ ๋ฌ๋ผ. ๊ทธ๋์ ํ์์ ๋ฐ๋ ์ฐฝ์์์ชฝ์ Receiver๋ก ๋ฐ๊ฟจ์ด
WrongDonationOwnerException
์ ํ์์์ธ์ง ๊ฒ์ฌ
- ๋ ํฌ์งํ ๋ฆฌ์ชฝ์
donationOwner()
๋ ์ฐฝ์์์ธ์ง ๊ฒ์ฌ.
- MemberRepository#findCurations() ์ฑ๋ฅ ์ด์
ํผํฌ๋จผ์คdb ๊ธฐ์ค ํ๊ท 14sec์ด ๊ฑธ๋ ธ์ด. ๋จ๋ฐ์ฑ ์ฟผ๋ฆฌ๋ก ๊ฐ์ ๊ฒฐ๊ณผ์ ๋ด์ง๋ง ์ฑ๋ฅ์ข์ ์ฟผ๋ฆฌ๋ฅผ ์ง๊ธด ํ๋ค๊ฒ๊ฐ๊ณ , ์๋ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ ๊ฒ ๊ฐ์.
- DonationRepository#calculateExchangeAmountFromDonation() ์ ๊ฑฐ
feature server