Java

UtilClass

dev_minpark 2024. 9. 5. 10:56
  • 장점
    • 상태가 없고, 행위만 가진 클래스이다.
    • 상태가 없기 때문에 인스턴스화가 필요없어 기본 생성자를 private 로 선언한다.
    • 공통적으로 사용되는 메서드를 모아서 클래스로 만듦
    • 중복된 코드를 방지할 수 있다.
  • 단점
    • 객체지향적 프로그래밍이 아닌 절차지향적 프로그래밍에 가깝다.
    • 단위테스트를 어렵게 한다.
    • 다른 클래스와 점점 강결합이 되려고 한다.
      • 추상화를 진행하지 않았기에 유틸 클래스 수정 시 사용 객체에 많은 영향을 받게된다.

예시 ) QuerydslPredicateUtil

import ...

public class QuerydslPredicateUtil {
    /**
     * 값이 null 이 아니면 조건을 생성
     *
     * @param expression 조건 생성 함수 객체
     * @param value      값
     * @param <T>        값 타입
     * @return 조건
     */
    public static <T> Predicate ifNullNone(Function<T, Predicate> expression, T value) {
        if (ObjectUtils.isEmpty(value)) {
            return null;
        } else {
            return expression.apply(value);
        }
    }

    /**
     * 값이 null 이 아니면 or 조건을 생성
     * @param conditions
     * @return
     */
    public static BooleanBuilder ifNullNoneOr(Predicate... conditions) {

        BooleanBuilder builder = new BooleanBuilder();

        for (Predicate condition : conditions) {
            if (!ObjectUtils.isEmpty(condition)) {
                builder.or(condition);
            }
        }

        return builder;
    }

    /**
     * 값이 Null이 아니면 (path <= date) 조건 생성 (검색 종료일)
     * @param path 날짜 데이터 컬럼
     * @param date 조건 날짜
     * @return {@link BooleanExpression}
     */
    public static BooleanExpression ifNullNoneDateLoe(DateTimePath<LocalDateTime> path, String date) {
        String val = StringUtil.toOnlyNumStr(date);
        if (StringUtils.hasText(val)) {
            return path.loe(LocalDateTime.of(
                            DateUtil.toFormatLocalDate(val, "yyyyMMdd"),
                            LocalTime.of(23, 59, 59)));
        }
        return null;
    }

    /**
     * 값이 Null이 아니면 (path >= date) 조건 생성 (검색 시작일)
     * @param path 날짜 데이터 컬럼
     * @param date 조건 날짜
     * @return {@link BooleanExpression}
     */
    public static BooleanExpression ifNullNoneDateGoe(DateTimePath<LocalDateTime> path, String date) {
        String val = StringUtil.toOnlyNumStr(date);
        if (StringUtils.hasText(val)) {
            return path.goe(LocalDateTime.of(
                    DateUtil.toFormatLocalDate(val, "yyyyMMdd"),
                    LocalTime.of(0, 0, 0)));
        }
        return null;
    }

    /**
     * orderBy(null)
     * @return {@link OrderSpecifier}
     */
    public static OrderSpecifier orderByNull() {
        return new OrderSpecifier(Order.ASC, NullExpression.DEFAULT, OrderSpecifier.NullHandling.Default);
    }
}

 

lombok 사용 시 @UtilityClass 애노테이션을 붙히면 자동으로 메소드와 기본생성자에 static 키워드를 붙혀주지만

명시적으로 static 을 붙혀주는게 좋아보인다.

'Java' 카테고리의 다른 글

volatile  (0) 2024.08.02
collect(), toList() 비교  (0) 2024.07.11
Mac <-> Windows Unicode 자소 분리 개선  (0) 2024.07.11
javax.validation.constraints 밸리데이션 속성  (0) 2024.07.11