Java - 정적 팩토리 메서드 패턴

TopOfTheHead·2025년 11월 11일

자바 ( JAVA )

목록 보기
18/29

정적 팩토리 메서드 패턴 ( Static Factory Method )
자바 클래스객체 생성자를 간접적으로 호출하여 객체를 생성하는 static으로 선언된 메서드
클라이언트에게 객체 생성과정캡슐화하여 내부구현을 외부로부터 숨길 수 있다.

Map.of() 등의 메서드정적 팩토리 메서드 패턴을 기반으로 구현

정적 팩토리 메서드 패턴 사용 시 생성자private로 설정함으로써 생성자를 통한 생성을 차단

  • 정적 팩토리 메서드외부가 아닌, 도메인이 스스로 객체 생성을 주도
    。기존 @Builder 어노테이션을 비롯한 생성자를 통한 객체 생성외부( ex. Service Layer )에서 주도하므로, DDD에 적합하지 않음.

    클래스 객체를 수신 시 다른 객체로 수정하여 반환하는 로직Entity 클래스 내 작성함으로써 도메인 외부에서 생성을 주도하지 않고, 도메인 내부에서 생성을 주도
    ▶ 주로 Entity인자로 받으면 DTO로 반환하는 로직을 작성함으로써 사용자Entity 간 매핑을 고려하지 않도록 설정이 가능

    。 내부에 검증방어 로직을 작성함으로써 도메인 스스로 검증이 가능
public static MemberDetails from(Member member){
        if (member == null) throw new IllegalArgumentException("멤버를 찾지 못함");
        return MemberDetails.builder()
                .name(member.getName())
                .email(member.getEmail())
                .build()
                .setId(member.getId())
                .setRole(member.getRole());
    }
  • 생성자와 달리 메서드명을 임의로 설정할 수 있음
    메서드명으로 어떤 생성 & 변환 패턴인지 유추할 수 있도록 다음 관례를 추종해야한다

    객체를 생성하면서 동시에 실행해야할 logic을 동시에 정의가 가능
// ResponseEntity를 생성하는 정적 팩토리 메서드
	public static ResponseEntity<String> of(HttpStatus status, String code) {
		return ResponseEntity.status(status).body(code);
	}
public static <T> ApiResult<T> of(String code, String message, T data){
		return new ApiResult<>(code,message,data);
	}

데이터 요소를 포함하는 객체를 생성하므로 of()로 명명
<T> : 해당 메서드에서 Generic을 사용을 위해 명시하는 선언부

정적 팩토리 메서드 패턴 유형

  • DB EntityDB에서 가져오고 클라이언트에게 반환 시 민감정보를 제외한 DTO를 생성시에도 활용
    클라이언트에게 DB Entity 객체 반환 시 연관관계 객체 등 모든 field를 포함해서 반환하면 안되므로
public static Details of(MemberEntity memberEntity){
			return new Details(
				memberEntity.getLoginId(),
				memberEntity.getName(),
				memberEntity.getEmail()
			);
		}
  • 객체 생성 시 동시에 수행해야할 추가작업을 정의 시 활용
    ex ) DB Entity 객체 생성 시 동시에 연관관계에서 부모 Entity@OneToMany List<> 필드에 추가할 필요가 있을때 정적 팩토리 메서드 사용
// 자식 Entity 이므로 외래키 Field에 @ManyToOne을 선언
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="memberId") // DB Table의 외래키 field명 설정
private MemberEntity member;
// 캡슐화된 생성자
private OrderEntity(Receiver receiver, LocalDateTime deliveredAt, MemberEntity member, OrderStatus orderStatus) {
		this.receiver = receiver;
		this.deliveredAt = deliveredAt;
		this.member = member;
		this.orderStatus = orderStatus;
	}
// 정적 팩토리 메서드
public static OrderEntity of(Receiver receiver, MemberEntity member){
		var order = new OrderEntity(
			receiver,
			LocalDateTime.now().plusDays(3),
			member,
			OrderStatus.PENDING
		);
		member.mapToOrder(order); // 부모 Entity 객체에 생성된 OrderEntity객체 추가
		return order;
	}

정적 팩토리 메서드명관례
메서드명으로 어떤 생성 & 변환 패턴인지 유추할 수 있도록 다음 관례를 추종해야한다

  • of(요소1 , ...) :
    。복수의 데이터요소를 받아서 객체를 생성하여 반환하는경우 사용하는 메소드명
    ex ) Map.of(1,2,3, ...)

  • from() :
    변환 용도로 입력된 객체를 전달받아 객체를 생성하여 반환 시 사용하는 메소드명
    ex ) YearMonth.from(LocalDate.of(2023, 6, 20))

  • valueOf(요소) :
    변환 용도로 입력된 을 다른 Type으로 변환하여 반환 시 사용하는 메소드명
    ex ) String.valueOf(1)
profile
공부기록 블로그

0개의 댓글