Static Factory Method

송형근·2024년 8월 28일
0

TIL

목록 보기
24/43
post-thumbnail

프로젝트에서 Dto를 Entity로 상호 변환하는 과정에서 Entity의 생성자 대신 Dto에서 Static Factory Method를 사용하는 방식을 적용했고, Method 명을 어떻게 지으면 좋을지 고민하며 여러 자료를 찾아보고 정리하게 되었음

Static Factory Method 란?

  • 생성자가 아닌 Static Method를 통해 인스턴스를 생성하는 방식

Static Factory Method 네이밍 규칙

  • from : 하나의 매개 변수를 받아서 인스턴스를 반환하는 경우
    • ex) Date date = Data.from(instant);
  • of : 여러 매개 변수를 받아서 인스턴스를 반환하는 경우
    • ex) Set cards = EnumSet.of(JACK, QUEEN, KING);
  • getInstance or instance : 생성된 인스턴스라면 그대로 반환하고 아니면 새로 생성하는 경우 ( Singleton)
    • ex) StackWalker luke = StackWalker.getInstance(option);
  • newInstance or create : 새로운 인스턴스를 반환하는 경우
    • ex) Object array = Array.newInstance(classObject, length);
  • get{Type} : getInstance와 동일하나, 클래스의 타입이 아닌 정의한 {Type}을 반환하는 경우
    • ex) FileStore fs = Files.getFileStore(path);
  • new{Type} : newInstance와 동일하나, 클래스의 타입이 아닌 정의한 {Type}을 반환하는 경우
    • ex) BufferedReader br = Files.newBufferedReader(path);

프로젝트 적용

  • Entity를 ResponseDto로 변환하기 위해 사용
    @Getter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class PaymentResDto {
        private UUID paymentId;
        private String userName;
        private UUID orderId;
        private String pResultId;
        private Long paymentAmount;
    
        public static PaymentResDto from(Payment payment) {
            return PaymentResDto.builder()
                    .paymentId(payment.getPaymentId())
                    .userName(payment.getUserName())
                    .orderId(payment.getOrder().getOrderId())
                    .pResultId(payment.getPResultId())
                    .paymentAmount(payment.getPaymentAmount())
                    .build();
        }
    }
  • 실제 사용 예시
        public PaymentResDto getPayment(UUID paymentId, String userName){
            Payment payment = paymentRepository.findOneByPaymentIdAndDeletedAtIsNull(paymentId).orElseThrow(()->{
                log.error("결제 정보를 찾을 수 없음");
                return new ResponseStatusException(HttpStatus.NOT_FOUND, "주문 정보를 찾을 수 없음");
            });
            if(!payment.getUserName().equals(userName)){
                log.error("접근할 수 없음");
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "접근할 수 없음");
            }
            return PaymentResDto.from(payment);
        }
    • payment 정보를 DB에서 가져온 후 ResDto로 from 메서드를 통해 변환

참고

profile
기록을 남겨보자

0개의 댓글