엔티티 생성과 업데이트에 단일 Builder 패턴을 사용하는 것이 좋은 관행일까?
Source: Dev.to
Problem
Node.js (TypeScript) 백엔드에서 Permission 객체를 레포지토리 계층에 전달하기 전에 생성하기 위해 Builder 패턴을 구현하고 있습니다. 생성과 업데이트 모두에 동일한 Builder를 재사용하고 싶지만, id의 존재 여부와 검증 규칙이 동작에 따라 완전히 달라집니다.
-
생성 시
id속성은 절대 전달되지 않습니다 (데이터베이스가 자동으로 생성).name과module은 모두 반드시 존재해야 합니다.
-
업데이트 시
id는 반드시 존재해야 합니다.name과module은 선택 사항이 되며, 두 필드가 모두 없을 수는 없습니다 (최소 하나는 제공되어야 함).- 필드가 제공되지 않으면
null혹은undefined상태로 유지되어 레포지토리가 해당 컬럼을 덮어쓰지 않도록 해야 합니다.
import { CustomError } from "../../../shared";
export class PermissionBuilder {
private name: string = '';
private module: string = '';
constructor() {}
setName(name: string): PermissionBuilder {
if (!name || !name.trim()) throw CustomError.badRequest('Name cannot be empty');
this.name = name;
return this;
}
setModule(module: string): PermissionBuilder {
if (!module || !module.trim()) throw CustomError.badRequest('Module cannot be empty');
this.module = module;
return this;
}
build(): { name: string; module: string } {
return {
name: this.name,
module: this.module,
};
}
}
Questions
-
id가 생성 시에는 없고 업데이트 시에는 필수인 이러한 조건부 로직을 하나의 Builder 안에서 처리하는 것이 좋은 관행인가요, 아니면CreatePermissionBuilder와UpdatePermissionBuilder처럼 두 개의 별도 Builder로 나누는 것이 좋을까요? -
단일 Builder를 유지하는 것이 옳다면,
id존재 여부에 따라 필수 필드가 동적으로 변하는 페이로드를 처리하기 위해 내부 상태와build()메서드를 어떻게 재구성해야 할까요?