- 장점
- 상태가 없고, 행위만 가진 클래스이다.
- 상태가 없기 때문에 인스턴스화가 필요없어 기본 생성자를 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 |