Skip to content

Latest commit

ย 

History

History
636 lines (420 loc) ยท 27.2 KB

10.md

File metadata and controls

636 lines (420 loc) ยท 27.2 KB

10. ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด

๐Ÿ•บ ์ด ๊ธ€์€ ๊น€์˜ํ•œ๋‹˜์˜ '์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ฒƒ์ž„์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.


10.1 ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์†Œ๊ฐœ

  • JPA์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ๋ฉ”์†Œ๋“œ๋กœ๋งŒ์€ ๊ฐœ๋ฐœํ•˜๊ธฐ ํž˜๋“ฆ
  • ๋”ฐ๋ผ์„œ JPQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์กด์žฌ
    • ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ
    • SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กด์ ์ด์ง€ ์•Š์Œ
  • ์ด ์™ธ์—๋„ Criteria ์ฟผ๋ฆฌ, Native SQL, Query DSL, ๋งคํผ ํ”„๋ ˆ์ž„ ์›Œํฌ ์‚ฌ์šฉ ๋“ฑ์ด ์žˆ์Œ

10.1.1 JPQL ์†Œ๊ฐœ

  • 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();

10.1.2 Criteria ์ฟผ๋ฆฌ ์†Œ๊ฐœ

  • 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)

  • ๋ชจ๋“  ์žฅ์ ์„ ์ƒ์‡„ํ•  ์ •๋„๋กœ ๋ณต์žกํ•˜๊ณ  ์žฅํ™ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ์—” ๋ถˆํŽธ

10.1.3 QueryDSL ์†Œ๊ฐœ

  • 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 ๊ฐ€ ์ฟผ๋ฆฌ ์ „์šฉ ํด๋ž˜์Šค

10.1.4 ๋„ค์ดํ‹ฐ๋ธŒ SQL ์†Œ๊ฐœ

  • SQL์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š”๋ฐ ์ด๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ SQL์ด๋ผ๊ณ  ํ•จ

  • ์•„๋ฌด๋ฆฌ ์ถ”์ƒํ™”๋ฅผ ํ•˜๋”๋ผ๋„ JPQL์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌ, ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค์ดํ‹ฐ๋ธŒ SQL์„ ์‚ฌ์šฉ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กด์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ฟผ๋ฆฌ ๋˜ํ•œ ๋ณ€๊ฒฝ

  • String sql = "SELECT * FROM MEMBER WHERE NAME = 'kim'";
    list<Member> resultList = em.createNativeQeury(sql, Member.class).getResultList();

10.1.5 JDBC ์ง์ ‘ ์‚ฌ์šฉ, SQL ๋งคํผ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ

  • JDBC๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JPA์—์„œ ์ œ๊ณตํ•˜๋Š” API๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ตฌํ˜„์ฒด๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ปค๋„ฅ์…˜์„ ํš๋“
  • EntityManager์—์„œ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ Session์„ ๊ตฌํ•จ
  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ ์ ˆํ•œ ์‹œ์ ์— ๊ฐ•์ œ๋กœ ํ”Œ๋Ÿฌ์‹œ
  • JPA๋ฅผ ๊ฑฐ์ณ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์šฐํšŒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ JPA๊ฐ€ ์ธ์‹ X, ๋”ฐ๋ผ์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ถˆ์ผ์น˜ ๋  ์ˆ˜ ์žˆ์Œ
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐํšŒํ•˜์—ฌ SQL์„ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ”Œ๋Ÿฌ์‹œํ•˜์—ฌ ๋™๊ธฐํ™”
  • ์Šคํ”„๋ง์—์„œ๋Š” AOP๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ™œ์šฉํ•˜์—ฌ JPA๋ฅผ ์šฐํšŒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ธ€ํ•  ๋•Œ๋งˆ๋‹ค ํ”Œ๋Ÿฌ์‹œ๋ฅผ ํ˜ธ์ถœ

10.2 JPQL

