JPA 40

JPA에서 사용하는 다양한 API

JPA에서 사용하는 다양한 API JPQL QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL(객체 지향 SQL) 엔티티 중심으로 개발 검색에도 테이블이 아닌 엔티티 객체를 대상으로 검색 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL 필요 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) ANSI 표준 문법은 모두 지원 동적 쿼리 생성이 매우 어려움 JPQL은 엔티티 객체를 대상으로 쿼리 List resultList = em.createQuery( "select m from Member m where m.username like '%kim%'", // 테이..

JPA/JPA 2020.06.09

JPA 의 데이터 타입 분류

엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 추적 가능 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없으므로 변경시 추적 불가 불변 객체로 만들어야 부작용을 피할수 있다. 값 타입은 공유하면 안됨 기본 타입(primitive type) 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 생명주기를 엔티티에 의존 회원을 삭제하면 이름, 나이 필드도 함께 삭제 회원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨 기본 타입은 항상 '값'을 복사므로, 공유되지 않음 임베디드 타입(embedded type, 복합 값 타입) 새로운 값 타입을 직접 정의할 수 있음. 주로 기본 값 타입을..

JPA/JPA 2020.06.09

영속성 전이(CASCADE)

영속성 전이(CASCADE) ** 특정 엔티티가 개인 소유일 때 사용 자동 영속 상태 변환을 하려는 엔티티가 다른 연관관계가 있을 경우 사용하면 안된다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 변환 ALL, PERSIST 위주로 사용함. @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List childList = new ArrayList(); Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); // em.persi..

JPA/JPA 2020.06.09

즉시 로딩과 지연 로딩

지연 로딩 @ManyToOne(fetch = FetchType.LAZY) 해당 객체는 프록시 객체로 생성되며, get 할때 쿼리를 수행하여 가져옴. @BatchSize(int) 로 쿼리를 하나만 수행하게 할 수 있다. 즉시 로딩 @ManyToOne(fetch = FetchType.EAGER) 연관된 엔티티 객체 조회시 하나의 쿼리로 조회하며, 엔티티 객체가 된다. JPQL에서 (1 + N) 문제를 일으킨다.(호출하지 않은 쿼리도 EAGER 매치가 된 객체 쿼리가 수행됨) 따라서 상상하지 못한 쿼리가 수행됨. *** 실무에서는 지연 로딩을 사용하라 @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> 지연 로딩으로 설정 @OneToMany, @ManyToMany는 기본이 지연 로딩 JPQL fe..

JPA/JPA 2020.06.09

객체와 테이블 연관관계 매핑

객체와 테이블 연관관계 매핑 테이블 지향 모델링인 경우 객체 지향적이지 않음. 객체 연관관계 사용해야함. 단방향 연관관계 @ManyToOne - 1:N 관계 @JoinColumn(name ="") - 양방향 연관관계 - 양쪽에서 참조하도록 작업 ** mappedBy - 객체 연관관계 = 2개(양방향이라 부름) - 회원 -> 팀 - 팀 -> 회원 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야함 테이블 연관관계 = 1개 외래키 하나로 두 테이블의 연관관계 관리 양방향 매핑 규칙 - 객치의 두 관계자중 하나를 연관관계의 주인으로 지정 - 연관관계의 주인만이 외래 키를 관리(등록, 수정) - 주인이 아닌 쪽은 읽기만 가능 - 주인은 mappedBy 속성 사용 X - 주인이 아니면 mappedBy ..

JPA/JPA 2020.06.09

엔티티 매핑

엔티티 매핑 객체 - 테이블 : @Entity, @Table 필드 - 컬럼 : @Column 기본 키 : @Id 연관관계 매핑 : @ManyToOne, @JoinColumn ** JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 기본 생성자 필수 final 클래스, enum, interface, inner 클래스 사용 X 저장할 필드에 final X 기본키 매핑 @Id 직접할당 @GeneratedValue IDENTITY - commit 이전에 키값 확인이 불가능하다. - JPA 에서 persist 하는 순간 INSERT 쿼리를 자동 수행한다. 따라서 persist 이후 해당 객체에 키값을 자동으로 넣어준다. SEQUENCE - persist 하는 순간 select sequenct 쿼리를 수..

JPA/JPA 2020.06.09

영속성 컨텍스트

영속성 컨텍스트 엔티티를 영구 저장하는 환경 영속성 컨테스트에 저장 EntityManager.persist(entity); // 1차 캐시에 저장, INSERT SQL 생성하여 쓰기 지연 SQL 저장소에 저장 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 비영속 객체를 생성한 상태 Member member = new Member(); 영속 em.persist(member); 준영속 상태 em.detach(member); 삭제 em.remove(member); 영속성 컨텍스트의 이점 1차 캐시 - 동일성(identity) 보장 변경 감지(Dirty Checking) - 수정시 스냅샷을 통해 기존 엔티티와 비교하여 변경이 있는 경우 수정 쿼리 생성 지연 로딩(Lazy Loading) flush 영속성 컨텍스..

JPA/JPA 2020.06.09

객체와 관계형 데이터베이스의 차이

차이점객체와 관계형 데이터베이스의 차이 상속 연관관계(참조) - 참조 : PK, FK 객체는 단방향, DB는 양방향 데이터 조회 가능 JPA(Java Persistence API) 자바 진영의 ORM 기술 표준 Object-relational mapping(객체 관계 매핑) 객체는 객체대로 관계형 DB는 관계형 DB 대로 설계 ORM 프레임워크가 중간에서 매핑 - 패러다임의 불일치 해결 JPA 프로젝트 기본 구조 controller, web : 웹계층 service : 비지니스 로직, 트랜잭션 처리 - 대부분의 로직을 처리함 - 서비스 계층은 단순 엔티티에 필요한 요청을 위임하는 역할 repository : JPA를 직접 사용하는 계층, 엔티티 매니저 사용 domain : 엔티티가 모여 있는 계층, 모든..

JPA/JPA 2020.06.09