Back-End/JPA 15

스프링 데이터 JPA - 분석

✔️ 스프링 JPA 구현체 분석 org.springframework.data.jpa.repository.support.SimpleJpaRepository   @Repository // JPA 예외를 스프링이 추상화한 예외로 변환@Transactional(readOnly = true) // 서비스 계층에서 트랜잭션 시작시 해당 트랜잭션을 전파 받아서 사용public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; ..

Back-End/JPA 2024.07.31

스프링 데이터 JPA - 확장 기능

✔️ 사용자 정의 리포지토리 구현스프링 데이터 JPA 외에 JPA 직접사용 JDBC TemplateQuerydsl 사용데이터베이스 커넥션 직접 사용 등 ..  인터페이스 메서드를 직접 구현하고 싶을 때 사용 // 사용자 정의 인터페이스public interface MemberRepositoryCustom { List findMemberCustom();} 사용자 정의 인터페이스 구현 클래스@RequiredArgsConstructorpublic class memberRepositoryImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List findMemberCustom() {..

Back-End/JPA 2024.07.31

스프링 데이터 JPA - 페이징과 정렬, 벌크 수정

✔️  페이징과 정렬 페이징과 정렬 파라미터org.springframework.data.domain.Sort // 정렬 기능org.springframework.data.domain.Pageable // 페이징 기능 (내부에 Sort 포함)  특별한 반환 타입org.springframework.data.domain.Page // 추가 count 쿼리 결과를 포함하는 페이징org.springframework.data.domain.Slice // count 쿼리 없이 다음 페이지만 확인 가능 (내부적으로 limit + 1 조회)List(자바 컬렉션) : 추가 count 쿼리 없이 결과만 반환  Page 인터페이스public interface Page extends Slice { int getTotalPa..

Back-End/JPA 2024.07.29

스프링 데이터 JPA - 기본

✔️ 공통 인터페이스 설정JavaConfig 설정- 스프링 부트 사용시 생략 가능@Configuration@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")public class AppConfig {} 스프링 부트 사용시 @SpringBootApplication 위치를 지정(해당 패키지와 하위 패키지 인식)만약 위치가 달라지면 @EnableJpaRepositories 필요// T : 엔티티 타입// ID : 식별자 타입 (PK)public interface XxxRepository extends JpaRepository {}@Repository 애노테이션 생략 가능컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리JPA 예외를 스프링..

Back-End/JPA 2024.07.29

API 학습 내용

api를 엔티티 그대로 반환하면 양방향 매핑시 무한 루프에 빠진다. @Jsonignore 을 사용하는것도 좋은 방법은 아니다. (항상 사용하지 않는것이 아니기에) DTO로 반환하자 💠  DTO로 조회하는 V4 ~ V6✔️ V3컬렉션 패치 조인 + 페이징 @BatchSize // 쿼리 1번 @GetMapping("api/v3.1/orders") public List ordersV3_page(@RequestParam(value = "offset", defaultValue = "0") int offset, @RequestParam(value = "limit", defaultValue = "100") int limit) { ..

Back-End/JPA 2024.07.15

JPA - JPQL

JPA는 SQL을 추상화한 JPQL은 객체 지향 쿼리 언어를 제공JPQL은 테이블이 아닌 엔티티 객체를 대상특정 데이터베이스 SQL에 의존 X즉, 객체 지향 SQL   참고 JPA를 사용하면서 JDBC 직접 사용 Template 등을 사용하게 되면SQL을 실행하기 전에 영속성 컨텍스트를 수동 플러시 하자   ✔️ 문법 select m from Member (as) m where m.age > 18엔티티와 속성은 대소문자 구분 O (Member, age 등)JPQL 키워드는 대소문자 구분 X (SELECT, select 등)엔티티 이름 사용 💠 집합과 정렬select COUNT(m), //회원수 SUM(m.age), //나이 합 AVG(m.age), //평균 나이 MAX(m.age), //최대 나이 MI..

Back-End/JPA 2024.07.12

JPA - 값타입

엔티티 타입@Entity 로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능   값 타입int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고 값만 있으므로 변경시 추적 불가 💠 기본값 타입primitive type, wrapper type생명주기를 엔티티에 의존값타입은 공유 금지  primitive type(기본 타입)은 절대 공유 금지기본 타입은 항상 값을 복사  wrapper 클래스나 String 같은 특수한 클래스는 공유 가능 객체지만 변경 XInteger a = 10;Integer b = a;System.out.println("a = " + a);System.out.println("b = " + b); b = 20;Syste..

Back-End/JPA 2024.07.12

JPA - 프록시와 연관관계 관리

연관관계를 맺은 Member 와 Team 객체에서Member 만 조회할 때 Member 객체 안에는 Team 객체가 들어가 있을까?만약 그렇다면 Member만 사용하고 싶을 때는 어떻게 해야하나 ?JPA는 프록시 기술을 통해서 이 문제를 해결하였다.  ✔️ 프록시 실제 클래스를 상속받아서 만들어진 가짜  위임프록시 객체는 실제 객체의 참조를 보관 (Entity target 필드 가짐)프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 1. 멤버 프록시 조회Member member = em.getRefernce(Member.class, id);2. member.getName() 호출member.getN..

Back-End/JPA 2024.07.10

JPA - 고급 매핑

✔️ 상속관계 매핑관계형 데이터베이스는 상속 관계 X슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사상속 관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브 타입 관계를 매핑  슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법각각 테이블로 변환 -> 조인 전략통합 테이블로 변환 -> 단일 테이블 전략서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략   ✔️ Join 전략부모 엔티티에 해당 애노테이션 붙이기@Entity@Inheritance(strategy = InheritanceType.JOINED) // 조인 전략@DiscriminatorColumn(name = "DTYPE") // DTYPE 설정 default : DTYPE public class Item { @..

Back-End/JPA 2024.07.09

JPA - 1:N 단방향과 양방향에 대해서

JPA 공부중 이해가 안가서 책을 참고하면서 이해한 것을 적어보려한다 먼저 JPA는 외래키를 관리하며 연관관계 주인만 사용한다.주인이 아닌 Team.members는 조회를 위한 JPQL이나 객체 그래프를 탐색할 때 사용한다. 가정Team : 1(연관관계 주인)Member : N (FK)  1:N 단방향 매핑을 하고 Team이 연관관계 주인이라 했을 때Member는 Team을 모른다.  아래의 코드를 실행해보자.Member member = new Member(); member.setUsername("member1"); Team team = new Team(); team.setName("team1"); member.setTeam(team); team.getMembers().add(member);..

Back-End/JPA 2024.07.09