10.2.1 ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ์ฟผ๋ฆฌ API

  • 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๊ฐœ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ

10.2.2 ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

  • 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๋กœ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ ์ด์ ์„ ๊ฐ€์ง

  • ๋”ฐ๋ผ์„œ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜!

10.2.3 ํ”„๋กœ์ ์…˜

  • 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();
    • ์ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒจํ‚ค์ง€ ๋ช…์„ ํฌํ•จํ•œ ์ „์ฒด ํด๋ž˜์Šค ๋ช…์„ ์ž…๋ ฅ, ์ˆœ์„œ์™€ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š” ์ƒ์„ฑ์ž ํ•„์š”

10.2.4 ํŽ˜์ด์ง• API

  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์šฉ SQL์€ ๋ฐ˜๋ณต์ ์ด๊ณ  ์ง€๋ฃจํ•จ, ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค SQL ๋ฌธ๋ฒ•์ด ๋‹ค๋ฆ„
  • JPA์—์„œ๋Š” ๋‘ API๋กœ ์ถ”์ƒํ™”
    • setFirstReulst() : ์กฐํšŒ ์‹œ์ž‘ ์œ„์น˜(0๋ถ€ํ„ฐ ์‹œ์ž‘)
    • setMaxResults() : ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜
  • ์ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค SQL๋ฌธ์ด ๋ณ€๊ฒฝ

10.2.5 ์ง‘ํ•ฉ๊ณผ ์ •๋ ฌ

  • ์ง‘ํ•ฉํ•จ์ˆ˜

    ํ•จ์ˆ˜ ์„ค๋ช…
    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 : ๋‚ด๋ฆผ์ฐจ์ˆœ

10.2.6 JPQL ์กฐ์ธ

  • ๋‚ด๋ถ€ ์กฐ์ธ
    • 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๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์œผ๋ฏ€๋กœ ๋ณดํ†ต ์™ธ๋ถ€ ์กฐ์ธ์—์„œ ์‚ฌ์šฉ

