엔티티 생성과 업데이트에 단일 Builder 패턴을 사용하는 것이 좋은 관행일까?

발행: (2026년 5월 27일 AM 11:29 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

Problem

Node.js (TypeScript) 백엔드에서 Permission 객체를 레포지토리 계층에 전달하기 전에 생성하기 위해 Builder 패턴을 구현하고 있습니다. 생성과 업데이트 모두에 동일한 Builder를 재사용하고 싶지만, id의 존재 여부와 검증 규칙이 동작에 따라 완전히 달라집니다.

  • 생성 시

    • id 속성은 절대 전달되지 않습니다 (데이터베이스가 자동으로 생성).
    • namemodule은 모두 반드시 존재해야 합니다.
  • 업데이트 시

    • id는 반드시 존재해야 합니다.
    • namemodule은 선택 사항이 되며, 두 필드가 모두 없을 수는 없습니다 (최소 하나는 제공되어야 함).
    • 필드가 제공되지 않으면 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

  1. id가 생성 시에는 없고 업데이트 시에는 필수인 이러한 조건부 로직을 하나의 Builder 안에서 처리하는 것이 좋은 관행인가요, 아니면 CreatePermissionBuilderUpdatePermissionBuilder처럼 두 개의 별도 Builder로 나누는 것이 좋을까요?

  2. 단일 Builder를 유지하는 것이 옳다면, id 존재 여부에 따라 필수 필드가 동적으로 변하는 페이로드를 처리하기 위해 내부 상태와 build() 메서드를 어떻게 재구성해야 할까요?

0 조회
Back to Blog

관련 글

더 보기 »