정적 팩토리 메서드 네이밍의 차이 (of vs from)

2024. 11. 4. 17:12Java

public record FindCouponsResponse(List<FindCouponResponse> coupons) {

    public static FindCouponsResponse from(final List<Coupon> coupons) {
        return coupons.stream()
                .map(FindCouponResponse::from)
                .collect(Collectors.collectingAndThen(Collectors.toList(), FindCouponsResponse::new));
    }

    public record FindCouponResponse(Long couponId, String name, String description, Integer discount, LocalDate endAt) {

        public static FindCouponResponse from(final Coupon coupon) {
            return new FindCouponResponse(
                    coupon.getId(),
                    coupon.getName(),
                    coupon.getDescription(),
                    coupon.getDiscount(),
                    coupon.getEndAt());
        }
    }
}
public record FindCartItemsResponse(List<FindCartItemResponse> cartItems) {
    public static FindCartItemsResponse from(final List<FindCartItemResponse> cartItemsResponse) {
        return new FindCartItemsResponse(cartItemsResponse);
    }
}

public record FindCartItemResponse(Long cartId, Long itemId, Integer quantity) {

    public static FindCartItemResponse of(final long cartId, final long itemId, final Integer quantity) {
        return new FindCartItemResponse(cartId, itemId, quantity);
    }
}

왜 위 아래의 코드를 같은 형식의 포맷으로 작성하지 않고, 나뉘는가에 대한 궁금증에 의한 글입니다.


// 1) of 사용 - 단순 파라미터 전달 public static FindCartItemResponse of(Long cartId, Long itemId, int quantity) { return new FindCartItemResponse(cartId, itemId, quantity); }

// 2) from 사용 - 다른 객체로부터의 변환 public static FindCouponResponse from(final Coupon coupon) { return new FindCouponResponse( coupon.getId(), coupon.getName(), coupon.getDescription(), coupon.getDiscount(), coupon.getEndAt() ); }
  • of: 주로 단순히 파라미터들을 모아서 인스턴스를 생성할 때 사용
  • from: 다른 타입의 객체를 변환하여 새로운 인스턴스를 생성할 때 사용
// 1) 분리된 구조
public record FindCartItemResponse(Long cartId, Long itemId, int quantity) { ... }
public record FindCartItemsResponse(List<FindCartItemResponse> cartItems) { ... }

// 2) 중첩된 구조
public record FindCouponsResponse(List<FindCouponResponse> coupons) {
    public record FindCouponResponse(...) { ... }
}
  • 분리된 구조: 두 record가 독립적으로 존재
  • 중첩된 구조: 응답 객체가 논리적으로 강하게 연관되어 있음을 표현
// 1) 단순 List 래핑
public static FindCartItemsResponse from(List<FindCartItemResponse> responses) {
    return new FindCartItemsResponse(responses);
}

// 2) Stream을 사용한 복잡한 변환
public static FindCouponsResponse from(List<Coupon> coupons) {
    return coupons.stream()
        .map(FindCouponResponse::from)
        .collect(Collectors.collectingAndThen(
            Collectors.toList(), 
            FindCouponsResponse::new
        ));
}

같은 내용이다.

'Java' 카테고리의 다른 글

JWT 그런데 OAuth2.0 곁들인 (2)  (1) 2024.11.10
JWT 그런데 OAuth2.0 곁들인  (1) 2024.11.08
SSE(Server-Sent Events)  (0) 2024.11.06
QueryDSL 아이템 목록 페이징 처리  (0) 2024.10.31
StringUtils 라이브러리  (0) 2024.10.29