JPQL 경로 표현식 - .을 찍어 객체 그래프 탐색 - 상태 필드 (state field) : 단순히 값을 저장하기 위한 필드 - 연관 필드 (association field) : 연관관계를 위한 필드 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 - 상태 필드: 경로 탐색의 끝, 탐색 X - 단일 값 연관 경로: 묵시적 내부 조인 발생, 탐색 O - 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 탐색 X 명시적 조인, 묵시적 조인 - 명시적 조인 : join 키워드 직접 사용 select m from Member m join m.team t - 묵시적 조인 : 경로 표현식에 의해 묵시적으..
JPA는 다양한 쿼리 방법을 지원 - JPQL - JPA Criteria - QueryDSL - Native SQL - JDBC API, MyBatis, SpringJdbcTemplate JPQL - 문제는 검색 쿼리 - 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색 - 검색 조건이 포함된 SQL이 필요 - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공 - SQL과 문법 유사 - JPQL은 엔티티 객체를 대상으로 쿼리 - SQL은 데이터베이스 테이블을 대상으로 쿼리 String query = "select m From Member m where m.name like '%hello%'"; List result = em.createQuery(query, Member.clas..
기본값 타입 JPA의 데이터 타입 분류 - 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 - 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경시 추적 불가 값 타입의 분류 - 기본값 타입 : 자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String - 임베디드 타입(embedded type, 복합 값 타입) - 컬렉션 값 타입(collection value type) 기본값 타입 - ex) String name, int age - 생명주기를 엔티티에 의존 : ex) 회원을 삭제하면 이름(name), 나이(age) 필드도 함께 삭제 - 값 타입은 ..
프록시 프록시 기초 - em.find() vs em.getReference() - em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 - em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 - 실제 클래스를 상속받아서 만들어진다. - 실제 클래스와 겉모양이 같다. - 이론상 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. - 프록세 객체는 실제 객체의 참조(target)을 보관 - 프록시 객체를 호출하면 프록시 개체는 실제 객체의 메소드 호출 프록시 객체의 초기화 Member member = em.getReference(Member.class, member.getId()); member.getName()..
상속관계 - RDB는 상속 관계가 없다. - 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 - 상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 - 각각의 테이블로 변환 -> 조인 전략 - 통합 테이블로 변환 -> 단일 테이블 전략 - 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션 - @Inheritance(strategy = InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 - @DiscriminatorColumn(name = "DTYPE"), @Discri..
연관관계 매핑 시 고려사항 3가지 - 다중성 - 단방향, 양방향 - 연관관계의 주인 다중성 - 다대일(N:1) : @ManyToOne - 일대다(1:N) : @OneToMany - 일대일(1:1) : @OneToOne - 다대다(N;M) : @ManyToMany 단방향, 양방향 - 테이블 외래 키 하나로 양쪽 조인 가능 사실 방향이라는 개념이 없다 - 객체 참조용 필드가 있는 쪽으로만 참조 가능 한쪽만 참조 가능하면 단방향, 양쪽이 서로 참조하면 양방향 연관관계의 주인 - 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 - 객체 양방향 관계는 참조가 2군데 - 객체 양방향 관계는 둘 중 테이블의 외래 키를 관리할 곳을 지정해야함 - 연관관계의 주인 : 외래 키를 관리하는 참조 - 주인의 반대편 : ..
- 객채와 테이블 연관관계의 차이를 이해 - 객체의 참조와 테이블의 외래 키를 매핑 연관관계가 필요한 이유 예시 시나리오 - 회원과 팀이 있다. - 회원은 하나의 팀에만 소속될 수 있다. - 회원과 팀은 다대일(N:1) 관계 객체를 테이블에 맞추어 모델링 (연관관계 없음) Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); members.setTeamId(team.getId()); em.persist(member); Member findMember = em.find(Member.class, member.getId()); Team findTe..
객체와 테이블 매핑 @Entity - @Entity가 붙은 클래스는 JPA가 관리 - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 속성 : name - JPA에서 사용할 엔티티 이름 지정 (기본값: 클래스 이름) @Table - @Table은 엔티티와 매핑할 테이블 지정 데이터베이스 스키마 자동 생성 - DDL(Database Definition Langauge)을 애플리케이션 실행 시점에 생성 - 테이블 중심 -> 객체 중심 - 데이터베이스 Dialect에 맞게 적절한 DDL 생성 - 개발 장비에서만 사용, 운영서버에서는 사용하지 않는다 속성 hibernate.hbm2ddl.auto - 운영 장비에는 절대 create, create-drop, update 사용하면 안된다 - 제약 조건..
JPA에서 중요한 두 가지 - ORM - 영속성 컨텍스트(Persistence Context) 영속성 컨텍스트 - JPA를 이해하는 데 가장 중요한 용어 - "엔티티를 영구 저장하는 환경" - 영속성 컨텍스트는 눈에 보이지 않는 논리적인 개념 - EntityManager를 통해서 영속성 컨텍스트에 접근 엔티티의 생명주기 - 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계 없는 새로운 상태 - 영속(managed) : 영속성 컨텍스트에 관리되는 상태 - 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태 - 삭제(removed) : 삭제된 상태 비영속 - 객체를 생성한 상태 Member member = new Member(); member.setId("member1")..
SQL 중심적인 개발의 문제점 - 무한 반복, 지루한 코드 (CRUD) - SQL에 의존적인 개발을 피하기 어렵다 패러다임의 불일치 객체 지향(OOP) vs 관계형 데이터베이스(RDB) 개발자가 SQL 매퍼(Mapper)를 통해 객체를 RDB에 저장한다. 객체와 관계형 데이터베이스의 차이 1. 상속 - 객체는 상속을 지원하지만, RDB는 지원하지 않는다(유사한 것 있음) 2. 연관관계 - 객체는 참조를 사용하지만, RDB는 외래 키를 사용한다. 3. 데이터 타입 4. 데이터 식별 방법 객체 그래프 탐색 - 객체는 연관된 것끼리 자유롭게 객체 그래프를 탐색할 수 있어야 한다. 엔티티 신뢰 문제 - 계층형 아키텍처(Layered Architecture)에서 엔티티는 신뢰할 필요가 있다. 모든 객체를 미리 로..