본문 바로가기

728x90
반응형

전체 글

(75)
프록시와 연관관계 정리 - (1) 프록시 엔티티를 조회할 때 연관된 엔티티를 항상 사용하는 것은 아니다데이터베이스에서 사용하지 않는 연관된 엔티티를 함께 조회하는 것은 효율적이지 않다 JPA는 이런 문제를 해결하기 위해 데이터베이스 조회를 실제 사용할 때까지 지연하는 방법을 제공하는데 이를 지연 로딩이라 한다 지연 로딩을 사용하기 위해서 실제 엔티티 객체 대신 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이를 프록시 객체라 한다프록시 기초EntityManager.find()를 사용해 조회하면 엔티티를 실제 사용하든 사용하지 않든 데이터베이스를 조회한다 엔티티를 실제 사용하는 시점까지 데이터베이스 조회를 미루려면 EntityManager.getReference() 메소드를 사용해야 한다 JPA는 데이터베이스를 조회하지 않고 실..
고급 매핑 - (3) 조인 테이블 데이터베이스 테이블의 연관관계를 설계하는 방법  - 조인 컬럼 사용 (외래 키)  - 조인 테이블 사용  조인 테이블 사용 조인 테이블이라는 별도의 테이블을 사용해 연관관계를 관리한다 테이블을 하나 추가해야 한다  - 관리해야 하는 테이블이 늘어나고 조인 시 조인 테이블도 추가로 조인해야 한다주로 다대다 관계를 일대다, 다대일로 풀어내기 위해 사용한다  - 일대일, 일대다, 다대일에서도 사용한다 일대일 조인 테이블일대일 조인 테이블의 외래 키 컬럼 각각에 유니크 제약조건을 걸어야 한다다대다 조인 테이블조인 테이블의 두 컬럼을 합해서 하나의 복합 키에 유니크 제약조건을 걸어야 한다엔티티 하나에 여러 테이블 매핑 @SecondaryTable을 사용하면 한 엔티티에 여러 개의 테이블을 매핑할 수 ..
고급 매핑 - (2) 복합 키와 식별 관계 매핑식별 관계 vs 비식별 관계테이블 사이의 관계에는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분한다 식별 관계란 부모 테이블의 기본 키를 받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계이다비식별 관계란 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계이다 필수적 비식별 관계는 외래 키에 null을 허용하지 않는다 즉, 연관관계를 필수적으로 맺어야 한다선택적 비식별 관계는 외래 키에 null을 허용한다 연관관계를 맺을지 말지 선택할 수 있다 최근에는 비식별 관계를 주로 사용하고 꼭 필요할 곳에만 식별 관계를 사용하는 추세이다복합 키: 비식별 관계 매핑JPA는 복합 키를 지원하기 위해 @IdClass와 @Embedded..
고급 매핑 - (1) 상속 관계 매핑 관계형 데이터베이스에는 객체지향 언어에서의 상속이라는 개념이 없다슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다 ORM에서의 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다조인 전략엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다 객체는 타입으로 구분할 수 있지만 테이블에는 타입의 개념이 없다타입을 구분하는 컬럼을 추가해야 한다 (DTYPE) @Entity@Inheritance(strategy=InheritanceType.JOINED)@DiscriminatorColumn(name="DTYPE")public abstract class Item { ..
다양한 연관관계 매핑 - (3) 다대다 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다-> 다대다 관계를 일대다, 다대일 관계로 풀어내는 연결 테이블을 사용한다 객체는 테이블과 다르게 객체 2개로 다대다 관계를 만들 수 있다-> 서로를 컬렉션을 이용해 참조하면 된다다대다: 단방향@Entitypublic class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; private String username; @ManyToMany @JoinTable(name="MEMBER_PRODUCT", joinColumns=@JoinColumn(name="MEMBER_ID"), inverseJoinColumns=@JoinColumn(nam..
다양한 연관관계 매핑 - (2) 일대일 양쪽이 서로 하나의 관계만을 가진다일대일 관계에서는 주 테이블과 대상 테이블 어느 곳이나 외래 키를 가질 수 있다 주 테이블에 외래 키객체지향적 관점에서는 주 테이블에 외래 키가 있는 것을 선호한다 단방향@Entitypublic class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; private String username; @OneToOne @JoinColumn(name="LOCKER_ID") private Locker locker; ...}@Entitypublic class Locker { @Id @GeneratedValue @Column(name="LOCKER_ID") private Long id; ..
다양한 연관관계 매핑 - (1) 다대일 다대일 관계의 반대 방향은 일대다이고 일대다 관계의 반대 방향은 다대일이다외래 키는 항상 다쪽에 있고, 연관관계의 주인은 항상 다쪽이다다대일 양방향 [N:1, 1:N]@Entitypublic class Member ( @Id @Column(name="MEMBER_ID") private String id; private String username; //연관관계 매핑 @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; public void setTeam(Team team) { this.team = team; //무한루프에 빠지지 않도록 검사 if (!team.getMembers().contains(this)) { team.getM..
연관관계 매핑 기초 - (2) 양방향 연관관계 객체의 경우 필드를 추가해 반대 방향으로의 연관관계를 추가해야 한다데이터베이스의 경우 외래 키 하나로 양방향 조회가 가능하므로 추가할 내용이 없다양방향 연관관계 매핑@Entitypublic class Member ( @Id @Column(name="MEMBER_ID") private String id; private String username; //연관관계 매핑 @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; public void setTeam(Team team) { this.team = team; } ...)@Entitypublic class Team { @Id @Column(name="TEAM_ID") private S..

728x90
반응형