Home > Spring > πŸƒ[Spring] spring.jap.hibernate.ddl-auto μ„€μ • μ˜΅μ…˜μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸƒ[Spring] spring.jap.hibernate.ddl-auto μ„€μ • μ˜΅μ…˜μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?
Spring Framework

πŸƒ[Spring] spring.jap.hibernate.ddl-auto μ„€μ • μ˜΅μ…˜μ΄λž€ λ¬΄μ—‡μΌκΉŒμš”?

  • spring.jpa.hibernate.ddl-autoλŠ” Spring Bootμ—μ„œ JPA(Java Persistence API)와 Hibernateλ₯Ό μ‚¬μš©ν•  λ•Œ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆμ˜ 생성을 μ œμ–΄ν•˜λŠ” μ„€μ • μ˜΅μ…˜μž…λ‹ˆλ‹€.

πŸ“ μŠ€ν‚€λ§ˆ(Schema)

λ°μ΄ν„°λ² μ΄μŠ€μ˜ ꡬ쑰λ₯Ό μ •μ˜ν•˜λŠ” μš©μ–΄λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터가 μ–΄λ–»κ²Œ μ €μž₯되고, μ–΄λ–»κ²Œ μ‘°μ§ν™”λ˜λŠ”μ§€λ₯Ό μ„€λͺ…ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
μŠ€ν‚€λ§ˆλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ 논리적 섀계λ₯Ό λ‚˜νƒ€λ‚΄λ©°, ν…Œμ΄λΈ”, λ·°, 인덱슀, 트리거, μ €μž₯ ν”„λ‘œμ‹œμ €, μ œμ•½ 쑰건 λ“±κ³Ό 같은 λ°μ΄ν„°λ² μ΄μŠ€ 객체듀이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜λŠ”μ§€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

  • ddl-autoμ—μ„œ β€œDDL”은 Data Definition Language의 μ•½μžλ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”, 인덱슀, 컬럼 등을 μ •μ˜ν•˜λŠ” SQL(Structured Query Language) λͺ…λ Ήμ–΄μž…λ‹ˆλ‹€.
  • 이 섀정은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ—”ν‹°ν‹°(Entity) ν΄λž˜μŠ€κ°€ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)와 μΌμΉ˜ν•˜λ„λ‘ μžλ™μœΌλ‘œ μ²˜λ¦¬ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ μ—”ν‹°ν‹°(Entity)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

1️⃣ μ„€μ • κ°’.

  • spring.jpa.hibernate.ddl-autoλŠ” λ‹€μŒκ³Ό 같은 μ—¬λŸ¬ 가지 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 각 값은 Hibernateκ°€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)에 λŒ€ν•΄ μ–΄λ–€ λ™μž‘μ„ μˆ˜ν–‰ν• μ§€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

1️⃣ none

  • 아무 μž‘μ—…λ„ ν•˜μ§€ μ•ŠμŒ.
    • HibernateλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ” ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)λ₯Ό μˆ˜λ™μœΌλ‘œ 관리할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

2️⃣ validate

  • μ—”ν‹°ν‹°(Entity) ν΄λž˜μŠ€μ™€ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)κ°€ μΌμΉ˜ν•˜λŠ”μ§€ κ²€μ¦ν•©λ‹ˆλ‹€.
  • μ• ν”Œλ¦¬κ²Œμ΄μ…˜μ΄ μ‹œμž‘ν•  λ•Œ, μ—”ν‹°ν‹°(Entity) ν΄λž˜μŠ€μ™€ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)κ°€ μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
    • λ§Œμ•½ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€λ©° μ‹œμž‘μ— μ‹€νŒ¨ν•©λ‹ˆλ‹€.
  • μŠ€ν‚€λ§ˆ(Schema)κ°€ 이미 μ‘΄μž¬ν•˜κ³ , μŠ€ν‚€λ§ˆ(Schema)의 λ³€κ²½ 없이 μ—”ν‹°ν‹°(Entity) 맀핑이 μ˜¬λ°”λ₯Έμ§€ 확인할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

3️⃣ update

  • μ—”ν‹°ν‹°(Entity) 클래슀의 λ³€κ²½ 사항을 κΈ°μ‘΄ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)에 λ°˜μ˜ν•©λ‹ˆλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€μ— 이미 μ‘΄μž¬ν•˜λŠ” ν…Œμ΄λΈ” ꡬ쑰에 λ§žμΆ”μ–΄ ν•„μš”ν•œ 경우 μƒˆλ‘œμš΄ 컬럼(Column,μ—΄)을 μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•©λ‹ˆλ‹€.
    • κ·ΈλŸ¬λ‚˜ κΈ°μ‘΄ λ°μ΄ν„°λ‚˜ ꡬ쑰λ₯Ό μ‚­μ œν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
  • 개발 쀑 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)κ°€ 자주 변경될 λ•Œ μœ μš©ν•˜μ§€λ§Œ, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4️⃣ create

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ μ‹œ κΈ°μ‘΄ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ„ μ‚­μ œν•œ ν›„ μƒˆλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  κΈ°μ‘΄ λ°μ΄ν„°λŠ” μ‚­μ œλ˜λ©°, μ—”ν‹°ν‹°(Entity) ν΄λž˜μŠ€μ— μ •μ˜λœ λŒ€λ‘œ μƒˆλ‘œμš΄ ν…Œμ΄λΈ”κ³Ό 컬럼(Column, μ—΄)을 μƒμ„±ν•©λ‹ˆλ‹€.
  • 개발 초기 λ‹¨κ³„μ—μ„œ μ‚¬μš©λ˜λ©°, 맀번 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μƒˆλ‘œ 생성해야 ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€.

