Util 클래스를 써야하나? @Component를 써야하나?

이돈이면 official·2023년 8월 22일
4

회원정보처리

목록 보기
1/1

작성자: 우아한테크코스 5기 호이

이돈이면 프로젝트에서 별 생각없이 구현하고 있었는데..

케로의 질문..

상태를 가지지 않는 TokenGenerator 무엇으로 구현해야할까..?

@Component
public class TokenGenerator {

    public String getBasicToken(final String email, final String password) {
        String valueToEncode = email + ":" + password;
        return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
    }
}

지선생님의 답변

질문: @Component 클래스와 Util 클래스(static 메소드)의 차이와 언제 어떤걸 사용하는지 알려줘

답변:
@Component 클래스:

  • 주로 비즈니스 로직, 서비스, 데이터 액세스와 같은 핵심 애플리케이션 로직을 구현할 때 사용됩니다.
  • DI를 활용하여 다른 빈과 협력하며, 스프링의 기능을 활용하여 트랜잭션 관리, 보안, AOP 등을 적용할 수 있습니다.
  • 애플리케이션의 핵심 기능을 제공하는 데 사용됩니다.

Util 클래스 (Static 메소드):

  • 재사용 가능한 유틸리티 기능 또는 헬퍼 메소드를 제공할 때 사용됩니다.
  • 상태를 가지지 않으며, 순수한 로직을 실행하는 데 사용됩니다.
  • 인스턴스 생성 없이 직접 접근 가능하므로 간단한 작업을 처리할 때 유용합니다.

어떤 것을 선택할지는 해당 클래스의 목적과 역할에 따라 다릅니다. 핵심 비즈니스 로직은 @Component 클래스로 구현하고, 반면에 재사용 가능한 유틸리티 함수나 헬퍼 메소드는 Util 클래스에 추가하여 코드를 구성하는 것이 일반적인 패턴입니다.

TokenGenerator의 경우 상태를 가지지 않는다. email과 password를 입력하면 그저 base 64로 인코딩한 토큰을 넘겨줄 뿐!

그렇다면 Util 클래스로 생성해야 하는가?

→ 아니다. 우리가 로그인시 제공하는 Token은 인증 서비스에서 핵심 로직이라고 볼 수 있다.

추가로 @Component 를 사용하면 Bearer 토큰을 사용한다고 하면 해당 구현체를 구현하고 의존성 주입을 받을 수 있다.

public interface TokenGenerator {

    public String getToken(final String email, final String password);
}
@Component
public class BasicTokenGenerator implements TokenGenerator {

    public String getToken(final String email, final String password) {
        String valueToEncode = email + ":" + password;
        return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
    }
}
@Component
public class TokenGenerator implements TokenGenerator {

    public String getToken(final String email, final String password) {
        String valueToEncode = email + ":" + password;
        return "Bearer " + Bearer.getEncoder().encodeToString(valueToEncode.getBytes());
    }
}

위와 같이 기존에 확장 가능성을 고려해두고 구현했으면 리뷰하는 입장에서도 @Component를 쓸지 Util 클래스를 쓸지 좀 더 이해하기 쉬웠을 거 같다!

profile
이돈이면 기술 블로그입니다 🫶🏻

0개의 댓글