처음부터 차근차근
Builder pattern과 @Builder 본문
빌더 패턴이란
객체를 정의할 때 생성자를 통해서 정의하는게 아니라 builder를 이용해서 정의하는 방법을 빌더 패턴이라고 한다.
Post post = new Post(1, "테스트", "테스트 내용", "2022-07-28 18:26:39", 0, 1, 2);
->
Post post = Post.builder()
.id(1)
.title("테스트")
.content("테스트 내용")
.writeTime("2022-07-28 18:26:39")
.viewCount(0)
.state(1)
.writerId(2)
.build();
빌더를 사용하는 이유
1. 생성자의 매개변수가 많으면 가독성이 떨어진다.
위의 board에서 봤듯이 각 값들이 어떤 값을 의미하는 지 알기 힘들다.
물론 ide 에서는 매개변수 옆에 어떤 값인지 나와있지만 만약 ide를 사용하지 않고 코드만 본다면 그 의미를 알기 힘들 것이다.
반면에 빌더를 사용하면 옆에 바로 변수명이 있기 때문에 가독성이 좋다.
그리고 값 넣는 순서를 착각하는 것을 방지해서 사전에 에러를 예방할 수 있다.
2. 매개변수의 순서를 상관하지 않아도 된다.
생성자는 매개변수를 반드시 순서대로 넣어줘야하는데 빌더는 이름만 맞추면 순서와 상관없이 값을 넣을 수 있다.
@Builder
class Cat {
private int age;
private String name;
}
위 클래스의 builder를 만드려면 아래와 같이 만들어야한다.
class Cat {
private int age;
private String name;
private Cat(int age, String name) {
this.age = age;
this.name = name;
}
public static CatBuilder builder() {
return new CatBuilder();
}
public static class CatBuilder {
private int age;
private String name;
private CatBuilder() {}
public CatBuilder age(int age) {
this.age = age;
return this;
}
public CatBuilder name(String name) {
this.name = name;
return this;
}
public Cat build() {
return new Cat(age, name);
}
}
}
참~~~길다.
spring 라이브러리 중 lombok은 @Builder 어노테이션을 지원해서 builder를 자동생성해준다.
@Builder
class Cat {
private int age;
private String name;
}
그래서 이렇게 사용하기만 하면 위의 긴 코드를 일일히 다 작성하지 않아도 된다!
@Builder.Default
빌더 패턴을 통해 객체를 만들 때 특정 필드를 특정 값으로 미리 초기화하는 어노테이션이다.
변수 기본값 지정할 때 사용하기 좋은 어노테이션이다.
예를 들어
@ToString
@Builder
class Cat {
private int age;
@Builder.Default
private String name = "nero";
}
이렇게 어노테이션을 붙이고 값을 미리 초기화하면
public class Main {
public static void main(String[] args) {
Cat cat = Cat.builder().age(1).build();
System.out.println(cat.toString());
}
}
age 변수만 초기화하고 출력해봤을 때
Cat(age=1, name=nero)
이런식으로 "nero"가 기본 값으로 초기화되서 출력된다.
참고 : https://pamyferret.tistory.com/67
'Framework > Spring' 카테고리의 다른 글
테스트 주도개발(TDD) (0) | 2022.08.14 |
---|---|
db 설정정보 외부 파일로 옮기기 (0) | 2022.08.10 |
스프링 이니셜라이즈를 이용한 스프링 부트 프로젝트 생성 방법 (0) | 2022.07.12 |
Logback : 로그 색상 수정 (0) | 2022.06.22 |
@DeleteMapping과 @PutMapping (1) | 2022.05.24 |