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