jpa

    실무 활용 - 스프링 데이터 JPA와 Querydsl

    실무 활용 - 스프링 데이터 JPA와 Querydsl

    목차 스프링 데이터 JPA 리포지토리로 변경 사용자 정의 리포지토리 스프링 데이터 페이징 활용1 - Querydsl 페이징 연동 스프링 데이터 페이징 활용2 - CountQuery 최적화 스프링 데이터 페이징 활용3 - 컨트롤러 개발 스프링 데이터 JPA 리포지토리로 변경 스프링 데이터 JPA - MemberRepository 생성 package study.querydsl.repository; import org.springframework.data.jpa.repository.JpaRepository; import study.querydsl.entity.Member; import java.util.List; public interface MemberRepository extends JpaRepositor..

    순수 JPA와 Querydsl

    목차 순수 JPA 리포지토리와 Querydsl 동적 쿼리와 성능 최적화 조회 - Builder 사용 동적 쿼리와 성능 최적화 조회 - Where절 파라미터 사용 조회 API 컨트롤러 개발 순수 JPA 리포지토리와 Querydsl 순수 JPA 리포지토리 package study.querydsl.repository; import com.querydsl.jpa.impl.JPAQueryFactory; import org.springframework.stereotype.Repository; import study.querydsl.entity.Member; import javax.persistence.EntityManager; import java.util.List; import java.util.Optional;..

    나머지 기능들

    목차 Specifications (명세) Query By Example Projections 네이티브 쿼리 Specifications (명세) 책 도메인 주도 설계(Domain Driven Design)는 SPECIFICATION(명세)라는 개념을 소개 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원 술어(predicate) 참 또는 거짓으로 평가 AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성(컴포지트 패턴) 예) 검색 조건 하나하나 스프링 데이터 JPA는 org.springframework.data.jpa.domain.Specification 클래스로 정의 명세 기능 사용 방법 * JpaSpecificationExecutor 인터페이스 상속*..

    스프링 데이터 JPA 분석

    목차 스프링 데이터 JPA 구현체 분석 새로운 엔티티를 구별하는 방법 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleJpaRepository SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(en..

    확장 기능

    목차 사용자 정의 리포지토리 구현 Auditing Web 확장 - 도메인 클래스 컨버터 Web 확장 - 페이징과 정렬 사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? JPA 직접 사용( EntityManager ) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 등등... Querydsl 사용 사용자 정의 인터페이스 package study.datajpa.repository; import study.datajpa.entity.Member; import j..

    쿼리 메소드 기능

    목차 메소드 이름으로 쿼리 생성 JPA NamedQuery @Query, 리포지토리 메소드에 쿼리 정의하기 @Query, 값, DTO 조회하기 파라미터 바인딩 반환 타입 순수 JPA 페이징과 정렬 스프링 데이터 JPA 페이징과 정렬 벌크성 수정 쿼리 @EntityGraph JPA Hint & Lock 메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리 실행 이름과 나이를 기준으로 회원을 조회하려면? 순수 JPA 리포지토리 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m...

    프로젝트 환경설정

    목차 프로젝트 생성 라이브러리 살펴보기 스프링 데이터 JPA와 DB 설정, 동작확인 프로젝트 환경설정 프로젝트 생성 스프링 부트 스타터(https://start.spring.io/) 사용 기능: web, jpa, h2, lombok SpringBootVersion: 2.2.1 groupId: study artifactId: data-jpa Gradle 전체 설정 plugins { id 'org.springframework.boot' version '2.6.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility =..

    웹 계층 개발

    웹 계층 개발

    웹 계층 개발 홈 화면 회원 기능 회원 등록 회원 조회 상품 기능 상품 등록 상품 수정 상품 조회 주문 기능 상품 주문 주문 내역 조회 주문 취소 상품 등록 상품 목록 상품 수정 변경 감지와 병합 상품 주문 홈 화면과 레이아웃 홈 컨트롤러 등록 package jpabook.jpashop.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HomController { Logger log = L..

    주문 도메인 개발

    주문 도메인 개발

    주문 도메인 개발 구현 기능 상품 주문 주문 내역 조회 주문 취소 목차 주문 엔티티, 주문상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 주문, 주문상품 엔티티 개발 주문 엔티티 개발 주문 엔티티 코드 package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Getter @Setter public class Order { @I..

    상품 도메인 개발

    상품 도메인 개발

    상품 도메인 개발 구현 기능 상품 등록 상품 목록 조회 상품 수정 목차 상품 엔티티 개발(비즈니스 로직 추가) 상품 리포지토리 개발 상품 서비스 개발 상품 기능 테스트 -> 여기선 생략할거임 (바로앞 테스트와 비슷) 상품 엔티티 개발(비즈니스 로직 추가) 상품 엔티티 코드 package jpabook.jpashop.domain.item; import jpabook.jpashop.domain.Category; import jpabook.jpashop.exception.NotEnoughStockException; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import jav..