Bibi's DevLog πŸ€“πŸŽ

[Spring Data JDBC, JPA] @Embededλž€?, @Embeded μ‚¬μš©ν•˜κΈ° λ³Έλ¬Έ

πŸ–₯ BE λ°±μ—”λ“œ/Spring μŠ€ν”„λ§

[Spring Data JDBC, JPA] @Embededλž€?, @Embeded μ‚¬μš©ν•˜κΈ°

λΉ„λΉ„ bibi 2021. 4. 30. 19:43

@Embeded

μ—°κ΄€ μžˆλŠ” μ»¬λŸΌλ“€μ„ 묢되 ν…Œμ΄λΈ”μ„ μƒˆλ‘œ λ§Œλ“€μ§€ μ•Šκ³ , @Embededλ₯Ό μ‚¬μš©ν•΄ 마치 ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ λ§Œλ“  κ²ƒμ²˜λŸΌ μ‚¬μš©ν•˜λŠ” 방법이닀!!

[JPA] @Embeded, μž„λ² λ””λ“œ νƒ€μž…

https://velog.io/@conatuseus/JPA-%EC%9E%84%EB%B2%A0%EB%94%94%EB%93%9C-%ED%83%80%EC%9E%85embedded-type-8ak3ygq8wo 에 잘 μ„€λͺ…λ˜μ–΄ μžˆμ–΄ μš”μ•½ μ •λ¦¬λ§Œ ν–ˆμŠ΅λ‹ˆλ‹€.πŸ™‡β€β™€οΈ

JPAμ—μ„œ μž„λ² λ””λ“œ νƒ€μž…(볡합 κ°’ νƒ€μž…)μ΄λž€ μƒˆλ‘œμš΄ κ°’ νƒ€μž…μ„ 직접 μ •μ˜ν•΄ μ‚¬μš©ν•˜λŠ” 것이닀.

μž„λ² λ””λ“œ νƒ€μž… μ—­μ‹œ int, String처럼 κ°’ νƒ€μž…μ΄λ‹€.

❓ μž„λ² λ””λ“œ νƒ€μž…μ„ μ“°λŠ” 이유

❗ μƒμ„Έν•œ 데이터듀을 κ΄€λ ¨ μžˆλŠ” νƒ€μž…μœΌλ‘œ λ¬Άμ–΄ 객체지ν–₯적이고 응집λ ₯ λ†’κ²Œ λ§Œλ“€κΈ° μœ„ν•΄.

예λ₯Ό λ“€μ–΄..

νšŒμ› 엔티티에 "이름, 근무 μ‹œμž‘μΌ, 근무 μ’…λ£ŒμΌ, μ£Όμ†Œ μ‹œ/κ΅°/ꡬ, μ£Όμ†Œ λ²ˆμ§€, μ£Όμ†Œ 우편번호"와 같은 속성듀이 μžˆλ‹€λ©΄

μ„œλ‘œ κ΄€λ ¨μžˆλŠ” 정보λ₯Ό λ¬Άμ–΄ "이름, 근무기간, μ£Όμ†Œ"둜 κ΄€λ¦¬ν•˜λŠ” 것이 더 λ‚«λ‹€.

이 λ•Œ 상세 데이터듀을 λ¬ΆλŠ” "근무기간", "μ£Όμ†Œ"λ₯Ό μž„λ² λ””λ“œ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•΄ μ‚¬μš©ν•  수 μžˆλ‹€.

βœ” μž„λ² λ””λ“œ νƒ€μž…μ˜ μž₯점

  • μž¬μ‚¬μš©μ„±
  • 높은 응집도
  • ν•΄λ‹Ή μž„λ² λ””λ“œ νƒ€μž…λ§Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ 생성 κ°€λŠ₯

βœ” μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš©λ²•

  • @Embeddable : κ°’ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 곳에 ν‘œμ‹œ
  • @Embedded : κ°’ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 곳에 ν‘œμ‹œ
  • μž„λ² λ””λ“œ νƒ€μž…μ€ κΈ°λ³Έ μƒμ„±μžκ°€ ν•„μˆ˜
  • μž„λ² λ””λ“œ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ° μ „κ³Ό 후에 λ§΅ν•‘ν•˜λŠ” ν…Œμ΄λΈ”μ€ κ°™λ‹€ - μž„λ² λ””λ“œ νƒ€μž…μ€ μ—”ν‹°ν‹°μ˜ 값일 λΏμž„

