JPA(17)
-
나머지 기능들
Specifications(명세) JPA Criteria 복잡 QueryDSL 사용하자 Query By Example 장점 동적 쿼리를 편리하게 처리 도메인 객체를 그대로 사용 데이터 저장소를 RDB에서 NoSQL로 변경해도 코드 변경이 없게 추상화되어 있음 스프링 데이터 JPA JpaRepository 인터페이스에 이미 포함 단점 조인은 가능하지만 내부 조인만 가능 외부 조인은 안됨 중첩 제약조건 안됨 매칭 조건이 매우 단순 QueryDSL Projections
2023.09.29 -
스프링 데이터 JPA 분석
스프링 데이터 JPA 구현체 분석 SimpleJpaRepository 에 @Transactional이 걸려 있음 → 스프링 데이터 JPA를 사용하면 트랜잭션이 없어도 데이터 등록, 변경이 가능 @Transactional(readOnly = true) 를 사용하면 flush를 생략해서 약간의 성능 향상 가능 save()는 새로운 엔티티면 persist 아니면 merge 새로운 엔티티를 구별하는 방법 기본 전략 식별자가 객체일 때 null로 판단 식별자가 자바 기본 타입일 때 0으로 판단 Persistable 인터페이스를 구현해서 판단 로직 변경 가능 @GenerateValue를 사용하지 않고 id를 직접 할당할 경우 이미 식별자 값이 있는 상태로 save()를 호출함 → merge()가 호출됨 merge(..
2023.09.29 -
확장 기능
사용자 정의 리포지토리 구현 스프링 데이터 JPA가 생성하는 메서드를 사용하지 않고 직접 구현하고 싶다면 JPA 직접 사용 스프링 JDBC Template MyBatis 데이터 커넥션 Querydsl 사용자 정의 인터페이스를 만들고 그 인터페이스의 구현 클래스를 만든 후 respository에 사용자 정의 인터페이스를 상속시킴 사용자 정의 구현 클래스는 리포지토리 인터페이스 이름 + Impl 으로 만들어야 함 스프링 데이터 JPA가 인식해서 스프링 빈으로 등록해줌 다른 이름으로 변경하고 싶으면 @EnableJpaRepositories(basePackages = "study.datajpa.repository", repositoryImplementationPostfix = "Impl") 실무에서는 주로 Qu..
2023.09.29 -
쿼리 메소드 기능
메소드 이름으로 쿼리 생성 Spring Data JPA - Reference Documentation Example 121. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del docs.spring.io 조회(SELECT) : find…By, query…By, get…By 개수 조회(COUNT) : count…By → long..
2023.09.29 -
공통 인터페이스 기능
공통 인터페이스 설정 javaConfig 설정 @Configuration @EnableJpaRepositories(basePackages = "jpabook.jpashop.repository") public class AppConfig {} 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식) 만약 위치가 달라지면 @EnableJpaRepositories 필요 스프링 데이터 JPA가 구현 클래스 대신 생성 org.springframework.data.repository.Repository를 구현한 클래스는 스캔 대상 @Repository 애노테이션 생략 가능 공통 인터페이스 분석 공통 인터페이스 구성 주요 메서드 save(S) : 새로운 엔티티는 저장..
2023.09.29 -
프로젝트 환경 설정 / 예제 도메인 모델
프로젝트 환경 설정 build.gradle plugins { id 'java' id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' } group = 'study' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter..
2023.09.29