Spring/JPA

데이터베이스 스키마 자동 생성

느리지만 꾸준하게 2022. 4. 14. 03:49
  • DDL을 애플리케이션 실행 시점에 자동 생성(Create문으로 생성을 하고 시작)
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
  • 이렇게 생성된 DDL은 개발 장비에서만 사용
  • 생성된 DDL은 운영서버에서 사용하지 않고 다음어서 사용

 

 

매핑정보를 보면 어떤테이블인지 알 수가 있는데 JPA에서는 애플리케이션 로딩 시점에 DB를 생성하는 기능도 지원해준다.

애플리케이션 실행시점에 Insert Into같은 것들을 실행시켜주는것이다.

아래와 같이 설정 해두고 실행 시키면 빌드창에서

drop 문구를 생성해주고 create table을 하고 로직이 돈다.

-- persistence.xml에 아래와 같이 속성을 두게되면

<properties>
	<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>

 

 

age라는 변수를 추가로 지정해주고 빌드를 돌려서 h2 db에서 확인을 해주면 컬럼이 추가가 된다.

보통 같으면 코드를 추가하고 db상에서 create table ~~를 따로 적어줘야 했었지만 JPA같은 경우는 매우 편리하다.

@Entity
@Table(name = "MBR")
public class Member {
    @Id
    private Long id;
    private String name;
    private int age;

 

create-drop를 하게되면 drop - select - drop순으로 빌드가 된다.

Hibernate: 
    
    drop table MBR if exists
    
    
Hibernate: 
    select
        member0_.id as id1_5_0_,
        member0_.age as age2_5_0_,
        member0_.name as name3_5_0_ 
    from
        MBR member0_ 
    where
        member0_.id=?
        
        
Hibernate: 
    
    drop table MBR if exists

 

 

update는 추가하는 경우만 생기고

validate는 없는 엔티티가 있게되면 에러를 찍어준다.

@Entity
@Table(name = "MBR")
public class Member {
    @Id
    private Long id;
    private String name;
    private int gogo2;

    public Member() {

    }
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [gogo2] in table [MBR]

 

 

 

데이터베이스 방언별로 달라지는 것을 확인하면(persistence.xml의 property를 아래와 같이 설정)

(oracle은 가변문자 기본이 varchar(2)로 되어있음 varchar(2)로 생성)

<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.hbm2ddl.auto" value="create" />

 

create 할 때 보면 varchar2로 되어있다.

Hibernate: 

create table Member (
       id number(19,0) not null,
        gogo2 number(10,0) not null,
        name varchar2(255 char),
        TEAM_ID number(19,0),
        primary key (id)
    )

 

 

아래사항을 주의하자.

  • 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
  • 개발 초기 단계에서 create 또는 update
  • 테스트 서버에는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none

 

 

@Column을 적을 수가 있는데

@Entity
public class Member {
    @Id
    private Long id;


// column을 주고 실행을 시켜주면
    @Column(unique = true, length = 10)
    private String name;
    private int gogo2;



    public Member() {

    }

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String name() {
        return name;
    }

    public void setName(String name) { this.name = name; }
}

 

build를 보게되면 varchar(10)이 들어가있고 alter로 해서 unique 제약조건이 생기게 된다.

unique같은경우는 JPA에 실행 매커니즘에는 영향을 주지않고 alter script가 한번 생성되거나 실행이 되는 것이다.

Hibernate: 
    
    create table Member (
       id bigint not null,
        gogo2 integer not null,
        name varchar(10),
        TEAM_ID bigint,
        primary key (id)
    )
    
    
 alter table Member 
       add constraint UK_ektea7vp6e3low620iewuxhlq unique (name)

 

 

이런것이 아래에 DDL 생성기능이다.

  • 제약조건 추가 : 회원 이름은 필수, 10자 초과 x
  • @Column(nullable = false, length = 10)
  • DDL 생성 기능은 DDL을 자동 생성할 때에만 사용되고 JPA의 실행 로직에 영향을 주지 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com