κΈ°μ‘΄ Dish에 ν¬ν•¨λ˜μ–΄ 있던 image κ΄€λ ¨ 속성듀을 뢄리해 κ΄€λ¦¬ν•˜λ˜, DBν…Œμ΄λΈ”μ€ λ”°λ‘œ λ§Œλ“€κ³  싢지 μ•Šμ„ λ•Œ, μ•„λž˜μ™€ 같이 μ²˜λ¦¬ν•œλ‹€.

(λΆ„λ¦¬ν•œ 속성듀 : mainImage, topImage, thumbImages, detailSection)

Spring Data JDBCμ—μ„œλŠ” μ•„λž˜μ™€ 같이 Embededλ₯Ό μ‚¬μš©ν•œλ‹€.

Dish.java

public class Dish {

    @Id
    private String id;

    private String alt;
    private String deliveryType;
    private String title;
    private String description;
    private String normalPrice;
    private String sellingPrice;
    private String badge;
    private Long categoryId;
    private String deliveryInfo;
    private String deliveryFee;
    private int stock;
    private String point;

    @Embedded.Nullable
    private Image image;

    // ...
}

Image.java

public class Image {

    private String mainImage;
    private String topImage;
    private String thumbImages;
    private String detailSection;

    public String getMainImage() {
        return mainImage;
    }

    public String getTopImage() {
        return topImage;
    }

    public String getThumbImages() {
        return thumbImages;
    }

    public String getDetailSection() {
        return detailSection;
    }
}

Image객체λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” @Embededμ²˜λ¦¬ν•œ μƒμœ„ 엔티티인 Dish객체λ₯Ό ν™œμš©ν•œλ‹€.

public static DishResponseDto of(Dish dish) {
    Image image = dish.getImage();
    return new DishResponseDto(dish.getId(), image.getMainImage(), dish.getAlt(),
        dish.getDeliveryType(), dish.getTitle(), dish.getDescription(),
        dish.getNormalPrice(), dish.getSellingPrice(), dish.getBadge());
}

JPAμ—μ„œλŠ” μ•„λž˜μ™€ 같이 Embededλ₯Ό μ‚¬μš©ν•œλ‹€.

μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš© μ „

// μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ
@Entity
public class Member {

  @Id @GeneratedValue
  private Long id;
  private String name;

  // 근무 κΈ°κ°„
  @Temporal(TemporalType.DATE)
  Date startDate;
  @Temporal(TemporalType.DATE)
  Date endDate;

  // 집 μ£Όμ†Œ ν‘œν˜„
  private String city;
  private String street;
  private String zipcode;
  // ...
}

μž„λ² λ””λ“œ νƒ€μž… μ‚¬μš© ν›„

@Entity
public class Member {

  @Id @GeneratedVAlue
  private Long id;
  private String name;

  @Embedded
  private Period workPeriod;    // 근무 κΈ°κ°„

  @Embedded
  private Address homeAddress;    // 집 μ£Όμ†Œ
}
@Embeddable
public class Peroid {

  @Temporal(TemporalType.DATE)
  Date startDate;
  @Temporal(TemporalType/Date)
  Date endDate;
  // ...

  public boolean isWork (Date date) {
    // .. κ°’ νƒ€μž…μ„ μœ„ν•œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€
  }
}
@Embeddable
public class Address {

  @Column(name="city") // 맀핑할 컬럼 μ •μ˜ κ°€λŠ₯
  private String city;
  private String street;
  private String zipcode;
  // ...
}

βœ” 엔티티와 μž„λ² λ””λ“œ νƒ€μž…μ˜ 관계

  • UML : μ»΄ν¬μ§€μ…˜(composition, ꡬ성) 관계
  • ν•˜μ΄λ²„λ„€μ΄νŠΈ : μ»΄ν¬λ„ŒνŠΈ(components, κ΅¬μ„±μš”μ†Œ) 관계

μ•„λž˜λŠ” μ»΄ν¬μ§€μ…˜ 관계 UML κ·Έλ¦Ό.img