간단하다. 기존 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 등 가변성 있는 정보만 수정할 때 용이하게 사용된다.
어떤식으로 동작되냐면
- DB에 저장되어있는 Member 객체를 Id를 기반으로 찾는다.
- 찾은 정보를 member라는 이름의 Member 객체에 저장한다.
- toBuilder를 사용해 updateMember에 member를 그대로 복사한다.
- 원하는 필드 (age) 만 변경한 후 DB에 저장한다.
- 식별자인 Id는 기존 member의 Id이기 때문에 update되어 저장된다.
이와 같이 회원 정보 수정이 아주 간단하게 toBuilder를 사용하여 구현되었다.
사용법은 @Builder에 @Builder(toBuilder=true) 를 추가해주면 끝난다!