ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [26] Spring Data : Initialization of Database
    Spring/Spring boot 2020. 7. 17. 08:55
    반응형

    [JPA를 사용한 database 초기화]

    예제는 이전 포스팅에서 작성한 것을 이어서 사용하시면 됩니다.

     

    JPA에는 DDL[각주:1]생성 기능이 있습니다. 우선 test code를 돌려서 어떤 DDL이 실행되는지 실행창을 통해 확인합니다.

     

     

    기존에 users table이 있으면 drop하고 새롭게 users table을 생성하도록 되어있군요.

     

     

    하지만 application을 실행해보면 test code 실행 때와 같은 DDL이 실행되지 않습니다. 실제로 terminal이나 DB관리 tool에서 table이 있는지 확인해보면 역시 어떤 테이블도 생성되지 않은 상태입니다.

    그 이유는 test code 실행시에는 JPA에서 DDL을 생성하기 위한 property가 자동으로 제공되지만 application 실행 시에는 DDL 생성과 관련한 property가 작성되어있지 않기 때문입니다.

     

    이제 application 실행 시 JPA에서 DDL을 생성할 수 있도록 application.properties file에 다음의 내용을 추가하도록 합니다.

    #JPA에서 DDL을 생성하도록 할지에 대한 여부를 설정합니다.
    spring.jpa.generate-ddl=true
    
    #생성된 DDL을 실행할 방법을 설정합니다. 설정 가능한 value는 다음과 같습니다.
    # update : schema를 자동으로 생성하고 필요에 따라 수정합니다.
    # create-drop : application 기동 시 schema를 생성하고 종료 시 삭제합니다.
    # create : application 기동 시 기존의 schema를 지우고 새롭게 생성합니다.
    spring.jpa.hibernate.ddl=update
    
    #실행창에 sql을 보여주는 것에 대한 여부를 설정합니다.
    spring.jpa.show-sql=true	

     

     

    개발 초기에 적합한 설정

    • spring.jpa.generate-ddl=true
    • spring.jpa.hibernate.ddl-auto=update

     

     

    운영 환경에서의 설정 

    • spring.jpa.generate-ddl=false -> DDL 생성을 막아 database에 영향이 없도록 합니다.
    • spring.jpa.hibernate.ddl-auto=validate -> relation의 유효성만 검사합니다.

     

     

     

    application.properties file에 property 추가가 되었으니 다시 application을 실행합니다.

    이번에는 table을 생성했음을 실행창에서 확인할 수 있습니다. 실제 schema가 잘 생성되었는지 terminal에서 확인해보도록 하겠습니다.

    문제없이 잘 생성되었습니다.

     

     

    spring.jpa.hibernate.ddl-auto property 설정에 따른 Entity class의 변경 시 실행결과는 다음과 같습니다.

    spring.jpa.hibernate.ddl result
    validate JPA와 DB간 schema가 일치하는지 확인합니다. 따라서 Entity class의 member 변수가 추가되면 error를 발생시키게 됩니다.
    update member 변수를 추가하면 거기에 맞춰 schema를 변경합니다. 기존의 member 변수명을 바꿔도 새로은 column 추가로 인식하니 주의해야 합니다.

     

     

     

     

     

     

     


    [SQL script file을 사용한 database 초기화]

    먼저 test code를 실행하면 실행창에서 ddl에 해당하는 query를 확인할 수 있습니다. 해당 query문을 복사해주세요.

    /resource/schema.sql file을 생성하고 복사한 내용을 붙여 넣습니다. 최종적인 schema.sql file의 내용은 다음과 같습니다. 

    drop table if exists users
    drop sequence if exists hibernate_sequence
    create sequence hibernate_sequence start with 1 increment by 1
    create table users (id bigint not null, password varchar(255), username varchar(255), primary key (id))

    hibernate에서 위의 SQL script를 사용하여 database를 초기화합니다. script가 존재하면 application.properties file의 spring.jpa.hibernate.ddl-auto가 validate로 설정되어 있어도 script를 통해 database를 초기화 하게 됩니다.(우선 schema.sql을 찾고 없으면 property를 참고하여 설정한 정책에 따라 나머지 db를 초기화하거나 유효성만 검사하고 끝 내도록 합니다.)

     

    schema.sql이 호출된 이후에 data.sql이 호출 됩니다. schema.sql에서 ddl을 실행 후 data.sql에 원하는 data를 추가하는 dml을 넣어 초기 data를 지정할 수 있습니다.

     

    각 database platform에 따라 사용할 SQL script를 따로 관리할 수 있습니다. 이렇게 platform 별로 관리되는 SQLscript는 application.properties file에 지정한 platform에 따라 선택하여 사용할 수 있습니다. postgresql을 사용하는 경우 다음과 같이 platform을 지정합니다.

    spring.datasource.platorm=postgresql

     

     

    위와 같이 platform을 지정한 상태에서 resources 아래에 schema-postgresql.sql을 넣어두면 database 초기화에 사용됩니다.

     

     

     

    application을 실행 시 연결된 pqstgresql database를 SQL script로 초기화 하려면 application.properties에 다은과 같은 내용을 추가해야 합니다.

    spring.datasource.initialization-mode=always

    spring.datasource.initialization-mode는 embedded DataSource의 schema 생성 여부를 결정하는 property입니다만 production용 database의 의도치 않은 초기화를 막기위해 명시적으로 지정해줘야 초기화가 이뤄집니다. 기본값은 always이며 never로 지정하면 schema를 생성하지 않습니다.

     

     

     

     

     


     

    1. Data Definition Language는 database table을 생성, 삭제하거나 table column의 data type 변경 또는 추가, 삭제 그리고 모든 row 잘라 버리기 등과 같은 db table 사양에 직접적인 영향을 주는 language를 말합니다.

      1. CREATE : table을 생성합니다.

      2. ALTER : table을 수정합니다.

      3. DROP : table을 삭제합니다.

      4. TRUNCATE : table의 row를 index 포함 완전히 제거합니다. [본문으로]

    댓글

Designed by Tistory.