[우아콘2020] 수십억건에서 QUERYDSL 사용하기

Поділитися
Вставка
  • Опубліковано 24 вер 2024
  • 수억, 수십억 건이 쌓인 테이블 환경에서 Querydsl-JPA의 성능 개선 사례를 소개합니다.
    🎤 발표자 : 우아한형제들 이동욱
    ----------------------------------------------------------------------------
    2020년 12월 16일 우아한형제들의 첫번째 기술 이야기 우아한테크콘서트가 시작됩니다.
    www.woowacon.com
    대한민국 대표 푸드테크 기업으로 2016년 클라우드 전환을 시작한 이래 4년이라는 시간동안 200%의 성장을 한 우아한형제들의 배달의 민족 서비스!
    지난 4년간 매우 빠른 속도로 성장하는 비즈니스를 뒷받침 하는동안 개발자들도 함께 성장했습니다. 우아한형제들의 지난 4년간의 성장을 담은 우아콘의 Opening 영상! 우아한형제들 4년간의 Cloud Journey 를 영상으로 함께해주세요.
    #우아한형제들 #우아한테크콘서트 #클라우드

КОМЕНТАРІ • 44

  • @dongmyo
    @dongmyo 3 роки тому +26

    발표 내용 중에 custom repository 구현할 때 JPAQueryFactory를 이용해서 QuerydslRepositorySupport를 굳이 상속받지 않아도 되도록 하는 부분
    되게 좋은 아이디어인 것 같습니다.
    그런데, custom repository 구현을 extends/implements 전부 다 떼고 @Repository 붙여서 별도의 repository 형태로 만드니까
    repository를 사용하는 측면에서는 기본 repository와 custom repository의 메서드들을 하나의 인터페이스로 참조할 수 있는 장점이 사라지는 것 같네요.
    그래서 custom repository interface를 implements하는 부분은 남겨두고,
    대신 custom repository 구현 클래스의 이름을 Spring Data Repository naming rule에 맞도록 `기본 repository + Impl`로 정해주면
    Spring Data가 알아서 구현 클래스를 bean으로 등록해주니까 여기에 JPAQueryFactory를 생성자 주입받도록만 해줘도 괜찮지 않을까 생각되네요.

    • @jojoldu8351
      @jojoldu8351 3 роки тому +19

      크 맞습니다 먼저 좋은 의견 감사합니다 동민님!
      말씀하신 방법도 좋은 방법이라 생각합니다.
      발표에 다 녹이지 못했는데, 말씀하신대로 기본 JpaRepository의 코드를 확장해서 쓰는게 아니다보니 장점이 하나 사라지는데요.
      저희가 이렇게 하게 된 이유가, (저희 프로젝트 특성일수도 있는데) 점점 프로젝트가 커지다 보니, *단일 Entity만을 위한 기능*이 어드민/api/batch 등 기능을 구현할때는 거의 안쓰이게 되었었는데요.
      어떤 기능을 구현하기 위해 A/B/C 엔티티를 함께 참조 (혹은 Join) 해야하는데, 이건 A엔티티 Repository의 역할로 봐야할지, B엔티티 Repository의 역할로 봐야할지 모호할때가 계속 발생했었습니다.
      그래서 이럴 경우에 특정 Entity를 메인으로 하지 않는 기능이라 판단되는 경우에 위와 같이 JPAQueryFactory 로만 구현된 **서비스 기능에 특화된** 로직에 적극적으로 사용하고 있습니다.
      발표에는 이런 부분들을 다 설명하고 가기에 주절주절 하게 되는 것같아서 잘라내게 되었습니다 ㅠ
      EntityRepository 기능을 확장할때는 동민님 말씀하신 방법을 저희도 고려해봐야겠습니다 :)
      좋은 의견 감사합니다!

  • @majortom6301
    @majortom6301 3 роки тому +10

    와 믿고 보는 jojoldu님이다!!

  • @김태정-d4i
    @김태정-d4i 3 роки тому +2

    동욱님 블로그 매일 들어가서 보는데, 역시 영상으로도 최고네요! 좋은 발표 영상 감사합니다 ㅎㅎㅎ

  • @progress0407
    @progress0407 Рік тому

    이걸 수년에 흐른뒤에서야 보네요... 아마 제가 개발을 얼마 시작하지 않았을때 봤으면 이해가 안됐겠죠.. ㅠ
    ㅎㅎ 발표 영상 정말 유익했습니다 많은 노고가 느껴집니다 !!

  • @seankim5873
    @seankim5873 Рік тому

    JPA가 아닌 다른 ORM을 쓰는 입장에서 들어도 뼈가 되고 살이 되는 이야기들 뿐이네요. 대규모 데이터 처리는 아직 머나먼 이야기이다 보니 ORM이 못하는 기능들을 제외하고는 제공하는 기능들을 최대한으로 사용해보자는 방식으로 공부하고 개발하고 있는데 ORM과 Raw SQL의 장단점을 저울질 해봐야 한다는 부분은 덮어두고 지나치던 맹점인 것 같습니다.

  • @주한규-k8u
    @주한규-k8u Рік тому

    너무 좋은 팁을 주셔서 감사드립니다. 실무에서 잘 활용해 보겠습니다.

  • @DDD-dh4mk
    @DDD-dh4mk Рік тому

    좋은 내용 너무 감사합니다 향로님! 쵝옹

  • @swhan94
    @swhan94 3 роки тому +3

    우와 향로님이다

  • @kwo2002
    @kwo2002 Рік тому

    오... 너무너무 좋은정보 감사합니다.

  • @진재혁-x1k
    @진재혁-x1k 2 роки тому

    꿀팁 감사합니다ㅎㅎ 많이 배웠습니다~

  • @dionkim
    @dionkim 3 роки тому +2

    잘봤습니다! 마지막의 DB 공부를 등한시하지 마시라는말 새겨듣고 갑니다~

  • @Son-lm5mf
    @Son-lm5mf 23 дні тому

    진짜 개꿀팁.❤❤

  • @Chundol42
    @Chundol42 3 роки тому

    좋은내용 영상으로 공유주셔서 감사합니다!

  • @noyes2333
    @noyes2333 3 роки тому +1

    안녕하세요! 저도 흑두루미님처럼 개인 블로그에 후기 형태로 작성하겠습니다!
    querydsl 이해에 도움이 많이 되었어요 감사합니다

  • @kabkee
    @kabkee 2 роки тому

    exist 존재도 몰랐지만, 대체 방법도 알려주셔서 너무 좋네요.

  • @dminseol508
    @dminseol508 3 роки тому

    감사합니다 항상 잘보고있습니다

  • @keepstudying1602
    @keepstudying1602 3 роки тому +1

    잘 보고 갑니다 :)

    • @jojoldu8351
      @jojoldu8351 3 роки тому

      잘 봐주셔서 감사합니다 :)

  • @jinKorlover
    @jinKorlover 3 роки тому

    유익한 강의 감사합니다!

  • @funlifekindol7190
    @funlifekindol7190 3 роки тому

    와... 정말 이건 꿀팁이네요 너무 감사합니다.

  • @novasuper5118
    @novasuper5118 3 роки тому +2

    그동안 얼마나 많은 시행착오를 겪으셨을지 느껴지고 그런 꿀팁들을 간명하게 알려주시니 많은 도움이 됩니다.
    감사합니다 :D

  • @nick6267
    @nick6267 3 роки тому

    저희 서비스도 배치에서는 querydsl이 hibernate로 변환뒤 sql로 변환하는 querydsl 아니라
    querydsl -> native sql로 바로 변환해주는 놈을 사용하고 있습니다 그래서 서브쿼리도 사용 가능하구요^^

  • @taekkim2
    @taekkim2 3 роки тому +2

    중간에 쿼리횟수를 확인하는 툴은 뭔지 알 수 있을까요?

  • @MaruhanPark
    @MaruhanPark Рік тому

    9:16에 select절에 대체하는 부분에 대해서 저렇게 교체하는게 성능차이가 있나요? 어차피 select할때 그 row 전체를 먼저 찾은 뒤에 그 중에서 select에서 명시한 column에 대해서 리턴하는것 아닌가요? 그 row에 있는 column값을 복사하느냐 아니면 파라미터로 전달한 값으로 복사하느냐 거기서 거기일것 같은데

  • @dongmyo
    @dongmyo 3 роки тому +1

    좋은 발표 잘 보고 갑니다. :+1:

    • @jojoldu8351
      @jojoldu8351 3 роки тому +1

      잘봐주셔서 감사합니다 동민님!

  • @박지용-k3k6w
    @박지용-k3k6w 3 роки тому +1

    11:42 저는 연관관계 매핑할 때 Id 만 존재하는 Entity 를 매핑시켜서 저장하려고 하면 id 만 존재하고 다른 필드가 다르다고 오류가 나는데 왜 그런지 알 수 있을까요 ?

  • @MaruhanPark
    @MaruhanPark Рік тому

    16:06에 대해서 제가 최근에 궁금했는데요, JPA에서 saveAll 문을 써도 update문 하나로 묶이는게 아니라 loop를 돌면서 각각 save를 부르게 되있더라고요. 근데, batch-size를 등록하면 어차피 db로 쿼리가 나갈때 묶여서 나간다고는하는데 검증이 필요하네요. 그리고 insert를 묶어서 하려면 id를 identity가 아닌 id를 사용해야된다하네요 (identity는 db에다가 id가 무엇인지를 물어보고 만드는것이라 각 row마다 db를 조회하는게 필수라네요). 그래서 querydsl아니고 그냥 jpa의 save/persist/merge 함수에서도 어떻게 해야 묶여서 나가는지 햇갈립니다

  • @김기현-l4z6y
    @김기현-l4z6y 3 роки тому +1

    너무나도 좋은강의 감사드립니다

    • @jojoldu8351
      @jojoldu8351 3 роки тому

      감사합니다 기현님 ^^

  • @redutan
    @redutan 3 роки тому +1

    꿀팁 가득한 영상 잘 봤습니다.

    • @jojoldu8351
      @jojoldu8351 3 роки тому

      감사합니다 명주님! :)

  • @sion_food
    @sion_food 2 роки тому +1

    리얼 mysql과 jpa 책을 추천해주신댔는데, jpa책은 무엇이 있나요?

  • @bnsauu
    @bnsauu 3 роки тому

    Lazy Loading 만 하면 될줄 알았는데 그게 또 아니었군요..ㅠㅠ..감사합니다

  • @Amanda-lc1wo
    @Amanda-lc1wo 2 роки тому

    2:56 동적쿼리(Querydsl)

  • @Iam짱구
    @Iam짱구 3 роки тому +2

    너무 좋은 내용 감사 드립니다! 혹시 추후에 블로그나 깃허브 같은 곳에 정리해서 보고 싶은데 그럴 경우 문제가 될까요?? 만약 그렇다면 하지 않으려고 합니당!

    • @jojoldu8351
      @jojoldu8351 3 роки тому

      물론 가능합니다 :) 컨퍼런스 후기와 같은 형태로 작성해주신다면 정말 감사한 일이죠 :)

    • @Iam짱구
      @Iam짱구 3 роки тому +1

      @@jojoldu8351 감사합니다! 꼭 컨퍼런스 후기 형태로 작성하도록 하겠습니다! 매번 좋은 내용 감사합니다🙏

  • @ebichu8126
    @ebichu8126 3 роки тому

    jOOQ가 아닌 QueryDSL-sql을 사용하시는 이유가 있을까요?

  • @hyunsusim6143
    @hyunsusim6143 Рік тому

    향로님 ㅎㅎ

  • @gwisekor
    @gwisekor 3 роки тому

    정렬은 was보다 앱 클라이언트에서 하는게 좋을듯