스프링 공부/JPA 28

[JPA] 28. Re.Zero : JPQL : 뻘크업(연)산

벌크 연산 쉽게 생각하면 sql의 update, delete문을 일컫는다. Row 하나를 골라 실행하는 것이 아닌, 전체를 기준으로 실행시키는 방식이다. 이를 JPA에서 기본 제공하는 변경 감지로 실행하려면 변경해야할 대상들을 쿼리문으로 가져온다. 가져온 엔티티의 값을 변경시킨다. 변경될 때 마다 변경 감지가 발생해 바꿀 때 마다 update문이 발생한다. 쓸데없이 쿼리를 많이 쓰게 된다.(이것도 N+1처럼 쿼리 하나 후에 N번의 쿼리를 또 처리하는 모습이다) 이럴 때 .executeUpdate를 실행하면 한번에 테이블 단위로 조작이 가능하다. 이런식으로 나이를 1~100으로 만들어둔 후, 모든 멤버의 나이를 20으로 update시키는 쿼리문을 날렸다. (벌크 연산) 이 후 나이가 20인 멤버를 셌을 때..

[JPA] 27. Re.Zero : JPQL 그냥 다 끍어오기.(fetch join)

페치 조인 돼지꼬리 그리고 별 세개 박고 밑줄 쫙 긋고 하이라이트까지 칠해라. 겁나 중요하다. SQL 조인 종류는 아니다. JPQL에서 성능 최적화를 위해 따로 만든 기능으로, 연관된 엔티티나 모든 컬렉션을 한번에 조회하는 기능이다. Join fetch 명령어를 이용한다. 2번으로 나뉘는 쿼리들을 한방에 나가게 할 수 있다. Select m from Member m join fetch m.team; 이러한 페치 조인은, 회원을 조회하며 연곤 팀도 같이 구해올 수 있다. 즉, 멤버의 정보와 멤버가 속한 팀의 정보를 모두 구해오게 해준다. (즉시로딩과 똑같이 동작한다. 하지만 쿼리를 통한 명시적 방식이다) 이렇게 만들어진 상황에서, 페치 조인이 아닌 그냥 멤버 조회를 했을 때, 멤버에서 팀을 가져온다고 해보..

[JPA] 26. Re.Zero : JPQL 함수/경로 표현

JPQL에서 사용하는 함수 함수는 JPQL표준함수 Concat : 두 문자를 더해준다. 이를 concat(‘A’, ‘B’) 로 써도 되지만, ‘A’ || ‘B’ 를 써도 된다. Substring : 자바의 substring은 문자열의 일부를 떼어내는 방식이다. Trim : 공백을 제거한다. Lower, upper : 전부 소문자/ 대문자로 바꾸어준다. Length : 길이를 반환해준다. Locate : locate(찾아야 하는 부분, 찾는 대상)으로 넣어 해당 위치를 반환해준다. Abs, sqrt, mod : 일반적인 수학의 방식으로, 순서대로 절대값/제곱근/제곱을 구해준다. Size, index : 팀을 기준으로, 팀에 속한 멤버의 수를 세어줄 수 있다. Select size(t.members) fro..

[JPA] 26. Re.Zero : JPQL 의 타입표현

JPQL의 타입 표현 문자 : ‘~’(작은 따옴표)에 넣어주어야 한다. 숫자 : Integer를 제외한 경우에는, L(Long), D(Double), F(Float)를 숫자 뒤에 입력해주어야 한다. Boolean : TRUE, FALSE ENUM : entity.Role.USER ( 패키지를 모두 포함시켜야 한다 ) 엔티티 타입 : TYPE(m) = MEMBER( 보통은 상속관계에서 사용된다 ) 조건식 기본 case : select case when m.age = 60 then ‘경로요금’ else ‘일반요금’ end from Member m; 단순 case : select case t.name when ‘A’ then ‘+110%’ when ‘B’ then ‘+120%’ else ‘+105%’ end ..

[JPA] 25. Re.Zero : JPQL : 서브쿼리

