김영한 JPA
-
JPA - 8. 객체지향 쿼리 언어 (JPQL) - 1Java 2020. 7. 29. 14:16
객체 지향 쿼리 언어 소개 - JPQL - JPA Criteria - QueryDSL - 네이티브 SQL - JDBC API 직접 사용, MyBatis, SpringJdbcTemplate 과 함께 사용 JPQL 소개 - 가장 단순한 조회 방법 - EntityManager.find() - 객체 그래프 탐색 (a.getB().getC()) - 나이가 18살 이상인 회원을 모두 검색하고 싶다면 ? JPQL - JPA를 사용하면 엔티티 객체를 중심으로 개발 - 문제는 검색 개발 - 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능 - 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요 - JPA는 SQL을..
-
JPA - 7. 값 타입Java 2020. 7. 27. 19:53
기본값 타입 JPA의 데이터 타입 분류 - 엔티티 타입 - @Entity로 정의하는 객체 - 데이터가 변해도 식별자로 지속해서 추적 가능 - 예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 - 값 타입 - int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 - 식별자가 없고 값만 있으므로 변경시 추적 불가 - 예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류 - 기본값 타입 - 자바 기본 타입 (int, double) - 래퍼 클래스 (Integer, Long) - String - 임베디드 타입 (embedded type, 복합 값 타입) - 컬렉션 값 타입 (collection value type) 기본값 타입 - 예) String ..
-
JPA - 2. 엔티티 매핑Java 2020. 7. 26. 14:32
객체와 테이블 매핑 @Entity - @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 - 기본 생성자 필수 (파라미터가 없는 public 또는 protected) - final 클래스 , enum, interface, inner 클래스 사용 X - 저장할 필드에 final 사용 X @Entity 속성 name - JPA에서 사용할 엔티티 이름 지정 - default -> 클래스 이름 - 같은 클래스 이름이 없다면, 가급적 기본값을 사용한다. @Table 속성 - catalog : 데이터베이스 catalog 매핑 - schema : 데이터베이스 schema 매핑 - uniqueConstraints (DDL) : DDL 생성 시..
-
JPA - 1. 영속성 관리 - 내부 동작 방식Java 2020. 7. 26. 14:03
JPA에서 가장 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 영속성 컨텍스트 - JPA를 이해하는데 가장 중요한 언어 - "엔티티를 영구 저장하는 환경" 이라는 뜻 - EntityManager.persist(entity); 엔티티 매니저 ? 영속성 컨텍스트 ? - 영속성 컨텍스트는 논리적인 개념 - 눈에 보이지 않는다. - 엔티티 매니저를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 - 비영속 (new/ transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 - 영속 (managed) 영속성 컨텍스트에 관리되는 상태 - 준영속 (detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제 (removed) 삭제된 상태 영속성 컨텍스트의 이점 - 1..
-
JPA - 0. JPA 소개, DB 용어 정리Java 2020. 7. 26. 13:36
SQL 중심 개발의 문제점 - 객체를 관계형 DB에 관리 - SQL 중심적인 개발 - CRUD 의 무한 반복, 지루한 코드 - 패러다임의 불일치 : 객체 vs 관계형 데이터베이스 - 객체를 관계형 데이터베이스에 저장. 객체 -> SQL 변환 -> RDB(SQL) - 객체와 관계형 데이터베이스의 차이 1. 상속 2. 연관관계 3. 데이터 타입 4. 데이터 식별 방법 1. 객체의 경우 상속이 존재하지만 Table의 경우 상속이 존재하지 않고 비슷한 슈퍼타입 서브타입 관계가 존재한다. -> 자바 컬렉션을 예시로 설명 2. 객체는 참조를 사용, 테이블은 외래 키를 사용 -> 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다. 결국 객체를 객체답게 모델링 할 수록 매핑 작업만 늘어난다. 객체를 자바 컬렉션에 ..
-
JPA - 4. 다양한 연관관계 매핑Java 2020. 7. 25. 18:16
연관관계 매핑시 고려사항 3가지 1. 다중성 2. 단방향, 양방향 3. 연관관계의 주인 1. 다중성 - 다대일 : @ManyToOne - 일대다 : @OneToMany - 일대일 : @OneToOne - 다대다 : @ManyToMany 2. 단방향, 양방향 - 테이블 - 외래키 하나로 양쪽 조인 가능 - 사실 방향이라는 개념이 없다. - 객체 - 참조용 필드가 있는 쪽으로만 참조 가능 - 한쪽만 참조하면 단방향 - 양쪽이 서로 참조하면 양방향 3. 연관관계의 주인 - 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 - 객체 양방향 관계는 A -> B , B -> A 처럼 참조가 2군데 - 객체 양방향 관계는 참조가 2군데 있다. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 한다. - 연관관계의 ..
-
JPA - 3. 연관관계 매핑Java 2020. 7. 25. 17:33
- 연관관계가 필요한 이유 - 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다. - 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다. - 객체는 참조를 사용해서 연관된 객체를 찾는다. - 테이블과 객체 사이에는 이런 큰 간격이 있다. - 객체 지향 모델링 / 단방향 연관관계 // Member.class @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; ... //조회 Member findMember = em.find(Member.class, member.getId()); //참조를 사용해서 연관관계 조회 Team findTeam = findMember.getTeam(); //팀 저장 Team team = n..
-
JPA - 6. 프록시와 연관관계 관리Java 2020. 7. 25. 16:48
프록시 프록시 기초 - em.find() vs em.getReference() - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 - 실제 클래스를 상속 받아서 만들어진다. - 실제 클래스와 겉 모양이 같다. - 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. (이론상으로) - 프록시 객체는 실제 객체의 참조(target)을 보관한다. - 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출한다. - 프록시 객체는 처음 사용할 때 한 번만 초기화 - 프록시 객체를 초기화 할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님. 초기화 ..