10.2.7 ํŽ˜์น˜ ์กฐ์ธ

  • ํŽ˜์น˜ ์กฐ์ธ์€ JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

  • ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•œ ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ(join fetch)

  • ์—”ํ‹ฐํ‹ฐ ํŽ˜์น˜ ์กฐ์ธ

    • select m from Member m join fetch m.team ์ด๋ž€ ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•  ๋•Œ

      Member์™€ Team์„ ํ•จ๊ป˜ ์กฐํšŒ(ํŽ˜์น˜ ์กฐ์ธ์—๋Š” ๋ณ„์นญ X, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ํ—ˆ์šฉ)

    • ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•ด๋„ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†์Œ

  • ์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ

    • ์—”ํ‹ฐํ‹ฐ ํŽ˜์น˜ ์กฐ์ธ๊ณผ ๋™์ผ

    • ์›๋ž˜ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์ด์ง€๋งŒ, ๋‹ค์ชฝ๊ณผ ์กฐ์ธํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์ฆ๊ฐ€(์ฃผ์†Œ๋Š” ๊ฐ™์Œ)

    • ์ผ๋Œ€๋‹ค ์กฐ์ธ์€ ๊ฒฐ๊ณผ ์ฆ๊ฐ€ ๊ฐ€๋Šฅ, ๋‹ค๋Œ€์ผ ์กฐ์ธ์€ ๊ฒฐ๊ณผ ์ฆ๊ฐ€ X

  • ํŽ˜์น˜ ์กฐ์ธ๊ณผ DISTINCT

    • ์œ„ ์ผ๋Œ€๋‹ค ์กฐ์ธ์˜ ๊ฒฐ๊ณผ์— DISTINCT๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํšŒ์› ์ •๋ณด๊ฐ€ 2๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํšจ๊ณผ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ

    • ํ•˜์ง€๋งŒ ํŒ€ ์—”ํ‹ฐํ‹ฐ ๊ฒฐ๊ณผ ์ค‘๋ณต์€ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ

      โ€‹

  • ํŽ˜์น˜ ์กฐ์ธ๊ณผ ์ผ๋ฐ˜ ์กฐ์ธ์˜ ์ฐจ์ด

    • ์ผ๋ฐ˜ ์กฐ์ธ์˜ ๊ฒฝ์šฐ SELECT์ ˆ์— ์“ด ํ”„๋กœ์ ์…˜๋งŒ ์กฐํšŒ
    • ํŽ˜์น˜ ์กฐ์ธ์€ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ
  • ํŽ˜์น˜ ์กฐ์ธ์˜ ํŠน์ง•๊ณผ ํ•œ๊ณ„

    • ํŽ˜์น˜ ์กฐ์ธ์€ ์ผ๋ฐ˜ ์กฐ์ธ๋ณด๋‹ค SQL ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋˜ํ•œ ๊ธ€๋กœ๋ฒŒ ๋กœ๋”ฉ ์ „๋žต๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์œ„(join fetch > FetchType.LAZY)
    • ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ•„์š”ํ•œ ๊ณณ์— ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ด๋“
    • ์ค€์˜์† ์ƒํ…Œ์—์„œ๋„ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
    • ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์—๋Š” ๋ณ„์นญ์„ ์ค„ ์ˆ˜ ์—†์Œ
      ๋”ฐ๋ผ์„œ SELECT, WHERE ์ ˆ, ์„œ๋ธŒ ์ฟผ๋ฆฌ์—์„œ ํŽ˜์น˜ ์กฐ์ธ ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
      (ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ํฌํ•จํ•œ ๋ช‡๋ช‡ ๊ตฌํ˜„์ฒด์—์„œ๋Š” ๋ณ„์นญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ ธ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ์–ด ์กฐ์‹ฌํ•ด์„œ ์‚ฌ์šฉ)
    • ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ํ•  ์ˆ˜ ์—†์Œ(๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ๋˜๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ์นดํ…Œ์‹œ์•ˆ ๊ณฑ์ด ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ์ฃผ์˜)
    • ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ ์กฐ์ธํ•˜๋ฉด ํŽ˜์ด์ง• API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
      ์ปฌ๋ ‰์…˜์ด ์•„๋‹Œ ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ๋“ค์— ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด๋„ ํŽ˜์ด์ง• API ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์—์„œ ์ปฌ๋ ‰์…˜ ํŽ˜์น˜ ์กฐ์ธ ํ›„์— ํŽ˜์ด์ง• API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฝ๊ณ  ๋กœ๊ทธ ๋ฐœ์ƒ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
      ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์„ฑ๋Šฅ ์ด์Šˆ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ ์˜ˆ์™ธ ๋ฐœ์ƒ

10.2.8 ๊ฒฝ๋กœ ํ‘œํ˜„์‹

  • ๊ฒฝ๋กœ ํ‘œํ˜„์‹์€ .์„ ์ฐ์–ด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ
    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์ ˆ์— ์˜ํ–ฅ
  • ์กฐ์ธ์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ์— ๋ฌต์‹œ์  ์กฐ์ธ๋ณด๋‹ค๋Š” ๋ช…์‹œ์  ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

10.2.9 ์„œ๋ธŒ ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ๋Š” WHERE, HAVING ์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(๋‚˜๋จธ์ง€์—์„œ๋Š” ๋ถˆ๊ฐ€, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์—์„œ๋Š” SELECT๋Š” ๊ฐ€๋Šฅ)

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ํ•จ์ˆ˜

    • [NOT] EXISTS (subquery)

      ์„œ๋ธŒ ์ฟผ๋ฆฌ์— ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ฐธ(NOT์€ ๋ฐ˜๋Œ€)

    • {ALL | ANY | SOME} (subquery)

      ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์ด ์‚ฌ์šฉ
      ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑ์ผ ๋•Œ ์ฐธ(ALL), ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด (ANY, SOME)

    • [NOT] IN (subquery)

      ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์ฐธ
      IN์€ ์„œ๋ธŒ ์ฟผ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉ

