매핑

· JPA
데이터베이스 테이블의 연관관계를 설계하는 방법은 크게 2가지다. 조인 컬럼(외래 키) 사용 조인 테이블(브릿지 테이블) 사용 조인 컬럼 사용 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리한다. 연결할 테이블이 많아 질수록 컬럼이 많아질 수 있다. 조인한 테이블이 필수일때는 INNER JOIN(NOT NULL)을, 필수가 아닐때는 OUTER JOIN(NULL)으로 조인한다. 조인 테이블 사용 조인 테이블을 생성해 연결할 테이블들의 기본 키들을 엮어서 연결한다. 나는 보통 브릿지 테이블로 부르고 다대다 연결을 할때, 다른 테이블에 조인이 추가될 가능성이 높을때 주로 사용한다. 테이블마다 필요한 정보만 저장할 수 있어서 이 방법을 선호하지만 조인 테이블이 많아져 SQL이 느려질 ..
· JPA
복합키 JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들어 식별자를 구분해야 한다. JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 2가지 방법을 제공한다. @IdClass는 관계형 데이터베이스에 가까운 방법이고, @EmbeddedId는 좀 더 객체 지향에 가까운 방법이다. 복합키 매핑에 예제에서 확인해보자 복합 키: 식별 관계(Identifying Relationship) 매핑 식별 관계는 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계다. PARENT 테이블의 기본 키 PARENT_ID를 받아서 CHILD 테이블의 기본 키(CHILD_ID) + 외래 ..
· JPA
@MappedSuperclass를 사용하면 부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공한다. 비유를 하자만 추상 클래스와 비슷한데 @Entity는 실제 테이블과 매핑되지만 @MappedSuperclass는 실제 테이블과 매핑되지 않는다. 단순히 매핑 정보를 상속할 목적으로만 사용된다. 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다. @MappedSuperclass public abstract class BaseEntity { @Id @GeneratedValue @Column(name = "ID") private long id; @Column(name = "NAME") private String name; } @E..
· JPA
관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신 슈퍼타입 서브타입 관계(Super-Type Sub-Type Relationship)라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은 객체 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 조인 전략(각각의 테이블로 변환) 각각을 모두 테이블로 만들고 조회할때 조인을 사용한다. JPA에서는 조인 전략이라 한다. 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 구분 컬럼으로 타입을 구분한다. @Entity @Inheritance(strategy = InheritanceType.JOINED) // 조인 전략 사용 @Discrim..
· JPA
엔티티의 연관관계를 설정할때 주의해야할 부분들이 있다. 다중성 다중성에는 다대일(@ManyToOne) 일대다(@OneToMany) 일대일(@OneToOne) 다대다(@ManyToMany) 가 있다. 다중성을 판단하기 어려울 때는 반대방향을 생각해 보면 된다. 참고로 일대다의 반대 방향은 항상 다대일이고, 일대일의 반대방향은 항상 일대일이다. 일대일 관계에서는 외래키를 어느 테이블에서도 가질 수 있다. 어느 테이블이든 외래키 하나만 있으면 양쪽으로 조회할 수 있다. 주 테이블에 외래키가 있으면 주 테이블이 외래키를 가지고 있으므로 주 테이블만 확인해도 대상 테이블과 연관관계가 있는지 알 수 있고, 대상 테이블에 외래키가 있을때는 일대일에서 일대다로 변경할 때 테이블 구조를 그대로 유지할 수 있다. 단방향,..
· JPA
아래 자주 쓰이는 기본적인 객체 관계 매핑 어노테이션을 정리해보았다. @JoinColumn 외래 키를 매핑할 때 사용한다. 속성 기능 기본값(Default) name 매핑할 외래 키 이름 필드명 + _ + 참조하는 테이블의 기본 키 컬럼 referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 키 컬럼명 foreignKye(DDL) 외래 키 졔약조건을 직접 지정할 수 있다. 이 속성은 테이블을 생성할 때만 사용한다. unique nulldable insertable updatable columnDefinition table @Column의 속성과 같다 class Member { @ManyToOne @JoinColumn(name = "team_id", refer..
· DDD
엔티티(Entity) 식별자를 갖는 객체 식별자 유형 특정 규칙에 따라 생성 UUID 사용 (java.util.UUID) 값을 직접 입력 일련번호 사용(시퀀스나 DB의 자동 증가 컬럼 사용)\ // 엔티티 클래스 @Entity @Table(name = "member") public class Member() { @Id private int id; // 식별자 } 밸류(Value) 타입 개념적으로 완전한 하나를 표한할 때 사용한다. 예를들어 주소(zipcode, address, detailAddress), 받는 사람(name, phoneNumber) 등등 // 엔티티 클래스 @Entity @Table(name = "member") public class Member() { @Id private int id..
beekei
'매핑' 태그의 글 목록