카테고리 없음

[ 호돌맨 요절복통 개발쇼 ] Builder

sian han 2022. 8. 2. 21:17

테스트 만들기 : ctrl + shift + T





@Builder

@ToString
@Data
public class PostCreate {

    @NotBlank(message ="타이틀을 입력해주세요.")
    public String title;

    @NotBlank(message ="콘텐츠를 입력해주세요.")
    public String content;

    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
}


setter를 사용해서 set 하거나 필드에 바로 값을 꽂아버리는 방식보다
생성자로 set 하는 걸 좋아한다.

근데 만약 어떤 사이코패스같은 개발자가 생성자 위치를

public PostCreate(String content, String title) {
this.title = title;
this.content = content;
}

이렇게 변경해버리면 어떨까 ? ( 악마가 아닐까 )당연히 에러가 나겠지 (String,String 이니까)
근데 어디서 에러가 났는지 찾기가 매우 어려울 것이다
이런걸 방지하기 위해 @Builder 를 사용해주면 됨

▶ @Builder

- 자바 디자인 패턴에 Builder라는 패턴이 있음 참조 : https://mangkyu.tistory.com/163
- 보통 생성자 위에 달아줌 ( 클래스 위에 달수도 있긴한데 다른 어노테이션과 겹쳐서 작동이 안될수도있음 )

    @Builder
    public PostCreate(String title, String content) {
        this.title = title;
        this.content = content;
    }
PostCreate request = PostCreate.builder()
                .title("제목입니다")
                .content("내용입니다")
                .build();




▷ Builder 의 장점
- 가독성이 좋다 (파라미터가 뭐 몇십개가 있으면 순서에 맞춰서 값을 넣어주기가 힘듦)
- 값 생성에 대한 유연함
- 필요한 값만 받을 수 있다
ㄴ 예를들어 나는 title만 필요할때 title 만 인자로 받는 생성자를 하나더 만들어야 한다 ==> 지저분해짐
- 객체의 불변성


▷ Builder 사용전


ErrorResponse.java

@Getter
@RequiredArgsConstructor
public class ErrorResponse {
    private final String code;
    private final String message;
    private final Map<String,String> validation = new HashMap<>();

    
    public void addValidation(String fieldName,String errorMessage){
        this.validation.put(fieldName,errorMessage);
    }
}


ExceptionController.java




▷ Builder 사용후

ErrorResponse.java


ExceptionController.java