Spring Bean VS StaticClass
kindof
·2022. 12. 10. 16:06
Spring bean과 Static 함수의 생성 시점은 아래와 같습니다.
[1] Spring bean : JVM 로드 → Tomcat 실행 → Component Scan 시점
[2] StaticClass Method : JVM에서 클래스가 메모리에 올라가는 시점
이 사실을 보면 Spring Bean 생성 시점보다 StaticClass 내부의 Method 생성 시점이 앞선다는 것을 알 수 있습니다. 뿐만 아니라, Spring bean과 StaticClass의 Method 모두 싱글톤을 보장한다는 점에서 공통점을 가집니다.
그렇다면 'Spring Bean을 대체해서 StaticClass를 정의해서 사용해도 될까'하는 의구심(?)이 스쳐지나가는데요.
이번 포스팅에서는 둘 사이의 차이점에 대해 짚어보고 어떤 상황에서 [Bean / StaticClass]를 사용하는 것이 더 나은지에 대한 내용을 정리해보겠습니다.
1. Spring Bean
공식 문서의 정의에 따르면, Spring bean은 Spring IoC 컨테이너에 의해 관리되는 자바 객체입니다.
IoC 컨테이너에 의해 관리되는 Bean은 싱글톤을 유지하며 생성과 사용, 소멸까지의 생명 주기 관리에 대한 사용자의 부담을 덜어주고, 의존성 주입을 통해 필요한 Bean을 사용하면 됩니다.
Bean 사용 자체에 대한 자세한 정리는 생략하겠습니다.
2. StaticClass
비슷한 맥락에서 StaticClass는 자신의 ClassName 자체로 객체에 접근할 수 있게 합니다.
System.class.out 대신 System.out 으로만 코드를 작성할 수 있는 이유가 StaticClass의 성질 때문이죠. 따라서 New() 키워드를 통해 객체를 생성할 필요도 없고, 사용자는 StaticClass의 내부 메서드나 필드에 곧바로 접근할 수 있습니다.
3. 사용 시점
위에서 간단하게 설명한 Spring Bean과 Static class의 정의를 되새겨보면, Spring Bean은 결국 다른 Bean과의 의존성을 가지고 사용됩니다.
물론 의존성 없이 독립적으로 사용되는 Bean도 있을 수 있겠지만, 다른 Bean에서 의존성을 가질 수도 있으며 미래에는 의존성을 가질 수도 있다는 고려 대상인 것이죠.
결국 이 포인트가 Spring Bean과 StaticClass의 사용처를 구분짓습니다.
Spring Bean은 의존성을 가지고 사용되어 자신의 작업이 외부에 의존하게 되며, StaticClass는 다른 외부에 의존하지 않고 자기 자신이 모든 일을 처리합니다.
또한 StaticClass 내부의 메서드나 필드는 모두 Static하게 정의하여 ClassName 자체로 접근할 수 있어야 하며, new()를 통한 생성을 필요없도록 해야 합니다.
예를 들어보겠습니다.
[StringUtils.class]
StringUtils는 대표적인 StaticClass 입니다. 내부의 모든 메서드는 Static 메서드로 정의되어 있습니다. 외부의 어떠한 객체와의 의존성이 없으며 동일한 호출에 대해 동일한 결과를 리턴합니다.
하지만 아래 Bean을 보겠습니다.
[S3Uploader.java]
제가 작성한 S3Uploader 클래스는 @Component 어노테이션을 통해 Bean으로 등록된 대상입니다.
코드를 보면 알 수 있는 것처럼 S3Uploader는 자기 자신만으로 일하지 못합니다. AmazonS3Client라는 외부 Bean을 의존성 주입받아 사용합니다. 그리고 만약 AmazonS3Client가 다른 녀석으로 대체된다면 아래 코드들도 수정되어야 하죠.
4. 정리
지금까지 설명한 내용을 정리하자면, Spring Bean과 StaticClass는 공식 문서에서 내린 정의 그대로 활용해야 합니다. 그리고 이 정의를 따라가기 위해서는 아래 내용을 고려했을 때 사용이 적합해야 합니다.
- Bean은 외부 객체와 의존성을 가진다.
- Bean은 의존성에 따라 결과나 로직이 변경될 수 있다.
- StaticClass의 모든 내부 필드, 메서드 등은 Static 해야 한다.
- StaticClass는 외부 환경의 변화에 영향을 받지 않아야 한다.
'Spring & Springboot' 카테고리의 다른 글
[Spring] @CacheEvict 없이 @Cacheable을 쓸 때 생길 수 있는 문제 (0) | 2023.02.22 |
---|---|
@DataJpaTest의 동작 방식과 몇 가지 주의사항 (0) | 2023.02.12 |
Spring AOP 스터디 - (3) 프록시 객체의 내부 메서드 호출 문제 (0) | 2022.11.20 |
Spring AOP 스터디 - (2) @Aspect 기반 AOP 적용 (0) | 2022.10.21 |
Spring AOP 스터디 - (1) AOP의 필요성과 기본적인 동작 원리 (0) | 2022.10.18 |