문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
wiki:spring:jpa [2022/07/05 19:20] dhan |
wiki:spring:jpa [2023/01/13 18:44] (현재) |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Spring에 JPA 적용하기 ====== | ====== Spring에 JPA 적용하기 ====== | ||
<WRAP left notice 80%> | <WRAP left notice 80%> | ||
- | * description : | + | * description : JPA 관련 내용 기술 |
* author | * author | ||
* email : hylee@repia.com | * email : hylee@repia.com | ||
줄 230: | 줄 230: | ||
실무에서 즉시 로딩을 사용하지 마라!, JPQL fetch 조인이나, | 실무에서 즉시 로딩을 사용하지 마라!, JPQL fetch 조인이나, | ||
즉시 로딩은 상상하지 못한 쿼리가 나간다. | 즉시 로딩은 상상하지 못한 쿼리가 나간다. | ||
- | + | | |
영속성 전이(CASCADE) | 영속성 전이(CASCADE) | ||
영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 | 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음 | ||
줄 251: | 줄 251: | ||
| | ||
===== 값 타입 ===== | ===== 값 타입 ===== | ||
+ | | ||
자바 기본값 타입은 공유가 불가능(복사) | 자바 기본값 타입은 공유가 불가능(복사) | ||
래퍼 클래스는 공유가 가능하지만 변경할 방법이 없음 | 래퍼 클래스는 공유가 가능하지만 변경할 방법이 없음 | ||
줄 269: | 줄 270: | ||
대신 불변 객체(immutable object)로 설계하거나 생성자로만 값을 설정하고, | 대신 불변 객체(immutable object)로 설계하거나 생성자로만 값을 설정하고, | ||
변경하려면 new를 기존 값을 가져오고, | 변경하려면 new를 기존 값을 가져오고, | ||
+ | | ||
실전: 임베디드 타입은 사용할 경우 불변 객체로 해서 사용하면 주석을 꼭 만들자!! | 실전: 임베디드 타입은 사용할 경우 불변 객체로 해서 사용하면 주석을 꼭 만들자!! | ||
| | ||
줄 296: | 줄 297: | ||
실무에서는 값타입을 엔티티로 승격하여 사용(일대다 관계) | 실무에서는 값타입을 엔티티로 승격하여 사용(일대다 관계) | ||
값 타입 컬렉션은 단순한 값 저장시에만 사용 | 값 타입 컬렉션은 단순한 값 저장시에만 사용 | ||
- | | ||
- | | ||
- | ===== 객체지향 쿼리 언어 ===== | ||
- | | ||
- | 하이버네이트가 100% 지원하는 것은 아님 | ||
- | JPQL로 거의 되지만 네이티브를 사용해야 될 경우가 있음 | ||
- | | ||
- | JPQL: Java Persistence Query Language ( 철저하게 잘하자 !! ) | ||
- | 문제는 검색 쿼리 (검색 조건이 포함된 SQL 필요) | ||
- | 엔티티 객체를 대상으로 쿼리 -> 결국에는 SQL로 변환됨(feat Dialect) | ||
- | 객체 지행 SQL, 특정 데이터베이스 SQL에 의존하지 않음 | ||
- | 동적쿼리를 만들기 어려움 | ||
- | 위치기반 파라미터 매핑은 웬만하면 사용하지 말자(좋은 대안으로 해결하자) | ||
- | 프로젝션 | ||
- | 대상: 엔티티, 임베디드 타입, 스칼라 타입(숫자, | ||
- | | ||
- | 페이징 | ||
- | setFirstResult(0) - 0부터 시작 | ||
- | 데이터베이스에 상관없이 동작 | ||
- | | ||
- | 조인 | ||
- | 내부 조인 | ||
- | 외부 조인 | ||
- | 세타 조인(막조인) | ||
- | 기타 - ON 절 | ||
- | JPA 2.1부터 지원 | ||
- | 조인 대상 필터링 가능, 연관관계 없는 엔티티 외부 조인(하이버네이트 5.1 부터 가능) | ||
- | | ||
- | 서브 쿼리 | ||
- | exists, ALL, ANY 사용 가능, (NOT) IN 사용가능 | ||
- | JPA WHERE, HAVING절에서만 가능, | ||
- | FROM 절의 서브 쿼리는 JPQL에서 불가능(조인으로 풀수 있으면 풀어서 해결) | ||
- | 아니면 Native Query 나 Application에서 처리 , 아니면 2번 쿼리해야 됨 | ||
- | | ||
- | JPQL 타입 표현 및 기타식 | ||
- | 문자: ' | ||
- | 숫자: 10L, 10D, 10F | ||
- | Boolean: TRUE, FALSES | ||
- | ENUM: FQCN | ||
- | 엔티티 타입: TYPE(m) = Member | ||
- | 기타: EXISTS, IN, AND, OR, NOT, =, >, >=, <, <=, <>, BETWEEN, LIKE, IS NULL | ||
- | | ||
- | 조건식 | ||
- | 기본 CASE 식 : 조건 추가 | ||
- | 단순 CASE 식 : 정확하게 일치 | ||
- | COALESCE: 내용이 없으면 리턴 | ||
- | NULLIF: 조건이 맞으면 널 리턴 | ||
- | | ||
- | 기본 함수 | ||
- | CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE, ABS, SQRT, MOD, SIZE, INDEX(JPA용도) | ||
- | 사용자 정의 함수(Dialect에 등록하여 사용하거나 등록된 함수 사용 가능), select function(' | ||
- | | ||
- | 경로 표현식 | ||
- | 상태 필드: 단순히 값을 저장, m.username, 경로 탐색의 끝, 더 이상 탐색 불가 | ||
- | 연관 필드: | ||
- | 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티, 묵시적 내부 조인(INNER JOIN)발생, | ||
- | 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, | ||
- | FROM절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색 가능 | ||
- | 실무: 가급적 묵시적 조인 대신에 항상 명시적 조인 사용(join 명시) | ||
- | 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어려움, 성능에 지대한 영향(JOIN 튜닝 해야 됨) | ||
- | |||
- | 페치 조인(fetch join) | ||
- | JPQL에서 성능 최적화를 위해 제공하는 기능 | ||
- | 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능 | ||
- | join fetch 명령어 사용 | ||
- | 연관 관계가 지연이라도 fetch join이 우선 함 | ||
- | | ||
- | | ||
- | | ||
- | JPA Criteria | ||
- | JPQL 제너레이터 | ||
- | JAVA 표준이지만 쉽지 않음(복잡함, | ||
- | SQL 문법 오류가 줄어 듦(자바 코드로 구현) | ||
- | 동적 쿼리를 만들기 쉬움, SQL스럽지 않음 | ||
- | 엔티티와 속성은 대소문자 구문 | ||
- | JPQL 키워드는 대소문자 구분하지 않음 | ||
- | 엔티티 이름 사용, 테이블 이름이 아님(Member) | ||
- | 별칭은 필수(m) (as는 생략 가능) - 가급적 사용하자 | ||
- | | ||
- | QueryDSL | ||
- | JPQL 제너레이터 | ||
- | 단순하고 읽기 쉬움 | ||
- | 문법 오류를 찾을 수 있음, 오타가 없음 | ||
- | 동적 쿼리를 작성하기 쉬움 | ||
- | 실무 사용 권장 | ||
- | | ||
- | 네이티브 SQL | ||
- | 웬만하면 지양하자 | ||
- | | ||
- | JDBC API 직접 사용, MyBatis, SpringJdbcTemplage 함께 사용 | ||
- | 적절하게 em.persist()를 사용해야 됨 | ||
- | | ||
- | // flush -> commit, query | ||
- | createNativeQuery, | ||
- | | ||
- | | ||
| | ||
+ | ===== 객체 지향 쿼리 언어 ===== | ||
+ | * [[wiki: | ||
+ | |||
===== 적용파일 목록 ===== | ===== 적용파일 목록 ===== | ||
줄 574: | 줄 482: | ||
===== Builder 사용하기 ===== | ===== Builder 사용하기 ===== | ||
* [[https:// | * [[https:// | ||
- | | + | |
+ | ===== Troubleshooting ===== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | ===== Ref ===== | ||
+ | [[wiki: | ||
{{tag> | {{tag> | ||
+ |