티스토리 뷰
데이터베이스 스키마 자동 생성하기
DDL을 애플리케이션 실행 시점에 자동 생성
테이블 중심 -> 객체 중심으로 이동한 것이다.
데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
이렇게 생성된 DDL은 개발 장비에서만 사용
생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
hibernate.hbm2ddl.auto
create
기존 테이블 삭제 후 다시 생성(DROP + CREATE)
create-drop
create와 같으나 종료시점에 테이블 DROP(테스트에서 사용하면 도움됨)
update
변경분만 반영(운영DB에는 사용하면 안됨)
validate
엔티티와 테이블이 정상 매핑되었는지만 확인
none
사용하지 않음
데이터베이스 스키마 자동 생성하기 주의
운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
개발 초기 단계는 create 또는 update
테스트 서버는 update 또는 validate
스테이징과 운영 서버는 validate 또는 none
웬만하면 쓰면 안된다.
매핑 어노테이션
데이터베이스에 어떤식으로 매핑할지를 결정하는 철저히 매핑정보에 관련된 어노테이션들이다.
public class Member {
private Lond id;
name = "USERNAME") (
private String name;
private int age;
TemporalType.TIMESTAMP) (
private Date regDate;
EnumType.STRING) (
private MemberType memberType;
...
}
@Column
@Column(name = "USERNAME")
name
필드와 매핑할 테이블의 컬럼 이름
insertable, updatable
TRUE/FALSE 설정. 읽기 전용
nullable
null 허용여부 결정, DDL 생성시 사용(not null 추가)
unique
유니크 제약 조건, DDL 생성시 사용
columnDefinition, length, precision, scale(DDL)
@Temporal
@Temporal(TemporalType.TIMESTAMP)
시간과 관련된 매핑
Date 뿐만아니라 자바8에서 지원하는 LocalDatetime도 지원한다.
@Enumerates
@Enumerated(EnumType.STRING)
자바의 Enum 타입 매핑을 지원한다.
현업에서는 EnumType을 무조건 STRING으로 지정 해야한다.
기본 값인 ORDINAL로 설정하면 Enum 순서로 숫자가 매핑되는데, Enum 중간에 필드가 하나 추가 되면 다 꼬이게 된다.
@Lob
컨텐츠의 길이가 너무 길 경우 바이너리 파일로 DB에 바로 밀어 넣어야 하는데, 보통 이런 경우에 사용한다.
공통적으로 @Lob으로 사용하면 된다.
CLOB, BLOB 매핑
CLOB : String, char[], java.sql.CLOB
BLOB : byte[], java.sql.BLOB
@Transient
이 필드는 매핑하지 않는다.
애플리케이션에서 DB에 저장하지 않는 필드
웬만하면 쓰지 않는 것이...
식별자 매핑 어노테이션
식별자 매핑 방법
@Id(직접 매핑)
@GeneratedValue(strategy = GenerationType.[타입])
타입 설정
IDENTITY
데이터베이스에 위임, MYSQL
SEQUENCE
데이터베이스 시퀀스 오브젝트 사용, ORACLE
@SequenceGenerator 필요
TABLE
키 생성용 테이블 사용, 모든 DB에서 사용
@TableGenerator 필요
AUTO
방언에 따라 자동 지정, 기본값
권장하는 식별자 전략
기본 키 제약 조건
null 아님, 유일, 변하면 안된다.
미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.
예를 들어 주민등록번호도 기본 키로 적절하지 않다.
주민번호를 PK로 설정하고 다른 테이블과 FK 참조시 그대로 주민번호가 넘어간다. 갑자기 나라에서 개인정보 목적으로 "DB에 주민번호 저장하지 마라"라고 한다. 헬게이트 오픈
권장
Long + 대체키 + 키 생성전략 사용
대체키는 전혀 비즈니스랑 관계없는 키.
AUTO_INCREMENT로 숫자로 PK를 사용하면, int쓰면 안된다. 생각보다 금방 끝난다..
Long 타입으로.
Reference
자바 ORM 표준 JPA 프로그래밍
저자 직강 -
'ICT Eng > JPA' 카테고리의 다른 글
[JPA] 단방향 연관관계 (0) | 2019.08.16 |
---|---|
[JPA] Spring Data JPA와 QueryDSL 이해, 실무 경험 공유 (18) | 2019.04.30 |
[JPA] 객체지향 쿼리, JPQL (1) | 2019.04.26 |
[JPA] 기초와 매핑 (0) | 2019.04.22 |
[JPA] ORM과 JPA 소개, SQL 중심적인 개발의 문제점 (1) | 2019.04.22 |
- Total
- Today
- Yesterday
- 한밭이글스
- github
- 레드블랙트리
- Raspberry Pi
- Spring
- ORM
- 무선통신소프트웨어연구실
- Recursion
- vuejs
- Spring Boot
- Wisoft
- 인프런
- Java
- Vue.js
- 정렬
- 자바
- 스프링부트
- JPA
- 시간복잡도
- springboot
- 순환
- 젠킨스
- AWS
- 한밭대학교
- vuex
- 라즈베리파이
- RBT
- IT융합인력양성사업단
- 알고리즘
- Algorithm
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |