[DB] 테이블을 설계하자! -1

SeoYoung Jung·2022년 3월 18일
0

DataBase

목록 보기
3/6

주제: 테이블 설계

엔티티 매핑

  • Entity Mapping은 jpa에서 기본적이면서도 가장 중요한 개념
    1.영속성 컨텍스트
    2.객체과 관계형 데이터베이스 매핑

엔터티 매핑?

=> 객체와 테이블 사이의 관계와 속성을 지정할 수 있도록 매핑하는 것이다.
=>관련된 어노테이션을 사용하여 테이블과 클래스, 필드와 속성등을 매핑 가능하다.

@ Entity

해당 어노테이션이 붙은 클래스는 JPA에 관리되어지며 엔티티라고 한다. JPA를 사용하기 위해선 필수적으로 사용해야한다. (*기본 생성자 필수)

@Table

엔티티와 매핑할 테이블을 지정한다. name 속성을 통해 매핑할 테이블 이름을 지정 할 수있다. ex) 엔티티 이름을 Order이라고 한다면 Oracle에선 order by 예약어와 중복되어 테이블 명으로 설정 할 수 없기때문에 변경 해야함.

@Id

해당 필드를 기본 키로 매핑한다. (직접 할당 하는 방식)

@GeneratedValue

해당 필드를 기본 키로 매핑한다. (자동 생성 하는 방식, @Id 와 같이 사용)
strategy 속성을 이용하여 생성되는 타입을 정할 수 있다. default 값은 Auto이며 sql 방언에 따라 자동 지정된다.

@Column

필드와 컬럼의 매핑 속성을 지정한다. 컬럼 이름이나 변경 여부, null 여부, unique, 길이 등의 제약조건을 설정할 수 있다.

@Enumerated

자바의 enum 타입을 매핑할 때 사용한다.
속성타입으로 ORDINAL과 STRING이 있는데 꼭 STRING을 사용하길 권장한다. ORDINAL은 enum 순서를 DB에 저장하고 STRING은 이름으로 값을 저장하는데 enum 타입이 변경 되었을 시 ORDINAL은 순서로 저장하기 때문에 데이터가 꼬일 수 있다.

@Temporal

날짜 타입을 매핑 할 때 사용한다. 속성 타입으로 DATE(날짜), TIME(시간), TIMESTAMP(날짜와 시간) 등 이 있다.
Date 객체를 쓴 이유는 하이버네이트가 최신버전이라면 LocalDate나 LocalDateTime 객체를 사용 시 해당 어노테이션을 생략 할 수있다.

@Lob

데이터베이스의 BLOB, CLOB 타입과 매핑할 때 사용한다. (속성은 없으며 문자타입은 CLOB이고 나머지는 BLOB이다.)
CLOB: String, char[] / BLOB: byte[]

*JPA는 기존의 테이블 중심 설계에서 객체 중심의 설계로 !!!! ****

DataBase 스키마 자동생성은

  • application.properties or * application.yml

설정 파일에 들어갈 속성 5가지

create : 기존 테이블 삭제 후 다시 생성(DROP 후 CREATE)
create-drop : create와 같으나 종료 시점에 모든 테이블 DROP
update : 변경분만 반영
validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
none : 사용 안함

운영서버에는 create, create-drop, update는 사용하지 않을것을 권장한다.

  • 개발 초기 : create 또는 update
  • 테스트 서버 : update 또는 validate
  • 스테이징 서버나 운영 서버 : validate 또는 none

연관관계

위에서 간단히 엔터티 연관관계에 대해서 알아보았는데 이 부분에서 더 자세히 알아보자.

연관관계에는 방향이 세가지가 있다.

방향 : 단방향, 양방향 (객체 참조)
연관 관계의 주인 : 양방향일 때, 연관 관계에서 관리 주체
다중성 : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)

단방향과 양방향

데이터베이스의 테이블은 외래 키 하나로 양쪽 테이블 조인이 가능하다.
=> DB는 방향을 나눌 필요가 없음

BUT 객체는 참조용 필드가 있는 개체만 다른 객체를 참조한다.

  • 두 객체 사이에 하나의 객체만 참조용 필드를 가지고 참조 > 단방향관계
  • 두 객체 사이가 각각 참조용 필드를 갖고 참조 > 양방향 관계

"결국 양방향관계가 아닌 객체가 단방향 참조를 각각 가지게 되어 양방향 처럼"

그래서 우리는 개발시에 어떠한 연관 관계를 가질지 택해야한다.

_기본적으로 단방향 매핑으로 하고 나중에 역방향으로 객체 탐색이 꼭 필요하다고 느낄 때 추가하는 것으로 잡아야한다.

연관관계의 주인

두 객체(A, B)가 양방향 관계, 단방향 관계 2개(A→B, B→A)를 맺을 때, 연관 관계의 주인을 지정.

연관 관계의 주인을 지정 하는 것은 두 단방향 관계(A→B, B→A)중, 제어의 권한(외래 키를 비롯한 테이블 레코드를 저장, 수정, 삭제 처리)을 갖는 실질적인 관계가 어떤 것인지 JPA에게 알려준다고 생각해야한다.

연관 관계의 주인은 연관 관계를 갖는 두 객체 사이에서 조회, 저장, 수정, 삭제를 할 수 있지만, 연관 관계의 주인이 아니면 조회만 가능

연관 관계의 주인이 아닌 객체에서 mappedBy 속성을 사용해서 주인을 지정해줘야합니다.

TIP : 외래 키가 있는 곳을 연관 관계의 주인으로 정함. 무조건.

_
DB에서 외래키가 있는 테이블을 수정할때 주인만 변경하는 것이 맞기는 하지만... 실질적으로 둘다 변경해야함...
두 참조를 사용하는 객체는 데이터 동기화가 필요하다.

_

이후 이어서 다음 포스팅에 다중성을 포스팅하겟다.

profile
뚱땅뚱땅개발자

0개의 댓글