ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] κ°’ νƒ€μž…
    Back-end/JPA 2022. 4. 28. 10:15

    πŸ“Œ JPA의 데이터 νƒ€μž… λΆ„λ₯˜ (2가지)

    1) μ—”ν‹°ν‹° νƒ€μž…

    • @Entity둜 μ •μ˜ν•˜λŠ” 객체
    • 데이터가 변해도 μ‹λ³„μžλ‘œ μ§€μ†ν•΄μ„œ 좔적이 κ°€λŠ₯ν•˜λ‹€.
    • κ³΅μœ κ°€ κ°€λŠ₯ν•˜λ‹€.
    • ex) νšŒμ› μ—”ν‹°ν‹°μ˜ ν‚€λ‚˜ λ‚˜μ΄ 값을 변경해도 μ‹λ³„μžλ‘œ 인식 κ°€λŠ₯

     

    2) κ°’ νƒ€μž…

    • int, Integer, String처럼 λ‹¨μˆœνžˆ κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μžλ°” κΈ°λ³Έ νƒ€μž…μ΄λ‚˜ 객체
    • μ‹λ³„μžκ°€ μ—†κ³  κ°’λ§Œ μžˆμœΌλ―€λ‘œ λ³€κ²½μ‹œ 좔적이 λΆˆκ°€ν•˜λ‹€.
    • 곡유되면 μ•ˆλ˜λŠ” 값이닀. (λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©, λΆˆλ³€ 객체둜 생성)
    • 생λͺ… μ£ΌκΈ°λ₯Ό 엔티티에 μ˜μ‘΄ν•œλ‹€.
    • ex) 숫자 100을 200으둜 λ³€κ²½ν•˜λ©° μ™„μ „νžˆ λ‹€λ₯Έ κ°’μœΌλ‘œ λŒ€μ²΄

     

    πŸ“Œ κ°’ νƒ€μž… λΆ„λ₯˜ (3가지)

    κΈ°λ³Έκ°’ νƒ€μž…, μž„λ² λ””λ“œ νƒ€μž…, μ»¬λ ‰μ…˜ κ°’ νƒ€μž… 총 3κ°€μ§€λ‘œ λΆ„λ₯˜λœλ‹€.

     

    πŸ“Œ κΈ°λ³Έκ°’ νƒ€μž…

    • μ’…λ₯˜: μžλ°” κΈ°λ³Έ νƒ€μž…(int, double), 래퍼 클래슀(Integer, Long), String
    • 생λͺ…μ£ΌκΈ°λ₯Ό μ—”ν‹°ν‹°μ˜ μ˜μ‘΄ν•œλ‹€. ex) νšŒμ›μ„ μ‚­μ œν•˜λ©΄ 이름, λ‚˜μ΄ ν•„λ“œλ„ ν•¨κ»˜ μ‚­μ œ
    • κ³΅μœ ν•˜λ©΄ μ•ˆλœλ‹€. ex) νŠΉμ • νšŒμ› 이름 λ³€κ²½μ‹œ λ‹€λ₯Έ νšŒμ›μ˜ 이름도 ν•¨κ»˜ λ³€κ²½λ˜λ©΄ μ•ˆλ¨

     

    μΆ”κ°€)

    int, double 같은 μžλ°” κΈ°λ³Έ νƒ€μž…(primitive type)은 곡유될 수 μ—†κ³ , 항상 값을 λ³΅μ‚¬ν•œλ‹€.

    Integer 같은 래퍼 클래슀 or String 같은 μ°Έμ‘° ν΄λž˜μŠ€λŠ” κ³΅μœ λŠ” κ°€λŠ₯ν•˜μ§€λ§Œ 값을 λ³€κ²½ν•  수 μ—†λ‹€.

     

    πŸ“Œ μž„λ² λ””λ“œ νƒ€μž… (볡합 κ°’ νƒ€μž…)

    주둜 κΈ°λ³Έ κ°’ νƒ€μž…μ„ λͺ¨μ•„μ„œ μƒˆλ‘œμš΄ κ°’ νƒ€μž…μœΌλ‘œ μ •μ˜ν•˜κΈ° λ•Œλ¬Έμ— 볡합 κ°’ νƒ€μž…μ΄λΌκ³ λ„ ν•œλ‹€.

    μž„λ² λ””λ“œ νƒ€μž… μ˜ˆμ‹œ

    β–Ά μ‚¬μš©λ²•

    • @Embeddable: κ°’ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 곳에 ν‘œμ‹œ
    • @Embedded: κ°’ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 곳에 ν‘œμ‹œ

     

    *μΆ”κ°€ν•  λ‚΄μš©

    μž„λ² λ””λ“œ νƒ€μž…μ˜ 경우 'κΈ°λ³Έ μƒμ„±μžκ°€ ν•„μˆ˜'라고 ν•˜λŠ”λ° κ·Έ μ΄μœ λŠ”?

     

    β–Ά μž₯점

    • μž¬μ‚¬μš©ν•  수 있고, 높은 응집도λ₯Ό 가진닀.
    • Period.isWork()처럼 ν•΄λ‹Ή κ°’ νƒ€μž…λ§Œ μ‚¬μš©ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
    • μž„λ² λ””λ“œ νƒ€μž…μ„ ν¬ν•¨ν•œ λͺ¨λ“  κ°’ νƒ€μž…μ€, κ°’ νƒ€μž…μ„ μ†Œμœ ν•œ 엔티티에 생λͺ…μ£ΌκΈ°λ₯Ό μ˜μ‘΄ν•œλ‹€.

     

    β–Ά μž„λ² λ””λ“œ νƒ€μž…κ³Ό ν…Œμ΄λΈ” 맀핑

    • μž„λ² λ””λ“œ νƒ€μž…μ€ μ—”ν‹°ν‹°μ˜ ν•˜λ‚˜μ˜ 값일 λΏμ΄λ―€λ‘œ, μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš© μ „κ³Ό 후에 λ§€ν•‘ν•˜λŠ” ν…Œμ΄λΈ”μ˜ ν˜•νƒœλŠ” λ™μΌν•˜λ‹€.
    • λ§Œμ•½ μž„λ² λ””λ“œ νƒ€μž…μ˜ 값이 null이면 λ§€ν•‘λ˜λŠ” μ»¬λŸΌκ°’λ„ λͺ¨λ‘ null이 λœλ‹€.

     

    β–Ά μΆ”κ°€) @AttributeOverride: 속성 μž¬μ •μ˜

    • λ§Œμ•½ ν•˜λ‚˜μ˜ μ—”ν‹°ν‹°μ—μ„œ 같은 μž„λ² λ””λ“œ νƒ€μž…μ„ 2개 μ‚¬μš©ν•˜λ©΄, 컬럼λͺ…이 μ€‘λ³΅λ˜μ–΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
    • @AttributeOverrides, @AttributeOverrideλ₯Ό μ‚¬μš©ν•΄ 컬럼λͺ… 속성을 μž¬μ •μ˜ν•˜μ—¬(DB ν…Œμ΄λΈ”μ— μ €μž₯될 컬럼λͺ…을 λ‹€λ₯΄κ²Œ 함) ν•΄κ²°ν•  수 μžˆλ‹€.

     

    πŸ“Œ κ°’ νƒ€μž…κ³Ό λΆˆλ³€ 객체

    β–Ά κ°’ νƒ€μž… 곡유 μ°Έμ‘° vs. 볡사

    κ°’ νƒ€μž…(μž„λ² λ””λ“œ νƒ€μž…) 곡유 μ°Έμ‘° μ˜ˆμ‹œ

    μœ„μ™€ 같이 μž„λ² λ””λ“œ νƒ€μž… 같은 κ°’ νƒ€μž…μ„ μ—¬λŸ¬ μ—”ν‹°ν‹°μ—μ„œ κ³΅μœ ν•˜λ©΄ κ°’ λ³€κ²½μ‹œ ν•΄λ‹Ή κ°’ νƒ€μž…μ„ μ°Έμ‘°ν•˜κ³  μžˆλŠ” λͺ¨λ“  μ—”ν‹°ν‹°κ°€ λ³€κ²½λœ 값을 κ°€μ§€κ²Œ λ˜λ―€λ‘œ μœ„ν—˜ν•˜λ‹€.

    κ°’ νƒ€μž… 볡사 μ˜ˆμ‹œ

    κ°’ νƒ€μž…μ˜ μ‹€μ œ 객체λ₯Ό κ³΅μœ ν•˜λŠ” 것은 μœ„ν—˜ν•˜λ―€λ‘œ, κ°’(μΈμŠ€ν„΄μŠ€)λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

     

    β–Ά 객체 νƒ€μž…μ˜ ν•œκ³„

    • 항상 값을 λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ 곡유 참쑰둜 인해 λ°œμƒν•˜λŠ” 상황을 ν”Όν•  수 μžˆλ‹€.
    • μžλ°” κΈ°λ³Έ νƒ€μž…μ— 값을 λŒ€μž…ν•˜λ©΄ 값을 λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
    • 이와 달리 μž„λ² λ””λ“œ νƒ€μž…μ²˜λŸΌ 직접 μ •μ˜ν•œ κ°’ νƒ€μž…μ€ μžλ°”μ˜ κΈ°λ³Έ νƒ€μž…μ΄ μ•„λ‹ˆλΌ 객체 νƒ€μž…μ΄λ―€λ‘œ μžλ°” κΈ°λ³Έ νƒ€μž…μ²˜λŸΌ μžλ™μœΌλ‘œ 값을 λ³΅μ‚¬ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ, 곡유 μ°Έμ‘°λ₯Ό 막을 방법이 μ—†λ‹€. 

    κΈ°λ³Έ νƒ€μž…, 객체 νƒ€μž… μ˜ˆμ‹œ

     

    β–Ά λΆˆλ³€ 객체

    • λΆˆλ³€ 객체 : 생성 μ‹œμ  이후 μ ˆλŒ€ 값을 λ³€κ²½ν•  수 μ—†λŠ” 객체
    • μœ„μ™€ 같은 객체 νƒ€μž…μ˜ ν•œκ³„λ‘œ λ“±μž₯ν•œ κ°œλ…μ΄ λΆˆλ³€ 객체이닀. 곡유 μ°Έμ‘°λ₯Ό 막을 수 μ—†μœΌλ‹ˆ 객체 νƒ€μž…μ„ μˆ˜μ •ν•  수 μ—†κ²Œ λ§Œλ“€μ–΄ 였λ₯˜ 상황을 μ°¨λ‹¨ν•˜λŠ” 것이닀.
    • 즉, κ°’ νƒ€μž…μ€ λΆˆλ³€ 객체(immutable object)둜 섀계해야 ν•œλ‹€.
    • μƒμ„±μžλ‘œλ§Œ 값을 μ„€μ •ν•˜κ³ , Setterλ₯Ό λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€.
    • 값을 μˆ˜μ •ν•˜λ €λ©΄, μƒμ„±μžλ‘œ μˆ˜μ •λœ 값을 가진 μƒˆλ‘œμš΄ 객체λ₯Ό 생성해 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€.

     

    *μΆ”κ°€ν•  λ‚΄μš©

    Integer, String은 μžλ°”κ°€ 자체적으둜 λΆˆλ³€ 객체둜 μ„€μ •ν•΄λ†“μ•˜λ‹€.

     

    πŸ“Œ κ°’ νƒ€μž…μ˜ 비ꡐ

    κ°’ νƒ€μž…μ˜ 경우 μΈμŠ€ν„΄μŠ€κ°€ 달라도 κ·Έ μ•ˆμ˜ 값이 κ°™μœΌλ©΄ 같은 것이라고 κ°„μ£Όν•΄μ•Ό ν•œλ‹€.

     

    동일성(identity) 비ꡐ : μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘° 값을 비ꡐ, == μ‚¬μš©

    동등성(equivalence) 비ꡐ : μΈμŠ€ν„΄μŠ€μ˜ 값을 비ꡐ, equals() μ‚¬μš©

     

    • κ°’ νƒ€μž…μ€ equals()λ₯Ό μ‚¬μš©ν•΄ 동등성 비ꡐλ₯Ό ν•΄μ•Όν•œλ‹€.
    • κ°’ νƒ€μž…μ˜ equals()λ₯Ό ν•„μš”μ‹œ μ˜€λ²„λΌμ΄λ”©ν•΄μ•Ό ν•œλ‹€.

     

    *μΆ”κ°€ν•  λ‚΄μš©

    κ°’ νƒ€μž…μ˜ equals() λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”© (Object 클래슀의 equals())

     

    πŸ“Œ μ»¬λ ‰μ…˜ κ°’ νƒ€μž…

    μ˜ˆμ‹œ

    • κ°’ νƒ€μž…μ„ ν•˜λ‚˜ 이상 μ €μž₯ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
    • @ElementCollection, @CollectionTableλ₯Ό μ‚¬μš©ν•œλ‹€.
    • λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ»¬λ ‰μ…˜μ„ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— μ €μž₯ν•  수 μ—†μœΌλ―€λ‘œ, μ»¬λ ‰μ…˜ μ €μž₯을 μœ„ν•œ λ³„λ„μ˜ ν…Œμ΄λΈ”μ΄ ν•„μš”ν•˜λ‹€.
    • μ»¬λ ‰μ…˜ κ°’ νƒ€μž…λ„ ν•΄λ‹Ή 값을 가지고 μžˆλŠ” 엔티티에 생λͺ…μ£ΌκΈ°κ°€ κ²°μ •λœλ‹€.
    • κ°’ νƒ€μž…μ€ 엔티티와 λ‹€λ₯΄κ²Œ μ‹λ³„μž κ°œλ…μ΄ μ—†κΈ° λ•Œλ¬Έμ—, κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ— λ³€κ²½ 사항이 λ°œμƒν•˜λ©΄, ν•΄λ‹Ή 엔티티와 μ—°κ΄€λœ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜κ³ , κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ— μžˆλŠ” ν˜„μž¬μ˜ 값을 λͺ¨λ‘ λ‹€μ‹œ 생성해 μ €μž₯ν•œλ‹€.
    • μœ„μ˜ μ˜ˆμ‹œμ—μ„œμ²˜λŸΌ κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ„ λ§€ν•‘ν•˜λŠ” ν…Œμ΄λΈ”μ€ λͺ¨λ“  μ»¬λŸΌμ„ λ¬Άμ–΄μ„œ PKλ₯Ό κ΅¬μ„±ν•˜λ―€λ‘œ, null μž…λ ₯X & 쀑볡 μ €μž₯X

     

    β–Ά μ»¬λ ‰μ…˜ κ°’ νƒ€μž… λŒ€μ•ˆ

    • 상황에 따라 μ»¬λ ‰μ…˜ κ°’ νƒ€μž… λŒ€μ‹  μΌλŒ€λ‹€ κ΄€κ³„λ‘œ μˆ˜μ •ν•˜λŠ” 것을 고렀해봐야 ν•œλ‹€.
    • μΌλŒ€λ‹€ 관계λ₯Ό μœ„ν•œ μ—”ν‹°ν‹°λ₯Ό λ§Œλ“€κ³ , ν•΄λ‹Ή μ—”ν‹°ν‹°κ°€ κ°’ νƒ€μž…μ„ 가지도둝 ν•œλ‹€.
    • μ˜μ†μ„± 전이(CASCADE)와 κ³ μ•„ 객체 제거 섀정을 ν•˜μ—¬ κ°’ νƒ€μž… μ»¬λ ‰μ…˜μ²˜λŸΌ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

     

    λŒ“κΈ€

Designed by Tistory.