JVM/Java

[Lombok] @Builder.ObtainVia 사용법과 toBuilder 개념

헹창 2024. 3. 21.
반응형

@Builder.ObtainVia

@Builder를 사용하여 여러분이 만든 클래스의 인스턴스를 생성하는 빌더를 만들 때  
(이것은 메서드에 @Builder를 추가하지 않는 한 항상 해당됩니다), 
@Builder(toBuilder = true)를 사용하여 이 클래스 내부에 toBuilder()라는 이름의 인스턴스 메서드도 생성할 수 있습니다. 
이 메서드는 현재 인스턴스의 모든 값으로 시작하는 새로운 빌더를 만듭니다. 
또한 매개변수(생성자 또는 메서드의 경우)나 필드(타입에 @Builder를 사용하는 경우)에 
@Builder.ObtainVia 주석을 넣어서 해당 필드/매개변수의 값을 이 인스턴스에서 가져오는 대체 수단을 나타낼 수 있습니다. 
예를 들어 메서드를 지정할 수 있습니다: @Builder.ObtainVia(method = "calculateFoo").
  • 즉, 특정 필드에 대해 메서드를 지정하여 값을 가공할 수 있다.

예제 코드

@Builder 객체

  • @Setter 를 사용하지 않고, @Builder 패턴을 사용하였다
  • 생성자는 @NoArgs-, @AllArgs- 만 지정하였다
@Getter
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private String firstName;
    private String lastName;
    private int age;

    @Builder.ObtainVia(method = "calculateFullName")
    private String fullName;

    public String calculateFullName() {
    
        if (this.fullName != null) {
            return this.fullName;
        }
        
        return String.join(firstName, " ", lastName);
    }
}
  • @Builder(toBuilder = true) 설정
  • @Builder.ObtainVia(method = "calculateFullName") 설정으로 fullName 데이터 가공

테스트 코드

  • build().toBuild().build();
  • calculateFullName
    • builder 생성 시 fullName 세팅한 경우는 해당 값을 리턴
    • builder 생성 시 fullName 세팅하지 않은 경우는 firstName + lastName 리턴
@Test
void BuilderPatternTest1() {
    
	Person person = Person.builder()
			.firstName("John")
			.lastName("Doe")
			.age(30)
			.build()
			.toBuild()
			.build();

	assertThat(person.getFullName).isEqualTo("John Doe"); 
	// result : success (true)
    
}

@Test
void BuilderPatternTest2() {
    
	Person person = Person.builder()
			.firstName("John")
			.lastName("Doe")
			.fullName("Christina")
			.age(30)
			.build()
			.toBuild()
			.build();

	assertThat(person.getFullName).isEqualTo("John Doe"); 
	// result : fail (false)

	assertThat(person.getFullName).isEqualTo("Christina"); 
	// result : success (true)
    
}

 

 

@Builder(toBuilder = true)

  • 빌더 객체를 복제하여 새로운 빌더 객체를 생성
  • @Builder 는 불변(immutable)한 객체를 생성하는 데 사용되며, 이는 생성된 객체를 변경할 수 없다는 것을 의미
  • 하지만, 생성된 객체 일부 필드를 수정하고 새로운 객체를 만들어야 할 때, toBuilder 기능을 사용할 수 있음
  • 이렇게 생성된 빌더를 통해 객체 필드를 수정하고, 새로운 객체를 생성할 수 있으며 기존 객체는 변경되지 않고 유지됨
Person person1 = Person.builder()
                              .firstName("John")
                              .lastName("Doe")
                              .age(30)
                              .build();

// 기존 객체에서 빌더를 사용하여 새로운 객체 생성
Person person2 = person1.toBuilder()
                                .age(40) // 나이 변경
                                .build();

 

 

 

더보기

728x90
반응형

댓글

추천 글