Helper Class란 ?
객체 지향 프로그래밍 에서 헬퍼 클래스는 해당 애플리케이션이나 해당 클래스의 주요 목적이 아닌 일부 기능을 제공하는 데 사용한다.
위키피디아의 Helper Class 를 보면 다음과 같이 정의하고 있다. 게다가 단어의 의미에서도 알 수 있듯 도움을 주는 클래스다. 특정 작업을 수행하거나 여러 클래스에서 공통적으로 사용될 수 있는 보조적인 메서드나 기능을 제공하는 클래스다.
일반적으로 특정 작업을 단순화하거나 반복적인 작업을 처리하는데 사용한다. 다양한 메서드를 제공하며, 상태를 유지하거나, 객체로서 다른 객체와 협력한다. 또한 서비스 클래스나 비즈니스 로직을 돕는 역할을 한다.
Helper Class의 특징
☑️ 보조적 역할 : 다른 클래스의 작업을 보조하는 역할을 하며, 복잡한 로직을 간결하게 처리할 수 있다.
☑️ 정적 메서드 사용 : 헬퍼 클래스는 정적 메서드를 자주 사용하여, 객체를 생성하지 않고 바로 메서드를 호출할 수 있도록 한다.
☑️ 재사용성 : 한 번 구현된 헬퍼 클래스는 여러 곳에서 재사용 가능하며, 유지보수에 용이하다.
Helper Class의 장점
- 중복 코드 제거: 여러 클래스에서 동일한 작업을 반복적으로 수행해야 할 때, 이를 헬퍼 클래스에 집중시켜 중복을 제거한다.
- 유틸리티 기능 제공: 문자열 처리, 날짜 및 시간 계산, 데이터 포맷 변환 등 공통으로 사용되는 유틸리티 기능을 제공한다.
- 단일 책임 원칙(SRP): 헬퍼 클래스는 하나의 기능에 집중하며, 여러 기능을 가진 클래스를 분리하는 데 도움을 준다.
- 재사용 성 : 한 번 구현된 헬퍼 클래스는 다양한 클래스에서 재사용할 수 있다.
Helper Class의 단점
- 객체 지향 설계 원칙 위반 가능성: 지나치게 많은 정적 메서드를 사용하면, 객체 지향 설계 원칙에서 캡슐화와 상속의 장점이 사라질 수 있다. 헬퍼 클래스가 너무 많은 기능을 맡고 있다면 책임 분리가 제대로 이루어지지 않을 수 있으므로 조심해야한다.
- 테스트 어려움: 정적 메서드는 테스트가 어려울 수 있다. 특히, 단위 테스트에서 외부 의존성이 있는 정적 메서드를 모킹하기 어려워 테스트 코드가 복잡해질 수 있다.
Helper Class의 예시
▶️ 날짜 관련 헬퍼 클래스
날짜와 관련된 공통 기능을 헬퍼 클래스로 분리할 수 있다.
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateHelper {
// 날짜를 원하는 형식으로 변환
public static String formatDate(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
// 날짜 차이 계산 (예: 일 차이)
public static long getDaysBetween(Date startDate, Date endDate) {
long diff = endDate.getTime() - startDate.getTime();
return diff / (1000 * 60 * 60 * 24); // 밀리초 -> 일 단위로 변환
}
}
사용 예시
public class EventService {
public void displayEventDetails(Date eventDate) {
String formattedDate = DateHelper.formatDate(eventDate, "yyyy-MM-dd");
System.out.println("Event Date: " + formattedDate);
}
public void printDaysUntilEvent(Date eventDate) {
Date currentDate = new Date();
long daysLeft = DateHelper.getDaysBetween(currentDate, eventDate);
System.out.println("Days until event: " + daysLeft);
}
}
Helper Class vs Service Class
헬퍼 클래스와 서비스 클래스는 비슷한 역할을 할 수 있지만, 목적과 책임이 다르다.
✅ 헬퍼 클래스: 주로 유틸리티성 작업을 처리하는 클래스로 단순한 작업이나 반복적인 기능을 제공한다.
✅ 서비스 클래스: 애플리케이션의 비즈니스 로직을 처리하는 클래스로 여러 작업을 조합하여 비즈니스 로직을 수행하고, 상태를 관리한다.
따라서 객체 지향 설계와 책임 분리를 고려하여, 너무 많은 기능을 하나의 헬퍼 클래스에 담지 않도록 주의해야한다.
Helper Class vs Utility Class
유틸 클래스 (Utility Class)
유틸 클래스는 특정 기능을 수행하는 메서드들을 묶은 클래스다. 유틸 클래스는 주로 한 가지 목적을 가지고 있으며, 특정 문제 해결을 위한 도구처럼 사용된다. 유틸리티 클래스는 상태(state)를 가지지 않으며, 대부분 모든 메서드를 static 로 구현한다.
Utility Class 특징
- 상태 없음 (Stateless): 유틸 클래스는 상태를 저장하지 않으며, 모든 메서드는 독립적으로 실행된다. 예를 들어, Math 클래스의 메서드처럼 클래스의 필드를 갖지 않으며, 메서드는 독립적이다.
- 정적 메서드: 유틸 클래스는 대부분 정적 메서드로 구성된다. 이는 객체 생성 없이 클래스의 메서드를 직접 호출할 수 있게 해준다.
- 기능적 목적: 보통 반복적으로 사용되는 간단한 작업이나 수학적, 문자열, 날짜 처리 등 간단하고 공통적인 기능을 제공한다.
- 상속 불가능: 보통 유틸 클래스는 상속할 필요가 없는 클래스로 설계되므로. private 생성자를 사용하여 객체 생성 불가하도록 설정한다.
예시
public class MathUtils {
// 두 수의 합을 반환하는 메서드
public static int add(int a, int b) {
return a + b;
}
// 두 수의 차이를 반환하는 메서드
public static int subtract(int a, int b) {
return a - b;
}
// private 생성자로 객체 생성 방지
private MathUtils() {
throw new UnsupportedOperationException("Utility class");
}
}
사용 예시
int sum = MathUtils.add(5, 3); // 8
Helper Class vs Utility Class 비교 표
항목 | 헬퍼 클래스 (Helper Class) | 유틸 클래스 (Utility Class) |
---|---|---|
상태 | 상태 있음 (Stateful) | 상태 없음 (Stateless) |
메서드 | 인스턴스 메서드로 구현 가능 | 대부분 정적 메서드로 구현 |
객체 생성 | 객체 생성이 가능하고, 상태를 관리할 수 있음 | 객체를 생성하지 않음 (정적 메서드만 사용) |
용도 | 복잡한 작업을 지원하는 보조 클래스 (비즈니스 로직 지원) | 단순한 유틸리티 기능 (문자열 처리, 수학 계산 등) |
상속 | 상속 가능 (확장이 가능) | 상속이 불필요하고, 상속할 수 없음 |
공통 예시 | FileHelper , JsonHelper , ValidationHelper |
Math , StringUtils , DateUtils |
언제 유틸 클래스와 헬퍼 클래스를 사용할까?
- 유틸 클래스:
- 간단하고 반복적인 작업을 처리할 때 유용하다. 예를 들어, 문자열 처리, 날짜 계산, 수학적 계산 등 간단하고 독립적인 작업을 처리할 때 사용한다.
- 정적 메서드로 작업을 처리하므로, 객체를 생성할 필요 없이 빠르게 사용할 수 있다.
- 헬퍼 클래스:
- 복잡한 작업이나 여러 작업을 조합하여 처리해야 할 때 유용히다. 예를 들어, 파일 처리, 네트워크 요청 처리, 유효성 검사 등에서 사용된다.
- 상태를 유지하거나, 객체 지향적인 방식으로 작업을 처리해야 할 때 사용된다.
결론
- 비즈니스 로직을 지원하거나 복잡한 작업을 처리해야할 때
- 객체 지향적인 설계가 필요한 경우, 즉 객체의 상태를 관리하고, 다양한 클래스와 협력하여 작업을 처리할 때
- 특정 기능이 여러 클래스에서 재사용될 수 있는 경우
다음의 경우 헬퍼 클래스를 도입하는 것이 적절하고, 객체지향의 관점에서 단일책임원칙(SRP)를 항상 고려해서 코드를 작성해야한다 !!
'Backend > Spring' 카테고리의 다른 글
ServiceHelper를 통한 Service 코드 책임 분리 (0) | 2025.04.01 |
---|---|
BaseTimeEntity와 JPA Auditing: 왜 사용할까? (0) | 2025.04.01 |
JPA와 영속성 컨텍스트 (0) | 2025.03.31 |
[Spring 기초] 일정 관리 앱 만들기 (0) | 2025.03.26 |
JWT 토큰 인증 이란? (0) | 2025.03.25 |