JPA์ ๋์์ ๋ฐ๋๋ค๋ฉด exist
์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด๋ค.
๋ด๊ฐ ์ด๋ฒ์ ๊ตฌํํ๊ณ ์ ํ ๊ธฐ๋ฅ์ ์กฐ์ (์์ ,์ญ์ ..)ํ๊ณ ์ ํ๋ ๊ฒ์๊ธ์ ์ฃผ์ธ์ด ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์๊ฐ ๋ง๋๊ฐ ์ ๋ํ ๊ฒ์ด๋ค.
ํ์ฌ ๊ฒ์๊ธ๊ณผ ์ธ์ฆ๋ ์ฌ์ฉ์๋ก ๊ฒ์๊ธ db์ exist์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด ๋๋ค.
boolean existsByIdAndRequestUser(Long id, User requestUser);
์ด๋ ๊ฒ ํ๋ฉด ์์ฃผ ์๋ฆ๋ต๊ฒ ์ํ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
์ด๋ฒ์ ๋ด๊ฐ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ ์นผ๋ผ์ 2๊ฐ์ด์ง๋ง ์ด๋ณด๋ค ๋ง์ ์กฐ๊ฑด์ ํ์๋ก ํ๋ ์ฟผ๋ฆฌ๊ฐ ํ์ํ ์ ์๋ค.
๋ค์ด๋ฐ ๊ธฐ๋ฐ ์ฟผ๋ฆฌ๊ฐ ๋๋ฌด ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ ๋ณดํต @Query
๋ฅผ ์ด์ฉํด์ ์ง์ JPQL
์ ๊ตฌ์ฑํ๋ค.
ํ์ง๋ง JPQL
์ ๊ฒฝ์ฐ exist
ํค์๋๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์กด์ฌ์ฌ๋ถ๋ฅผ ํ๋จํด์ผ ํ๋ค.
๋ณดํต ์ง๊ณ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ ์กฐํ๋ ๊ฒฐ๊ณผ์ count
๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ง์ด ์ฌ์ฉํ๋ค.
์๋ ์ฟผ๋ฆฌ๋ฅผ JPQL
๋ก ๋ฐ๊ฟ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
@Query(
"select count(r.id) > 0 from ReviewRequest r " +
"where r.id = :id and r.requestUser = :requestUser"
)
boolean existsByIdAndRequestUserJPQL(Long id, User requestUser);
ํ ์คํธ๋ ์ ํต๊ณผ๋๋ ๊ฑธ๋ก ๋ณด์ ๊ฒฐ๊ณผ๋ ๋์ผํ๊ฒ ๋ง๋ค์ด ๋ด๊ณ ์ฟผ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ๋ณต์กํ์ง ์์ผ๋ ์ถฉ๋ถํ ๋์ฒด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค...
์ ์ฟผ๋ฆฌ๋ ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ exist
๊ธฐ๋ฅ์ JPQL์์ ์ฌ์ฉํ๊ธฐ ์ํด count
๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๋ฐ ๋ฌธ์ ๊ฐ ์๋ค.
count
์ ๊ฒฝ์ฐ ์ผ๋จ ๋ชจ๋ row๋ฅผ ์กฐํํ๋ค. select ์ ์์ >0
์กฐ๊ฑด์ ๊ฑธ์์ง๋ง ์๋ฏธ์๋ค. ๊ทธ๋ฅ ๋ค ์กฐํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ด >0
์ธ์ง๋ฅผ ํ๋จํ๋ค. ์ด๋ ์ฑ๋ฅ์ ํฐ ์ด์๋ฅผ ๋ฐ์์ํจ๋ค.
์๋ JPA
์ exist
์ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๋์ limit๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
limit๊ฐ 1๋ก ์ค์ ๋๋ฉด์ ์กฐ๊ฑด์ ๋ถํฉํ๋ row๋ฅผ ์ฐพ์์ ๋ ๋ฐ๋ก true๋ฅผ ๋ฆฌํดํ ์ ์๊ฒ ๋๋ค.
count
์ exist( + limit)
์ ์ฑ๋ฅ์ฐจ์ด๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ผ๋ฉด ๋ง์์๋ก ์กฐ๊ฑด์ ๋ถํฉํ๋ ํ๋๊ฐ ์์ ์์์๋ก ๋ ํฌ๊ฒ ๋ฒ์ด์ง๊ฒ ๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์ ๋ด๊ฐ ์ ํ ๋ฃฐ ์ค ํ๋๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ ๋ฐ๋์ Querydsl
๋ก ์์ฑํ๋ ๊ฒ์ด๋ค.
exist ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ ์ง์ JPQL์ ์์ฑํ๋ค๊ณ ํ๋ค. ๋ณต์กํ๊ฑฐ๋๊น JPQL ๋ง๊ณ Querydsl๋ก ์์ฑํด๋ณด์.
JPQL์์๋ ์ง์ ์ ์ผ๋ก exist๋ฅผ ์ ๊ณตํ์ง ์์๊ณ Querydsl๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค.
but ์ง์ ๊ตฌํ์ ๊ฐ๋ฅํ๋ค.
(์ฝ๋๋ jojoldu ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.)
๊ตฌํํด์ผ ํ๋ ๊ธฐ๋ฅ์ ์๋ ๋ ๊ฐ์ด๋ค.
์ฒซ๋ฒ์งธ ๊ธฐ๋ฅ์ limit 1
์ ํตํด ๊ตฌํ ๊ฐ๋ฅํ๋ค. Querydsl์ fetchFirst()
์ด limit 1
์ ๋์ ํ๋ค.
๋๋ฒ์งธ ๊ธฐ๋ฅ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ null์ธ์ง ์ฒดํฌํ๋ ๊ฒ์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค. null์ด๋ผ๋ฉด ์กฐ๊ฑด์ ๋ถํฉํ๋ row๊ฐ ์๋ค๋ ๊ฒ์ด๋ฏ๋ก fasle๊ฐ ๋ฆฌํด๋๋ค.
@Override
public boolean isMyReviewRequest(Long reviewId, User user) {
Integer exist = query.selectOne()
.from(reviewRequest)
.where(reviewRequest.id.eq(reviewId).and(reviewRequest.requestUser.eq(user)))
.fetchFirst();
return exist != null;
}
์ฟผ๋ฆฌ๊ฒฐ๊ณผ