10.2.10 ์กฐ๊ฑด์‹

  • ํƒ€์ž… ํ‘œํ˜„

    ์ข…๋ฅ˜ ์„ค๋ช… ์˜ˆ์ œ
    ๋ฌธ์ž ์ž‘์€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์ด์— ํ‘œํ˜„
    ์ž‘์€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ์‹œ์—๋Š” ์—ฐ์† ๋‘๊ฐœ ์‚ฌ์šฉ
    '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
  • ๋‚˜๋จธ์ง€ ์ƒ๋žต

10.2.11 ๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ

  • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๊ทธ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒ
  • TYPE
    • ์—”ํ‹ฐํ‹ฐ์˜ ์ƒ์† ๊ตฌ์กฐ์—์„œ ์กฐํšŒ ๋Œ€์ƒ์„ ํŠน์ • ์ž์‹ ํƒ€์ž…์œผ๋กœ ํ•œ์ •ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
  • TREAT(JPA 2.1)
    • 2.1์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ž๋ฐ”์˜ ํƒ€์ž… ์บ์ŠคํŒ…๊ณผ ๋น„์Šท
    • ์ƒ์† ๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจ ํƒ€์ž…์„ ํŠน์ • ์ž์‹ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉ
    • JPA ํ‘œ์ค€์€ FROM, WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” SELECT ์ ˆ์—์„œ๋„ TREAT๋ฅผ ์‚ฌ์šฉ

10.2.12 ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ(JPA 2.1)

  • 2.1๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋ฅผ ์ง€์›
  • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜ ๋ฏธ๋ฆฌ ๋“ฑ๋ก

10.2.13 ๊ธฐํƒ€ ์ •๋ฆฌ

  • ENUM์€ = ๋น„๊ต ์—ฐ์‚ฐ๋งŒ ์ง€์›
  • ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๋น„๊ต๋ฅผ ์ง€์› X
  • EMPTY STRING
    • ''์„ ๊ธธ์ด 0์ธ Empty String์œผ๋กœ ์ •ํ–ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋”ฐ๋ผ NULL๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์กด์žฌ
  • NULL
    • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ
    • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’
    • NULL๊ณผ ๋ชจ๋“  ์ˆ˜ํ•™์  ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋Š” NULL
    • Null == Null์€ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฐ’
    • Null is Null์€ ์ฐธ

10.2.14 ์—”ํ‹ฐํ‹ฐ ์ง์ ‘ ์‚ฌ์šฉ

  • ์ƒ๋žต

10.2.15 Named ์ฟผ๋ฆฌ : ์ •์  ์ฟผ๋ฆฌ

  • 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์—์„œ ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง


10.3 Criteria

์ƒ๋žต


10.4 QueryDSL

  • ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋„ ์‰ฝ๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ ์ฟผ๋ฆฌ์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ
  • QueryDSL์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ฟผ๋ฆฌ๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ ํŠนํ™”

10.4.1 QueryDSL ์„ค์ •

  • ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • querydsl-jpa : QueryDSL JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • querydsl-apt : ์ฟผ๋ฆฌ ํƒ€์ž…์„ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

10.4.2 ์‹œ์ž‘

  • JPAQuery ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ๋ฐ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์ƒ์„ฑ์ž์— ๋„˜๊ฒจ์คŒ
  • ์ฟผ๋ฆฌ ํƒ€์ž…์„ ์ƒ์„ฑ ๋ฐ ๋ณ„์นญ ์ฃผ๊ธฐ
  • ๊ธฐ๋ณธ Q ์ƒ์„ฑ
    • ์‚ฌ์šฉ์‹œ ํŽธ๋ฆฌ๋ฅผ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ๋ณด๊ด€
    • ํ•˜์ง€๋งŒ ๋ณ„์นญ์„ ์ง์ ‘ ์„ค์ •ํ•ด์•ผ๋  ๋•Œ๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ

