전체 글
-
04. JPA 값 타입BackEnd/JPA 2021. 8. 13. 16:12
1. 기본값 타입 > 생명 주기를 엔티티에 의존한다. 값 타입은 공유하면X 1) 자바 기본 타입(int, double) 2) 래퍼 클래스(Integer, Long) 3) String 2. 임베디드 타입(embedded type, 복합 값 타입) (사용법) > @Embeddable: 값 타입을 정의하는 곳에 표시 > @Embedded: 값 타입을 사용하는 곳에 표시 > 기본 생성자 필수 (장점) > 재사용 > 높은 응집도 > Period.isWork()처럼 해당 값 타입만 사용하는 의미 있는 메소 드를 만들 수 있음 > 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티 티에 생명주기를 의존함 (주의사항) > 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 부작용(side effect)..
-
03. JPA 연관관계 관리BackEnd/JPA 2021. 8. 13. 14:48
1. 즉시 로딩(EAGER)과 지연 로딩(LAZY) > Member Entity : Team Entity ( N : 1 )가 존재할 때 즉시 로딩은 두 엔티티를 한 번에 조회하지만 지연 로딩은 프록시로 조회한다. > 즉시 로딩은 JPQL에서 N+1 문제를 야기하기 때문에 실무에서는 가급적 지연 로딩만 사용한다. JPQL fetch 조인이나 엔티티 그래프 기능을 사용하는 것이 좋다. (@OneToMany, @ManyToMany는 기본이 지연 로딩이다. @ManyToOne, @OneToOne은 기본이 즉시 로딩이기에 LAZY로 설정한다.) tip) 프록시(Proxy) > em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 > em.getReference(): 데이터베이스 조회를 미루는 가짜(프록..
-
02. JPA Mapping AnnotationBackEnd/JPA 2021. 8. 9. 19:00
Annotation 정의 @Entity JPA가 관리할 객체, JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 > 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자), final 클래스, enum, interface, inner 클래스 사용X (속성) > name : JPA에서 사용할 엔티티 이름을 지정 (기본값: 클래스 이름을 그대로 사용, 기본값 사용 권장) @Table 엔티티와 매핑할 테이블 지정 (속성) > name : 매핑할 테이블 이름 (기본값 : 엔티티 이름을 사용) > catalog : DB catalog 매핑 > schema : DB schema 매핑 > uniqueConstraints(DDL) : DDL 생성 시에 유니크 제약 조건 생성 예) @..
-
01. JPA(Java Persistence API)BackEnd/JPA 2021. 8. 9. 18:00
1. JPA란? JPA란 JAVA의 ORM(Object-Relational Mapping) 기술 표준으로 JAVA 객체(Object)와 관계형 데이터베이스(RDB)를 중간에서 매핑해주는 ORM 프레임워크이다. 2. JPA 사용 이유 1) SQL 중심 > 객체 중심 개발 2) 생산성 > JPA가 SQL문을 만들어 주기 때문에 persist, find, setXX, remove 메서드로 CRUD 수행 3) 유지보수 > 컬럼 추가 시 SELECT/INSERT/UPDATE/DELETE 모든 DML문 수정이 필요했으나, JPA의 경우 필드만 추가 4) 패러다임의 불일치 해결 > 상속, 연관관계, 객체 그래프 탐색, 비교 5) 성능 (1) 1차 캐시와 같은 트랜잭션 안에서는 같은 엔티티를 반환하는 동일성 보장 (2..
-
13. Querydsl 활용 (Spring Data JPA 적용)BackEnd/Querydsl 2021. 7. 30. 21:54
[전체소스코드] 1. 프로파일 설정 (main 코드와 테스트 코드 실행 시 프로파일 분리) > src/main/resources/application.yml > src/test/resources/application.yml 2. 샘플데이터 추가 > InitMember.java 3. DTO 추가 > MemberTeamDto.java (Qtype 생성을 위해 ./gradlew compileQuerydsl (우측 Gradle querydsl > Tasks > other > compileQuerydsl)) > MemberSearchCondition.java 4. 사용자 정의 Repository 1) 사용자 정의 인터페이스 작성 MemberRepositoryCustom.java 2) 사용자 정의 인터페이스 구현 ..
-
12. Querydsl SQL functionBackEnd/Querydsl 2021. 7. 29. 21:11
[전체소스코드] SQL function은 JPA와 같이 Dialect에 등록된 내용만 호출할 수 있다. 1. Replace String result = queryFactory .select(Expressions.stringTemplate("function('replace', {0}, {1}, {2})", member.username, "member", "M")) .from(member) .fetchFirst(); // result : M1 2. lower String result = queryFactory .select(member.username) .from(member) // .where(member.username.eq(Expressions.stringTemplate("function('lower'..
-
11. Querydsl Update/Delete BulkBackEnd/Querydsl 2021. 7. 29. 20:50
[전체소스코드] (주의) JPQL 배치와 마찬가지로, 영속성 컨텍스트에 있는 엔티티를 무시하고 실행되기 때문에 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는 것이 안전하다. 1. Update long count = queryFactory .update(member) .set(member.username, "비회원") /** 기존 숫자에 더하기 .set(member.age, member.age.add(1)) 기존 숫자에 곱하기 .set(member.age, member.age.multiply(2)) */ .where(member.age.lt(28)) .execute(); 2. Delete long count = queryFactory .delete(member) .where(member.age...
-
10. Querydsl Dynamic Query (동적쿼리)BackEnd/Querydsl 2021. 7. 29. 20:37
[전체소스코드] 1. BooleanBuilder private List searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null) { builder.and(member.username.eq(usernameCond)); } if (ageCond != null) { builder.and(member.age.eq(ageCond)); } return queryFactory .selectFrom(member) .where(builder) .fetch(); } 2. Where 다중 파라미터 > where 조건에 null 값은 무시된다. > 메서드를 ..