1. 객체지향 쿼리 소개 모든 엔티티를 메모리에 올려두고 애플리케이션에서 특정 조건으로 검색하는 것은 현실성이 없다. 결국 데이터는 데이터베이스에 있으므로 SQL로 필요한 내용을 최대한 걸러서 조회해야 한다. 하지만 ORM을 사용하면 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로, 검색도 테이블이 아닌 엔티티 객체를 대상으로 하는 방법이 필요하다. 종류 설명 SQL 데이터베이스 테이블을 대상으로 하는 데이터 중심의 쿼리 JPQL - 엔티티 객체를 대상으로 하는 객체지향 쿼리. - SQL을 추상화해서 특정 DB 의 SQL에 의존하지 않는다. JPQL을 사용하면 JPQ는 이 JPQL 을 분석한 다음 적절한 SQL을 만들어 데이터베이스를 조회한다. 그리고 조회한 결과로 엔티티 객체를 생성해서 반..
1. 기본값 타입 // 기본값 타입 @Entity public class Member { @Id @GeneratedValue private Long id; // 식별자 값 private String name; // 값 타입 속성 private int age; // 값 타입 속성 ... } 값 타입은 공유하면 안된다. 2. 임베디드 타입 임베디드 타입 JPA에서 새로운 값 타입을 직접 정의해서 사용하는 타입 임베디드 타입도 int, String 처럼 값 타입이다. @Entity public class Member { @Id @GeneratedValue private Long id; private String name; // 근무 기간 @Temporal(TemporalType.DATE) java.util.D..
1. 프록시 엔티티를 조회할 때 연관된 엔티티가 항상 사용되는 것은 아니다. 1.1 프록시 1.1.1 회원과 팀 정보를 출력하는 비즈니스 로직 public void printUserAndTeam(String memberId) { Member member = em.find(Member.class, memberId); Team team = member.getTeam(); System.out.println("회원 이름 : " + member.getUserName()); System.out.println("소속팀 : " + team.getName()); } 1.1.2 회원 정보만 출력하는 비즈니스 로직 public String printUser(String memberId) { Member member = em..
1. 상속 관계 매핑 관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다. 1. 각각의 테이블로 변환 각각을 모두 테이블로 만들고 조회할 때 조인을 사용한다. JPA에서는 조인 전략이라 한다. 2. 통합 테이블로 변환 테이블을 하나만 사용해서 통합한다. JPA에서는 단일 테이블 전략이라 한다. 3. 서브타입 테이블로 변환 서브 타입마다 하나의 테이블을 만든다. JPA에서는 구현 클래스마다 ..
1. 다대일 다대일 관계의 반대 방향은 항상 일대다 관계 일대다 관계의 반대 방향은 항상 다대일 관계 외래 키는 항상 다쪽에 있다. -> 객체 양방향 관계에서 연관관계의 주인은 항상 다쪽이다. 1.1 다대일 단방향 회원은 Member.team으로 팀 엔티티 참조 가능 반대로 팀에서 회원은 참조하는 필도가 없어서 참조 불가능 1.1.1 회원 엔티티 @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") // TEAM_ID 외래 키와 매핑 private Team team; // ..
1. 단방향 연관관계 연관관계 중 다대일(N:1) 단방향 관계를 가장 먼저 이해해야 한다. 객체 연관관계와 테이블 연관관계의 가장 큰 차이 참조를 통한 연관관계는 항상 단방향이다. 객체 간 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야 한다. => 서로 다른 단방향 관계 2개 객체는 참조(주소)로 연관관계를 맺는다. ex) a.getB().getC() 테이블은 외래 키로 연관관계를 맺는다. ex) A JOIN B or B JOIN A 1.1 순수한 객체 연관관계 객체 그래프 탐색 : 참조를 사용해서 연관관계를 탐색한다. Team findTeam = member1.getTeam(); 1.2 테이블 연관관계 조인 : 데이터베이스는 외래 키를 사용해서 연관관계를 탐색할 수 있다..