T_era

헬퍼(Helper)와 유틸(Utility)의 차이, 그리고 실전 코드 예시 본문

Programing/Spring

헬퍼(Helper)와 유틸(Utility)의 차이, 그리고 실전 코드 예시

블스뜸 2025. 6. 25. 17:44

개발하다 보면 “헬퍼 클래스”, “유틸 클래스”들을 자주 보게 된다.
둘 다 공통 기능을 모아놓은 클래스라는 점은 비슷한데,
실제로는 어떤 차이가 있을까?
그리고 언제 Helper, 언제 Util을 써야 할까?


1. 헬퍼(Helper)란?

헬퍼(Helper)

  • “특정 상황에서, 어떤 객체의 동작을 도와주는 역할”
  • 상태(필드)를 가질 수 있고,
  • 보통 객체로 생성해서 사용하는 경우가 많음

예시: 이메일 전송을 도와주는 Helper

public class EmailHelper {
    private final EmailSender sender;

    public EmailHelper(EmailSender sender) {
        this.sender = sender;
    }

    public void sendWelcomeEmail(String to, String name) {
        String subject = "Welcome!";
        String body = "안녕하세요, " + name + "님!";
        sender.send(to, subject, body);
    }
}

Q. Helper는 왜 상태(필드)를 가질 수 있나요?
A. Helper는 실제로 “도와주는 역할”을 하면서,
내부적으로 의존성(EmailSender 등)을 가질 수 있기 때문이다.
즉, 상황에 따라 다르게 동작할 수 있다.


2. 유틸(Utility)이란?

유틸(Utility)

  • “어디서나 쓸 수 있는, 순수 기능(stateless) 모음”
  • 상태(필드)가 없고,
  • 보통 static 메서드로만 구성
  • 객체 생성 없이 바로 사용

예시: 문자열 관련 유틸

public class StringUtil {
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }

    public static String capitalize(String str) {
        if (isEmpty(str)) return str;
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
}

Q. 왜 유틸은 static 메서드만 쓸까요?
A. 상태가 없고, 어디서나 바로 쓸 수 있어야 하니까
객체를 만들 필요가 없다.


3. 실무에서 헷갈리는 부분

Q. “Helper랑 Util이랑 사실상 똑같은 거 아냐?”

  • 비슷해 보이지만, 의도가 다르다
  • Helper는 상황에 따라 다르게 동작할 수 있고,
    Util은 항상 똑같이 동작해야 한다.

Q. “Helper도 static 메서드만 있으면 Util 아닌가요?”

  • 맞다
    실제로 Helper/Util 구분이 엄격하지 않은 프로젝트도 많다고 한다.
  • 하지만 Helper는 “도와주는 역할”,
    Util은 “순수 기능 모음”이라는 의도를 코드에서 드러내면
    협업/유지보수에 더 좋다.

4. Spring 실무에서의 예시

1) 유틸 클래스 예시 (stateless, static)

public class JwtUtil {
    public static String substringToken(String token) {
        // ... 토큰 앞뒤 Bearer 제거
    }
    public static Long getUserId(String token) {
        // ... 토큰에서 userId 추출
    }
}
  • 상태 없음
  • static 메서드만
  • 어디서나 바로 사용

2) 헬퍼 클래스 예시 (상태, 의존성 주입)

@Component
public class EmailHelper {
    private final JavaMailSender mailSender;

    @Autowired
    public EmailHelper(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void send(String to, String subject, String body) {
        // ... 실제 메일 전송
    }
}
  • 상태(필드) 있음
  • 의존성 주입
  • 상황에 따라 다르게 동작

5. 언제 Helper, 언제 Util?

  • 상태가 필요 없고, 순수 기능만 제공Util
  • 상태(필드)나 의존성이 필요Helper
  • static 메서드만Util
  • 객체로 만들어서 써야 함Helper

Q. 실무에서는 구분이 엄격한가요?
A. 아니다!
프로젝트마다 Helper/Util 구분이 애매할 수 있다.
하지만 “이 클래스의 의도가 무엇인지”를 명확히 하면
협업, 유지보수, 테스트가 훨씬 쉬워진다.


6. 마치며

  • Helper와 Util은 비슷해 보이지만, 의도와 사용 방식이 다르다.
  • Helper는 “상황에 따라 도와주는 역할”,
    Util은 “어디서나 쓸 수 있는 순수 기능 모음”
  • static, 상태, 의존성이 있는지 없는지로 구분하면 쉽습니다.