728x90
반응형

분류 전체보기 145

[JPA] 객체 지향 쿼리 심화

객체 지향 쿼리 심화 한번에 여러 데이터를 수정할 수 있는 벌크 연산이 있다. 벌크 연산 엔티티를 수정하려면 영속성 컨텍스트 변경 감지 기능이나 병합을 사용하고, 삭제하려면 em.remove() 를 사용한다. 데이터를 하나씩 처리하기엔 너무 오래걸려서 여러개를 동시에 처리할 수 있는 벌크연산이 있다. 벌크 연산은 executeUpdate() 를 사용한다. 이 메소드는 벌크 연산으로 영향을 받은 엔티티 건수를 반환한다. 주의사항 벌크 연산은 영속성 컨텍스트를 통하지 않고 바로 DB에 직접 쿼리를 날린다. 그래서 영속성 컨텍스트에 있는 엔티티와 DB에 있는 테이블의 칼럼 값이 다를 수 있는데, 그래서 이 부분을 주의하여야 한다. em.refresh 사용 엔티티를 사용해야 할 경우엔 DB에서 다시 조회한다. ..

Java 2022.08.05

[JPA] 객체 지향 쿼리 언어 - Native SQL

네이티브 SQL JPQL은 표준 SQL이 지원하는 대부분의 문법과 SQL함수를 지원한다. 근데 특정 DB의 방언과 같은 종속적 기능은 지원하지 않는다. 특정 DB만 지원하는 함수, 문법, SQL 쿼리 힌트 인라인 뷰(from절 서브쿼리), UNION, INTERSECT 스토어드 프로시저 종속적인 기능을 지원하는 방법은 특정 DB만 사용하는 함수 특정 JPQL에서 네이티브 SQL 함수를 호출할 수 있다. Hibernate는 DB 방언에 각 DB에 종속적 함수를 정의했다. 그리고 직접 호출할 함수를 정의하기도 가능하다. 특정 DB만 지원하는 힌트 Hibernate를 포함한 몇몇 JPA구현체가 지원한다. 인라인 뷰(from절 서브쿼리), UNION, INTERSECT JPA구현체들이 지원한다. Hibernat..

JPA 2022.08.05

[JPA] 객체 지향 쿼리 언어 - Querydsl 2

이번 포스팅에서는 조인에 대해 알아볼 것이다. 조인 조인은 innerJoin(join), leftJoin, rightJoin, fullJoin을 사용할 수 있고 추가로 JPQL의 on과 성능 최적화를 위한 fetchJoin을 사용할 수 있다. jpaQueryFactory.selectFrom(item).join(조인할 쿼리클래스).fetch(); 연관관계가 있으면 그냥 join만 사용해도 되지만 지금은 on이 추가되어 on() 절로 연관관계 없이 조인도 가능하다. jpaQueryFactory.selectFrom(item).join(chair).on(chair.name.eq(item.name)).fetch(); from절에 여러 조건을 사용해서 세타조인도 가능하다. 서브 쿼리 서브 쿼리는 예전 버전에서는 J..

JPA 2022.08.05

[JPA] 객체 지향 쿼리 언어 - Querydsl

