1. 개요

지속성 계층을 생성할 때 SQL 데이터베이스 스키마를 코드에서 생성한 개체 모델과 일치시켜야 합니다. 이는 수동으로 수행하기에는 많은 작업이 될 수 있습니다.

이 사용방법(예제)에서는 코드의 엔터티 모델을 기반으로 데이터베이스 스키마를 생성하고 내보내는 방법을 배웁니다 .

먼저 스키마 생성을 위한 JPA 구성 속성을 다룰 것입니다. 그런 다음 Spring Data JPA에서 이러한 속성을 사용하는 방법을 살펴보겠습니다.

마지막으로 Hibernate의 기본 API를 사용하여 DDL 생성을 위한 대안을 논의할 것입니다.

2. JPA 스키마 생성

JPA 2.1은 데이터베이스 스키마 생성을 위한 표준을 도입했습니다 . 따라서 이 릴리스부터 미리 정의된 구성 속성 집합을 통해 데이터베이스 스키마를 생성하고 내보내는 방법을 제어할 수 있습니다.

2.1. 스크립트 작업

생성할 DDL 명령을 제어하기 위해 JPA는 스크립트 작업 구성 옵션을 도입합니다.

javax.persistence.schema-generation.scripts.action

네 가지 옵션 중에서 선택할 수 있습니다.

  • none - DDL 명령을 생성하지 않습니다.
  • create – 데이터베이스 생성 명령만 생성
  • drop – 데이터베이스 삭제 명령만 생성
  • drop-and-create – 데이터베이스 drop 명령과 create 명령을 생성합니다.

2.2. 스크립트 대상

지정된 각 스크립트 작업 에 대해 해당 대상 구성 을 정의해야 합니다.

javax.persistence.schema-generation.scripts.create-target
javax.persistence.schema-generation.scripts.drop-target

본질적으로 스크립트 대상 은 스키마 생성 또는 삭제 명령을 포함하는 파일의 위치를 ​​정의합니다 . 예를 들어 drop-and-create  를 스크립트 작업 으로 선택하면 두 대상  을 모두 지정해야 합니다 .

2.3. 스키마 소스

마지막으로 엔터티 모델에서 스키마 DDL 명령을 생성하려면 선택한 메타데이터 옵션 과 함께 스키마 소스 구성을 포함해야 합니다.

javax.persistence.schema-generation.create-source=metadata
javax.persistence.schema-generation.drop-source=metadata

다음 섹션에서는 Spring Data JPA를 사용하여 표준 JPA 속성으로 데이터베이스 스키마를 자동으로 생성하는 방법을 살펴보겠습니다.

3. 스프링 데이터 JPA를 사용한 스키마 생성

3.1. 모델

Account 라는 엔터티 를 사용하여 사용자 계정 시스템을 구현한다고 가정해 보겠습니다 .

@Entity
@Table(name = "accounts")
public class Account {
    
    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable = false, length = 100)
    private String name;

    @Column(name = "email_address")
    private String emailAddress;

    @OneToMany(mappedBy = "account", cascade = CascadeType.ALL)
    private List<AccountSettings> accountSettings = new ArrayList<>();

    // getters and setters
}

각 계정에는 여러 계정 설정이 있을 수 있으므로 여기서는 일대다 매핑이 ​​있습니다.

@Entity
@Table(name = "account_settings")
public class AccountSetting {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "name", nullable = false)
    private String settingName;

    @Column(name = "value", nullable = false)
    private String settingValue;

    @ManyToOne
    @JoinColumn(name ="account_id", nullable = false)
    private Account account;

    // getters and setters
}

3.2. 스프링 데이터 JPA 구성

데이터베이스 스키마를 생성하려면 사용 중인 지속성 Provider에 스키마 생성 속성을 전달해야 합니다. 이를 위해 구성 파일에서 spring.jpa.properties 접두사 아래의 기본 JPA 속성을 설정합니다.

spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata

그런 다음 Spring Data JPA는 EntityManagerFactory bean  을 생성할 때 이러한 속성을 지속성 Provider에게 전달합니다.

3.3. create.sql 파일 _

결과적으로 애플리케이션 시작 시 위의 구성은 엔터티 매핑 메타데이터를 기반으로 데이터베이스 생성 명령을 생성합니다. 또한 DDL 명령은 기본 프로젝트 폴더에 생성된 create.sql 파일로 내보내집니다.

create table account_settings (
    id bigint not null,
    name varchar(255) not null,
    value varchar(255) not null,
    account_id bigint not null,
    primary key (id)
)

create table accounts (
    id bigint not null,
    email_address varchar(255),
    name varchar(100) not null,
    primary key (id)
)

alter table account_settings
   add constraint FK54uo82jnot7ye32pyc8dcj2eh
   foreign key (account_id)
   references accounts (id)

4. Hibernate API로 스키마 생성

Hibernate를 사용하고 있다면 기본 API인 SchemaExport 를 사용하여 스키마 DDL 명령을 생성 할 수 있습니다 . 마찬가지로 Hibernate API는 애플리케이션 엔티티 모델을 사용하여 데이터베이스 스키마를 생성하고 내보냅니다.

Hibernate의 SchemaExport  를 사용하면 drop , createOnly  및 create 메서드를 명시적으로 사용할 수 있습니다.

MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addAnnotatedClass(Account.class);
metadataSources.addAnnotatedClass(AccountSettings.class);
Metadata metadata = metadataSources.buildMetadata();

SchemaExport schemaExport = new SchemaExport();
schemaExport.setFormat(true);
schemaExport.setOutputFile("create.sql");
schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), metadata);

이 코드를 실행하면 데이터베이스 생성 명령이 기본 프로젝트 폴더 의 create.sql 파일 로 내보내집니다 .

SchemaExportHibernate Bootstrapping API 의 일부입니다 .

5. 스키마 생성 옵션

스키마 생성은 개발 중에 시간을 절약할 수 있지만 기본 시나리오에만 사용해야 합니다.

예를 들어 개발 또는 테스트 데이터베이스를 신속하게 가동하는 데 사용할 수 있습니다.

반대로 데이터베이스 마이그레이션과 같은 보다 복잡한 시나리오의 경우 Liquibase 또는 Flyway 와 같은 보다 정교한 도구를 사용해야 합니다 .

6. 결론

이 기사에서는 JPA 스키마 생성 속성 을 사용하여 데이터베이스 스키마를 생성하고 내보내는 방법을 배웠습니다 . 그런 다음 Hibernate의 기본 API인 SchemaExport 를 사용하여 동일한 결과를 얻는 방법에 대해 논의했습니다 .

항상 그렇듯이 이 기사의 예제 코드는 GitHub에서 사용할 수 있습니다 .

Persistence footer banner