Coupon Entity
package so.ego.re_darling.domains.coupon.domain;
import lombok.*;
import so.ego.re_darling.domains.user.domain.User;
import javax.persistence.*;
import java.time.LocalDateTime;
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "coupon")
@Entity
public class Coupon {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull private String title;
private String content;
private LocalDateTime useDate;
@Enumerated(value = EnumType.STRING)
private CouponStatus status;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "receiver_id")
private User receiver;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "sender_id")
private User sender;
@Builder
public Coupon(@NonNull String title, String content, LocalDateTime useDate, CouponStatus status) {
this.title = title;
this.content = content;
this.useDate = useDate;
this.status = status;
}
}
@ManyToOne
์๋ฅผ๋ค์ด Coupon ์ ์ฅ์์ receriver User๋ 1๋ช ๋ฟ์ด๊ณ ๊ทธ ํ๋ช ์ด ์ฌ๋ฌ๊ฐ์ Coupon์ ์์งํ ์ ์๋ค.
์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ๊ณ ์๋ Coupon์ด Many ์ด๊ธฐ ๋๋ฌธ์ User ์ Coupon ์ ์ฐ๊ด๊ด๊ณ๋ @ManyToOne ์ด๋ค.
๋จ๋ฐํฅ์ผ๋ก ์ค์ ํ ์ด์ ๋ User๋ฅผ ์กฐํํ๋ฉด์ Coupon ๊น์ง ์กฐํํ ๋ชฉ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋๋ก Coupon์ ์กฐํํ ๋๋ ๋ฐ๋์ฌ๋์ธ User์ ์ ๋ณด๋ฅผ ํ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ User๊น์ง ์กฐํํ ๋ชฉ์ ์ด ์๋ค.
fetch = FetchType.LAZY *( ๋์ค์ ๋ค์ ํ์ธํด๋ณด๊ธฐ )*
@ManyToOne ์ ๊ธฐ๋ณธ fetch ์ ๋ต์ EAGER์ ๋ต์ด๋ค(์ฆ์๋ก๋ฉ) EAGER ์ ํด๋น Entity๋ฅผ ์กฐํํ๋ฉด ์ฐ๊ด๋ Entity๊น์ง ๋ชจ๋ ์กฐํํ๋ค.
๋จ์ผ ์ ๋ณด๋ฉด ์กฐํํ๋๋ฐ๋ ์ฐ๊ด๋ Entity๊น์ง ์กฐํํ๋ฉฐ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด N+1 ๋ฌธ์ ์ธ๋ฐ ์ด ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด LAZY๋ฅผ ์ค์ ํ๋ค.
ํ ์คํธ๋ฅผ ์๋์ ๊ฐ์ด ํด๋ดค์ผ๋ EAGER, LAZY ๋๋ค ์๋์๊ฐ์ด ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
ํ ์คํธ ์ฝ๋๊ฐ ์๋ชป๋๊ฑด์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค

package so.ego.re_darling.domains.coupon.domain;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.transaction.annotation.Transactional;
import so.ego.re_darling.domains.user.domain.User;
import so.ego.re_darling.domains.user.domain.UserRepository;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
@Transactional
class CouponTest {
@Autowired CouponRepository couponRepository;
@Autowired UserRepository userRepository;
@Test
@DisplayName("LAZY์ ๋ต ์คํ")
void lazyTest() {
User a = userRepository.save(User.builder().socialToken("a").build());
User b = userRepository.save(User.builder().socialToken("b").build());
couponRepository.save(Coupon.builder().receiver(a).sender(b).title("non-null").build());
couponRepository.save(Coupon.builder().receiver(b).sender(a).title("non-null").build());
System.out.println("=====Find ALL=====");
List<Coupon> couponList = couponRepository.findAll();
System.out.println("==========");
for (Coupon c : couponList) {
System.out.println(c.getReceiver().getSocialToken());
}
}
}
cascade = CascadeType.ALL
@OneToMany, @ManyToOne ์ ๊ฑธ์ด์ค ์ ์๋ค. ํด๋น ์ปฌ๋ผ์ด ์ญ์ ๋๋ฉด ๊ฐ์ด ์ญ์ ๋ ์ ์๋๋ก ์ค์ ํ๊ฒ์ด๋ค.
PERSIST,REMOVE ๋ฑ ์ต์ ์ด ์์ง๋ง ๋ณดํต ALL์ ์ฃผ๊ณ ์ฌ์ฉํ๋ค.
์์ 22.02.17
-> @ManyToOne์ ๊ฑธ๋ฉด ๋ง์ด ์๋๋ ๋ถ๋ถ์ด ์ปคํํ ์ด๋ธ - ๋ค์ด์ด๋ฆฌ ํ ์ด๋ธ์ด ์์ ๊ฒฝ์ฐ ๋ค์ด์ด๋ฆฌ ํ ์ด๋ธ์์ cascade๋ฅผ ๊ฑธ์ด์ฃผ๋ฉด
๋ค์ด์ด๋ฆฌ๊ฐ ์ญ์ ๋ ๋ ์ปคํ ๊น์ง ์ญ์ ํ๋๊ฒ์ด๋ค. ์์ฐ๋๊ฑธ๋ก...
@JoinColumn
๋ฐ๋์ฌ๋๊ณผ ๋ณด๋ธ ์ฌ๋์ ๊ตฌ๋ณํ๊ธฐ ์ํด receiver,sender ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
๋๋ค user ์ด๊ธฐ ๋๋ฌธ์ @JoinColumn ์ ์ด๋ฆ์ ๋ค๋ฅด๊ฒ ํ๋ค.
name = " " ์ด ๋ถ๋ถ์๋ user์ pk ์ ์ฐ๊ฒฐํด์ฃผ๋ ์ธ๋ํค ์ปฌ๋ผ๋ช ์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
'Project > DARLING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
7. CI/CD ๊ณํ (0) | 2022.02.09 |
---|---|
6. ๋ฌด์์ด ๋ฌธ์ ์ผ๊น ... (0) | 2022.01.25 |
5. Spring REST Docs ์ฌ์ฉ (0) | 2022.01.24 |
4. ์ฐ๊ด๊ด๊ณ - OneToMany (0) | 2022.01.23 |
2. Entity (0) | 2021.12.03 |