Java - 정적 팩토리 메서드

TopOfTheHead·2025년 11월 11일

자바 ( JAVA )

목록 보기
18/23

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

생성자와 달리 메서드명을 임의로 설정할 수 있음
메서드명으로 어떤 생성 & 변환 패턴인지 유추할 수 있도록 다음 관례를 추종해야한다

객체를 생성하면서 동시에 실행해야할 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개의 댓글