- ์๊ฐ
- ๊ธฐ๋ฐ ๊ธฐ์
- API Reference
- ํ๋ก์ ํธ ์งํ ๋ฐ ์ด์ ๊ด๋ฆฌ
- ๊ตฌํ๊ณผ์ (์ค๊ณ ๋ฐ ์๋)
- TIL ๋ฐ ํ๊ณ
- Authors
- References
์ฌ๋ฌ ์์
๋ฏธ๋์ด ์๋น์ค์ ์ฌ๋ผ์จ ๊ฒ์๋ฌผ์ ํด์ํ๊ทธ ๊ธฐ๋ฐ์ผ๋ก ์ทจํฉํ์ฌ ํตํฉ ์ ๊ณตํ๋ ์๋น์ค์
๋๋ค.
- ์ธ์ด
- Java 17
- ์น ํ๋ ์์ํฌ
- SpringBoot 2.7.17
- DB ์ ๊ทผ ๊ธฐ์
- Spring Data JPA
- Spring JDBC (Bulk Insert์ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ํด ์ฌ์ฉ)
- QueryDSL
- DBMS
- H2 (SpringBoot embedded)
- (JPA์ ANSIํ์ค SQL๋ฌธ ์ฌ์ฉ์ผ๋ก, ๋๋ถ๋ถ์ RDBMS์ ํธํ๋ ๊ฒ์ผ๋ก ์๊ฐ๋จ.)
์์ฑ์์
๋ฌดํ ์คํฌ๋กค์ ๊ณ ๋ คํ ์ ์ ๋ง์ถค ์ปจํ ์ธ ์กฐํ - click
- ์๋น์ค ํน์ฑ
- ์์ ๋ฏธ๋์ด์ ํน์ฑ์ ๊ฒ์๋ฌผ์ด ์์ฃผ ์ ๋ฐ์ดํธ๋จ.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฌดํ์คํฌ๋กค ๋ฐฉ์์ UX๋ฅผ ์ฑํํ ๊ฒ์.
- ๋ชจ๋ SNS ๊ฒ์๋ฌผ์ ์ ๋ถ ํฌ๋กค๋งํ์ฌ ์ ์ฅ ๊ฒ์ ๊ฒ์ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํจ.
- ๋ณธ ์๋น์ค์์ ๊ด๋ฆฌํ๋ ํด์ํ๊ทธ๊ฐ ํฌํจ๋ ๊ฒ์๋ฌผ์ ํํด์ ์ ์ฅํ๊ฒ ๋จ.
- ๋๋ฌธ์, ๋ณธ ์๋น์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์์๋ ์ค์ ๊ฒ์๋ฌผ์ด ๊ฒ์๋ ์์์ ์ ํ ๋ค๋ฅผ ์ ์์.(๋ณธ ์๋น์ค์์ ๊ด๋ฆฌํ๋ PK ์์ฑ ๋ฐฉ์๊ณผ ๊ด๋ จํ์ฌ ๊ณ ๋ คํ ํ์๊ฐ ์์.)
- ๋ฌดํ์คํฌ๋กค ๊ตฌํ
- ๊ตฌํ ๋ฐฉ๋ฒ ๊ฒฐ์ (๋ง์ง๋ง ์กฐํ ๊ฒฐ๊ณผ ์ดํ ์์ ๋ถํฐ ์ฟผ๋ฆฌ)
- ๋จ์ offset ์ฌ์ฉ์ ์ ์ ํ์ง ์๋ค๊ณ ํ๋จํจ.
- ๋ค์ ํ์ด์ง๋ฅผ ์กฐํํ๊ธฐ ์ ์ ์๋ก์ด ๊ฒ์๋ฌผ์ด ์ฌ๋ผ์จ๋ค๋ฉด, ์ค๋ณต๋๋ ๊ฒ์๋ฌผ์ด ๋ฑ์ฅํ ์ ์์.
- UX ์ธก๋ฉด์์, ์คํฌ๋กค์ ๋ด๋ฆด ๋, ์ค๋ณต๋ ๊ฒ์๋ฌผ์ด ๋ฑ์ฅํ๋ ๊ฒ์ ์ข์ง ๋ชปํจ.
- ๋ง์ง๋ง ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ทธ ์ดํ์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํ ํ์๊ฐ ์๋ค๊ณ ๊ฒฐ๋ก ์ ๋.
- ๋จ์ offset ์ฌ์ฉ์ ์ ์ ํ์ง ์๋ค๊ณ ํ๋จํจ.
- ๋ง์ง๋ง ์กฐํ ๊ฒฐ๊ณผ๋ฅผ DB์์ ์ด๋ป๊ฒ ํน์ ํ ๊ฒ์ธ๊ฐ
- Incremental, ํน์ Time-Based๋ก ์์ฑ๋ PK๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋, ๋ณธ ์๋น์ค์์๋ ๋ถ์ ์ ํ๋ค๊ณ ํ๋จํจ.
- ์ฌ๋ฌ SNS์ ๊ฒ์๋ฌผ ID ํ์ ๊ณผ ๊ด๋ฆฌ ์ฒด๊ณ๊ฐ ๋ค๋ฆ. ๋๋ฌธ์ ๋ณธ ์๋น์ค์์๋ ๋๋ฆฌํคPK๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋จํ์์.
- SNS ๊ฒ์๋ฌผ์ ์ค์ ๊ฒ์ ์์ ๊ณผ, ๋ณธ ์๋น์ค์์ DB์ ์ ์ฅํ ์์ ์ ๋ค๋ฅผ ์ ์์.
- ์ ๋ฌธ์ ๋ ์ ๊ทํ๋ฅผ ํฌ๊ธฐํ๊ณ , ํด์ํ๊ทธ๋ง๋ค
Content๋ฅผ ์ค๋ณต ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์๊ธฐ๋ ํ์ง๋ง, ๋ณด๋ค ์จ๊ฑดํ ๋ฐฉ๋ฒ์ ์ฑํํจ.- ๋ฌธ์ ์ ์ฌ๊ฐ์ฑ์ ๋นํด์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋๋ฌด ๊ธ์ง์ ์ด๋ผ๊ณ ํ๋จํจ.
- ํต๊ณ ๊ด๋ จ ๊ธฐ๋ฅ ๊ตฌํ์ ์ ๋ก์ฌํญ์ด ์์ ์๋ ์๋ค๊ณ ํ๋จํจ.
- ๋ง์ง๋ง ์กฐํ๋ ๊ฒ์๋ฌผ์ ํน์ ํ๊ธฐ ์ํด์ ๊ฒ์๋ฌผ ์์ฑ์์ ์ธ
createdAt์ ํ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํจ.
- Incremental, ํน์ Time-Based๋ก ์์ฑ๋ PK๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋, ๋ณธ ์๋น์ค์์๋ ๋ถ์ ์ ํ๋ค๊ณ ํ๋จํจ.
- ๊ตฌํ ๋ฐฉ๋ฒ ๊ฒฐ์ (๋ง์ง๋ง ์กฐํ ๊ฒฐ๊ณผ ์ดํ ์์ ๋ถํฐ ์ฟผ๋ฆฌ)
- ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์
- ๋ฌธ์์ด ๋งค์นญ ์ฑ๋ฅ ๋ฌธ์
Content.hashtag๋ฅผ ๊ณต๋ฐฑ ๊ตฌ๋ถ ๋ฌธ์์ด๋ก ์ ์ฅํจ.like %tofind%๋ก ๊ฒ์ฌํ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.- ํด๊ฒฐ๋ฐฉ๋ฒ
HashtagContent์ํฐํฐ(ํ ์ด๋ธ)๋ฅผ ๋ง๋ค์ด ์ต์ ํ๋ฅผ ์๋ํ์์.HashtagContentLong id(๋๋ฆฌํค, PK)String hashtagLong contentId(์ธ๋ํค)
- Join ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์
- ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ํ์ฉํ ์ ์๋ ๋ฌธ์
- ์์ ์ธ๊ธํ ์๊ฐ ๊ธฐ๋ฐ์ผ๋ก ์ด์ ๊ฒ์๋ฌผ์ ํน์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ดํ, ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ํ์ฉํ ์ ์๋ค๋ ์ ์ ์ธ์งํ์์.
- ํด๊ฒฐ๋ฐฉ๋ฒ
- ์ ๊ทํ๋ฅผ ์กฐ๊ธ ํฌ๊ธฐํ๊ณ ,
HashtagContent์createdAt์ปฌ๋ผ์ ์ถ๊ฐํจ.- join์, ๋๋ผ์ด๋น ํ ์ด๋ธ์ Row ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด์์.
createdAt์HashtagContent์ ์ถ๊ฐํ ๊ฒฝ์ฐ, ๋๋ผ์ด๋น ํ ์ด๋ธ์์ ๋ชฉ๋ก ์ปจํ ์ธ ์ฟผ๋ฆฌ์ ํ์ํ ๋ชจ๋ ์กฐ๊ฑด์ ์์ฑํ ์ ์์.- ์ฟผ๋ฆฌ ์กฐ๊ฑด์
HashtagContent์ ์ค์ ๋ ๋ณตํฉ ์ธ๋ฑ์ค (hashtag,createdAt)๋ฅผ ํตํด ์์ ํ ์ปค๋ฒ ๊ฐ๋ฅํจ.
- ์ฟผ๋ฆฌ ์กฐ๊ฑด์
- ๋๋ฆฌ๋ธ ํ
์ด๋ธ์ ๊ฐ(์ด ๊ฒฝ์ฐ
Content.createdAt)์ ์์กด์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ ๋น์ฉ ์์ธก์ด ์ฌ์์ง.
- ์ ๊ทํ๋ฅผ ์กฐ๊ธ ํฌ๊ธฐํ๊ณ ,
- ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ํ์ฉํ ์ ์๋ ๋ฌธ์
- ๋ฌธ์์ด ๋งค์นญ ์ฑ๋ฅ ๋ฌธ์
- ๊ฒ์๋ฌผ ์์ฑ ์์ ์ ์ธ๋ถ์ฑ(granularity)๊ณผ ๊ด๋ จ๋ ๋ฌธ์
- ์ธ๋ถ SNS์์ ๊ฒ์๋ฌผ ์์ฑ ์์ ์ ์ผ๋ง๋ ์์ธํ๊ฒ ์ ๊ณตํ๋๋์ ๋ฐ๋ผ์ ์ฟผ๋ฆฌ ๋ฐฉ์์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฐ์์ด ๊ฐ๋ฅํจ.
- DB์๋ ์~์์ญms ๋จ์๋ก ์ธ๋ถํ๋ ์๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅ ๊ฐ๋ฅํ์ง๋ง, ์ธ๋ถ ์๋น์ค๊ฐ ์๊ฐ์ ์ผ๋ง๋ ์์ธํ ์ ๊ณตํ๋์ง ๊ณ ๋ คํ์ฌ์ผํจ.
- ๋ง์ฝ API๋ก ์ ๊ณต๋๋ ๊ฒ์๋ฌผ์ ์๊ฐ ๋จ์๊ฐ 1์ด, 1๋ถ๊ณผ ๊ฐ์ด ํฐ ๋จ์๋ก ์ ๊ณต๋๋ค๋ฉด, ๋์ผํ ์๊ฐ์ ์์ฑ๋ ๊ฒ์๋ฌผ์ด ์ฌ๋ฟ ์กด์ฌํ ์ ์์.
- ์ด ๊ฒฝ์ฐ,
createdAt์ ๊ธฐ๋ฐ์ผ๋ก ๋ฌดํ์คํฌ๋กค์ ๊ตฌํํ ๋ณธ ์๋น์ค์์, ๋์ผํ ๊ฒฐ๊ณผ๋ง ์ง์์ ์ผ๋ก ์ฟผ๋ฆฌ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์.
- ์ด ๊ฒฝ์ฐ,
- ํด๊ฒฐ๋ฐฉ๋ฒ
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์
offset์กฐ๊ฑด์ ์ถ๊ฐํ๊ณ , ๋ค์ ์ฟผ๋ฆฌ์offset์ค์ ์ด ํ์ํ ๊ฒฝ์ฐ(๋ง์ง๋ง ์กฐํ๋ ๊ฒ์๋ฌผ์ ์์ฑ์์ ๊ณผ, ๊ทธ ์งํ์ ์์ฑ์์ ์ด ๊ฐ์ ๊ฒฝ์ฐ), ์ด๋ฅผ ํ๋จํ์ฌ ๋ฐํํ๋๋ก api ์คํ์ ์์ฑํ์์. createdAtํ๋ผ๋ฏธํฐ๋ ์ฌ์ ํ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ ๊ฒ์๋ฌผ๋ก ์ธํด์ ์ค๋ณต๋ ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์์ ๊ฒ์ผ๋ก ์๊ฐ๋จ.
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์
- ์ถ๊ฐ๋ก ๊ณ ๋ คํด์ผํ ์
offset์ ํน์ฑ์, ์์ฒญ๋๊ฒ ์ธ๊ธฐ์๋ ํด์ํ๊ทธ๋ฅผ ์ฒ๋ฆฌํด์ผํ ๊ฒฝ์ฐ, ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ๊ฐ์ ํด์ผํ ํ์๊ฐ ์์ ์๋ ์์.- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก
contentId๊น์ง ๋ฐ๊ณ , ์ ๋ ฌ ์กฐ๊ฑด์ ํฌํจ์ํจ ๋ค,contentId์ดํ์ ๊ฐ์ ๋ถ๋ฌ์ค๋ ์์ผ๋ก ๊ตฌํํ ์๋ ์์ ๊ฒ ๊ฐ์. - ๋จ,
contentId์ปฌ๋ผ๊น์ง ์ธ๋ฑ์ค์ ํฌํจ๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ์ ์ ๋ฐ์ ์ธ ์ฝ๊ธฐ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ trade-off๊ฐ ์กด์ฌํจ. - ์ถํ sns์์ ์ ๊ณตํ๋ ์๊ฐ ์๋ต ๊ฐ์ด ์ด๋ค์ง ํ์ธํ๊ณ , ์ค์ ์๋น์ค์ ์ ์ฆ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํ์ฌ ๋ค๋ฅธ ๋ฐฉ์์ ์๊ฐํด๋ณผ๊ฒ.
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก
- ์ธ๋ถ SNS์์ ๊ฒ์๋ฌผ ์์ฑ ์์ ์ ์ผ๋ง๋ ์์ธํ๊ฒ ์ ๊ณตํ๋๋์ ๋ฐ๋ผ์ ์ฟผ๋ฆฌ ๋ฐฉ์์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฐ์์ด ๊ฐ๋ฅํจ.
์ธ๋ถ API ํธ์ถ ์ถ์ํ - click
- ์ธ๋ถ ์์ ๋ฏธ๋์ด ์๋น์ค์ API๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์ ์ถ์ํํ์์ต๋๋ค. ๋ก๊ทธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ตฌํ์ฒด๋ก ๋์ฒดํ์์ต๋๋ค.
- ๊ตฌํ
ExternalApiHandler์ธํฐํ์ด์คExternalApiHandler๋ฅผ ํตํด ๊ฐ ์์ ๋ฏธ๋์ด ํ๋ซํผ์ API ํธ์ถ์ ์ถ์ํํ์ต๋๋ค.InstagramApiHandler,FacebookpiHandler,TreadsApiHandler,TwitterApiHandler๋ฑ์ ๊ตฌํ์ฒด๊ฐ ์กด์ฌํฉ๋๋ค.
getSourceType๋ฉ์๋๋ ๊ฐ ํธ๋ค๋ฌ๊ฐ ์ด๋ค ์์ ๋ฏธ๋์ด์ API๋ฅผ ๋ค๋ฃจ๋์ง ์๋ณํฉ๋๋ค.like์share๋ฉ์๋๋ ๊ฒ์๋ฌผ์ ์ข์์ ๋๋ ๊ณต์ ๋ฅผ ์ํํฉ๋๋ค.
ExternalApiHandlerResolver- ๋ด๋ถ์
ExternalApiHandler์ ๊ตฌํ์ฒด๊ฐ ๋งคํ๋Map์ธ์คํด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ,sourceType์ ๋ฐ๋ผ ์ ์ ํExternalApiHandler๋ฅผ ๋ฐํํฉ๋๋ค. - ์์ฑ์์์
ExternalApiHandler๋ฅผ ๊ตฌํํ ํด๋์ค๋ค์ ์ฃผ์ ๋ฐ์sourceType์ ๊ธฐ์ค์ผ๋ก ํธ๋ค๋ฌ ํด๋์ค๋ค์ ๋งคํํฉ๋๋ค.
- ๋ด๋ถ์
