ํ์ : PM(1) / Design(1) / Frontend(2) / Backend(3)
๊ธฐ๊ฐ : 2024.03 ~ 2025.03
๋งํฌ : https://github.com/M-ung/MoodBuddy_Server
์๋น์ค ๋ด์ฉ : ์ฌ์ฉ์๊ฐ ์์ฑํ ์ผ๊ธฐ๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ ๋ถ์ํ๋ ์น ์๋น์ค
์ํต : GitHub, Slack, Notion, Discord
์ฐ๋ฆฌ ์๋น์ค 'MoodBuddy" ์๋ ํน๋ณํ ๊ธฐ๋ฅ์ด ์๋ค. ๋ฐ๋ก "์ฟผ๋ํฐ์์ด(QuddyTI)" ์ด๋ค.
์ฟผ๋ํฐ์์ด(QuddyTI)๋?
๋จ์ํ MBTI๋ฅผ ์๊ฐํ๋ฉด ๋๋ค.
์ฌ์ฉ์๊ฐ ํ ๋ฌ ๋์ ์์ฑํ ์ผ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก "์ผ๊ธฐ ์์ฑ ํ์, ์ผ๊ธฐ ๋ถ์์ ํตํด ๋์จ ๊ฐ์ , ์ฃผ์ " ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ๊ธฐ ์ฑ๊ฒฉ ์ ํ์ ํ๋ณํด์ฃผ๋ ์๋น์ค์ด๋ค.
์ด๋ ํ ๋ฌ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋งค๋ฌ 00์์ ์ฟผ๋ํฐ์์ด(QuddyTI) ์์ฑ(ํ์ฌ ๋ฌ) ๋ฐ ์์ (์ง๋ ๋ฌ)์ด ๋ฐ์ํ๋ค.
์ฒ์ 1์ฐจ ๋ฐฐํฌ ๋๋ ๋จ์ํ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํด์ ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
@Component
@RequiredArgsConstructor
public class QuddyTIScheduler {
private final QuddyTIFacade quddyTIFacade;
@Scheduled(cron = "0 0 0 1 * ?")
@Transactional
public void aggregateAndSaveDiaryData() {
quddyTIFacade.createAndUpadteQuddyTI();
}
}
์ค์ผ์ค๋ฌ๋ฅผ ๋๋ ค ๋งค๋ฌ 00์์ ๋์ํ๋๋ก ๊ตฌํํ๋ค.
ํ์ง๋ง ์๋์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ๋ฐ์ํ๋ค.
1. ํ ๋ฒ์ ๋ชจ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ค ๋ณด๋ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์ฟผ๋ฆฌ ๋ถํ ์ฆ๊ฐ
2. ํธ๋์ญ์
์ด ๊ธธ์ด์ง๊ณ , ์ ์ฒด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ด ๋์ด๋๋ฉด์ ์๋ฒ ๋ถํ ๋ฐ์
3. ์ฌ์ฉ์๊ฐ ๋ง์์ง์๋ก ๋ฐ์ดํฐ ์ฆ๊ฐ๋ก ์ธํด ํ๋์ ์ค์ผ์ค๋ฌ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์ ์ ๋ถ๋ด์ค๋ฌ์์ง
๊ทธ๋์ ์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด "Spring Batch" ๋ฅผ ์ฐ๋ฆฌ ์๋น์ค์ ๋์ ํ๊ธฐ๋ก ํ๋ค.
Spring Batch๋?
Spring Batch๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ๋ฐฐ์น ์ฒ๋ฆฌ ํ๋ ์์ํฌ๋ค.
์ค์ผ์ค๋ฌ๊ฐ ๋จ์ ๋ฐ๋ณต ์คํ์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ๋๋ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋๋์ด ์ฒ๋ฆฌํ๊ณ , ์ฌ์๋ ๋ฐ ์คํจ ๋ณต๊ตฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Spring Batch์ ํต์ฌ ๊ฐ๋
1. Job: ํ๋์ ๋ฐฐ์น ์์
๋จ์
2. Step: Job์ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ ๋จ๊ณ
3. ItemReader: ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์ญํ
4. ItemProcessor: ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ์ญํ
5. ItemWriter: ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ญํ
์ "Spring Batch" ๋ฅผ ์ ์ฉํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ ๊ธฐ๋ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
1. ์ฑ๋ฅ ๊ฐ์ : ์์ ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ DB ๋ถํ ๊ฐ์
2. ์์ ์ฑ ํฅ์: ์คํจํ ์์
์ ์๋์ผ๋ก ์ฌ์๋ ๊ฐ๋ฅ
๋จผ์ ๊ธฐ์กด ์ค์ผ์ค๋ฌ๋ Spring Batch์ ํธ๋ฆฌ๊ฑฐ ์ญํ ์ ํ ์ ์๊ฒ ๋ณ๊ฒฝํ ํ ์๋์ ๊ฐ์ด ์ค๊ณํ๋ค. ๊ทธ๋ฆฌ๊ณ Spring Data JPA๋ฅผ ํ์ฉํด์ ์์ฑ, ์์ , ์กฐํ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ค.
ํ์ง๋ง Spring Data JPA๋ฅผ ํ์ฉํ ๋ฐฉ์์๋ ์๋์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ์์๋ค.
1. ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ ์ฑ๋ฅ ์ ํ
2. JPA์ ๊ธฐ๋ณธ์ ์ธ Bulk Update/Insert์ ํ๊ณ
๊ทธ๋์ Spring Data JPA ๋ณด๋ค JDBC ๋ฐฉ์์ผ๋ก ์์ฑ, ์์ , ์กฐํ๋ฅผ ๊ตฌํํ์๋ค.
์ฝ๋๋ ์๋์ ๊ฐ๋ค.
๋ํ, ์ฟผ๋ํฐ์์ด ์์
์ ํ๋๋ก ํ๋ ๊ฒ์ด ์๋, ์์ฑ๊ณผ ์์ ์์
์ ๋ ๊ฐ๋ก ๋ถ๋ฆฌํ์ฌ DB ๋ถํ๋ฅผ ๋ถ์ฐํ๊ธฐ๋ก ํ๋ค.
์ค์ผ์ค๋ฌ๋ ๋ ๊ฐ๋ก ๋๋ด๋๋ผ๋ ๊ฐ์ ์๊ฐ์ ์คํํ๋ฉด ์์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฑ๊ณผ ์์ ์ค์ผ์ค๋ฌ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ๋งค๋ฌ ๋ง์ผ๊ณผ 1์ผ๋ก ๋ถ๋ฆฌํด์ ์คํํ๋๋ก ์ค๊ณํ๋ค.
๋ฌธ์ ํด๊ฒฐ๋ก ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค.
1. ์ฌ์ฉ์ 10,000๋ช
๊ธฐ์ค, ์ฟผ๋ํฐ์์ด ์์ฑ ํ๊ท ์ฝ 919ms, ์์ ํ๊ท ์ฝ 14,528ms๋ก ์ฑ๋ฅ ๊ฐ์ .
2. ์ค์ผ์ค๋ฌ โ Spring Batch ํธ๋ฆฌ๊ฑฐ ๋ฐฉ์์ผ๋ก ์ ํํ์ฌ ์ ์ง๋ณด์์ฑ์ ํฅ์.
3. JPA ๋์ JDBC ์ฌ์ฉ์ผ๋ก ๋ํฐ ์ฒดํน ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ๊ณ batch ์ฑ๋ฅ ์ต์ ํ.
4. ์ฟผ๋ํฐ์์ด ์์ฑ๊ณผ ์์ ์์
์ ๋ถ๋ฆฌํ์ฌ DB ๋ถํ๋ฅผ ๋ถ์ฐ
์ด๋ฒ Spring Batch ๋์ ์ ํตํด ์ค์ผ์ค๋ฌ ๊ธฐ๋ฐ์ ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๊ฒฝํ์ ํ ์ ์์๋ค.
์ฒ์ ์ ์ฉํ ์ค์ผ์ค๋ฌ ๋ฐฉ์์์๋ ๋๋ ๋ฐ์ดํฐ ์กฐํ ๋ฐ ์ ๋ฐ์ดํธ๋ก ์ธํด ํธ๋์ญ์ ์ด ๊ธธ์ด์ง๊ณ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง, Spring Batch๋ฅผ ํ์ฉํ์ฌ ์์ ๋จ์๋ก ๋๋์ด ์ฒ๋ฆฌํ ์ ์์์ผ๋ฉฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ์์ ์ฑ์ ํ๋ณดํ ์ ์์๋ค.
์ ๊ฒฝํ๋ค์ ํตํด ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๋จ์ํ ์ค์ผ์ค๋ฌ๋ก ์ ์ฉํด์ผ๊ฒ ๋ค๋ ์๊ฐ๋ณด๋จ Spring Batch์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ํ์์ ์ด๋ผ๋ ์๊ฐ์ ํ๋ค.
๋ Spring Data JPA์ ํธ๋ฆฌ์ฑ์ผ๋ก ์ธํด ์ด์ ์์กดํ๊ธฐ๋ณด๋จ ์๊ณ ์ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ๋ถํธํ๋๋ผ๋ ์ฑ๋ฅ์ ์ผ๋ก ๋จ์ด์ง๋ฉด JDBC์ ๊ฐ์ ๊ธฐ์ ์ ์ ์ฉํ ์ ์๋ ์ค๊ณ ๋ฅ๋ ฅ์ ๊ฐ์ถ ๊ฐ๋ฐ์๊ฐ ๋์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.