10.4.3 ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์ฟผ๋ฆฌ

  • QueryDSL์˜ WHERE ์ ˆ์—๋Š” AND ํ˜น์€ OR ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

10.4.4 ๊ฒฐ๊ณผ ์กฐํšŒ

  • ๊ฒฐ๊ณผ ์กฐํšŒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ์‹œ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒ
  • ์กฐํšŒ ๋ฉ”์†Œ๋“œ
    • uniqueResult() : ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ๊ฑด์ผ ๋•Œ ์‚ฌ์šฉ, ์—†์œผ๋ฉด null, ํ•˜๋‚˜ ์ด์ƒ์ด๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
    • singleResult() : uniqueResult()์™€ ๋น„์Šท, ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฒฐ๊ณผ์—์„œ๋Š” ์ฒ˜์Œ ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜
    • list() : ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ผ ๋•Œ ์‚ฌ์šฉ, ๊ฒฐ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜ ๋ฐ˜ํ™˜

10.4.5 ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ

  • ์ •๋ ฌ์˜ ๊ฒฝ์šฐ orderBy() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
  • ํŽ˜์ด์ง•์€ offset() ๊ณผ limit() ์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ํ˜น์€ restrict() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
  • ๋งŒ์•ฝ ์ „์ฒด ๋ฐ์ดํ„ฐ ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด list() ๋Œ€์‹ ์— listResults()๋ฅผ ์‚ฌ์šฉ(์ด ๋•Œ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•œ count ์ฟผ๋ฆฌ ์ถ”๊ฐ€ ์‹คํ–‰)

10.4.6 ๊ทธ๋ฃน

  • groupBy()๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ฃนํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด having()์„ ์‚ฌ์šฉ

10.4.7 ์กฐ์ธ

  • ์กฐ์ธ์˜ ๊ฒฝ์šฐ innerJoin, leftJoin, rightJoin, fullJoin์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ fetch ์กฐ์ธ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

10.4.8 ์„œ๋ธŒ ์ฟผ๋ฆฌ

  • JPASubQuery๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ
  • ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜๋ฉด unique(), ์—ฌ๋Ÿฌ๊ฐœ๋ฉด list()๋ฅผ ์‚ฌ์šฉ

10.4.9 ํ”„๋กœ์ ์…˜๊ณผ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

  • ํ”„๋กœ์ ์…˜ ๋Œ€์ƒ์ด ํ•˜๋‚˜๋ฉด ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์• ์ƒ์ด๋ผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Tuple ์ด๋ผ๋Š” Map๊ณผ ํก์‚ฌํ•œ ๋‚ด๋ถ€ ํƒ€์ž…์„ ์‚ฌ์šฉ
  • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹Œ ํŠน์ • ๊ฐ์ฒด๋กœ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด ๋นˆ ์ƒ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ(ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ, ํ•„๋“œ ์ง์ ‘ ์ ‘๊ทผ, ์ƒ์„ฑ์ž ์‚ฌ์šฉ)
  • ๋นˆ ์ƒ์„ฑ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Projections ๋ฅผ ์‚ฌ์šฉ bean() ์˜ ๊ฒฝ์šฐ๋Š” Setter๋ฅผ ์ด์šฉํ•˜๊ณ  fields() ์‚ฌ์šฉํ•˜๋ฉด ํ•„๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ฑ„์›€(private๋„) , constructor() ๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉ(ํ”„๋กœ์ ์…˜ ์ˆœ์„œ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๊ฐ€ ๋™์ผํ•œ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”)
  • ๋งŒ์•ฝ, ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ์ด๋ฆ„๊ณผ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋ฉด as() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ„์นญ์„ ๋ถ€์—ฌ

10.4.10 ์ˆ˜์ •, ์‚ญ์ œ ๋ฐฐ์น˜ ์ฟผ๋ฆฌ

  • QueryDSL์—์„œ๋„ ์ˆ˜์ •, ์‚ญ์ œ ๊ฐ™์€ ๋ฐฐ์น˜ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์ง€๋งŒ, JPQL๊ณผ ๊ฐ™์ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ง์ ‘ ์ฟผ๋ฆฌ

