상세 컨텐츠

본문 제목

Builder pattern과 @Jacksonized

Programming/BackEnd

by Dal_pang 2023. 5. 7. 23:17

본문

Builder Pattern

자바 에서 객체를 생성하는 다양한 방식 중 최근 알게된 방식이다.
좀더 이해하기 위해 찾아보며 작성함!

객체를 여러 곳에서 재사용할 경우, 경우에 따라 생성되는 객체에서 사용할 파라미터가 다르다면
기존의 방식으로는 새로운 생성자를 만들어야 했다.

하지만 Builder패턴을 사용하면 더 이상 생성자를 여러 개 만드는 번거로움을 줄일 수 있다.
예를 들어 다음과 같은 Person 클래스를 만드는 경우.

@NoArgsConstructor
@AllargsConstructor 
Public class Person {
	private String name;
    private String genter;
    private String ethnicity;
    private int age;
    private int height;
    private int family_number;
}

기존의 방식

Person user = new Person("Jane Doe", "F", "American", 28, 160, 4);

이와 같이 생성자를 통해 생성 시, 일부 파라미터만 넘겨 생성자를 사용하려면 새로운 생성자 유형을 추가해줘야 한다.

 


*** 수정자도 비슷한 귀찮음이 존재한다.

하지만 Builder 패턴 사용 시 @Builder 어노테이션만 써주면 더 이상의 설정을 추가하지 않아도 다음과 같이 바로 사용가능하다.
@Builder 어노테이션은 롬복이 지원해 주는 어노테이션임!

 

Builder Pattern 

객체 클래스

@Builder
Public class Person {
	private String name;
    private String genter;
    private String ethnicity;
    private int age;
    private int height;
    private int family_number;
}

빌더 패턴 사용예제

Person user = Person.builder()
             .name("Jane Doe")
             .gender("F")
             .age(28).build();

 

세팅해 주는 값이 어떤 매개 변수인지 이해하기 쉽고, 불필요하게 생성자를 만들 필요가 없다는 장점이 있다.


@Jacksonized 

그러나 Builder패턴을 적용함으로써 나는 에러도 있다!

웹 프로젝트 작성 시 보통 데이터를 json형태로 보내는 경우가 많은데, 이때 바로 에러가 나게 된다.
이는 Builder 패턴을 적용해 세팅하는 객체가 json 데이터를 제대로 인식하지 못해서 나는 에러인데 보통
Constructor가 없다고 나올 것이다.

이 문제를 해결하기 위해서는 @Jacksonized 어노테이션을 사용할 수 있다. (클릭 시 롬복 공식 홈페이지로 이동)
아직 실험적으로 사용되는 방식이긴 하지만 이게 무슨 일을 하는 건지 알고 나면 왜 안 쓰나 싶은 기능이다.

@Jacksonized는 꼭 @Builder 또는 @SuperBuilder와 함께 사용해야 하며 결과적으로는 다음과 같은 작동을 한다.

1) Json 데이터를 Deserialize 하고 (아래의 예제는 공식홈페이지에서 가져옴.)

@JsonDeserialize(builder=Foobar.FoobarBuilder[Impl].class))

2) @JsonIgnoreProperties와 같은 Jackson관련 어노테이션을 확인한 후
3) @JsonPOJOBuilder(withPrefix="")를 통해 Jackson 기본 prefix(접두사)인 "with"를 replace 한다. (setterPrefix를 통해 다른 접두사 세팅 가능)


@Jacksonized를 사용한 버전과 안사용한 버전의 예제를 작성해 놓은 좋은 블로그가 있어서 첨부한다.

https://kapentaz.github.io/java/Builder%EB%A1%9C-Jackson-Deserialize%ED%95%98%EA%B8%B0/#

 

Builder로 Jackson Deserialize하기

개인적으로는 DTO 클래스가 필요할 때 불변 클래스로 만드는 것을 선호합니다.여러 장점이 있지만 그 중에서도 객체 값이 중간에 변경될 일이 없기 때문에 다른 걱정이 없이 사용할 수 있는 장점

kapentaz.github.io


Summary

기존 생성자, 수정자 사용 객체 생성을 넘어 Builder Pattern이라는게 있어서 더 편리하게 사용가능하다.
단, Builder 패턴을 사용해 객체 생성시, Json 값을 바로 할당하지 못하는 에러가 발생한다면 @Jacksonized 어노테이션을 써볼것.

[추가]
Record를 사용하는 경우, Builder를 사용해도 @Jacksonized를 사용하지 않아도 자동으로 입력 받아준다.

728x90

관련글 더보기