개발/개발 잡담

정적 팩토리 메소드 컨벤션 : from() 과 of()

배워서, 남주자 2025. 2. 3. 22:13

오늘 회사 동료의 코드를 리뷰하면서 제안드린 내용을 정리합니다.

 


from()of() 는 일반적으로 정적 팩토리 메소드(Static Factory Method)의 이름으로 사용되며, 각각 미묘한 의미적 차이를 가지고 있습니다.

 

아래는 동료가 작성했던 PR의 코드 중 일부분입니다.

public static Product of(DraftProduct draft) {

	return Product.builder()
    			.name(draft.getName())
    			... // 중략
    			.build();
}

보기에는 딱히 이상한 부분이 없죠.

다만, 일반적으로 메소드 네이밍 컨벤션에서 of() 는 아래와 같은 의미로 사용됩니다.

 

  • 명확하고 직관적인 값 반환: of()는 주어진 인자를 사용하여 명확한 인스턴스를 생성하는 경우에 사용됩니다.
  • 직접적인 변환 없음: 보통 입력값을 추가적인 가공 없이 사용하여 새 객체를 만들거나 반환합니다.

 

즉, 아래와 같이 표현할 때 많이 사용합니다.

    public static Product of(String name, int price) {
        return new Product(name, price);
    }

 


코드 리뷰

그래서 아래와 같이 from() 을 사용해서 우리 프로젝트의 컨벤션과 동일하게 가져가는것이 어떨지 제안 드렸습니다.

public static Product from(DraftProduct draft) {

	return Product.builder()
    			.name(draft.getName())
    			... // 중략
    			.build();
}

위와 같이 메소드 네이밍 컨벤션에서 from() 은 아래와 같은 의미로 사용됩니다.

 

  • 다른 타입을 변환하여 객체 생성: from()은 일반적으로 다른 타입의 객체나 데이터를 기반으로 새 객체를 생성하는 경우 사용됩니다.
  • 데이터 가공이 포함될 수 있음: 입력을 변환하여 내부 필드에 적절한 값으로 매핑하는 과정이 포함될 수 있습니다.
  • 메소드 인자로 받은 다른 타입의 객체의 일부분이 사용되지 않을 수 있음: DraftProduct 의 인스턴스 필드에 price 가 있더라도, Product 의 구성요소에 가격과 관련한 필드가 없더라면 사용되지 않을 수 있습니다. 

 


자바 표준 라이브러리 코드에서의 사용 예제

  • Java Collection Framework : List.of(), set.of() 등등
  • LocalDate / LocalDateTime : LocalDate.of(), LocalDate.from() 등
var numberList = List.of(1, 2, 3);
var alphabetSet = Set.of("A", "B", "C");

LocalDate x = LocalDate.of(2021, Month.MARCH, 27);
ZoneId zoneId = ZoneId.of("Africa/Casablanca");
ZonedDateTime zdt = ZonedDateTime.now(zoneId);
LocalDate y = LocalDate.from(zdt);

 


✅ 정리 (차이점 비교)

  메소드의미 주된 사용 목적 변환 과정
of() 명확한 값 반환 주어진 인자를 그대로 사용해 객체를 생성 없음
from() 변환 후 객체 생성 다른 타입을 변환하여 새로운 객체를 생성 있음

 


🔥 어떤 경우에 사용할까?

  • 객체를 직접 만들 때 → of()
  • 다른 객체나 데이터를 변환하여 만들 때 → from()

예를 들어, 엔티티에서 DTO 변환 같은 경우 from()을 쓰는 것이 일반적이며, 값을 직접 지정하여 객체를 만들 때 of()를 사용하는 것이 적절합니다.

💡 Best Practice

  • of() → 직관적인 팩토리 메서드
  • from() → 타입 변환이 포함된 팩토리 메서드

 

 


ref.https://docs.oracle.com/javase/tutorial/datetime/overview/naming.html