서브쿼리 쿼리안에서 사용되는 서브쿼리를 만들어 쓸 수 있다. (괜히 연산 하나 한 값을 가져와서 이걸 대입해서 뭐 어떻게 하려는거보단, 편할테니까???) 예를들면, Member의 age가 18살 이상인 사람들이 속한 팀들을 조회해오는 방식으로 처리될 수 있다. 서브쿼리에서 지원되는 함수는 Exists (서브쿼리) : 서브쿼리의 결과가 존재하면 참 All (서브쿼리) : 모두 만족하면 참 Any (서브쿼리) : 조건을 하나라도 만족하면 참 Some : Any와 동일 In (서브쿼리) : 서브쿼리의 결과중 하나라도 같은게 존재하면 참 Exists, In은 앞에 not을 붙여 사용할 수 있다. team1이라는 엔티티를 조회한다. 이게 멤버에게 존재한다면 참을 반환한다. 즉, team1이라는 인스턴스를 가지고 ..

[JPA] 24. Re.Zero : JPQL : join하실래요? 합석?

조인 내부 조인, 외부 조인, 세타 조인등 모두 구현이 된다. (세타조인 : 관계도 없는 것들을 합쳐서, 여기에서 해당되는 부분들은 모두 찾아오는 것) ON절을 이용한 조인 조인 대상을 미리 필터링 한 상태에서 join을 이용한 쿼리문을 이용할 수 있다. (결국, 연산량을 줄일 수 있다) 연관관계가 없는 외부 조인을 시킬 수 있다. 이렇게 on을 이용한 join 쿼리문에서, 이렇게 team1인 팀들을 먼저 구해놓고, 그 중에서 member를 구하는 방식으로 처리될 수 있다. 이런식으로 연관관계를 사용하지 않는 쿼리문에서도 on을 통해 그냥 두 문자열을 비교해서 같은 것들을 전부 반환하라는 쿼리를 보낼 수 있다. 이 때에도 에러가 발생하지 않고, 쿼리문이 정상적으로 만들어져 보내지는 것을 볼 수 있다.

[JPA] 23. Re.Zero : JPQL : 프로젝션

프로젝션 Select절에서 조회 대상을 지정하는 것. 엔티티, 임베디드타입, 스칼라 타입(숫자, 문자, 기본 데이터 타입) Select m from Member as m ~~; (엔티티) Select m.username, m.age from Member as m~~; (엔티티의 스칼라 타입) Select m.team from Member as m ~~; (연관관계의 엔티티) Select m.address from Member asm m ~~;(임베디드 타입) 전부다 조회 가능하며, select 뒤에 distinct를 넣어 중복을 제거할 수 있다. 조회를 해서 엔티티를 불러오는 방법은 알겠는데, 우리가 조회한 엔티티의 인스턴스를 수정하면 어떻게 될까? 이러한 코드를 실행했을 때, Select, update..

[JPA] 21. Re.Zero : JPQL로 다시 시작하는 프로젝트!

JQPL 객체지향 쿼리. 즉, 엔티티를 위한 쿼리이다. JPQL의 문법을 보면, 일반 sql문과 크게 다를게 없어 보인다는 생각도 든다. Select * from Member where Member.age > 18; (SQL) Select m from Member as m where m.age > 18; (JPQL) 정말 비슷하다. *인가 m인가 말고는 큰 차이가 보이지 않을 정도이다. 심지어 테이블명, 속성명에서 대소문자를 구분한다는 것도 동일하다. 차이점은, JPQL은 클래스명을 사용한다는 것이다. 특이점은, 별칭(Memer as m)이 쓰인다는 것이다. Count, sum, avg, max, min, group by, having, order by 등 모든 것을 다 쓸 수 있다. 이를 변수로 받을 ..

[JPA] 20. JPA에서 쿼리를 쓰는 방법

JPA에서 쿼리문을 만들어내는 방법은 엄청나게 다양하다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접사용, MyBatis, SpringJdbcTemplcate 함꼐 사용 이렇게 다양한 방식이 있는데, 이에 대한 정리를 해보았다. JPQL 가장 단순한 조회 EntityManager.find() a.get().get() 개발을 엔티티 객체 중심으로 개발할 수 있다. 문제는, 데이터를 검색할 경우, 테이블을 기준으로 해야 한다. 이 부분을 우리가 개발할 때 사용했던, 객체를 기준으로 할 수 없을까? 모든 db 데이터를 객체화 시키면 성능의 문제가 생긴다. 이를 위해 객체 지향 JPQL이라는 객체 지향 쿼리문이 존재한다. JPQL = 엔티티를 대상으로 검색 SQL = 테..