10.4.11 ๋™์  ์ฟผ๋ฆฌ

  • BooleanBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ

10.4.12 ๋ฉ”์†Œ๋“œ ์œ„์ž„

  • ๋ฉ”์†Œ๋“œ ์œ„์ž„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ ํƒ€์ž…์— ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ง์ ‘ ์ •์˜ ๊ฐ€๋Šฅ

  • ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ •์  ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  QueryDelegate ์–ด๋…ธํ…Œ์ด์…˜ ์†์„ฑ์œผ๋กœ ์ ์šฉํ•  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ง€์ •

  • ํ•ด๋‹น ๊ฐ€๊ฒฉ๋ณด๋‹ค ๋น„์‹ผ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฉ”์†Œ๋“œ

    public class ProductExpression {
        @QueryDelegate(Product.class)
        public static BooleanExpression isExpensive(QProduct product, Integer price) {
            return product.price.gt(price);
        }
    }

    ์ดํ›„ mvn build๋ฅผ ํ•˜๊ณ  QProduct ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ์ด ๋˜์–ด์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ


10.5 ๋„ค์ดํ‹ฐ๋ธŒ SQL

์ƒ๋žต


10.6 ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์‹ฌํ™”

10.6.1 ๋ฒŒํฌ ์—ฐ์‚ฐ

  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ๋•Œ ๊ธฐ์กด ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ณ‘ํ•ฉ, remove() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆผ. ์ด ๋•Œ ์—ฌ๋Ÿฌ๊ฑด์„ ํ•œ ๋ฒˆ์— ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๋ฒŒํฌ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉ

  • ๋ฒŒํฌ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ excuteUpdate() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ, ์ดํ›„ ์˜ํ–ฅ์„ ๋ฐ›์€ ์—”ํ‹ฐํ‹ฐ ๊ฑด์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

    int resultCnt = em.createQuery("~~~")
        				.setParameter("price", 1000)
        				.excuteUpdate();
  • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์˜ ๊ฒฝ์šฐ, INSERT ๋ฒŒํฌ ์—ฐ์‚ฐ๋„ ์ง€์›

  • ๋ฒŒํฌ ์—ฐ์‚ฐ์‹œ ์ฃผ์˜์ 

    • ๋ฒŒํฌ ์—ฐ์‚ฐ์˜ ๊ฒฝ์šฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ฟผ๋ฆฌ
    • ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ
      • ๊ฐ€๊ฒฉ์ด 1000์›์ธ ์ƒํ’ˆ A๋ฅผ ์กฐํšŒ(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ)
      • ๋ฒŒํฌ ์—ฐ์‚ฐ์œผ๋กœ ๋ชจ๋“  ์ƒํ’ˆ์˜ ๊ฐ€๊ฒฉ์„ 10% ์ƒ์Šน, ์ด๋กœ์ธํ•ด ์ƒํ’ˆ A๋Š” 1100์›
      • ๊ธฐ์กด ์กฐํšŒํ•œ ์ƒํ’ˆ A์˜ ๊ฐ€๊ฒฉ์„ ์ถœ๋ ฅํ•˜๋ฉด 1100์›์ด ์•„๋‹Œ 1000์› ์ถœ๋ ฅ
    • ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
      • em.refresh() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ƒํ’ˆ A๋ฅผ ๋‹ค์‹œ ์กฐํšŒ
      • ๋ฒŒํฌ ์—ฐ์‚ฐ์„ ๋จผ์ € ์‹คํ–‰ ํ›„์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ(JPA, JDBC๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ์— ์œ ์šฉ)
      • ๋ฒŒํฌ ์—ฐ์‚ฐ ์งํ›„์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”

