쌓고 쌓다

[JPA] 스키마 자동 생성, 카멜과 언더바 본문

프로그래밍/JPA

[JPA] 스키마 자동 생성, 카멜과 언더바

승민아 2023. 7. 11. 19:48

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에 저장한 후에 식별자를 조회해서 엔티티의 식별자에 할당한다.

 

 

 

 

Comments