개발/JPA 10

객체 지향 쿼리 언어(JPQL) - 1

객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원 JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 소개 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색(a.getB().getC()) 나이가 18살 이상인 회원을 모두 검색하고 싶다면? JPQL 사용 이유 JPA를 사용하면 엔티티 객체를 중심으로 개발 문제는 검색 쿼리 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 JPQL 특징 JPA는 SQL을 추상..

개발/JPA 2022.06.17

값 타입 - 2

값 타입의 비교 값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다. // primitive type 비교 int a = 10; int b = 10; System.out.println(a == b);//true // 임베디드 타입(인스턴스) 비교 Address a = new Address("서울", "AAA", 1000); Address b = new Address("서울", "AAA", 1000); System.out.println(a == b);//false 인스턴스가 달라서 false가 뜸 상황에 따라 다르게 비교를 한다. 동일성 비교 : 인스턴스의 참조 값을 비교, == 사용 동등성 비교 : 인스턴스의 값을 비교, equals() 사용 값 타입은 a.equals(b)를 사용..

개발/JPA 2022.06.16

값 타입 - 1

기본값 타입 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 기본값 타입 자바 기본 타입(int, double) 래퍼 클래스(Integer, Long) String 임베디드 타입(embedded type, 복합 값 타입) EX) 좌표 등 컬렉션 값 타입(collection value type) EX) Array, Map, Set 기본값 타입 EX) String name, int a..

개발/JPA 2022.06.10

프록시와 연관관계 관리

프록시 em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 객체를 반환 특징 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 프록시 객체는 처음 사용할 때 한 번만 초기화 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초기화되면 프록시 객체를 통해서 실제제 엔티티에 접근 가능 프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야함( == X, instanceof 사용) m1.getClass() == m2.getClass() //false m1 instanceof Member /..

개발/JPA 2022.06.08

고급 매핑

주요 어노테이션 @Inheritance(strategy=InheritanceType.xxx) JOINED: 조인 전략 SINGLE_TABLE: 단일 테이블 전략 TABLE_PER_CLASS: 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name="DTYPE") @DiscriminatorValue("xxx") 상속 관계 매핑 관계형 데이터베이스는 상속 관계가 없다 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 1. 조인 전략 ITEM, ALBUM에 PK,FK가 같아 각각의 테이블에 INSERT를 수행함 장점 테이블 정규화 외래 키 참조..

개발/JPA 2022.06.07

다양한 연관관계 매핑

연관관계 매핑 시 고려사항 3가지 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 : 외래 키 하나로 양쪽 조인 가능, 사실 방향이라는 개념이 없음 객체 : 참조용 필드가 있는 쪽으로만 참조 가능, 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향 연관관계의 주인 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 객체 양방향 관계는 A ->, B->A 처럼 참조가 2군데 객체 양방향 관계는 참조가 2군데 있음. 둘중 테이블의 외래 키를 관리할 곳을 지정해야함 연관관계의 주인 : 외래 키를 관리하는 참조 주인의 반대편 : 외래키에 영향을 주지 않음, 단순 조회만 가능 다대일(N:1) 다대일 단방향..

개발/JPA 2022.06.06

연관관계 매핑 기초

▣ 목표 객체와 테이블 연관관계의 차이를 이해 객체의 참조와 테이블의 외래 키를 매핑 용어이해 방향 : 단방향, 양방향 다중성 : N:1, 1:N, 1:1, N:M 연관관계의 주인 : 객체 양방향 연관관계는 관계 관리 주인이 필요 연관관계가 필요한 이유 객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다. - 조영호(객체지향의 사실과 오해) 객체를 테이블에 맞추어 모델링 1. 연관관계가 없는 객체 코드(참조 대신에 외래 키를 그래로 사용) package study.datajpa.dto; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import..

개발/JPA 2022.06.05

엔티티 매핑

객체와 테이블 매핑 데이터베이스 스키마 자동 생성 필드와 컬럼 매핑 기본 키 매핑 실전 예제 - 요구사항 분석과 기본 매핑 객체와 테이블 매핑 @Entity 1. @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. 2. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수 이다. 3. 주의 사항 - 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) - final클래스, enum, interface, inner 클래스 사용X 4. 속성 정리 속성 : name JPA에서 사용할 엔티티 이름을 지정합니다. 기본값: 클래스 이름을 그대로 사용 합니다.(예: Member) 같은 클래스 이름이 없으면 가급적 기본값을 사용 합니다. @Table 1. 엔티티와 매핑할 ..

개발/JPA 2022.06.03

영속성 관리

JPA 내부 구조 JPA에서 가장 중요한 2가지 중 영속성 컨텍스트에 대해 알아보도록 리뷰 하도록 하겠습니다. 엔티티 매니저 팩토리와 엔티티 매니저 웹 어플리케이션 구동 시 EntityManagerFactory를 생성하여 가지고 있으며, 사용자의 요청 시 EntityManagerFactory가 사용자 각각의 요청에 따라 EntityManager를 각각 생성하여 ConnectionPool을 사용해서 DB를 핸들링 합니다. 영속성 컨텍스트란? 엔티티를 영구 저장하는 환경 EntityManager.persist(entity); 영속성 컨텍스트는 논리적인 개념 눈에 보이지 않음 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 엔티티의 생명 주기 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 ..

개발/JPA 2022.06.02

JPA소개 및 시작

JPA와 모던 자바데이터 저장 기술 현 문제점?? - 객체지향 언어인 JAVA의 객체를 관계형 데이터베이스를 통해 관리 - SQL 중심의 개발 - SQL 중심의 개발이기 개발자가 객체 지향의 구조를 만들었어도 결국 SQL로 데이터를 관리 (개발자가 직접 SQL을 작성 및 수정) 1. 객체 CRUD public class Member{ private String memberId; private String name; } Insert INTO MEMBER(MEMBER_ID, NAME) VALUES SELECT MEMBER_ID, NAME FROM MEMBER M UPDATE MEMBER SET ... 전화번호를 추가해야하는 요청이 있을 때... 하나 전화번호와 관련된 모든 SQL문을 수정 public cla..

개발/JPA 2022.05.31