5️⃣ create-drop

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ μ‹œ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μƒμ„±ν•˜κ³ , μ’…λ£Œ μ‹œ μŠ€ν‚€λ§ˆλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
  • create와 μœ μ‚¬ν•˜μ§€λ§Œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ’…λ£Œλ  λ•Œ ν…Œμ΄λΈ”μ„ λͺ¨λ‘ μ‚­μ œν•˜λŠ” μΆ”κ°€ λ™μž‘μ΄ μžˆμŠ΅λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 있으며, 개발이 λλ‚˜λ©΄ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ.

  • Spring Boot의 application.properties λ˜λŠ” application.yml νŒŒμΌμ—μ„œ spring.jpa.hibernate.ddl-autoλ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ application.properties μ˜ˆμ‹œ.

spring.jpa.hibernate.ddl-auto=update

application.yml μ˜ˆμ‹œ.

spring:
  jpa:
    hibernate:
      ddl-auto: update
  • μœ„ μ„€μ •μ—μ„œλŠ” updateλ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ‹œμ—°μ΄ μ‹œμž‘λ  λ•Œ Hibernateκ°€ μ—”ν‹°ν‹°(Entity) 클래슀의 λ³€κ²½ 사항을 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)에 λ°˜μ˜ν•˜μ§€λ§Œ, κΈ°μ‘΄ 데이터λ₯Ό μ‚­μ œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

3️⃣ 각 μ„€μ • κ°’μ˜ μ ν•©ν•œ μ‚¬μš© ν™˜κ²½.

  • none
    • 이미 μ™„μ „νžˆ μ„€μ •λœ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ³ , Hibernateκ°€ μŠ€ν‚€λ§ˆ(Schema)에 λŒ€ν•΄ μ•„λ¬΄λŸ° 변경도 ν•˜μ§€ μ•ŠκΈ°λ₯Ό 원할 λ•Œ μ‚¬μš©.
  • validate
    • λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)κ°€ 이미 μ€€λΉ„λ˜μ–΄ 있고, μ—”ν‹°ν‹° ν΄λž˜μŠ€μ™€ μŠ€ν‚€λ§ˆ κ°„μ˜ 뢈일치λ₯Ό ν™•μΈν•˜κ³  싢을 λ•Œ μ‚¬μš©.
  • update
    • 개발 쀑, λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)λ₯Ό μœ μ§€ν•˜λ©΄μ„œ μ—”ν‹°ν‹°(Entity) 클래슀의 λ³€κ²½ 사항을 λ°˜μ˜ν•˜κ³  싢을 λ•Œ μ‚¬μš©.
  • create
    • 개발 쀑, λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ(Schema)λ₯Ό μ™„μ „νžˆ μƒˆλ‘œ μƒμ„±ν•˜κ³  싢을 λ•Œ μ‚¬μš©.
  • create-drop
    • ν…ŒμŠ€νŠΈ μ‹œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ€‘μ—λ§Œ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μƒμ„±ν•˜κ³  μ’…λ£Œ μ‹œ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•  λ•Œ μ‚¬μš©.

4️⃣ 주의 사항.

  • create와 create-drop은 ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
    • 이 값듀은 κΈ°μ‘΄ 데이터λ₯Ό μ‚­μ œν•˜λ―€λ‘œ, μ‹€ λ°μ΄ν„°λ² μ΄μŠ€μ— μ‚¬μš©ν•˜λ©΄ 데이터 손싀이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • updateλŠ” 개발 ν™˜κ²½μ—μ„œ μœ μš©ν•˜μ§€λ§Œ, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 변경이 λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • validateλŠ” μŠ€ν‚€λ§ˆ(Schema) κ²€μ¦λ§Œ μˆ˜ν–‰ν•˜λ―€λ‘œ, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ μŠ€ν‚€λ§ˆ(Schema)의 일관성을 ν™•μΈν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ μš”μ•½.

  • spring.jpa.hibernate.ddl-autoλŠ” Hibernateκ°€ μ• ν”Œλ¦¬μΌ€μ‹œμ—° μ‹œμž‘ μ‹œ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν• μ§€λ₯Ό μ •μ˜ν•˜λŠ” μ„€μ •μž…λ‹ˆλ‹€.
  • 개발, ν…ŒμŠ€νŠΈ, ν”„λ‘œλ•μ…˜ ν™˜κ²½μ— 따라 μ μ ˆν•œ 값을 선택해 μ‚¬μš©ν•  수 있으며, 이 섀정을 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ±°λ‚˜ 검증, μ—…λ°μ΄νŠΈν•˜λŠ” 과정을 κ°„νŽΈν•˜κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.