[JPA] JPQL ๋ฌธ๋ฒ 2 - ์งํฉ ๋ฐ ์ ๋ ฌ, ์กฐ์ธ, ํ์น ์กฐ์ธ
by rlaehddnd0422์งํฉ ๋ฐ ์ ๋ ฌ
์งํฉ
์งํฉ์ ์งํฉํจ์(COUNT,SUM,AVG,MAX,MIN)๊ณผ ํจ๊ป ํต๊ณ์ ๋ณด๋ฅผ ๊ตฌํ ๋ ์ฌ์ฉํฉ๋๋ค.
select
COUNT(m),
SUM(m.age),
AVG(m.age),
MAX(m.age),
MIN(m.age)
from Member m
- COUNT() : ๊ฒฐ๊ณผ ์๋ฅผ ๋ฆฌํดํฉ๋๋ค.
- MAX,MIN() : ์ต๋ ์ต์ ๊ฐ์ ๋ฆฌํดํฉ๋๋ค. ์ฃผ๋ก ๋ฌธ์, ์ซ์, ๋ ์ง์ ์ฌ์ฉ
- AVG() : ํ๊ท ๊ฐ์ Double๋ก ๋ฆฌํดํฉ๋๋ค. ์ซ์ ํ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅ.
- SUM() : ํฉ์ ๋ฆฌํดํฉ๋๋ค. ์ซ์ ํ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅ
1. NULL ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ฌด์ํ๋ฏ๋ก ํต๊ณ์ ์กํ์ง ์์ต๋๋ค.
2. ๋ง์ฝ ๊ฐ์ด ์๋๋ฐ SUM, AVG, MAX, MIN ํจ์ ์ฌ์ฉ ์ NULL ๊ฐ์ด ๋ฉ๋๋ค.
3. DINTINCT๋ฅผ ์งํฉ ํจ์ ์์ ์ฌ์ฉํด์ ์ค๋ณต๋ ๊ฐ์ ์ ๊ฑฐํ๊ณ ๋์ ์งํฉ์ ๊ตฌํ ์ ์์ต๋๋ค.
ex) SELECT COUNT(DISTINCT m.age) FROM Member m
Group By
Group By๋ ํน์ ์ด์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค.
// ํ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃน๋ณ๋ก ๋ฌถ์ด์ ํต๊ณ ๋ฐ์ดํฐ ๊ตฌํ๊ธฐ
SELECT t.name, COUNT(m.age), SUM(m.age), AVG(m.age), MAX(m.age)
FROM Member m LEFT JOIN m.team t
GROUP BY t.name
Having ์
Having ์ ์ GroupBy์ ํจ๊ป ์ฌ์ฉ๋๋๋ฐ, ๊ทธ๋ฃนํํ ๋ฐ์ดํฐ์ ์กฐ๊ฑด์์ ๊ฑธ์ด์ ์กฐํํ ๋ ์ฌ์ฉํฉ๋๋ค.
// ๊ทธ๋ฃน๋ณ ํต๊ณ ๋ฐ์ดํฐ์ค์์ ํ๊ท ๋์ด๊ฐ 10์ด ์ด์์ธ ๊ทธ๋ฃน๋ง ์กฐํ
SELECT t.name, COUNT(m.age), AVG(m.age), SUM(m.age), MAX(m.age)
FROM Member m LEFT JOIN m.team t
GROUP BY t.name
HAVING AVG(m.age) >= 10
์ ๋ ฌ(Order By)
- ORDER BY ํน์ ์ด DESC : ๋ด๋ฆผ์ฐจ์
- ORDER BY ํน์ ์ด ASC : ์ค๋ฆ์ฐจ์ (๊ธฐ๋ณธ ๊ฐ)
ํ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํ ํ ํ ํ ์ด๋ฆ๊ณผ ๋ฉค๋ฒ ํ๊ท ๋์ด๋ฅผ ์กฐํํ๋, ํ๊ท ๋์ด๊ฐ ๋์ ์์ผ๋ก ์กฐํ(์ค๋ฆ์ฐจ์)
SELECT t.name, count(ma.ge) as cnt // 3
FROM Member m LEFT JOIN m.team t // 1
GROUP BY t.name // 2
ORDER BY cnt // 4
SELECT ํ ๊ฒฐ๊ณผ๋ฅผ ORDER BY ํ๊ธฐ ๋๋ฌธ์ SELECT ์ ์ ๋ณ์นญ์ ์ฌ์ฉํด์ ORDER BY์ ์ ์ฉํ ์ ์์ต๋๋ค.
ORDER BY์ ์ฌ๋ฌ ์ปฌ๋ผ์ ์ ์ฉํ๋ ๊ฒฝ์ฐ ๋จผ์ ์์ฑํ ์ปฌ๋ผ๋ช ์ ์ฐ์ ์์๋ก ์ ๋ ฌํฉ๋๋ค.
SELECT m
FROM Member m
ORDER BY m.age DESC, m.username ASC
-> age๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ดํ์ username์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด
JPQL ์กฐ์ธ
JPQL๋ ์กฐ์ธ์ ์ง์ํฉ๋๋ค. SQL์ ์กฐ์ธ๊ณผ ๊ธฐ๋ฅ์ ๋์ผํ์ง๋ง ๋ฌธ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ๋ด๋ถ ์กฐ์ธ๋ถํฐ ์์๋ด ์๋ค.
๋ด๋ถ ์กฐ์ธ
๋ด๋ถ์กฐ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์กฐํฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์กฐ์ธ์ฐ์ฐ์ผ๋ก, ์กฐ์ธ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ด๋ธ ๊ฐ ์ผ์นํ๋ ํ์ ์ ํํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์๋ฅผ๋ค์ด Member์ Team ํ ์ด๋ธ์ INNER JOIN ํ ๊ฒฝ์ฐ, ๋ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ธ ID ๊ฐ ๋์ผํ (MEMBER.member_id = TEAM.team_id) ํ๋ง ๊ฒฐ๊ณผ์ ํฌํจํด์ ๋ฆฌํดํฉ๋๋ค.
- ๋์ผํ๊ฒ INNER JOIN์ ์ฌ์ฉํฉ๋๋ค. ์ฐธ๊ณ ๋ก INNER๋ ์๋ต ๊ฐ๋ฅ.
List<Member> resultList = em.createQuery("SELECT m FROM Member m INNER JOIN m.team t where t.name =: teamName", Member.class)
.setParameter("teamName", "team1")
.getResultList();
for (Member member : resultList) {
System.out.println("member = " + member);
}
- MEMBER ์ TEAM ํ ์ด๋ธ์์ ๋์ผํ ID๋ฅผ ๊ธฐ์ค์ผ๋ก JOIN ํ ํ, ์ด๋ฆ ๊ธฐ๋ฐ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ธ๋ฉ๋ ๊ฐ์ธ ํ์ด๋ฆ์ ๊ฐ์ง ๋ฉค๋ฒ ์กฐํ ์ฟผ๋ฆฌ
- ๊ฐ์ฅ ํฐ ํน์ง : SQL ๊ณผ ๋ฌ๋ฆฌ ์กฐ์ธํ ๋ ์ฐ๊ด ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. (Member m INNER JOIN m.team t)
JPQL์ ํตํด ์์ฑ ๋๋ SQL : MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.TEAM_ID
- ์ฃผ์ : ์ฐ๊ด ํ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ JPQL ์กฐ์ธ์ SQL ์กฐ์ธ ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ์ ์์
List<Member> resultList = em.createQuery("SELECT m FROM Member m INNER JOIN Team t where t.name =: teamName", Member.class) // SQL ์กฐ์ธ์ฒ๋ผ ์ฌ์ฉ
.setParameter("teamName", "team1")
.getResultList();
for (Member member : resultList) {
System.out.println("member = " + member);
}
์ธ๋ถ ์กฐ์ธ
์ธ๋ถ ์กฐ์ธ์ ๋ด๋ถ ์กฐ์ธ๊ณผ ๋ฌ๋ฆฌ, ์ผ์นํ๋ ํ ๋ฟ๋ง ์๋๋ผ ์ผ์นํ์ง ์๋ ํ๋ ๊ฒฐ๊ณผ์ ํฌํจ์ํต๋๋ค.
- LEFT JOIN : ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์์ ์ผ์นํ๋ ํ์ ์กฐํฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ. ์ผ์นํ์ง ์๋ ํ์ NULL๋ก ์ฑ์์ง
- RIGHT JOIN : ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ผ์ชฝ ํ ์ด๋ธ์์ ์ผ์นํ๋ ํ์ ์กฐํฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์์ฑ. ์ผ์นํ์ง ์๋ ํ์ NULL๋ก ์ฑ์์ง
JPQL ์ธ๋ถ ์กฐ์ธ ๋ํ SQL ์ธ๋ถ ์กฐ์ธ๊ณผ ๋์ผํฉ๋๋ค. LEFT ๋ RIGHT ์์ฑ ์ OUTER ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
๋ณดํต LEFT JOIN์ผ๋ก ์ฌ์ฉ ํฉ๋๋ค.
์ธ๋ถ ์กฐ์ธ JPQL ๋ํ ์ฐ๊ดํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
List<Member> resultList = em.createQuery("SELECT m FROM Member m LEFT JOIN m.team t where t.name =: teamName", Member.class)
.setParameter("teamName", "team1")
.getResultList();
for (Member member : resultList) {
System.out.println("member = " + member);
}
์ปฌ๋ ์ ์กฐ์ธ
์ผ๋๋ค, ๋ค๋๋ค ๊ด๊ณ์ฒ๋ผ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ๊ณณ์ ์กฐ์ธํ๋ ๊ฒ์ ์ปฌ๋ ์ ์กฐ์ธ์ด๋ผ๊ณ ํฉ๋๋ค.
Member (*) โก๏ธ Team(1) ์ผ๋ก์ ์กฐ์ธ์ ๋ค๋์ผ ์กฐ์ธ์ด๋ฉด์ ๋จ์ผ ๊ฐ ์ฐ๊ด ํ๋ m.team ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
SELECT m, t
FROM Member m LEFT JOIN m.team
๋ฐ๋๋ก Team(1) โก๏ธ Member ๋ก์ ์กฐ์ธ์ ์ผ๋๋ค ์กฐ์ธ์ด๋ฉด์ ์ปฌ๋ ์ ๊ฐ ์ฐ๊ด ํ๋ m.members๋ฅผ ์ฌ์ฉํฉ๋๋ค.
SELECT t, m
FROM Team t LEFT JOIN t.members m
์ธํ ์กฐ์ธ
์ธํ ์กฐ์ธ์ ๋ ์ด์์ ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ ์ํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
WHERE ์ ์ ์ฌ์ฉํด์ ์ธํ ์กฐ์ธ์ ํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก ๋ด๋ถ ์ธํ ์กฐ์ธ๋ง ์ง์.
์ธํ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์ ํ ๊ด๊ณ์๋ ์ํฐํฐ๋ ์กฐ์ธํ ์ ์์ต๋๋ค.
// JPQL
SELECT COUNT(m)
FROM Member m, Team T
WHERE m.username = t.name
// SQL
SELECT COUNT(M.ID)
FROM MEMBER M CROSS TEAM T
WHERE M.USERNAME=T.NAME
JOIN ON ์
JPA 2.1 ์ดํ ๋ฒ์ ๋ถํฐ๋ JOIN ON ์ ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์กฐ์ธ ๋์์ ํํฐ๋งํ๊ณ ์กฐ์ธํ ์ ์์ต๋๋ค.
๋ด๋ถ ์กฐ์ธ์ ON์ ์ WHERE ์ ์ ์ฌ์ฉํ ๋์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ผ๋ฏ๋ก ๋ณดํต ON ์ ์ OUTER ์กฐ์ธ์์๋ง ์ฌ์ฉํฉ๋๋ค.
// JPQL
SELECT m, t
FROM Member m LEFT JOIN m.team t on t.name='A'
// SQL
SELECT m.*, t.*
FROM Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name = 'A'
ํ์น ์กฐ์ธ
์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์กฐ์ธํ ์ํฐํฐ๋ ์ปฌ๋ ์ ๊น์ง ํ ๋ฒ์ ๊ฐ์ด ์กฐํํ๋ JPQL๋ง์ ๊ธฐ๋ฅ์ ๋๋ค.
์ผ๋ฐ์ ์ธ join๊ณผ์ ์ฐจ์ด์ ์ ์ผ๋ฐ์ ์ธ join์ ์กฐํ ์ ์กฐํํ ์ํฐํฐ๋ง ๋ฐํํ๊ณ , ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ๋ก๋ํ์ง๋ ์์ต๋๋ค.
๋ฐ๋ฉด, fetch join์ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์กฐํํจ์ผ๋ก์จ ์ง์ฐ๋ก๋ฉํ๋ ๊ฒ์ด ์๋ ์ฆ์๋ก๋ฉํ๋ค๋ ์ ์ ๋๋ค.
์ฆ์๋ก๋ฉํ๋ฉด ์ฅ์ ์ด ๋ญ๋ ? ํ์ ์ฟผ๋ฆฌ( ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ผ๋ก ์คํ๋๋ ์ฟผ๋ฆฌ)๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ์ง ์์๋ ๋๋ค!
์ํฐํฐ ํ์น ์กฐ์ธ
ํ์ ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด์ ์ฐ๊ด๋ ํ ์ํฐํฐ๋ ํจ๊ป ์กฐํํ๋ JPQL
SELECT m
FROM Member m INNER JOIN FETCH m.team
JOIN ์์ FETCH ํค์๋๋ฅผ ๋ถ์ด๋ฉด ์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ ํจ๊ป ์กฐํํฉ๋๋ค. ์ฐธ๊ณ ๋ก ์ผ๋ฐ์ ์ธ JPQL ์กฐ์ธ๊ณผ ๋ค๋ฅด๊ฒ ํ์น ์กฐ์ธ์์๋ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์คํ๋ SQL
SELECT M.*, T.*
FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID
- JPQL์์ m ๋ง SELECT ํ์ง๋ง , SQL์ ๋ณด๋ฉด M๋ฟ๋ง ์๋๋ผ T๊น์ง SELECT ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- ์ํฐํฐ๋ฅผ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ค์ ํ๋ค ํ๋๋ผ๋ ํ์น ์กฐ์ธ์ ํ๊ฒ ๋๋ฉด ์ฐ๊ด๋ ์ํฐํฐ T๋ ํ๋ก์๊ฐ ์๋ ์ค์ ์ํฐํฐ์ด๊ธฐ ๋๋ฌธ์ ์ง์ฐ ๋ก๋ฉ์ด ์ผ์ด๋์ง ์์ต๋๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ์ค์ ์ํฐํฐ์ด๊ธฐ ๋๋ฌธ์ ํ์ ์ํฐํฐ๊ฐ ์ค์์์ํ๊ฐ ๋์ด๋ ์ฐ๊ด๋ ํ์ ์กฐํํ ์ ์์ต๋๋ค.
์ปฌ๋ ์ ํ์น ์กฐ์ธ
์ด๋ฒ์๋ Team๊ณผ ์ผ๋๋ค ๊ด๊ณ์ธ Member ์ปฌ๋ ์ ์ ํ์น ์กฐ์ธํด ๋ด ์๋ค.
ํ ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด์ ์ฐ๊ด๋ ๋ฉค๋ฒ ์ํฐํฐ(์ปฌ๋ ์ )๋ ํจ๊ป ์กฐํํ๋ JPQL
SELECT t
FROM Team t INNER JOIN FETCH t.members
์คํ๋ SQL
SELECT T.*, M.*
FROM TEAM T INNER JOIN FETCH MEMBER M ON T.id = M.team_id
- ์ํฐํฐ ํ์น ์กฐ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก JPQL์์ t๋ง ํ์น ์กฐ์ธ ํ select ํด๋ SQL์์ t๋ฟ๋ง ์๋๋ผ m๊น์ง ํจ๊ป select ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
List<Team> resultList = em.createQuery("SELECT t FROM Team t INNER JOIN FETCH t.members", Team.class)
.getResultList();
for (Team team : resultList) {
System.out.println("team = " + team);
}
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
emf.close();
}
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ ์ํฐํฐ๋ฅผ ์กฐํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ์ ์์๋ ํ์๋ค์ ์ฐธ์กฐ๊ฐ ๋์ผํ ํ ์ํฐํฐ๋ฅผ ๊ฐ์ต๋๋ค.
- team = domain.Team@313f8301
team = domain.Team@313f8301
- team = domain.Team@313f8301
- DISTINCT FETCH JOIN์ ํ๋ฉด ์ค๋ณต๋๋ ํ ์ํฐํฐ๋ ํ๋๋ง ์กฐํ๋ฉ๋๋ค.
- team = domain.Team@313f8301
ํ์น ์กฐ์ธ ์ฅ์
- ํ์น์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ฟผ๋ฆฌ ์์ ์ ์กฐํํ๋ฏ๋ก ์ง์ฐ ๋ก๋ฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ค์์ ์ํ์์๋ ๊ฐ์ฒด ๊ทธ๋ํ ํ์์ด ๊ฐ๋ฅ
- SQL ํธ์ถ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์ํฐํฐ๊ฐ ์ง์ฐ๋ก๋ฉ(fetchType.LAZY)์ผ๋ก ์ค์ ๋์ด ์๋ค ํ๋๋ผ๋, ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ณ ๋ คํ์ฌ ์ฐ๊ด๋ ์ํฐํฐ๊น์ง ์กฐํํ ์ ์์ต๋๋ค.
- ํ์น ์กฐ์ธ์ ๊ธ๋ก๋ฒ ๋ก๋ฉ ์ ๋ต ๋ณด๋ค ์ฐ์ ์๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์น ํ์ ์ LAZY๋ก ์ค์ ํ๋๋ผ๋ ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฆ์ ์กฐํ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
- ๊ธ๋ก๋ฒ ๋ก๋ฉ ์ ๋ต์ ๋ ์ ์์ผ๋ฉด ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๊ณ ์ต์ ํ๊ฐ ํ์ํ๋ฉด ํ์น ์กฐ์ธ์ ์ ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ ๋๋ค.
ํ์น ์กฐ์ธ ํ๊ณ์
- ์กฐ์ธ ๋์์ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ์ง๋ง ! ํ์ด๋ฒ๋ค์ดํธ๋ ํ์น ์กฐ์ธ์๋ ๋ณ์นญ์ ํ์ฉํฉ๋๋ค.
- ๋ ์ด์์ ์ปฌ๋ ์
์ ํ์นํ ์ ์์ต๋๋ค.
- ๊ตฌํ์ฒด์ ๋ฐ๋ผ ๋๊ธฐ๋ ํ์ง๋ง ์ปฌ๋ ์ * ์ปฌ๋ ์ ์ ๊ฒฝ์ฐ Cartesian Product ๊ฐ ๋ง๋ค์ด ์ง๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ํ์ด์ง API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Data JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422