자바 에서 객체를 생성하는 다양한 방식 중 최근 알게된 방식이다.
좀더 이해하기 위해 찾아보며 작성함!
객체를 여러 곳에서 재사용할 경우, 경우에 따라 생성되는 객체에서 사용할 파라미터가 다르다면
기존의 방식으로는 새로운 생성자를 만들어야 했다.
하지만 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
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();
세팅해 주는 값이 어떤 매개 변수인지 이해하기 쉽고, 불필요하게 생성자를 만들 필요가 없다는 장점이 있다.
그러나 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 Pattern이라는게 있어서 더 편리하게 사용가능하다.
단, Builder 패턴을 사용해 객체 생성시, Json 값을 바로 할당하지 못하는 에러가 발생한다면 @Jacksonized 어노테이션을 써볼것.
[추가]
Record를 사용하는 경우, Builder를 사용해도 @Jacksonized를 사용하지 않아도 자동으로 입력 받아준다.
자바 Vo -> Entity 리스트 변환 : stream, map, collect & 람다식 (0) | 2023.04.10 |
---|---|
[Spring Boot] 테스트 클래스와 @Transactional 어노테이션 (1) | 2023.03.05 |
[Spring boot] 테스트 케이스 작성하기 (0) | 2023.02.22 |
[Spring Boot] Entity와 Repository (0) | 2023.02.20 |
[Spring Boot] 웹개발 - 정적 컨텐츠, MVC + 템플릿 엔진, API (0) | 2023.02.19 |