Builder Pattern의 toBuilder

짱센호랑이·2023년 11월 27일

toBuilder

간단하다. 기존 Builder로 생성된 객체의 값 일부를 변경하여 새로운 객체를 생성한다.

나는 프로젝트에서 주로 변경 기능 (회원 정보 수정, 글 수정) 등의 기능을 구현할 때 사용하였다.

Member Entity가 다음과 같이 작성되어 있다고 보자.


@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class Member {

	
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
    @NotNull
    private String email;
    @NotNull
    private String name;
    @NotNull
    private String age;
    @NotNull
    private String job;
    
    
}

앞서 알아본 builder 패턴으로 객체를 생성해서 jpa를 통해 저장(회원가입)까지 해보겠다.


// ... memberService

public void regist(MemberRegistReqestDto requestDto){

	Member member = Member.builder()
    				.email(requestDto.getEamil())
                    .name(requestDto.getName())
                    .age(requestDto.getAge())
                    .job(requestDto.getJob())
                    .build();
                    
   memberRepository.save(member);

}

이제 생성된 정보를 수정하려면 어떻게 해야할까?
나는 toBuilder를 사용하였다.

// ... memberService
public void modify(MemberModifyReqeustDto requestDto){

//기존 객체 불러오기
	Member member = memberRepository.findById(memberId)
	.orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_MEMBER));

	Member updateMember = member.toBuilder().
				.age(requestDto.getAge())
                .build();
                
	memberRepository.save(updateMember);               
}

다음과 같이 작성하였다.

기존 member 객체의 정보가 updateMember 객체에 그대로 저장되었고 여기서내가 수정하고 싶은 필드만 수정하면 나머지 필드는 기존의 것 그대로 저장되게 되고 수정하고 싶은 필드만 수정된다.

회원 정보 수정 시 Id나 이름 등과 같이 불변하는 요소들을 제외하고 age, job 등 가변성 있는 정보만 수정할 때 용이하게 사용된다.

어떤식으로 동작되냐면

  1. DB에 저장되어있는 Member 객체를 Id를 기반으로 찾는다.
  2. 찾은 정보를 member라는 이름의 Member 객체에 저장한다.
  3. toBuilder를 사용해 updateMember에 member를 그대로 복사한다.
  4. 원하는 필드 (age) 만 변경한 후 DB에 저장한다.
  5. 식별자인 Id는 기존 member의 Id이기 때문에 update되어 저장된다.

이와 같이 회원 정보 수정이 아주 간단하게 toBuilder를 사용하여 구현되었다.

사용법은 @Builder에 @Builder(toBuilder=true) 를 추가해주면 끝난다!

profile
뭐라도 해야지

0개의 댓글