오늘 회사 동료의 코드를 리뷰하면서 제안드린 내용을 정리합니다.
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