멋사 Backend Plus 32일차 🦁

μ‹ μž¬μ›Β·2023λ…„ 12μ›” 9일

μ˜€λŠ˜λ„ μ˜€μ „ μ˜€ν›„ νŒ€ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜μ˜€κ³ , μ˜€λŠ˜μ€ μ§€κΈˆ κΉŒμ§€ λ§Œλ“€μ—ˆλ˜ λ°±μ—”λ“œ κΈ°λŠ₯에 λŒ€ν•΄ λ¦¬μ•‘νŠΈ 기술둜 ν”„λ‘ νŠΈ μ—”λ“œλ₯Ό ν•˜λ£¨μ’…μΌ μ§„ν–‰ν•˜μ˜€λ‹€.
(νŒ€μ›λΆ„λ“€μ˜ 도움 덕뢄에 κ·Έλž˜λ„ μͺΌκΈˆ μ•Œ 것 κ°™κ³ , κ΅¬ν˜„ν•˜μ˜€λ‹€)

κ·Έλž˜λ„ 였늘 λ‹€λ₯Έ νŒ€μ›λΆ„μ˜ μ½”λ“œ 리뷰λ₯Ό ν•˜λ©΄μ„œ 처음 λ³Έ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆμ–΄ 정리할렀고 ν•œλ‹€. @DynamicInsert 와 @ColumnDefault 이 두 μ–΄λ…Έν…Œμ΄μ…˜ 이닀.

μ˜€μ „

  • λ§ˆμΌ“μ˜ 전체 μƒν’ˆ 쑰회 νŽ˜μ΄μ§€μ™€, μƒν’ˆμ„ 등둝 λ²„νŠΌμ΄ μžˆλŠ” νŽ˜μ΄μ§€

  • μƒν’ˆ 등둝 λ²„νŠΌμ„ ν΄λ¦­μ‹œ μƒν’ˆμ„ 등둝할 수 μžˆλŠ” νŽ˜μ΄μ§€

  • μƒν’ˆμ„ 등둝후 5개 λ‹¨μœ„λ‘œ νŽ˜μ΄μ§• 처리λ₯Ό ν•œ νŽ˜μ΄μ§€

λ°±μ—”λ“œ λ‹¨μ—μ„œλŠ” μˆ˜μ •, μ‚­μ œ, 상세보기 (μž₯λ°”κ΅¬λ‹ˆ λ‹΄κΈ°) λ“± κΈ°λŠ₯ κ΅¬ν˜„μ€ λŒ€κ°• λλ‚˜κ°€λŠ”λ°, ν”„λ‘ νŠΈ λ‹¨μ—μ„œ ν•˜λŠ”κ²Œ λ„ˆλ¬΄ μ–΄λ €μš΄ 것 κ°™λ‹€.

πŸ€” λ°±μ—”λ“œλ‘œ μ§€μ›ν•˜λ©΄ ν”„λ‘ νŠΈ μ½”λ“œλŠ” μ•„μ˜ˆ 쳐닀 보지도 μ•ŠλŠ”λ‹€λŠ”λ°, 이게 μ˜λ―Έκ°€ μžˆλ‚˜ 흠..
내일은 μž₯λ°”κ΅¬λ‹ˆ μƒν’ˆμ— λŒ€ν•œ 낙관적 락 κ³Ό 비관적 락에 λŒ€ν•΄μ„œ 정리할 μ˜ˆμ •μ΄λ‹€.

μ˜€ν›„

  • @DynamicInsert

κ°„λ‹¨ν•œ μƒν’ˆ (Product) μ—”ν‹°ν‹° 클래슀 μž…λ‹ˆλ‹€.
(@DynamincInsert μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄ μžˆμ§€ μ•ŠμŒ)

@Entity
@Getter
@Table(name = "product")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {
	
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "product_price")
    private String price;

    @Lob
    @Column(name = "product_content")
    private String content;

    @Column(name = "product_count")
    private Integer count;

    @Enumerated(EnumType.STRING)
    @Column(name = "product_category")
    private Category category;
    
    private String status;
}

ν¬μŠ€νŠΈλ§¨μ„ 톡해 status의 ν•„λ“œλ₯Ό μ œμ™Έν•œ μš”μ²­ (Request)을 λ³΄λƒˆμ„λ•Œ 쿼리가 λ°œμƒν•˜λŠ” λ™μ‹œμ— status의 λŒ€ν•œ 쿼리도 λ°œμƒν•˜κ²Œ λœλ‹€.

@DynamicInsert μ–΄λ…Έν…Œμ΄μ…˜μ„ 뢙이면 μ–΄λ–»κ²Œ λ κΉŒμš”?
➑ status ν•„λ“œμ— λŒ€ν•œ 쿼리가 λ°œμƒν•˜μ§€ μ•Šμ€ 것을 μ•Œμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

데이터 λ² μ΄μŠ€μ—λŠ” null둜 μ €μž₯λ˜λŠ” 것 을 μ•Œμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

@DynamicInser의 μž₯μ μœΌλ‘œλŠ” 효율적으둜 쿼리λ₯Ό μ‹€ν–‰ ν• μˆ˜ μžˆλ‹€λŠ” 점 μž…λ‹ˆλ‹€.

  • @ColumnDefault
@Entity
@Getter
@Table(name = "product")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {
	
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;

    @Column(name = "product_name")
    private String productName;

    @Column(name = "product_price")
    private String price;

    @Lob
    @Column(name = "product_content")
    private String content;

    @Column(name = "product_count")
    private Integer count;

    @Enumerated(EnumType.STRING)
    @Column(name = "product_category")
    private Category category;
    
    @ColumnDefault("'Y'")
    private String status;
}

ν•„λ“œ μœ„μ— @ColumnDefault(μ§€μ •ν•  κ°’) 을 μž‘μ„±ν•˜μ—¬ μ‚¬μš© ν•˜λ©΄ 되며,
쿼리가 λ°œμƒν•˜μ§€ μ•Šμ§€λ§Œ, μ„€μ • κ°’μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ΄ˆκΈ°ν™” λ˜λŠ” 것을 μ•Œμˆ˜ μžˆλ‹€.

➑ κΈ°λ³Έκ°’ μ„€μ •μ˜ κ°„νŽΈμ„±μ΄ 있으며, λ‚˜λŠ” μœ„ 2개의 μ–΄λ…Έν…Œμ΄μ…˜κ³Ό @SqlDelete μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 논리 μ‚­μ œλ₯Ό κ΅¬ν˜„ν•˜μ˜€λ‹€.


REFERNCE

https://velog.io/@choidongkuen/JPA-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-DynamicInsert-DynamicUpdate-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B4%85%EC%8B%9C%EB%8B%A4
(DynamicInsert, DynamicUpdate λΈ”λ‘œκ·Έ)

0개의 λŒ“κΈ€