고민의 시작
다시 사이드 프로젝트를 진행하게 되면서, 공통 로직에 대한 고민을 하게 되었는데요.
고민한 내용으로는
- 공통 유틸을 스프링 빈 등록 vs static method
- 만약, 스프링 빈으로 등록해야 하는 근거는 뭔지
이 두 가지가 궁금 했습니다.
결론부터 말하면, 스프링 빈으로 등록 된 다른 Component 들과 상호 작용이
필요한 경우에는 스피링 빈으로 등록하고 그 이외의 경우에는 static 메서드로 이루어진
클래스로 만들어 사용하는 것이 좋다는 것 입니다.
그럼 예시를 들어 작성해보겠습니다.
예시
예시로 두가지 유틸을 작성해보겠습니다.
아래의 메서드는 순수 자바로직으로만 이루어진 유틸로 LocalTime 을 생성하는 로직입니다.
위에서 정리한 내용과 같이 다른 빈들 외부 리소스에 의존을 하지 않는 경우에
static 메서드로 만들어 사용하는 것이 더 좋다고 생각합니다.
public class TimeUtil {
public static LocalDateTime createLocalDateTime() {
return LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
}
public static LocalDateTime createLocalDateTimeInSystemZone() {
return LocalDateTime.now();
}
}
아래의 Jwt 유틸 같은 경우에는 다른 빈들과 함께 동작하는 경우도 존재하며,
@Value 어노테이션과 함께 사용하기 때문에, 빈으로 등록하여 사용하게 되었습니다.
@Component
public class JwtUtil {
private final String ALGORITHM =Jwts.SIG.HS256.key().build().getAlgorithm();
private final long EXPIRATION_TIME = 1000L * 60 * 60 * 24 * 7;
private final SecretKey secretKey;
public JwtUtil(@Value("#{environment['jwt.secret-key']}") String SECRET_KEY) {
this.secretKey = new SecretKeySpec(SECRET_KEY.getBytes(StandardCharsets.UTF_8), ALGORITHM);
}
}
결론
결론적으로, 외부 의존성이 없고 순수 기능적인 유틸리티는 static 메서드로 구현하는 것이 합리적이라 생각하고
다른 빈의 의존성이 필요하거나 설정 주입이 필요한 경우에는 @Component 어노테이션을 사용해
유틸 메서드를 만드는 것이 좋다고 생각하게 되었습니다.
사실, 이 부분을 고민하게 되면서 성능에 대한 영향을 줄거 같았지만?
그렇게 크게 영향은 주지 않는다고 합니다?
따라서 성능에 집중하기 보다는 유지보수, 테스트의 용이성과 같은 고려를 하면서
추가적인 유틸 클래스를 생성하면 될거라 생각합니다.
요약
- 외부 의존성이 없고 순수 기능적인 유틸리티는 static 메서드
- 다른 빈의 의존성이 필요하거나 설정 주입이 필요한 경우에는 빈 등록
- 성능에는 큰 영향 X, 유지보수, 테스트의 용이성을 고려하여 작성
반응형
'프로젝트 기록 > spring' 카테고리의 다른 글
[Spring] AOP 를 활용한 횡단 관심사 구현 (0) | 2024.02.29 |
---|---|
[spring] @ComponentScan 의 대상 위치 (0) | 2024.01.21 |