관계형 데이터베이스에는 객체처럼 상속이라는 개념이 없습니다. 그나마 유사한 개념으로는 슈퍼타입 서브타입 관계가 있습니다. JPA에서는 객체의 상속 구조를 DB의 슈퍼타입 - 서브타입 관계에 매핑시킵니다. 슈퍼타입 서브타입 모델의 구현 방법 1. 각각의 테이블로 변환 : 조인 테이블 부모 타입과 자식 타입을 모두 테이블로 만듭니다. 이후 자식 타입 조회 시 조인을 통해 조회하는 방식으로 사용합니다. 이는 JPA에서 조인 테이블 전략이라고 합니다. 2. 통합 테이블로 변환 : 싱글 테이블 테이블을 단 하나만 만든 후, 해당 테이블에 부모의 속성과 자식의 속성을 모두 포함시켜 사용합니다. 이는 JPA에서는 단일 테이블 혹은 싱글 테이블 전략이라고 합니다. 3. 서브타입 테이블로 변환 : 구현 클래스마다 테이블..
분류 전체보기
연관관계를 매핑할 때는 다음의 3가지를 고려해서 매핑하여야 합니다. 다중성 (일대 다, 다대 일, 다대 다, 일대 일) 방향 (양방향, 단방향) 연관관계의 주인 🧐 다중성 연관관계에는 다음과 같은 다중성이 있습니다. 다대일(N : 1)[ManyToOne] 일대다(1 : N)[OneToMany] 일대일(1 : 1)[OneToOne] 다대다(N : N)[ManyToMany] 🧐 방향 방향에는 단방향, 양방향이 있습니다. DB 테이블은 외래 키(Foreign key)하나로 조인(Join)을 사용해서 양방향으로 쿼리가 가능합니다. 따라서 DB에는 방향의 개념이 없습니다. 그러나 객체의 경우, 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회할 수 있으므로 방향의 개념이 존재합니다. 객체 관계에서 한 쪽만 반..
연관관계 편의 메서드를 작성할 때, 문제가 되는 상황과 이를 해결하기 위한 방법들을 살펴보도록 하겠습니다. 문제가 되는 코드 public class Member { private Team team; public void setTeam(Team team){ this.team = team; team.getMembers().add(this); } } 위의 setTeam() 메서드는 문제가 있습니다. 그림을 보면 알 수 있듯이, setTeam(teamA) 이후 setTeam(teamB)를 하게 되면 teamA와의 관계가 삭제되지 않은 체 남아있게 됩니다. 코드 수정 public class Member { private Team team; public void setTeam(Team team){ if(this.t..
@JoinColumn 외래 키를 매핑할 때 사용합니다. name 속성에는 매핑할 외래 키 컬럼명(이름)을 지정합니다. 속성 기능 기본값 name 매핑할 외래 키 컬럼명 필드명_[참조하는 테이블의 기본 키 컬럼명] referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 키 컬럼명 foreignKey (DDL) 외래 키 제약조건을 직접 지정할 때 사용하며, 테이블을 생성할 때만 사용한다. unique nullable insertable updatable columnDefinition table @Column의 속성과 동일하다. name과 referencedColumnName을 착각하지 않도록 주의하자 name은 단지 매핑할 외래 키의 이름, 즉 단순히 컬럼명을 ..
다음과 같은 코드를 살펴보겠습니다. @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", allocationSize = 50 ) public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR") @Column(name = "MEMBER_ID") private Long id; } 이후 다음 코드를 실행합니다. Member member = new Member(); em.persist(member); Member member2 = new Member(); em.persist(member2); 결과는 다음과 같이 시퀀스 호출이 2번 이루어진다..
DB 기본 키(Primary Key) 조건 데이터베이스의 기본 키(Primary Key)는 다음 3가지 조건을 모두 만족해야 합니다. null 값은 허용하지 않습니다. 유일해야 합니다 변해서는 안됩니다. 기본 키 선택 전략 자연 키 비즈니스적으로 의미가 있는 키를 의미합니다. (예: 주민번호, 전화번호 등) 대리 키 비즈니스와 관련 없는 임의로 만들어진 키. (예 : AUTO_INCREMENT, 오라클 시퀀스 등) 권장하는 식별자 선택 전략 자연 키보다는 대리 키를 권장합니다. 주민등록 번호같이 기본 키의 조건을 모두 만족하는 자연 키를 기본 키로 사용하고 싶다는 충동이 들 수 있습니다.. 그러나 갑자기 정책의 변경으로, 데이터베이스에 주민번호를 저장하지 못하게 막아버린다면 답이 없어집니다. 비즈니스 환..
🧐 @Id 데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션입니다. 적용 가능 타입 자바 기본형 (int, long, ...) 자바 래퍼형 (Integer, Long, ...) String Date (java.util) Date (java.sql) BigDecimal BigInteger @Id만 사용할 경우 기본 키를 직접 할당해 주어야 합니다. 기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 @GeneratedValue를 사용해주면 됩니다. 🧐 @GeneratedValue 기본 키를 자동 생성해주는 어노테이션입니다. 속성으로는 strategy가 있는데, 이를 통해 자동 생성 전략을 지정해 줄 수 있습니다. 이제부터 각각의 전략들을 살펴보도록 하겠습니다...
SEQUENCE 전략, TABLE 전략 SEQUENCE 전략은 데이터베이스 시퀀스를 사용해서 기본 키를 할당해주는 전략입니다. 사용 방법은 아래 글을 참고해주세요 [JPA] 기본 키(Primary Key)매핑 - @Id, @GeneratedValue @Id 데이터베이스 테이블의 기본 키와 매핑시켜주는 어노테이션이다. 적용 가능 타입 자바 기본형 (int, long, ...) 자바 래퍼형 (Integer, Long, ...) String Date (java.util) Date (java.sql) BigDecimal BigIn.. ttl-blog.tistory.com SEQUENCE 전략의 최적화. - allocationSize SequenceGenerator의 allocationSize의 기본값은 50입니..