📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page
  • 벌크 연산
  • 영속성 컨텍스트와 JPQL
  • JPQL과 플러시 모드
  • 마지막 정리

Was this helpful?

  1. JPA 책
  2. 객체지향 쿼리 언어

객체지향 쿼리 심화

벌크 연산

엔티티를 수정하기 위해서는 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용하고 삭제할때는 em.remove()을 사용함 하지만 아주 많은 엔티티에 작업을 진행하는건 벌크 연산을 사용할 수 있다

벌크 연산은 em.executeUpdate()이라는 메소드가 사용되고 이 메소드의 반환 값은 벌크 연산으로 변경사항이 생긴 엔티티 건수를 반환한다

String q1String = "update Product p set p.price = p.price * 1.1 where p.stockAmount < :stockAmount";

int resultCount = em.createQuery(q1String).setParameter("stockAmount, 10).executeUpdate();

이렇게 사용하는데 벌크 연산을 사용하는데 있어서 주의할점이 있다 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리한다는 점을 주의해야 한다

벌크 연산은 직접적으로 데이터베이스에 값을 집어 넣어주고 있기 때문에 만약 영속성 컨텍스트에 해당 엔티티가 이미 들어가있는 경우에는 값 조회시 연산이 적용되어있지 않은 (영속성 컨텍스트에 저장되있는) 값이 튀어나오는 문제가 있을 수 있다 그래서 해결은 어떻게 하냐

  1. em.refresh()의 사용 : 벌크 연산을 수행한 직후에 em.refresh()로 데이터베이스와 영속성 컨텍스트를 동기화

  2. 벌크 연산 먼저 실행 : 가장 실용적인 방법으로, 애초에 조회하기 전에 벌크를 먼저 진행

  3. 벌크 연산 수행 후, 영속성 컨텍스트 초기화 : refresh()가 아니라 그냥 벌크 연산과 관련되게 들어오면 em에 있는 엔티티를 깔끔하게 제거하는 것도 방법

영속성 컨텍스트와 JPQL

####쿼리 후 영속 상태인 것과 아닌 것 JPQL의 조회 대상은 엔티티, 임베디드 타입, 값 타입같이 종류가 다양한데, JPQL로 엔티티를 조회하면 영속성 컨텍스트에서 관리되지만 엔티티가 아니라면 영속성 컨텍스트에서 관리되지 않는다 = 조회한 엔티티만 영속성 컨텍스트에서 관리됨

####JPQL로 조회한 엔티티와 영속성 컨텍스트 그럼 em에서 엔티티를 조회해서 em에 엔티티가 있는 상황에서 그 값을 조회한다면? 일단 JPQL로 디비에서 조회한 엔티티가 영속성 컨텍스트에 존재하고 있다면 디비에서 조회한 결과를 버리고 em에 있는 엔티티를 반환함 현재 방식은

  • JPQL로 조회한 엔티티는 영속상태

  • 영속성 컨텍스트에 이미 존재하는 엔티티가 있다면 기존 엔티티를 반환

근데 왜 디비에서 직접 조회한걸 버리고 굳--이 영속성 컨텍스트에 있는걸 반환할까? 가능한 방법들을 예상해보자

  1. 새로운 엔티티를 영속성 컨텍스트에 하나 더 추가 -> 일단 기본키때문에 에러가 나겠죠?

  2. 기존 엔티티를 새로 검색한 엔티티로 대체 -> 나쁘진 않지만 영속성 컨텍스트에서 수정하고 있는 값이 있다면 수정하던 값이 사라지겠지?

  3. 기존 엔티티는 그대로 두고 새로 검색한 엔티티를 버린다 -> 그럼 방법이 이것말곤...

영속성 컨텍스트는 영속 상태인 엔티티의 동일성을 보장해주기 때문에 em.find()로 조회하든 JPQL으로 조회하든 사용하는 영속성 컨텍스트가 같으면 동일한 엔티티를 반환

find() vs JPQL

em.find()는 엔티티를 영속성 컨텍스트에서 먼저 찾아보고 없다면 그제야 디비에서 찾는 그런 메소드 그렇기 때문에 만약 영속성 컨텍스트에 엔티티가 영속되어 있다면 성능상 이점이 있다 하-지-만 JPQL은 항상 디비에 직접적으로 SQL을 실행해서 결과를 조회한다 em.find()는 영속성 컨텍스트를 우선 조회 후 디비를 조회하지만! JPQL은 디비를 먼저 조회하고 영속성 컨텍스트와 비교해서 값이 있으면 디비에서 찾은 값을 버린다 결과적으로 JPQL의 특징

  • JPQL은 항상 디비를 조회

  • JPQL로 조회한 엔티티는 영속 상태

  • 영속성 컨텍스트에 이미 존재하는 엔티티가 있으면 기존 엔티티를 반환

JPQL과 플러시 모드

플러시 -> 영속성 컨텍스트의 변경 내역을 디비에 동기화하는 작업 JPA는 플러시가 일어날 때 영속성 컨텍스트에 등록, 수정, 삭제한 엔티티를 찾아서 SQL을 만들고 디비에 반영 굳이 플러시 메소드를 호출해서 하는 것도 가능하지만 이외에도 플러시 모드를 설정하는 것을 통해서 모드를 변경하는 것도 가능

  • em.setFlushMode(FlushModeType.AUTO); //커밋 또는 쿼리 실행 시 플러시(기본값)

  • em.setFlushMode(FlushModeType.COMMIT); //커밋 시에만 플러시

이렇게 옵션은 성능 최적화를 위해 꼭 필요할때만 사용한다

쿼리와 플러시 모드

JPQL은 영속성 컨텍스트에 있는 데이터를 고려하지 않고 디비에서 데이터를 조회한다 그렇기 때문에 JPQL을 실행하기 전에 영속성 컨텍스트의 내용을 디비에 반영해야함 기본적으로 AUTO로 들어가면 알아서 수정된 데이터를 조회할 수 있다는 점이 나쁘지 않다 그리고 어떻게 보면 auto가 모든 것을 포함해주는 방식인데 왜 commit 모드가 존재하는걸까?

플러시 모드와 최적화

commmit 모드는 트랜잭션을 커밋할 때만 플러시하고 쿼리를 실행할 때는 플러시하지 않음 그러면 쿼리를 사용하게 되면 영속성 컨텍스트에는 있지만 디비에 적용하지 않은 데이터를 조회할 수 없다 즉, 그 의미는 결국 디비와 영속성 컨텍스트의 비동기화를 의미하고 이는 데이터의 무결성을 보장해주지 않는 방식이다 하-지-만, 플러시 모드가 자주 일어나게 되면 그 의미는 즉 성능의 저하를 의미하기 때문에 특별하게 사용하는 경우가 있다 JPA를 사용하지 않고 JDBC를 직접 사용해서 SQL을 실행할 때도 플러시를 고민해봐야함 JPA를 통하지 않고 JDBC로 쿼리를 직접 실행하면 JPA는 JDBC가 실행한 쿼리를 인식할 방법이 없음 그래도 특별하게 별도의 JDBC 호출은 플러시를 해도 적용 X -> 알아서 플러시를 통해서 동기화 하라

마지막 정리

JPQL은 SQL을 추상화해서 특정 데이터베이스 기술에 의존하지 않음

Criteria, QueryDSL은 JPQL을 만들어주는 빌더의 역할이기 때문에 JPQL에 익숙해져라

Criteria, QueryDSL을 사용하게 되면 동적으로 변하는 쿼리를 쉽게 사용할 수 있다

Criteria는 JPA에서 공식으로 지원하지만 QueryDSL이 몇배는 더 좋은듯

JPA도 네이티브 SQL을 제공하지만 네이티를 사용하면 한가지 디비에 종속적이라 그렇게 좋지는 않음

JPQL에서는 한꺼번에 다수의 엔티티에 접근하는 벌크 연산을 지원함

PreviousNativeSQLNext응용 애플리케이션

Last updated 3 years ago

Was this helpful?