Lombok ๊ธฐ๋ฅ ์ค์ ์์ฑ์ ๊ด๋ จํ ์ด๋ ธํ ์ด์ ์ด ์ธ ๊ฐ๊ฐ ์๋ค. ํ์ ๋์ค ์ค๋ฅ๋ฅผ ์ก๋ค๊ฐ ๊ทธ ๊ธฐ๋ฅ๋ค์ ๋ํด ์์ธํ ์์๋ณด๋ ค๊ณ ํ๋ค.
์ผ๋จ ์๋ฌ๊ฐ ๋ฌ๋ ์์ธ๊ณผ ํด๊ฒฐ๋ฒ๋ถํฐ !
์๋ฌ์์ธ
ํด๋์ค ๋ณ์์
@OneToMany(mappedBy = "orders")
private List<Receipt> receipts = new ArrayList<>();
๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํด์ฃผ๋ ๋ถ๋ถ์ด ์์๋๋ฐ ๋น๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๊ธฐํ๊ฐ ๋์ง ์์๋ค. ๊ทธ๋์ ์๊พธ NPE ๋ฐ์ (๋น๋ ํจํด์ ์ด์ฉํ๋ฉด ์๋ ์ด๊ธฐ๊ฐ์ด ์ธํ ๋๋ค๊ณ ํจ)
์๋ฌํด๊ฒฐ
package com.myproject.demo.domain;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
public class Orders {
@Builder
public Orders(Long memberId, LocalDateTime orderDate) {
this.memberId = memberId;
this.receipts = new ArrayList<>();
this.orderDate = orderDate;
}
public Orders() {
}
@Id @GeneratedValue
private Long id;
private Long memberId;
@Builder.Default
@OneToMany(mappedBy = "orders")
private List<Receipt> receipts = new ArrayList<>();
private int totalPrice;
private LocalDateTime orderDate;
public void setTotalPrice(int amount) {
this.totalPrice = amount;
}
public void setReceipts(Receipt receipt) {
getReceipts().add(receipt);
}
}
์ด๊ธฐ๊ฐ์ ์ฌ์ฉํ๊ณ ์ถ์ ํ๋์ Builder.Default๋ฅผ ์จ์ค๋ ๋์ง๋ง ๋น๋ ๋ฉ์๋์ธ์ง ์ ํํ๊ฒ ์ ์ ์๋๋ก ๋ฐ๋ก ์์ฑ์๋ฅผ ๋ง๋ค์๋ค.
@Builder
์ผ๋จ ๋น๋๋ ์ ์ฐ๋๊ฐ?
ํ์ํ ๋ฐ์ดํฐ๋ง ์ค์ ๊ฐ๋ฅํ๊ณ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Member {
private String name;
private int age;
public Member() {}
public Member(String name, int age) {
}
}
์ด๋ ๊ฒ ํด๋์ค ๋ณ์๊ฐ ์ ์ ๊ฒฝ์ฐ์ ํฌ๊ฒ ๋ฌธ์ ๋์ง ์์ง๋ง ๋ง์ฝ ๋๊ตฐ๊ฐ๊ฐ ์ ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ ํ์ ๊ฒฝ์ฐ์
...
private String addr;
private String school;
private String company;
public Member(String name, int age, String addr, String school, String company) {
}
์ด๋ ๊ฒ ์ถ๊ฐํ ๋๋ง๋ค ๋ ๋ค๋ฅธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ผ ํ๊ฑฐ๋ ๊ธฐ์กด์ ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๊ตฌ๋ฌธ์ ์์ ํด์ฃผ์ด์ผ ํ๋ค
new Member('name', 100);
-> new Member('name',100,'secret', null, null);
๋ ํ๋ผ๋ฏธํฐ์ ์์ ๋ํ ์ง์ผ์ค์ผ ํ๋ฏ๋ก ๋ณ์ ์ ์ธ ์์๋ผ๋ ๋ฐ๋๋ฉด ์์ ํด์ผ ํ ๋ถ๋ถ์ด ํ ๋๊ตฐ๋ฐ๊ฐ ์๋ ๊ฒ์ด๋ค !
์ฆ ๋น๋ ํจํด์ ์ด๋ฐ ๋ณ๊ฒฝ๊ณผ ํ์ ์ ๋ํด ์ ์ฐํ๊ฒ ๋์ฒ ๊ฐ๋ฅํ๋๋ก ํ ํจํด์ด๋ ๊ฒ.
(๋น๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ @Builder.Default๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ํ๋ฒ ์์๋ดค์ผ๋ ๊ตณ์ด ์ ์ง ์๊ฒ ๋ค!)
@NoArgsConstructor
๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ค๋ค. @Builder์๋ ๋จ ๋์ด ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ๋น๋๋ ์์ฑ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๋ชจ๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์์ฑํ๋๋ฐ @NoArgsConstructor๋ ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๋น๋๊ฐ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ์ง ์๊ฒ ๋๊ณ ๊ทธ๋ผ ๋น๋๋ฅผ ํ๋ ๊ณผ์ ์์ ์๋ง์ ์์ฑ์๋ฅผ ์ฐพ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๋ฅผ ๋ธ๋ค!
๊ฐ๋จ ์์ฝ :
@NoArgsConstructor ์กด์ฌ
// @NoArgsConstructor(access = AccessLevel.PROTECTED)
protected Member() {}
@Builder ๐ญ ์์ฑ์๊ฐ ์์ผ๋ ๋ฐ๋ก ๋ง๋ค ํ์๊ฐ ์๊ตฐ..
public User build() {
return new User(this.name, this.age);
}
@Builder ๐ญ ๋น๋ํ๋ ค๋๋ฐ ์๋ง์ ์์ฑ์๊ฐ ์๋ค..?
์๋ฌ โโผ๏ธ๐ซ
@AllArgsConstructor
@AllArgsConstructor๋ ํด๋์ค์ ์กด์ฌํ๋ ๋ชจ๋ ํ๋์ ๋ํ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋ค. (@Builder์ @NoArgsConstructor๋ฅผ ๊ฐ์ด ์ฌ์ฉํด์ ์๋ฌ๊ฐ ๋ ๋ ๋๋ถ๋ถ @AllArgsConstructor๋ฅผ ์ถ๊ฐํด์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋๊ฑธ ๋ง์ด ๋ณผ ์ ์์๋ค.)
๋ฌด์์ ํด๋์ค์ ๋น๋๋ฅผ ๋ฃ๊ธฐ๋ณด๋จ ์ด๋ค ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ์ฐ์ฌ์ผ ํจ์จ์ ์ธ์ง ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ์ง์ !!!