[JPA] 스키마 자동 생성, 카멜과 언더바
roleType VS role_type
자바는 단어와 단어 구별을 roleType 같은 카멜(Camel) 표기법을 사용한다.
데이터베이스는 관례상 role_type과 같은 언더스코어(_)를 사용한다.
아래와 같이 필드명을 "roleType"를 했다면 DB에 매핑되는 컬럼명은 "role_type"이 된다.
@Column(name="role_type")
String roleType
게시판 만들며 왜 이렇게 매핑이되나 싶었는데 궁금증 해결...!
데이터베이스 스키마 자동 생성
JPA는 엔티티의 매핑 정보를 통해 어떤 컬럼을 사용하는지 알 수 있으므로
맞는 방언으로 데이터베이스 스키마 자동 생성한다. ( 애플리케이션 실행 시점에 생성함 )
옵션 | 설명 |
create | 기존 테이블을 삭제하고 새로 생성 DROP + CREATE |
create-drop | create 속성과 동일하나 애플리케이션 종료이 생성한 DDL 제거 |
update | DB 테이블과 엔티티 매핑 정보를 비교하여 변경 사항만 수정 |
validate | DB 테이블과 엔티티 매핑 정보를 비교하여 차이가 있으면 경고를 남기고 애플리케이션 실행하지 않음 |
none | 자동 생성 기능 사용하지 않음 |
기타 내용
@Entity
JPA 사용을 위해 테이블과 매핑할 클래스를 지정해야함.
속성 | 기능 | 기본값 |
name | JPA에서 사용할 엔티티의 이름을 지정 | 클래스 이름을 그대로 사용한다. |
- 기본 생성사 필수 (파라미터가 없는 public 또는 protected)
- final, enum, interface 클래스에는 사용 불가
- 저장할 필드에 final 사용 불가
생성자를 하나 이상 만들면 자바는 기본 생성자를 자동으로 만들어주지 않으므로 기본 생성자를 직접 만들어 놓자.
@Table
엔티티와 매핑할 테이블을 지정
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | 엔티티 이름을 사용한다. |
다양한 매핑
- - 요구 사항 -
- 회원을 ADMIN과 USER로 구분 필요
- 회원 가입일, 수정일 필드 필요
- 회원을 길이 제한 없이 설명하는 필드 필요
RoleType
public enum RoleType {
ADMIN, USER
}
Member
@Entity
@Table(name="MEMBER")
public class Member {
@Column(name = "name", nullable = false, length = 10)
private String username;
@Enumerated(EnumType.STRING)
private RoleType roleType; // ADMIN, USER
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate; // 가입일
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate; // 수정일
@Lob
private String description; // 길이 제한 없은 대량의 설명 데이터
}
@Column
- nullable : 자동 생성되는 DDL 에 not null 제약 조건 추가
- length : 문자 크기 제한 - CHAR(10)
@Enumerated
ENUM 타입을 엔티티의 속성으로 지정할 수 있다.
- EnumType.STRING : ENUM 이름을 DB에 저장 -> ADMIN 저장시 DB에 "ADMIN" 문자열 자체가 저장
- EnumType.ORDIANL : ENUM 순서 값을 DB에 저장 -> ADMIN 저장시 DB에 ADMIN의 순서인 0이 저장
@Temporal
날짜 타입은 @Temporal을 사용하여 매핑한다.
@Lob
필드의 길이 제한이 없으므로 DB의 VARCHAR 대신 CLOB, BLOB 타입(Oracle 기준)으로 매핑할 필요가 있다.
기본 키 매핑
JPA가 제공하는 기본 키 생성 전략
- 직접 할당: 애플리케이션에서 직접 할당 -> @Id -> persist 전에 직접 값 할당하는 방식
- 자동 생성
- IDENTITY : 기본 키 생성을 DB에 위임
- SEQUENCE : DB 시퀀스 사용
- TABLE : 키 생성 테이블 사용
오라클은 시퀀스를 제공하지만 MySQL은 제공하지 않고 AUTO_INCREMENT를 제공한다.
즉, IDENTITY나 SEQUENCE는 DB에 의존한다.
기본 키 직접 할당하려면 @Id를, 자동 생성 전략을 사용하려면 @GenratedValue를 선택하자.
*IDENTITY 식별자 생성 전략은 쓰기 지연이 동작하지 않는다.
Board board = new Board();
em.persist(board);
System.out.println(board.getId); // 출력 : 1
엔티티가 영속 상태가 되려면 식별자가 반드시 필요한데 1이 출력이 된다.
즉, 엔티티를 DB에 저장해야 식별자를 얻을 수 있으므로 persist시 바로 INSERT 가 된다.
=> 엔티티를 DB에 저장한 후에 식별자를 조회해서 엔티티의 식별자에 할당한다.