λ°±μ—”λ“œ

[JAVA/DB] 상속관계 μ •μ˜μ™€ λ§€ν•‘μ „λž΅

πŸͺ„ν•˜λ£¨πŸͺ„ 2023. 5. 28. 17:36
728x90

μ˜€λŠ˜μ€ 객체의 상속관계λ₯Ό DBμ—μ„œ μ–΄λ–»κ²Œ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ”μ§€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

0. μžλ°” 상속(Interitance)μ΄λž€?

μžλ°”μ—μ„œ 상속(Inheritance)은 κ³΅ν†΅λœ νŠΉμ§•μ„ 가진 ν΄λž˜μŠ€λ“€μ„ 쀑볡을 ν”Όν•˜κ³  λ””μžμΈν•˜λŠ” 방법이닀.

예λ₯Ό λ“€μ–΄ 원, μ‚¬κ°ν˜•, μ‚Όκ°ν˜•μ„ λ‚˜νƒ€λ‚΄λŠ” 클래슀λ₯Ό μ •μ˜ν•΄ 보자.

λΆ€λͺ¨ 클래슀λ₯Ό λ„ν˜•/μžμ‹ 클래슀λ₯Ό 원, μ‚¬κ°ν˜•, μ‚Όκ°ν˜•μœΌλ‘œ μ •μ˜ν•œ λ’€,

곡톡 속성인 λ³€μˆ˜μ™€ ν•¨μˆ˜λŠ” 상속을 λ°›μ•„μ„œ μ‚¬μš©ν•˜κ³ , μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ‹€λ₯Έ λΆ€λΆ„λ§Œ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ μž¬μ •μ˜ ν•œλ‹€.

ex. 곡톡 λ³€μˆ˜μ™€ ν•¨μˆ˜

λ³€μˆ˜

- backgroundColor

- dateCreated λ“±

ν•¨μˆ˜

- getDateCreated() λ“±

 

λ‹€μ‹œ λ§ν•˜μžλ©΄ μƒμ†μ΄λž€ 기쑴의 클래슀(λΆ€λͺ¨ 클래슀=superclass)에 κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ μž¬μ •μ˜ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀(μžμ‹ 클래슀=subclass)λ₯Ό μ •μ˜ν•˜λŠ” 것이닀.

μ΄λ•Œ, μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ₯Ό ν™•μž₯ν•œλ‹€λŠ” ν‘œν˜„μ„ μ‚¬μš©ν•˜λŠ”λ°,

이것은 μžμ‹ ν΄λž˜μŠ€μ™€ λΆ€λͺ¨ 클래슀λ₯Ό 집합 관계(포함관계)둜 μ΄ν•΄ν•œλ‹€κΈ°λ³΄λ‹€λŠ”, μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μ’€ 더 κ΅¬μ²΄ν™”ν•œ κ²ƒμ΄λΌλŠ” μ˜λ―Έμ΄λ‹€.

 

 

1. DB μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ΄λž€?

κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μƒμ†κ΄€κ³„λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λŒ€μ‹  μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ„ μ΄μš©ν•œλ‹€.

μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • μŠˆνΌνƒ€μž…(Supertype) : μ„œλΈŒ νƒ€μž…μ—μ„œ κ³΅ν†΅λœ 속성을 ν¬ν•¨ν•˜λŠ” κ²ƒμœΌλ‘œ ν•˜λ‚˜ μ΄μƒμ˜ μ„œλΈŒ νƒ€μž…κ³Ό 관계λ₯Ό κ°–λŠ”λ‹€. 
  • μ„œλΈŒνƒ€μž…(Subtype) : 슈퍼 νƒ€μž…μ˜ λΆ€λΆ„ μ§‘ν•©μœΌλ‘œ, λ‹€λ₯Έ ν•˜μœ„ 집단과 λ³„κ°œ λ˜λŠ” μœ μΌν•œ 속성을 가지고 μžˆλ‹€.

μŠˆνΌνƒ€μž…μ—μ„œ ꡬ체화(Specialization)된 것을 μ„œλΈŒνƒ€μž…μ΄λΌκ³  ν•˜κ³  Top-Down λ°©μ‹μ˜ λΆ„ν•΄(decomposition) 방식이닀.

