๐บ ์ด ๊ธ์ ๊น์ํ๋์ '์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ'์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ฒ์์ ์๋ฆฝ๋๋ค.
- JPA์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ํฐํฐ ๋งค๋์ ๋ฉ์๋๋ก๋ง์ ๊ฐ๋ฐํ๊ธฐ ํ๋ฆ
- ๋ฐ๋ผ์ JPQL์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์กด์ฌ
- ํ ์ด๋ธ์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ
- SQL์ ์ถ์ํํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์กด์ ์ด์ง ์์
- ์ด ์ธ์๋ Criteria ์ฟผ๋ฆฌ, Native SQL, Query DSL, ๋งคํผ ํ๋ ์ ์ํฌ ์ฌ์ฉ ๋ฑ์ด ์์
-
JPQL(Java Persistence Query Language)์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ
-
๋ฌธ๋ฒ์ SQL๊ณผ ๋น์ทํ๊ณ ANSI ํ์ค SQL์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ์ ์ฌ
-
SQL์ ์ถ์ํํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์กด X(๋ฐฉ์ธ๋ง ๋ณ๊ฒฝํ๋ฉด ๋)
-
JPQL์ SQL๋ณด๋ค ๊ฐ๊ฒฐ(์ํฐํฐ ์ง์ ์กฐํ, ๋ฌต์์ ์กฐ์ธ, ๋คํ์ฑ ์ง์)
-
// ์ํฐํฐ @Entity(name="Member") public class Member { @Column(name="name") private String name; ... } // JPQL // ๋ฉค๋ฒ ํ ์ด๋ธ์ ์ ์ ์ด๋ฆ์ด kim์ธ ์ํฐํฐ๋ฅผ ์กฐํ // m.username => ํ ์ด๋ธ ์ปฌ๋ผ๋ช X, ์ํฐํฐ ๊ฐ์ฒด ํ๋๋ช O String jpql = "select m from Memeber as m where m.username='kim'"; List<Member> resultList = em.createQuert(jpql, Member.class).getResultList();
-
Criteria๋ JPQL์ ์์ฑํ๋ ๋น๋ ํด๋์ค
-
์ฅ์ ์ ๋ฌธ์์ด์ด ์๋ ๋ฉ์๋ ์ฒด์ด๋์ ํตํด JPQL์ ์์ฑํ ์ ์๋ค๋ ์
-
๋ฌธ์์ด ์ฟผ๋ฆฌ๋ ๋ฐํ์์์ ์๋ฌ ๋ฐ์, ๋ฐ๋ฉด ๋ฉ์๋ ๊ธฐ๋ฐ ์ฟผ๋ฆฌ๋ ์ปดํ์ผ ์์ ์์ ์ค๋ฅ ๋ฐ์
-
๋์ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ์ ํธ๋ฆฌํจ
-
// "select m from Memeber as m where m.username='kim'" // CriteriaBuilder ์์ฑ CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Member> query = cb.createQuery(Member.class); // ์กฐํ๋ฅผ ์์ํ ํด๋์ค Root<Member> m = query.from(Member.class); // ์ฟผ๋ฆฌ ์์ฑ CriteriaQuery<Member> cq = query.select(m).where(cb.equal(m.get("username"), "kim")); List<Member> resultList = em.createQuery(cq).getResultList();
-
ํ๋๋ช ์ ๋ฌธ์์ด์ธ๋ฐ ์ด๋ฅผ ๋ฉํ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค๋ฉด ์ฝ๋๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
-
๋ฉํ ๋ชจ๋ธ์ Criteria ์ ์ฉ ํด๋์ค๋ก ์๋ฐ๊ฐ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ๊ฒ
-
m.get("username")
โm.get(Memeber_.username)
-
๋ชจ๋ ์ฅ์ ์ ์์ํ ์ ๋๋ก ๋ณต์กํ๊ณ ์ฅํฉํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ธฐ์ ๋ถํธ
-
Criteria ์ฒ๋ผ ๋น๋ ํด๋์ค์ด์ง๋ง, Criteria๋ณด๋ค ๋จ์ํ๊ณ ์ฌ์ฉํ๊ธฐ ํธํจ
-
// QueryDSL ์ฌ์ฉ ์ค๋น JPAQuery query = new JPAQuery(em); QMember member = QMember.member; // ์ฟผ๋ฆฌ List<Member> members = query.from(member).where(member.username.eq("kim")).list(member);
-
QueryDSL ๋ํ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ ์ฉ ํด๋์ค๋ฅผ ๋ง๋ค๋ฉฐ ์ ์์ ์์๋
QMember
๊ฐ ์ฟผ๋ฆฌ ์ ์ฉ ํด๋์ค
-
SQL์ ์ง์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ง์ํ๋๋ฐ ์ด๋ฅผ ๋ค์ดํฐ๋ธ SQL์ด๋ผ๊ณ ํจ
-
์๋ฌด๋ฆฌ ์ถ์ํ๋ฅผ ํ๋๋ผ๋ JPQL์์ ์ง์ํ์ง ์์ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌ, ๋ฐ๋ผ์ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ค์ดํฐ๋ธ SQL์ ์ฌ์ฉ
-
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์กด์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ฟผ๋ฆฌ ๋ํ ๋ณ๊ฒฝ
-
String sql = "SELECT * FROM MEMBER WHERE NAME = 'kim'"; list<Member> resultList = em.createNativeQeury(sql, Member.class).getResultList();
- JDBC๋ฅผ ์ง์ ์ฌ์ฉํ๋ ค๋ฉด JPA์์ ์ ๊ณตํ๋ API๊ฐ ์์ผ๋ฏ๋ก ๊ตฌํ์ฒด๋ค์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ปค๋ฅ์ ์ ํ๋
EntityManager
์์ ํ์ด๋ฒ๋ค์ดํธSession
์ ๊ตฌํจ- ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ ์ ํ ์์ ์ ๊ฐ์ ๋ก ํ๋ฌ์
- JPA๋ฅผ ๊ฑฐ์ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ฐํํ์ฌ ์ฌ์ฉํ๋ฏ๋ก JPA๊ฐ ์ธ์ X, ๋ฐ๋ผ์ ์์์ฑ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ถ์ผ์น ๋ ์ ์์
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐํํ์ฌ SQL์ ์คํํ๊ธฐ ์ง์ ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์๋์ผ๋ก ํ๋ฌ์ํ์ฌ ๋๊ธฐํ
- ์คํ๋ง์์๋ AOP๋ฅผ ์ ์ ํ๊ฒ ํ์ฉํ์ฌ JPA๋ฅผ ์ฐํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ธํ ๋๋ง๋ค ํ๋ฌ์๋ฅผ ํธ์ถ
-
SQL๊ณผ ๋น์ทํ๊ฒ SELECT, UPDATE, DELETE ๋ฌธ์ ์ฌ์ฉ, ์ ์ฅ์์๋
EntityManager.persist()
๋ฉ์๋ ์ฌ์ฉ -
SELECT
select m from Memeber as m where m.username='kim'
์ ๊ฐ์ด ์ฌ์ฉ- ์ํฐํฐ ๊ด๋ จํ ํค์๋(Memeber, username)๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง๋ง JPQL๊ณผ ๊ด๋ จ๋ ํค์๋(SELECT, FROM, AS)๋ ๋์๋ฌธ์ ๊ตฌ๋ถ X
Member
๋ ํด๋์ค๋ช ์ด ์๋ ์ํฐํฐ๋ช , ๋ง์ฝ ์ํฐํฐ๋ช ์ ์ง์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ํด๋์ค ๋ช ์ผ๋ก ์ฌ์ฉ- ๋ณ์นญ์ ๋ฌด์กฐ๊ฑด ์ฌ์ฉ(AS๋ ์๋ต ๊ฐ๋ฅ)
-
TypeQuery, Query
- JPQL์ ์คํํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์์ฑ
- ์ฟผ๋ฆฌ ๊ฐ์ฒด์๋ TypeQuery์ Query๊ฐ ์กด์ฌํ๋๋ฐ TypeQuery๋ ๋ฐํํ ํ์ ์ ๋ช ํํ๊ฒ ์ง์ ํ ์ ์์ ๋ ์ฌ์ฉ
em.createQuery()
๋ฉ์๋์์ 2๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ฐํํ ํ์ ์ ์ง์ ํ๋ฉด TypeQuery๋ฅผ ๊ทธ๋ ์ง ์์ผ๋ฉด Query๋ฅผ ๋ฐํ- Qeury๋ ์กฐํ ๋์์ด ๋ ์ด์์ด๋ฉด
Object[]
๋ฅผ ํ๋๋ฉดObject
๋ฅผ ๋ฐํ
-
๊ฒฐ๊ณผ ์กฐํ
-
๋ค์ ๋ฉ์๋๋ค์ ํธ์ถํ๋ค๋ฉด ์ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํ
query.getResultList()
: ๊ฒฐ๊ณผ๋ฅผ ์์ ๋ก ๋ฐํ, ๋ง์ฝ ์๋ค๋ฉด ๋น ์ปฌ๋ ์ query.getSingleResult()
: ๊ฒฐ๊ณผ๋ฅผ ์ ํํ ํ๋์ผ ๋ ์ฌ์ฉ, ๊ฒฐ๊ณผ๊ฐ ์๊ฑฐ๋ 1๊ฐ๋ณด๋ค ๋ง๋ค๋ฉด ์์ธ ๋ฐ์
-
-
JPQL์ ์ด๋ฆ ๊ธฐ์ค ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์ง์
-
์ด๋ฆ ๊ธฐ์ค ํ๋ผ๋ฏธํฐ
-
ํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ
-
ํ๋ผ๋ฏธํฐ ์์
:
๋ฅผ ์ฌ์ฉTypedQuery<Member> query = em.createQuery("SELECT m FROM Member m where m.username = :username", Member.class) .setParameter("username", usernameParam) .getResultList();
-
-
์์น ๊ธฐ์ค ํ๋ผ๋ฏธํฐ
-
?
๋ค์์ ์์น ๊ฐ์ ์ค -
์์น๊ฐ์ 1๋ถํฐ ์์
List<Member> members = em.createQuery("SELECT m FROM Member m where m.username = ?1", Member.class) .setParameter(1, usernameParam) .getResultList();
-
-
์์น ๊ธฐ์ค ํ๋ผ๋ฏธํฐ๋ณด๋จ ์ด๋ฆ ๊ธฐ์ค ํ๋ผ๋ฏธํฐ ๋ฐฉ์์ด ๋ ๋ช ํ
-
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ๋ฌธ์์ด๋ง ์ฌ์ฉํ๋ฉด SQL ์ธ์ ์ ๊ณต๊ฒฉ์ ๋นํ ์ ์์
๋ํ, ํ๋ผ๋ฏธํฐ๋ง ๋ณ๊ฒฝ๋๋ค๋ฉด ๊ฐ์ ์ฟผ๋ฆฌ๋ก ์ธ์๋์ด SQL๋ก ํ์ฑํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ์ฌ ์ฑ๋ฅ์ ์ด์ ์ ๊ฐ์ง -
๋ฐ๋ผ์, ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ๋ฐฉ์์ ์ ํ์ด ์๋ ํ์!
-
SELECT ์ ์์ ์กฐํํ ๋์์ ์ง์ ํ๋ ๊ฒ์ ํ๋ก์ ์ ์ด๋ผ๊ณ ํจ
SELECT [ํ๋ก์ ์ ๋์] FROM ...
์ผ๋ก ๋์์ ์ ํ -
์ํฐํฐ ํ๋ก์ ์
SELECT m FROM Member m
,SELECT m.team FROM Member m
๊ณผ ๊ฐ์ด ์ฌ์ฉ- ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์กฐํํ ์ํฐํฐ๋ ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ
-
์๋ฒ ๋๋ ํ์ ํ๋ก์ ์
- ์ํฐํฐ์ ๊ฑฐ์ ๋น์ทํ๊ฒ ์ฌ์ฉ
- ์๋ฒ ๋๋ ํ์ ์ ์ํฐํฐ ํ์ ์ด ์๋ ๊ฐ ํ์ ์ด๋ฏ๋ก ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋์ง ์์
-
์ค์นผ๋ผ ํ์ ํ๋ก์ ์
- ์ซ์, ๋ฌธ์, ๋ ์ง์ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด DISTINCI ์ฌ์ฉ
- ํต๊ณ ์ฟผ๋ฆฌ๋ ์ฃผ๋ก ์ค์นผ๋ผ ํ์ ์ผ๋ก ์กฐํ
-
์ฌ๋ฌ ๊ฐ ์กฐํ
- ์ฌ๋ฌ ๊ฐ์ ์ ํํ๋ค๋ฉด TypeQuery๋ฅผ ์ฌ์ฉํ ์ ์์
- ์ค์นผ๋ผ ๋ง๊ณ ๋ ์ํฐํฐ ํ์ ๋ ์ฌ๋ฌ ๊ฐ์ ํจ๊ป ์กฐํ ๊ฐ๋ฅ
-
NEW ๋ช ๋ น์ด
-
์ฌ๋ฌ ๊ฐ์ ์กฐํ์์
Object[]
ํ์ ์ ์ฌ์ฉํ์ง ์๊ณ DTO ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉ -
์ฝ๋๋ก ๋ณ๊ฒฝํด๋ ๋์ง๋ง, new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ DTO ๊ฐ์ฒด๋ก ๋ฐ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ
TypedQeury<UserDTO> query = em.createQuery("SELECT new jpabook.jpql.UserDTO(m.username, m.age) FROM Member m", userDTO.class); List<UserDTO> resultList = query.getResultList();
-
์ด๋ฅผ ์ฌ์ฉํ ๋๋ ํจํค์ง ๋ช ์ ํฌํจํ ์ ์ฒด ํด๋์ค ๋ช ์ ์ ๋ ฅ, ์์์ ํ์ ์ด ์ผ์นํ๋ ์์ฑ์ ํ์
-
- ํ์ด์ง ์ฒ๋ฆฌ์ฉ SQL์ ๋ฐ๋ณต์ ์ด๊ณ ์ง๋ฃจํจ, ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค SQL ๋ฌธ๋ฒ์ด ๋ค๋ฆ
- JPA์์๋ ๋ API๋ก ์ถ์ํ
setFirstReulst()
: ์กฐํ ์์ ์์น(0๋ถํฐ ์์)setMaxResults()
: ์กฐํํ ๋ฐ์ดํฐ ์
- ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค SQL๋ฌธ์ด ๋ณ๊ฒฝ
-
์งํฉํจ์
ํจ์ ์ค๋ช COUNT ๊ฒฐ๊ณผ ์๋ฅผ ๊ตฌํจ(๋ฐํ : Long) MAX, MIN ์ต๋, ์ต์ ๊ฐ์ ๊ตฌํจ(๋ฌธ์, ์ซ์ ๋ ์ง ๋ฑ์ ์ฌ์ฉ) AVG ํ๊ท ๊ฐ ๊ตฌํจ(์ซ์ ํ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅ, ๋ฐํ : Double) SUM ํฉ์ ๊ตฌํจ(์ซ์ ํ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅ, ๋ฐํ ํ์ : Long, Double, BigInteger, BigDecimal) -
์งํจ ํจ์ ์ฌ์ฉ์ ์ฐธ๊ณ ์ฌํญ
- NULL ๊ฐ์ ๋ฌด์ํ๋ฏ๋ก ํต๊ณ ๊ฒฐ๊ณผ์ ๋ฐ์ X
- ๊ฐ์ด ์๋๋ฐ SUM, AVG, MAX, MIN ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด NULL, COUNT๋ 0
- DISTINCT๋ฅผ ์งํฉ ํจ์ ์์ ์ฌ์ฉํด์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ ์งํฉ์ ๊ตฌํ ์ ์์(COUNT์ ๊ฒฝ์ฐ ์๋ฒ ๋๋ ํ์ ์ง์ X)
-
GROUP BY, HAVING
-
GROUP BY
ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ ๋ ํน์ ๊ทธ๋ฃน๋ผ๋ฆฌ ๋ฌถ์
-
HAVING
GROUP BY์ ํจ๊ป ์ฌ์ฉ, ๊ทธ๋ฃนํํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ๋ง
-
-
์ ๋ ฌ(ORDER BY)
- ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ ๋ ์ฌ์ฉ
- ASC : ์ค๋ฆ์ฐจ์(๊ธฐ๋ณธ๊ฐ), DESC : ๋ด๋ฆผ์ฐจ์
- ๋ด๋ถ ์กฐ์ธ
- INNER JOIN ์ฌ์ฉ(INNER ์๋ต ๊ฐ๋ฅ)
"SELECT m FROM Member m INNER JOIN m.team t WHERE t.name = :teamName"
- ์ธ๋ถ ์กฐ์ธ
SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
- ์ปฌ๋ ์
์กฐ์ธ
- ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ ๊ณณ์ ์กฐ์ธํ๋ ๊ฒ
- ์ปฌ๋ ์ ์กฐ์ธ์์๋ IN์ ์ฌ์ฉ ๊ฐ๋ฅ, ๊ธฐ๋ฅ์ JOIN๊ณผ ๊ฐ์ง๋ง ์ปฌ๋ ์ ์ผ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ์ธํ ์กฐ์ธ
- WHERE ์ ์ ์ฌ์ฉํ์ฌ ์ธํ ์กฐ์ธ
- ๋ด๋ถ ์กฐ์ธ๋ง ์ง์
- JOIN ON ์
- JPA 2.1๋ถํฐ ์กฐ์ธ ์์ ON ์ ์ ์ง์
- ON์ ์ ์ฌ์ฉํ๋ฉด ํํฐ๋ง์ ํ๊ณ ์กฐ์ธ ๊ฐ๋ฅ
- ๋ด๋ถ ์กฐ์ธ์ ON ์ ์ WHERE๊ณผ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ผ๋ฏ๋ก ๋ณดํต ์ธ๋ถ ์กฐ์ธ์์ ์ฌ์ฉ
-
ํ์น ์กฐ์ธ์ JPQL์์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์ ๊ณตํ๋ ๊ธฐ๋ฅ
-
์ฐ๊ด๋ ์ํฐํฐ๋ ์ปฌ๋ ์ ์ ํ ๋ฒ์ ๊ฐ์ด ์กฐํํ๋ ๊ธฐ๋ฅ(
join fetch
) -
์ํฐํฐ ํ์น ์กฐ์ธ
-
select m from Member m join fetch m.team
์ด๋ ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ ๋Member์ Team์ ํจ๊ป ์กฐํ(ํ์น ์กฐ์ธ์๋ ๋ณ์นญ X, ํ์ด๋ฒ๋ค์ดํธ๋ ํ์ฉ)
-
์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํด๋ ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์๋ฌด ์๋ฏธ๊ฐ ์์
-
-
์ปฌ๋ ์ ํ์น ์กฐ์ธ
-
ํ์น ์กฐ์ธ๊ณผ DISTINCT
-
ํ์น ์กฐ์ธ๊ณผ ์ผ๋ฐ ์กฐ์ธ์ ์ฐจ์ด
- ์ผ๋ฐ ์กฐ์ธ์ ๊ฒฝ์ฐ SELECT์ ์ ์ด ํ๋ก์ ์ ๋ง ์กฐํ
- ํ์น ์กฐ์ธ์ ๋ชจ๋ ์ํฐํฐ๋ฅผ ์กฐํ
-
ํ์น ์กฐ์ธ์ ํน์ง๊ณผ ํ๊ณ
- ํ์น ์กฐ์ธ์ ์ผ๋ฐ ์กฐ์ธ๋ณด๋ค SQL ํธ์ถ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์์
- ๋ํ ๊ธ๋ก๋ฒ ๋ก๋ฉ ์ ๋ต๋ณด๋ค ์ฐ์ ์์๊ฐ ์(
join fetch
>FetchType.LAZY
) - ์ต์ ํ๋ฅผ ์ํด ์ฆ์ ๋ก๋ฉ์ ํ๋ ๊ฒ๋ณด๋ค ํ์ํ ๊ณณ์ ํ์น ์กฐ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ด๋
- ์ค์์ ์ํ ์์๋ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ ๊ฐ๋ฅ
- ํ์น ์กฐ์ธ ๋์์๋ ๋ณ์นญ์ ์ค ์ ์์
๋ฐ๋ผ์ SELECT, WHERE ์ , ์๋ธ ์ฟผ๋ฆฌ์์ ํ์น ์กฐ์ธ ๋์์ ์ฌ์ฉํ ์ ์์
(ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ํฌํจํ ๋ช๋ช ๊ตฌํ์ฒด์์๋ ๋ณ์นญ์ ์ฌ์ฉํ ์ ์์ง๋ง ์๋ชป ์ฌ์ฉํ๋ฉด ์ฐ๊ด๋ ๋ฐ์ดํฐ ์๊ฐ ๋ฌ๋ผ์ ธ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ์ ์์ด ์กฐ์ฌํด์ ์ฌ์ฉ) - ๋ ์ด์์ ์ปฌ๋ ์ ์ ํ์น ํ ์ ์์(๊ตฌํ์ฒด์ ๋ฐ๋ผ ๋๊ธฐ๋ ํ์ง๋ง ๊ฒฐ๊ณผ๊ฐ ์นดํ ์์ ๊ณฑ์ด ๋ง๋ค์ด์ง๋ฏ๋ก ์ฃผ์)
- ์ปฌ๋ ์
์ ํ์น ์กฐ์ธํ๋ฉด ํ์ด์ง API๋ฅผ ์ฌ์ฉํ ์ ์์
์ปฌ๋ ์ ์ด ์๋ ๋จ์ผ ๊ฐ ์ฐ๊ด ํ๋๋ค์ ํ์น ์กฐ์ธ์ ์ฌ์ฉํด๋ ํ์ด์ง API ์ฌ์ฉ ๊ฐ๋ฅ - ํ์ด๋ฒ๋ค์ดํธ์์ ์ปฌ๋ ์
ํ์น ์กฐ์ธ ํ์ ํ์ด์ง API๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฝ๊ณ ๋ก๊ทธ ๋ฐ์, ๋ฉ๋ชจ๋ฆฌ์์ ํ์ด์ง ์ฒ๋ฆฌ
๋ฐ์ดํฐ๊ฐ ๋ง๋ค๋ฉด ์ฑ๋ฅ ์ด์์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ์์ธ ๋ฐ์
-
๊ฒฝ๋ก ํํ์์
.
์ ์ฐ์ด ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ๊ฒ
select m.username from Member m join m.team t join m.orders o where t.name = 'ํA'
์ฌ๊ธฐ์m.username
,m.team
,m.orders
,t.name
์ด ๋ชจ๋ ๊ฒฝ๋ก ํํ์ -
๊ฒฝ๋ก ํํ์์ ์ฉ์ด ์ ๋ฆฌ
-
์ํ ํ๋
๋จ์ํ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ํ๋(ํ๋ or ํ๋กํผํฐ)
-
์ฐ๊ด ํ๋
์ฐ๊ด๊ด๊ณ๋ฅผ ์ํ ํ๋, ์๋ฒ ๋๋ ํ์ ํฌํจ(ํ๋ or ํ๋กํผํฐ)
- ๋จ์ผ ๊ฐ ์ฐ๊ด ํ๋ : @ManyToOne, @OneToOne, ๋์์ด ์ํฐํฐ
- ์ปฌ๋ ์ ๊ฐ ์ฐ๊ด ํ๋ : @OneToMany, @ManyToMany, ๋์์ด ์ปฌ๋ ์
-
-
๊ฒฝ๋ก ํํ์๊ณผ ํน์ง
-
์ํ ํ๋ ๊ฒฝ๋ก
๊ฒฝ๋ก ํ์์ ๋
-
๋จ์ผ ๊ฐ ์ฐ๊ด ๊ฒฝ๋ก
๋ฌต์์ ์ผ๋ก ๋ด๋ถ ์กฐ์ธ ๋ฐ์
๋จ์ผ ๊ฐ ์ฐ๊ด ๊ฒฝ๋ก๋ ๊ณ์ ํ์ ๊ฐ๋ฅ
-
์ปฌ๋ ์ ๊ฐ ์ฐ๊ด ๊ฒฝ๋ก
๋ฌต์์ ์ผ๋ก ๋ด๋ถ ์กฐ์ธ ๋ฐ์
๋๋ ํ์ ๋ถ๊ฐ๋ฅ, ๋จ FROM ์ ์์ ์กฐ์ธ์ ํตํด ๋ณ์นญ์ ์ป์ผ๋ฉด ๋ณ์นญ์ผ๋ก ํ์ ๊ฐ๋ฅ
-
-
๊ฒฝ๋ก ํ์์ ์ฌ์ฉํ ๋ฌต์์ ์กฐ์ธ ์ ์ฃผ์์ฌํญ
- ํญ์ ๋ด๋ถ ์กฐ์ธ
- ์ปฌ๋ ์ ์ ๊ฒฝ๋ก ํ์์ ๋, ๋ฐ๋ผ์ ์ปฌ๋ ์ ์์ ๊ฒฝ๋ก ํ์์ ํ๋ ค๋ฉด ์กฐ์ธํ์ฌ ๋ณ์นญ์ ์ป์ด์ผ ํจ
- ์ฃผ๋ก SELECT, WHERE ์ ์์ ๋ง์ด ์ฌ์ฉํ์ง๋ง ๋ฌต์์ ์กฐ์ธ์ผ๋ก ์ธํด SQL์ FROM์ ์ ์ํฅ
-
์กฐ์ธ์ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ด์๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ์ ๋ฌต์์ ์กฐ์ธ๋ณด๋ค๋ ๋ช ์์ ์กฐ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์
-
์๋ธ ์ฟผ๋ฆฌ๋ WHERE, HAVING ์ ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ(๋๋จธ์ง์์๋ ๋ถ๊ฐ, ํ์ด๋ฒ๋ค์ดํธ์์๋ SELECT๋ ๊ฐ๋ฅ)
-
์๋ธ ์ฟผ๋ฆฌ ํจ์
-
[NOT] EXISTS (subquery)
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด ์ฐธ(NOT์ ๋ฐ๋)
-
{ALL | ANY | SOME} (subquery)
๋น๊ต ์ฐ์ฐ์์ ๊ฐ์ด ์ฌ์ฉ
์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑ์ผ ๋ ์ฐธ(ALL), ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด (ANY, SOME) -
[NOT] IN (subquery)
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์ค ํ๋๋ผ๋ ๊ฐ์ ๊ฒ์ด ์์ผ๋ฉด ์ฐธ
IN์ ์๋ธ ์ฟผ๋ฆฌ๊ฐ ์๋ ๊ณณ์์๋ ์ฌ์ฉ
-
-
ํ์ ํํ
์ข ๋ฅ ์ค๋ช ์์ ๋ฌธ์ ์์ ๋ฐ์ดํ ์ฌ์ด์ ํํ
์์ ๋ฐ์ดํ ์ฌ์ฉ์์๋ ์ฐ์ ๋๊ฐ ์ฌ์ฉ'HELLO'
'She''s'์ซ์ L(Long), D(Double), F(Float) 10L, 10D, 10F ๋ ์ง DATE {d 'yyyy-mm-dd'}
TIME {t 'hh-mm-ss'}
DATETIME {ts 'yyyy-mm-dd hh:mm:ss.f'}{d '2021-07-02'}
{t '10-20-10'}
{ts '2021-07-02 10:20:10.123'}Boolean TRUE, FALSE Enum ํจํค์ง๋ช ์ ํฌํจํ ์ ์ฒด ์ด๋ฆ ์ฌ์ฉ jong.MemberType.Admin ์ํฐํฐ ํ์ ์ํฐํฐ ํ์ ์ ํํ. ์ฃผ๋ก ์์ ๊ด๋ จ TYPE(m) = Member -
๋๋จธ์ง ์๋ต
- ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด ๊ทธ ์์ ์ํฐํฐ๋ ํจ๊ป ์กฐํ
- TYPE
- ์ํฐํฐ์ ์์ ๊ตฌ์กฐ์์ ์กฐํ ๋์์ ํน์ ์์ ํ์ ์ผ๋ก ํ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ
- TREAT(JPA 2.1)
- 2.1์์ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก ์๋ฐ์ ํ์ ์บ์คํ ๊ณผ ๋น์ท
- ์์ ๊ตฌ์กฐ์์ ๋ถ๋ชจ ํ์ ์ ํน์ ์์ ํ์ ์ผ๋ก ๋ค๋ฃฐ ๋ ์ฌ์ฉ
- JPA ํ์ค์ FROM, WHERE ์ ์์ ์ฌ์ฉํ ์ ์์ง๋ง, ํ์ด๋ฒ๋ค์ดํธ๋ SELECT ์ ์์๋ TREAT๋ฅผ ์ฌ์ฉ
- 2.1๋ถํฐ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ง์
- ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ ํด๋์ค๋ฅผ ์์ํ์ฌ ๊ตฌํํ๊ณ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํจ์ ๋ฏธ๋ฆฌ ๋ฑ๋ก
- ENUM์ = ๋น๊ต ์ฐ์ฐ๋ง ์ง์
- ์๋ฒ ๋๋ ํ์ ์ ๋น๊ต๋ฅผ ์ง์ X
- EMPTY STRING
- ''์ ๊ธธ์ด 0์ธ Empty String์ผ๋ก ์ ํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ผ NULL๋ก ์ฌ์ฉํ๋ ๊ฒ๋ ์กด์ฌ
- NULL
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๊ฐ ์์ ๋
- ์ ์ ์๋ ๊ฐ
- NULL๊ณผ ๋ชจ๋ ์ํ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ NULL
- Null == Null์ ์ ์ ์๋ ๊ฐ
- Null is Null์ ์ฐธ
- ์๋ต
-
JPQL ์ฟผ๋ฆฌ๋ ํฌ๊ฒ ๋์ ์ฟผ๋ฆฌ์ ์ ์ ์ฟผ๋ฆฌ๋ก ๋๋ ์ ์์
-
๋์ ์ฟผ๋ฆฌ
- JPQL์ ๋ฌธ์๋ก ์์ฑํ์ฌ ์ง์ ๋๊ธฐ๋ ๊ฒ
- ๋ฐํ์์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ JPQL์ ๋์ ์ผ๋ก ๊ตฌ์ฑ
-
์ ์ ์ฟผ๋ฆฌ
- ๋ฏธ๋ฆฌ ์ ์ํ ์ฟผ๋ฆฌ์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ํ์ํ ๋ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๋ฅผ Named ์ฟผ๋ฆฌ๋ผ ํจ
- ์ด๋ ํ๋ฒ ์ ์ํ๋ฉด ๋ณ๊ฒฝํ ์ ์๋ ์ ์ ์ธ ์ฟผ๋ฆฌ
-
Named ์ฟผ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ JPQL ๋ฌธ๋ฒ์ ์ฒดํฌํ๊ณ ๋ฏธ๋ฆฌ ํ์ฑ
-
๋ฐ๋ผ์ ์ค๋ฅ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉํ๋ ์์ ์๋ ํ์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๋ฏ๋ก ์ฑ๋ฅ์ ์ด์ ์กด์ฌ
-
๋ณํ์ง ์๋ ์ ์ SQL์ด ์์ฑ๋๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กฐํ ์ฑ๋ฅ ์ต์ ํ์๋ ๋์
-
์ด๋ ธํ ์ด์ ์ ์ ์
-
Named ์ฟผ๋ฆฌ๋ฅผ ์ด๋ฆ ๊ทธ๋๋ก ์ฟผ๋ฆฌ์ ์ด๋ฆ์ ๋ถ์ฌํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
-
@NamedQuery
์ด๋ ธํ ์ด์ ์ฌ์ฉ -
@Entity @NamedQuery( // ์ถฉ๋ ๋ฐฉ์ง name = "Member.findByUsername", query = "select m from Member m where m.username = :username") public class Member{ ... } List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class).setParameter("username", "jong").getResultList();
-
๋๊ฐ ์ด์์
@NamedQueries()
์ฌ์ฉ
-
-
XML์ ์ ์
- ์ด๋ ธํ ์ด์ ์ด ๋ ์ง๊ด์ ์ด์ง๋ง XML์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํธ๋ฆฌ(๋ฉํฐ๋ผ์ธ ๋๋ฌธ)
-
๋ง์ฝ ์ด๋ ธํ ์ด์ ๊ณผ XML์ ๊ฐ์ ์ค์ ์ด ์กด์ฌํ๋ค๋ฉด XML์์ ์ฐ์ ๊ถ์ ๊ฐ์ง
์๋ต
- ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์๊ฐ ์๋ ์ฝ๋๋ก ์์ฑํด๋ ์ฝ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ ์ฟผ๋ฆฌ์ ๋น์ทํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ ํ๋ก์ ํธ
- QueryDSL์ ์ด๋ฆ ๊ทธ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์กฐํํ๋๋ฐ ํนํ
- ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- querydsl-jpa : QueryDSL JPA ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- querydsl-apt : ์ฟผ๋ฆฌ ํ์ ์ ์์ฑํ ๋ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
JPAQuery
๊ฐ์ฒด๋ฅผ ์์ฑ ๋ฐ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์์ฑ์์ ๋๊ฒจ์ค- ์ฟผ๋ฆฌ ํ์ ์ ์์ฑ ๋ฐ ๋ณ์นญ ์ฃผ๊ธฐ
- ๊ธฐ๋ณธ Q ์์ฑ
- ์ฌ์ฉ์ ํธ๋ฆฌ๋ฅผ ์ํด ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ๋ณด๊ด
- ํ์ง๋ง ๋ณ์นญ์ ์ง์ ์ค์ ํด์ผ๋ ๋๋ ์๋ก ์์ฑ
- QueryDSL์ WHERE ์ ์๋ AND ํน์ OR ์ฌ์ฉ ๊ฐ๋ฅ ๋ฐ ์ฌ๋ฌ๊ฐ์ง ๊ฒ์ ์กฐ๊ฑด ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ฒฐ๊ณผ ์กฐํ ๋ฉ์๋๋ฅผ ํธ์ถ ์์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํ
- ์กฐํ ๋ฉ์๋
uniqueResult()
: ์กฐํ ๊ฒฐ๊ณผ๊ฐ ํ ๊ฑด์ผ ๋ ์ฌ์ฉ, ์์ผ๋ฉด null, ํ๋ ์ด์์ด๋ฉด ์์ธ ๋ฐ์singleResult()
:uniqueResult()
์ ๋น์ท, ํ๋ ์ด์์ ๊ฒฐ๊ณผ์์๋ ์ฒ์ ๋ฐ์ดํฐ ๋ฐํlist()
: ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ผ ๋ ์ฌ์ฉ, ๊ฒฐ๊ณผ๊ฐ ์๋ค๋ฉด ๋น ์ปฌ๋ ์ ๋ฐํ
- ์ ๋ ฌ์ ๊ฒฝ์ฐ
orderBy()
๋ฉ์๋ ์ฌ์ฉ - ํ์ด์ง์
offset()
๊ณผlimit()
์ ์กฐํฉํ์ฌ ์ฌ์ฉ ํน์restrict()
๋ฉ์๋ ์ฌ์ฉ - ๋ง์ฝ ์ ์ฒด ๋ฐ์ดํฐ ์๋ฅผ ์๊ณ ์ถ๋ค๋ฉด
list()
๋์ ์listResults()
๋ฅผ ์ฌ์ฉ(์ด ๋๋ ์ ์ฒด ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ํ count ์ฟผ๋ฆฌ ์ถ๊ฐ ์คํ)
groupBy()
๋ฅผ ์ฌ์ฉํ๊ณ ๊ทธ๋ฃนํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๊ธฐ ์ํดhaving()
์ ์ฌ์ฉ
- ์กฐ์ธ์ ๊ฒฝ์ฐ
innerJoin
,leftJoin
,rightJoin
,fullJoin
์ ์ฌ์ฉ ๊ฐ๋ฅ - ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ
fetch
์กฐ์ธ๋ ์ฌ์ฉ ๊ฐ๋ฅ
JPASubQuery
๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉ- ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ํ๋๋ฉด
unique()
, ์ฌ๋ฌ๊ฐ๋ฉดlist()
๋ฅผ ์ฌ์ฉ
- ํ๋ก์ ์ ๋์์ด ํ๋๋ฉด ํด๋น ํ์ ์ผ๋ก ๋ฐํ
- ์ฌ๋ฌ๊ฐ์ ์ ์์ด๋ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก Tuple ์ด๋ผ๋ Map๊ณผ ํก์ฌํ ๋ด๋ถ ํ์ ์ ์ฌ์ฉ
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ํฐํฐ๊ฐ ์๋ ํน์ ๊ฐ์ฒด๋ก ๋ฐ๊ณ ์ถ๋ค๋ฉด ๋น ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉ(ํ๋กํผํฐ ์ ๊ทผ, ํ๋ ์ง์ ์ ๊ทผ, ์์ฑ์ ์ฌ์ฉ)
- ๋น ์์ฑ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด
Projections
๋ฅผ ์ฌ์ฉbean()
์ ๊ฒฝ์ฐ๋Setter
๋ฅผ ์ด์ฉํ๊ณfields()
์ฌ์ฉํ๋ฉด ํ๋์ ์ง์ ์ ๊ทผํ์ฌ ๊ฐ์ ์ฑ์(private
๋) ,constructor()
๋ ์์ฑ์๋ฅผ ์ฌ์ฉ(ํ๋ก์ ์ ์์์ ํ๋ผ๋ฏธํฐ ์์๊ฐ ๋์ผํ ์์ฑ์๊ฐ ํ์) - ๋ง์ฝ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด๋ฆ๊ณผ ํ๋กํผํฐ์ ์ด๋ฆ์ด ๋ค๋ฅด๋ฉด
as()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์นญ์ ๋ถ์ฌ
- QueryDSL์์๋ ์์ , ์ญ์ ๊ฐ์ ๋ฐฐ์น ์ฟผ๋ฆฌ๊ฐ ์์ง๋ง, JPQL๊ณผ ๊ฐ์ด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ง์ ์ฟผ๋ฆฌ
BooleanBuilder
๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋์ ์ฟผ๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑ ๊ฐ๋ฅ
-
๋ฉ์๋ ์์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ ํ์ ์ ๊ฒ์ ์กฐ๊ฑด์ ์ง์ ์ ์ ๊ฐ๋ฅ
-
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ
QueryDelegate
์ด๋ ธํ ์ด์ ์์ฑ์ผ๋ก ์ ์ฉํ ์ํฐํฐ๋ฅผ ์ง์ -
ํด๋น ๊ฐ๊ฒฉ๋ณด๋ค ๋น์ผ์ง๋ฅผ ํ์ธํ๋ ๋ฉ์๋
public class ProductExpression { @QueryDelegate(Product.class) public static BooleanExpression isExpensive(QProduct product, Integer price) { return product.price.gt(price); } }
์ดํ mvn build๋ฅผ ํ๊ณ
QProduct
๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑ์ด ๋์ด์๋๊ฒ์ ๋ณผ ์ ์์
์๋ต
-
์ํฐํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ๋ ๊ธฐ์กด ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณ๊ฒฝ ๊ฐ์ง ๊ธฐ๋ฅ์ด๋ ๋ณํฉ,
remove()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆผ. ์ด ๋ ์ฌ๋ฌ๊ฑด์ ํ ๋ฒ์ ์์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๋ฒํฌ ์ฐ์ฐ์ ์ฌ์ฉ -
๋ฒํฌ ์ฐ์ฐ์ ๊ฒฝ์ฐ
excuteUpdate()
๋ฉ์๋๋ฅผ ์ฌ์ฉ, ์ดํ ์ํฅ์ ๋ฐ์ ์ํฐํฐ ๊ฑด์๋ฅผ ๋ฐํint resultCnt = em.createQuery("~~~") .setParameter("price", 1000) .excuteUpdate();
-
ํ์ด๋ฒ๋ค์ดํธ์ ๊ฒฝ์ฐ, INSERT ๋ฒํฌ ์ฐ์ฐ๋ ์ง์
-
๋ฒํฌ ์ฐ์ฐ์ ์ฃผ์์
- ๋ฒํฌ ์ฐ์ฐ์ ๊ฒฝ์ฐ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฌด์ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ฟผ๋ฆฌ
- ๋ฐ์ํ ์ ์๋ ์์
- ๊ฐ๊ฒฉ์ด 1000์์ธ ์ํ A๋ฅผ ์กฐํ(์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ)
- ๋ฒํฌ ์ฐ์ฐ์ผ๋ก ๋ชจ๋ ์ํ์ ๊ฐ๊ฒฉ์ 10% ์์น, ์ด๋ก์ธํด ์ํ A๋ 1100์
- ๊ธฐ์กด ์กฐํํ ์ํ A์ ๊ฐ๊ฒฉ์ ์ถ๋ ฅํ๋ฉด 1100์์ด ์๋ 1000์ ์ถ๋ ฅ
- ํด๊ฒฐ ๋ฐฉ์
em.refresh()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ A๋ฅผ ๋ค์ ์กฐํ- ๋ฒํฌ ์ฐ์ฐ์ ๋จผ์ ์คํ ํ์ ์ํฐํฐ๋ฅผ ์กฐํ(JPA, JDBC๋ฅผ ํจ๊ป ์ฌ์ฉ์์ ์ ์ฉ)
- ๋ฒํฌ ์ฐ์ฐ ์งํ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด๊ธฐํ
- JPQL๋ก ์ํฐํฐ๋ฅผ ์กฐํํ๋ฉด ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋ฅผ ํ์ง๋ง ์๋ฒ ๋๋ ํ์ ์ ๊ทธ๋ ์ง ์์. ๋ฐ๋ผ์ ๋ณ๊ฒฝ ๊ฐ์ง์ ์ํ ์์ ์ด ๋ฐ์ํ์ง ์์
- ๋ง์ฝ, JPQL๋ก ์กฐํํ ์ํฐํฐ๊ฐ ์์์ฑ ์ปจํ ์คํธ์ ์กด์ฌํ๋ค๋ฉด JPQL๋ก ์กฐํํ ์ํฐํฐ๋ ๋ฒ๋ฆฌ๊ณ ๊ธฐ์กด ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌํ๋ ์ํฐํฐ๋ฅผ ๋ฐํ(์ด๋, ์๋ณ์๋ฅผ ํตํด ๋น๊ต)
- ์๋๋ฆฌ์ค
- JPQL์ ์ฌ์ฉํ์ฌ ์กฐํ ์์ฒญ
- JPQL โ SQL ๋ณํ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ
- ์กฐํํ ๊ฒฐ๊ณผ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋น๊ต
- ์๋ณ์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์๋ ๊ฒ์ ๋ฒ๋ฆฌ๊ณ ์๋ ๊ฒ์ ์ถ๊ฐ
- ์์ฒญํ ๊ฐ ๋ฐํ
- ์ ์ด๋ฐ ๋์์ ํ๋๊ฐ?
- ์๋ก์ด ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ถ๊ฐํ๋ค๊ณ ํ๋ค๋ฉด, ์๋ณ์ ๊ฐ์ ์ค๋ณต๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ
- ์๋ก์ด ์ํฐํฐ๋ก ๋ฐ๊พผ๋ค๊ณ ํ๋ค๋ฉด, ์์์ฑ ์ปจํ ์คํธ์์ ์์ ์ค์ธ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง ์ํ์ด ์กด์ฌ
find()
๋ฉ์๋์๋ ๋ฌ๋ฆฌ ํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๊ธฐ์ ์ฑ๋ฅ์ ์ฐจ์ด๊ฐ ๋ฐ์
- ํ๋ฌ์๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ ํ๋ ์์
- ํ๋ฌ์๋
flush()
๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ๋ก ์คํํ๊ฑฐ๋ ํ๋ฌ์ ๋ชจ๋์ ๋ฐ๋ผ ์ปค๋ฐํ๊ธฐ ์ง์ ํน์ ์ฟผ๋ฆฌ ์คํ ์ง์ ์ ์๋์ผ๋ก ํธ์ถ(์ฟผ๋ฆฌ ์คํ ์ง์ ํธ์ถ์ด ๊ธฐ๋ณธ๊ฐ) - JPQL์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์์์ฑ ์ปจํ
์คํธ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์๋์ง ์์ ๋ฐ์ดํฐ๋ค์ด ์กด์ฌ ํ ์ ์์.(AUTO ๋ชจ๋์์๋ ๋ฐ์ X, COMMIT ๋ชจ๋์์ ์ฃผ๋ก ๋ฐ์) ์ด๋ฐ ์ํฉ์์๋
flush()
๋ฅผ ํธ์ถํ๊ฑฐ๋setFlushMode()
๋ฅผ ์ฌ์ฉํด์ ํด๋น ์ฟผ๋ฆฌ์์๋ง ์ฌ์ฉํ ํ๋ฌ์ ๋ชจ๋๋ฅผ ์ค์ (๋ฐ๋ก ์ค์ ํ๋ ๊ฒ์ด ์ํฐํฐ ๋งค๋์ ์๋ง ์ค์ ํ๋ ๊ฒ๋ณด๋ค ์ฐ์ ๊ถ์ ๊ฐ์ง) - ๊ทธ๋ ๋ค๋ฉด COMMIT์ ์ธ์ ์ธ๊น?
AUTO์ ๊ฒฝ์ฐ ํธ๋์ญ์ ๋ด๋ถ์ ์ฌ๋ฌ ์ฟผ๋ฆฌ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ฟผ๋ฆฌ ์๋๋ก ํ๋ฌ์๊ฐ ๋ฐ์. ์ด๋, COMMIT ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ปค๋ฐ ํ๋ฒ์ผ๋ก ํ๋ฌ์๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ต์ ํ๊ฐ ๊ฐ๋ฅ - JDBC๋ฅผ ์ฌ์ฉํ ๋์๋ JPA๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ธ์ํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ AUTO๋ฅผ ํ์ฌ๋ ํ๋ฌ์ ๋ฐ์ X. ์ด๋๋ JDBC ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ง์
flush()
๋ฉ์๋๋ฅผ ํตํด ์ง์ ํ๋ฌ์ ํธ์ถ