QueryDSL Criteria의 단점 너무 복잡하고 어렵다는 것 그래서 JPQL이 어떻게 생성되는지 파악이 어렵다. 그래서 나온게 이 QueryDSL이다.. 코드로 작성하는데 간결하고 알아보기 쉽다. QueryDSL은 오픈소스 프로젝트이다. 단순 CRUD보다는 이름에 걸맞게 데이터를 조회 그러니까 통계형 쿼리를 짤때 적합하지 않을까 생각한다. QueryDSL Setting build.gradle buildscript { ext { ... querydslVersion = '1.0.10' } dependencies { .... classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:$querydslVersion" } } subprojects {..

JPA 2022.08.05

Spring -> Spring Boot 마이그레이션

내 팀 프로젝트를 예전에 Spring으로 구현을 했었는데 이것을 스프링부트로 마이그레이션 해보았다. 더불어 Maven 의존성을 Gradle로 바꾸면서 마이그레이션을 한 것이다. 오류들이 상당히 많았지만 남들과 같은 오류인지는 잘 모르겠다.🤣 어떤 오류들이 있었는지 알아보자 Lombok 일단 Jar로 빌드하게되면 SpringBoot는 WEB-INF안의 jsp파일을 읽을수가 없다. 그래서 war로 빌드를 해주어야한다. 추후에 Mybatis로 db연결을 하는 방식을 JPA로 변경할 예정이다. 우선 제일 먼저 gradle 을 의존성 관리 툴로 추가하기 위해서 pom.xml 이 있는 경로로 가서 gradle init을 시켜주었다. gradle init --type pom 이것으로 pom.xml의 내용이 Gradl..

Spring 2022.08.05

[DB] 옵티마이저

옵티마이저(Optimizer) 옵티마이저란, SQL을 가장 빠르고 효율적으로 수행할 최적(최저비용)의 처리 경로를 생성해주는 데이터베이스의 핵심엔진이다. 여기서 사용한 DB는 MariaDB이다. 옵티마이저 엔진 Parser : SQL 문장의 각 요소를 파싱해서 파싱트리를 만듦(문법 검사, 구문 분석) Query Transformer : SQL문을 효율적으로 실행하기 위해 더 일반적이고 표준적인 형태로 옵티마이저 변환 Estimator : 시스템 통계정보를 사용해서 SQL 실행비용을 계산 Plan Generator : SQL을 실행할 계획들을 수립 Row-Source Generator : 옵티마이저가 생성한 계획을 SQL Engine이 실행 가능한 코드로 포맷 SQL Engine : SQL 실행 컴퓨터의 ..

DB 2022.08.05

[JPA] 객체 지향 쿼리 언어 - 3

깃허브 바로가기 책의 내용이 너무많아 계속 분리해서 작성하게 된다. 이번 포스팅에서는 서브 쿼리부터 내용을 다뤄보도록 하겠다. 서브 쿼리 JPQL도 SQL처럼 서브 쿼리를 지원하는데, 여기서는 몇 가지 제약사항이 있다. 서브 쿼리를 WHERE, Having 절에서만 사용할 수 있고 select, from 절에서는 사용할 수 없다. 서브쿼리 함수 [NOT] EXISTS 서브쿼리 서브쿼리에 결과가 존재하면 참. NOT은 반대 {ALL | ANY | SOME} 서브쿼리 비교 연산자와 같이 사용한다. ALL: 조건을 모두 만족하면 참 ANY or SOME : 둘은 같은 의미이다. 조건을 하나라도 만족하면 참 [NOT] IN 서브쿼리 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참. 참고로 IN은 서브쿼리가 아..

JPA 2022.08.05

[JPA] 객체 지향 쿼리 언어 - 2

JPQL 다시한번 JPQL의 특징을 정리해보자 JPQL은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정 DB SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. 기본 문법과 쿼리 API JPQL도 SQL과 비슷하게 SELECT, UPDATE, DELETE 문을 사용할 수 있다. em.persist()로 엔티티를 저장하므로 INSERT 쿼리는 없다. JPQL 문법 select_문 :: = select_절 from_절 [where_절] [groupby_절] [having_절] [orderby_절] update_문 :: = update_절 [where_절] delete_문 :: = delete_절 [whe..

JPA 2022.08.05

[JPA] 객체지향 쿼리 언어 - 1

JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리기술을 지원한다. JPQL은 가장 중요한 객체지향 쿼리 언어이다. 다른 Criteria나 QueryDSL은 JPQL을 편리하게 사용하도록 도와주는 기술이므로 JPA를 다루는 개발자라면 JPQL을 필수로 학습해야 된다. 객체지향 쿼리 소개 EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다. 검색 방법은 두가지다. 식별자 조회 : EntityManager.find(); 객체 그래프 탐색 : a.getB().getC(); 이런 단순한 SELECT 쿼리들로는 개발을 하지 않는다. 복잡 쿼리나 통계형 쿼리같은 복잡한 쿼리들을 수행할 때에는 이런 쿼리로는 택도 없다. ORM을 사용하면 DB테이..

JPA 2022.08.05

Effective Java 1장

이펙티브 자바를 읽으면서 내 기술을 확장하고 싶었다. 그래서 부족한 부분은 채우고 앞으로의 개발에 적용해보려고 한다. 1. 객체의 생성과 파괴 생성자 대신 정적 팩토리 메서드를 고려하라 클래스는 클라이언트에 public 생성자 대신 정적 팩토리 메서드를 제공할 수 있다. 정적 팩토리 메소드가 생성자보다 좋은 장점 이름을 가질 수 있다. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 정적 펙토리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. 단점 상속을 하려면 public이나 protected 생성자가 필요하니 정적 팩토리 메서드만 제공하면 하위..

Java 2022.08.05
728x90
반응형