각 μ„œλΈŒνƒ€μž…λ“€μ˜ μΌλ°˜ν™”(Generalization)된 ν˜•νƒœλ₯Ό μŠˆνΌνƒ€μž…μ΄λΌκ³  ν•˜κ³  Bottom-Up λ°©μ‹μ˜ μΆ”μΆœ(extraction) 방식이닀.

 

μ •λ¦¬ν•˜μžλ©΄, κ³΅ν†΅λœ 속성은 λ¬Άμ–΄μ„œ μŠˆνΌνƒ€μž…μœΌλ‘œ λ§Œλ“€κ³ , μ΄μ™Έμ˜ 뢀뢄은 각 μ§‘λ‹¨μ˜ μœ μΌν•œ μ†μ„±μœΌλ‘œ μ„œλΈŒνƒ€μž…μœΌλ‘œ μ •μ˜ν•˜λŠ” 것이닀. 0번과 μœ μ‚¬ν•˜κ²Œ λ„ν˜•(원, μ‚¬κ°ν˜•, μ‚Όκ°ν˜•) μ˜ˆμ‹œλ₯Ό 그림으둜 μ‚΄νŽ΄λ³΄λ©΄ μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆλ‹€.

μŠˆνΌνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž… μ˜ˆμ‹œ

μœ„μ˜ 과정을 데이터 톡합이라고 ν•˜λ©° 해달 λͺ¨λΈμ˜ ν™•μž₯성이 μ¦κ°€ν•œλ‹€.

 

 

2. 논리 λͺ¨λΈ(μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž…)을 물리λͺ¨λΈ(상속)둜 κ΅¬ν˜„ν•˜λŠ” 방법

κ°μ²΄λŠ” 상속을 μ§€μ›ν•˜λ―€λ‘œ λͺ¨λΈλ§κ³Ό κ΅¬ν˜„μ΄ λ˜‘κ°™μ§€λ§Œ, DBλŠ” 상속을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 논리 λͺ¨λΈμ„ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•  방법이 ν•„μš”ν•˜λ‹€.

DB의 논리 λͺ¨λΈ(μŠˆνΌνƒ€μž… μ„œλΈŒνƒ€μž…)을 μ‹€μ œ 물리 λͺ¨λΈλ‘œ κ΅¬ν˜„ν•˜λŠ” 방법

  • @Inheritance(strategy=InheritanceType.XXX)
    • InheritanceType μ’…λ₯˜(XXX) - default=SINGLE_TABLE
      • JOINED : μƒμœ„/ν•˜μœ„ 클래슀λ₯Ό 각각의 ν…Œμ΄λΈ”λ‘œ λ³€ν™˜
        • @DiscriminatorColumn(name="DTYPE") : λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έ. ν•˜μœ„ 클래슀의 ꡬ뢄 컬럼 생성. default = DTYPE
      • SINGLE_TABLE : μƒμœ„ 클래슀λ₯Ό ν•˜λ‚˜λ₯Ό ν…Œμ΄λΈ”λ‘œ λ³€ν™˜
        • @DiscriminatorColumn(name="DTYPE") : λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έ. ν•˜μœ„ 클래슀의 ꡬ뢄 컬럼 생성. default = DTYPE
        • @DiscriminatorValue(name="이름") : μžμ‹ ν΄λž˜μŠ€μ— μ„ μ–Έ. μŠˆνΌνƒ€μž…μ˜ ꡬ뢄 μ»¬λŸΌμ— μ €μž₯ν•  값을 지정
      • TABLE_PER_CLASS  : ν•˜μœ„ ν…Œμ΄λΈ” 각각을 ν…Œμ΄λΈ”λ‘œ λ³€ν™˜
        • β€»μ£Όμ˜) μ΄λ•Œ, @Id @GenerateValue(strategy=GenerationType.IDENTITY) 일 경우 였λ₯˜ λ°œμƒ
      • 각 상속 νƒ€μž…μ— λŒ€ν•œ μ°¨μ΄λŠ” μ˜†μ˜ 링크에 잘 μ •λ¦¬λ˜μ–΄ μžˆμœΌλ‹ˆ μ°Έκ³ ν•˜μž(https://ict-nroo.tistory.com/128)
728x90