본문 바로가기

Web/JPA

(9)
확장기능 * 사용자 정의 리포지터리 구현 인터페이스는 아무이름이나 상관없음 그러나 구현하는 클래스 이름은 MemberRepository + Impl 붙여서 생성한다. public interface MemberRepositoryCustom { List findMemberCustom(); } @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List findMemberCustom() { return em.createQuery("select m from Member m") .getResultList(); } } p..
Spring Data JPA 페이징 org.springframework.data.domain.Sort; org.springframework.data.domain.Page; org.springframework.data.domain.PageRequest; Sort : 정렬기능 Pageable : 페이징기능 * 반환타입 Page : totalCount 가 포함 된 페이징 Slice : totalCount 미포함 ( 모바일에 더보기 기능 같은거) public interface MemberRepository extends JpaRepository { Page findByAge(int age, Pageable pageable); } @Test public void paging() { memberRepository.save(new Member("mem..
API 고급( 지연로딩과 조회성능 최적화) @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAllByString(new OrderSearch()); return all; } } @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private S..
고급매핑 * 상속 관계 매핑 - 데이터 베이스엔 상속관계가 없다 - 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 //부모 클래스조인전략 @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name=“DTYPE”) //자식 클래스 @DiscriminatorValue(“XXX”) //부모 클래스단일 테이블 전략 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name=“DTYPE”) //자식 클래스 @DiscriminatorValue(“XXX”) //부모 클래스구현 클래스마다 테이블 전략 @Inheritance(strategy=Inher..
다양한 연관관계 매핑 다대일 @ManyToOne 일대다 @OneToMany 일대일 @OneToOne 다대다 @ManyToMany * 일대다 단방향 정리 - 객체와 테이블의 차이 때문에 반대편 테이블의 외래키를 관리하는 특이한 구조 - JoinColumn 을 꼭 사용해야 됨 그렇지 않으면 조인테이블 방식을 사용해 중간에 테이블을 자동으로 추가시킨다 - 단점 : 엔티티가 관리하는 외래키가 다른 테이블에 있음 연관관계 관리를 위해 추가로 update sql 실행 * 일대다 단방향 매핑보다 다대일 양방향 매핑을 사용하자! * 일대다 양방향 - 공식적으로 존재하지 않는 매핑 - @JoinColumn(insertable=false, updatable=false) 읽기 전용 필드를 사용해서 양방향처럼 사용 - 다대일 양방향을 사용하자! ..
연관관계 매핑 기초 회원 ( Member ) : N 팀 ( Team ) : 1 회원과 팀은 다대일의 관계 : 1개의 팀에 여러명의 회원이 있다. 테이블 → '외래키'로 조인 객체 → 참조 ex) member.getId() * 단방향 @ManyToOne @JoinColumn(name = "Team_ID") private Team team; * 양방향 연관관계 - 양방향 매핑 ( 반대방향으로 객체 그래프 탐색 ) @OneToMany(mappedBy = "team") // team 은 Member 클래스에 있는 Team 의 변수명 List members = new ArrayList(); mappedBy 를 알기 위해선...객체와 테이블이 관계를 맺는 차이 알아야됨. *객체와 테이블이 관계를 맺는 차이 객체 연관관계 = 2개 회원..
엔티티 매핑 #객채와 테이블 매핑 - @Entity가 붙은 클래스는 JPA가 관리한다. - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션 필수 *속성 정리 -name : JPA에서 사용할 엔티티 이름을 지정한다 기본값 : 클래스 이름을 그대로 사용 (예: Member) 같은 클래스 이름이 없으면 가급적 기본값을 사용 -Table : 엔티티와 매필 할 테이블 지정 (DB) (속성 : name - 매핑할 테이블 이름 , catalog , schema, uniqueConstraints - DDL 생성 시 유니크 제약조건 생성) 데이터베이스 스키마 자동 생성 • DDL을 애플리케이션 실행 시점에 자동 생성 • 테이블 중심 -> 객체 중심 • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL..
플러시 @영속성 컨텍스트를 플러시 하는 법 1. em.flush() - 직접호출 2. 트랜잭션 커밋 - 플러시 자동 호출 3. JPQL 쿼리 실행 - 플러시 자동 호출 : 자동 호출 되는 이유는 em.persist(memberA); em.persist(memberB); em.persist(memberC); //중간에 JPQL 실행 query = em.createQuery("select m from Member m", Member.class); List members= query.getResultList(); : member A,B,C 가 commit 전에는 쿼리가 날라가지 않음.. JPQL 은 1차캐시에서 먼저 찾지 않고 DB에서 찾은 후 1차 캐시에 저장 1차 캐시에 같은게 있으면 쿼리에서 찾은거 버림... ..