10.6.2 ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ JPQL

  • JPQL๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜์ง€๋งŒ ์ž„๋ฒ ๋””๋“œ ํƒ€์ž…์€ ๊ทธ๋ ‡์ง€ ์•Š์Œ. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ ๊ฐ์ง€์— ์˜ํ•œ ์ˆ˜์ •์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ๋งŒ์•ฝ, JPQL๋กœ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์กด์žฌํ•œ๋‹ค๋ฉด JPQL๋กœ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ฒ„๋ฆฌ๊ณ  ๊ธฐ์กด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜(์ด๋•Œ, ์‹๋ณ„์ž๋ฅผ ํ†ตํ•ด ๋น„๊ต)
  • ์‹œ๋‚˜๋ฆฌ์˜ค
    1. JPQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ ์š”์ฒญ
    2. JPQL โ†’ SQL ๋ณ€ํ™˜ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ
    3. ์กฐํšŒํ•œ ๊ฒฐ๊ณผ์™€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๋น„๊ต
    4. ์‹๋ณ„์ž ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์žˆ๋Š” ๊ฒƒ์€ ๋ฒ„๋ฆฌ๊ณ  ์—†๋Š” ๊ฒƒ์€ ์ถ”๊ฐ€
    5. ์š”์ฒญํ•œ ๊ฐ’ ๋ฐ˜ํ™˜
  • ์™œ ์ด๋Ÿฐ ๋™์ž‘์„ ํ•˜๋Š”๊ฐ€?
    • ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ์‹๋ณ„์ž ๊ฐ’์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€
    • ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์ˆ˜์ •์ค‘์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์งˆ ์œ„ํ—˜์ด ์กด์žฌ
  • find() ๋ฉ”์†Œ๋“œ์™€๋Š” ๋‹ฌ๋ฆฌ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•˜๊ธฐ์— ์„ฑ๋Šฅ์ƒ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒ

10.6.3 JPQL๊ณผ ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ

  • ํ”Œ๋Ÿฌ์‹œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐํ™” ํ•˜๋Š” ์ž‘์—…
  • ํ”Œ๋Ÿฌ์‹œ๋Š” flush() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ•์ œ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ์— ๋”ฐ๋ผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ง์ „ ํ˜น์€ ์ฟผ๋ฆฌ ์‹คํ–‰ ์ง์ „์— ์ž๋™์œผ๋กœ ํ˜ธ์ถœ(์ฟผ๋ฆฌ ์‹คํ–‰ ์ง์ „ ํ˜ธ์ถœ์ด ๊ธฐ๋ณธ๊ฐ’)
  • JPQL์˜ ๊ฒฝ์šฐ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋“ค์ด ์กด์žฌ ํ•  ์ˆ˜ ์žˆ์Œ.(AUTO ๋ชจ๋“œ์—์„œ๋Š” ๋ฐœ์ƒ X, COMMIT ๋ชจ๋“œ์—์„œ ์ฃผ๋กœ ๋ฐœ์ƒ) ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” flush() ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ setFlushMode() ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์ฟผ๋ฆฌ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ์‹œ ๋ชจ๋“œ๋ฅผ ์„ค์ •(๋”ฐ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์—๋งŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง)
  • ๊ทธ๋ ‡๋‹ค๋ฉด COMMIT์€ ์–ธ์ œ ์“ธ๊นŒ?
    AUTO์˜ ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์— ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์ฟผ๋ฆฌ ์ˆ˜๋Œ€๋กœ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ๋ฐœ์ƒ. ์ด๋•Œ, COMMIT ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปค๋ฐ‹ ํ•œ๋ฒˆ์œผ๋กœ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅ
  • JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” JPA๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ธ์‹ํ•  ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— AUTO๋ฅผ ํ•˜์—ฌ๋„ ํ”Œ๋Ÿฌ์‹œ ๋ฐœ์ƒ X. ์ด๋•Œ๋Š” JDBC ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „ flush() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ”Œ๋Ÿฌ์‹œ ํ˜ธ์ถœ