JPA 10

스프링 데이터 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

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 - 프록시와 연관관계 관리

연관관계를 맺은 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

JPA - 다양한 연관관계 매핑

✔️ 연관관계 매핑시 고려사항 3가지다중성다대일 : @ManyToOne일대다 : @OneToMany일대일 : @OneToOne다대다 : @ManyToMany단방향, 양방향테이블외래 키 하나로 양쪽 조인 가능방향 개념 x객체참조용 필드가 있는 쪽으로만 참조 가능한쪽만 참조 : 단방향양족이 서로 참조 : 양방향연관관계 주인테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음객체 양방향은 참조가 2개 (A -> B, B-> A)때문에 연관관계 주인을 설정하여 외래 키를 관리주인의 반대편은 외래 키에 영향을 주지 않고 단순 조회만 가능 항상 N (다) 쪽이 FK키를 갖기에 연관관계 주인이 된다. ✔️ N : 1 [ 다대일 ]가장 많이 사용다대일의 반대는 1:N [일대다]   외래 키가 있는 쪽이 연관관계의 주인..

Back-End/JPA 2024.07.09

JPA - 연관관계 매핑 기초

객체와 테이블의 연관관계는 매우 다르다. 객체는 참조 하여 연관된 객체를 찾지만테이블은 외래 키를 매핑(조인)하여 연관된 테이블을 찾는다.  ✔️ 단방향 연관관계 @Entitypublic class Member { // 기본 id 및 정보 생략 @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team;}Member 가 Team을 단방향으로만 알고 있는 상태  ✔️ 양방향 연관관계 @Entitypublic class Member { // 기본 id 및 정보 생략 @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team;} @Entitypublic class Team..

Back-End/JPA 2024.07.05

JPA - 엔티티 매핑

✔️ 객체와 테이블 매핑 @Entity클래스에 붙이는 애노테이션해당 클래스는 엔티티로써 JPA가 관리JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수기본 생성자 필수 (public | protected)final 클래스, enum, interface, inner 클래스 사용 불가저장할 필드에 final 사용 x 엔티티 객체는 리플렉션으로 (기본 생성자 + 필드 값 주입 방식) 생성한다. 그런데 final 필드로 선언해버리면 리플렉션을 통한 값 주입이 불가능해진다.  💠 속성name : JPA에서 사용할 엔티티 이름 지정, Default : 클래스 이름 그대로 사용  @Table@Table 은 엔티티와 매핑할 테이블 지정속성기능기본값name매핑할 테이블 이름엔티티 이름을 사용catalog데..

Back-End/JPA 2024.07.05

JPA - 영속성 관리

JPA 핵심객체와 관계형 데이터베이스 매핑영속성 컨텍스트  영속성 컨텍스트의미 : 엔티티를 영구 저장하는 환경 영속성 컨텍스트는 논리적인 개념엔티티 매니저를 통해 영속성 컨텍스트에 접근 J2SE 환경엔티티 매니저 1 : 1 영속성 컨텍스트J2EE, 스프링 프레임 워크같은 컨테이너 환경엔티티 매니저 N : 1 영속성 컨텍스트 🌿 엔티티의 생명주기비영속 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태new / transientex) 객체를 생성한 상태 영속영속성 컨텍스트에 관리되는 상태managedex) persist(객체);    - 객체는 영속상태이기에 관리 대상준영속영속성 컨텍스트에 저장되었다가 분리된 상태detached준영속 상태로 만드는 법 em.detach(객체)  // 특정 엔티티만 준영속 상..

Back-End/JPA 2024.07.01