작성자: 우아한테크코스 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
클래스:
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 클래스를 쓸지 좀 더 이해하기 쉬웠을 거 같다!