| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| DB ๋ฝ (pessimistic lock) | ํธ๋์ญ์ ๋๊ธฐ๋ก ์ฒ๋ฆฌ๋ ์ ํ, ๋ฝ ํด์ ํ์ด๋ฐ ๊ด๋ฆฌ ๋ณต์ก |
| Redis setIfAbsent(NX) โ | ์์์ ์ฐ์ฐ์ผ๋ก ๋จ ํ๋์ ์์ฒญ๋ง ์ฑ๊ณต ๋ณด์ฅ, TTL๋ก ์๋ ๋ง๋ฃ |
๋์ผ ์ข์์ ๋์ ์์ฒญ์ด ๋ค์ด์์ ๋ DB ๋ฝ์ ๋๊ธฐ ํ ์์ฐจ ์ฒ๋ฆฌ๋์ด UX๊ฐ ์ ํ๋ ์ ์์ต๋๋ค. Redis NX ์ฐ์ฐ์ ์์์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ฒซ ๋ฒ์งธ ์์ฒญ๋ง ์ฑ๊ณตํ๊ณ ๋๋จธ์ง๋ ์ฆ์ ์คํจ ์๋ต์ ๋ฐ์ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| MyBatis ๋์ SQL | XML ์์ฑ ํ์, ์ปดํ์ผ ํ์ ์ค๋ฅ ๊ฐ์ง ๋ถ๊ฐ |
| QueryDSL โ | ํ์ ์์ ํ ๋์ ์ฟผ๋ฆฌ, BooleanExpression null ์ฒ๋ฆฌ๋ก ์กฐ๊ฑด ์๋ ์ ์ธ |
์ฅ๋ฅด ยท ์ง์ญ ยท ํค์๋ ์กฐ๊ฑด์ด ์ ํ์ ์ผ๋ก ์กฐํฉ๋๋ ๋ณตํฉ ํํฐ ๊ฒ์์์
MyBatis์ <if> ํ๊ทธ๋ณด๋ค QueryDSL์ BooleanExpression์ด
null ๋ฐํ ์ ์๋์ผ๋ก ์กฐ๊ฑด์์ ์ ์ธ๋์ด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์์ ํฉ๋๋ค.
private BooleanExpression genreEq(String genre) {
return (genre != null && !genre.isEmpty()) ? QEvent.event.genre.eq(genre) : null;
}
| ๋ฐฉ์ | ๊ฒํ ๋ด์ฉ |
|---|---|
| MyBatis | SQL ์ง์ ์ ์ด ๊ฐ๋ฅ, ๋ณต์กํ ์ฟผ๋ฆฌ์ ์ ๋ฆฌ |
| JPA + QueryDSL โ | ๊ธฐ๋ณธ CRUD ์๋ํ, ๋ณต์กํ ์ฟผ๋ฆฌ๋ QueryDSL๋ก ๋ณด์ |
Route In์์ MyBatis๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ JPA๋ก ๊ธฐ๋ณธ CRUD๋ฅผ ์๋ํํ๊ณ QueryDSL๋ก ๋ณต์กํ ์กฐ๊ฑด ๊ฒ์์ ์ฒ๋ฆฌํ๋ ์กฐํฉ์ ์ ํํด ๋ ๊ธฐ์ ๋ชจ๋ ๊ฒฝํํ์ต๋๋ค.