본문으로 바로가기

'Lombok에서 생성자 없이 사용하기'

 

그동안 객체를 만들고 나면 직접적으로 사용하기 위해 생성자를 사용하였다.

 

하지만 이것마저 편하게 해주는 기능이 있었으니...

 

그것은 바로 @Builder

 

사용 방법 : 

 

@Builder와 @NoArgsConstructor를 함께 사용하려면, 

@AllArgsConstructor도 함께 사용하거나 모든 필드를 가지는 생성자를 직접 만들어 줘야 한다. 

@Builder를 사용할 때 @NoArgsConstructor뿐만 아니라 손수 만든 다른 생성자가 있다면, 그 때도 모든 필드를 가지는 생성자가 필요하다.

 

엔티티 파일 (Product.java)

import com.sun.istack.NotNull;
import com.teckstudy.book.domain.entity.enums.ProductType;
import lombok.*;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long product_sn;

    @Column(length = 30)
    private String product_name;

    @Enumerated(EnumType.STRING)
    private ProductType product_option;

    @Column(length = 11)
    @NotNull
    private Integer price;

    @Column(length = 10)
    private Integer stock_cnt;

}

 

@Builder없이 기존 구현 한 생성자로 만든 소스 (직접 넣어주는 사례가 발생)

Product product1 = new Product("오라클과 SQL", ProductType.RADIO, 50000, 30);
Product product2 = new Product("Real Mysql", ProductType.CHECK, 35000, 50);

productRepository.save(product1);
productRepository.save(product2);

 

@Builder를 이용한 리팩토링

String[] bookList = {"해리포터", "반지의 제왕", "이것이 자바다", "기분이 없는 기분"};

for(int i=0; i<bookList.length; i++) {
	Product product= Product.builder()
		.product_name(bookList[i])
		.product_option(random.nextInt(2) % 2 == 0 ? ProductType.RADIO : ProductType.CHECK)
		.price(Integer.valueOf(random.nextInt(99999)+1))
		.stock_cnt(Integer.valueOf(random.nextInt(99)+1))
		.build();

	productRepository.save(product);
}