사실 이번 주제는 잘못된 질문에서 시작되었다.
그 이유는 우연히 Spring Resttemplate 클래스에 관한 아래 글을 접하고 단순히 static으로 선언하는 것과 bean으로 선언하는 것의 차이는 무엇일까 정도로 생각하고 구글링을 시작했기 때문이다.
https://brocess.tistory.com/265
[ Springboot ] RestTemplate 객체 생성으로 인한 성능 저하 사례
해당 글은 '실무로 배우는 시스템 성능 최적화' 책의 내용을 발췌한 내용입니다. 최근 해당 책을 읽다가 이전에 내가 했던 고민과 비슷한 사례에서 비롯한 성능 저하 사례가 있어 포스팅 해본다.
brocess.tistory.com
관련된 많은 글을 찾아보면서 내린 올바른 질문의 결론은 바로 ' Java static 싱글톤 VS Spring Bean'이다.
static과 bean이 단순히 전역적으로 사용할 수 있는 공통된 특징을 가지고 있다고만 생각해서 발생한 실수라고 생각한다.
그래서 이번 기회에 bean과 static에 대해 다시 한 번 정리를 해보았다.
아래 글을 참고 바랍니다.
2022.12.14 - [백엔드] - [Spring] Bean
2022.12.17 - [언어] - [Java] static
2022.12.21 - [백엔드] - [Spring] 싱글톤 컨테이너
비록 올바른 질문은 아니었지만 그래도 비슷한 내용의 글을 접하고 static method로 정의할 것과 bean으로 사용할 것을 구분하는 기준을 가질 수 있게 되었다.
아래 글을 참고했다.
언제 static 함수 모음 Class를 만들어야 할까?
먼저 내가 말하는 static 함수 모음 class란 Apache Commons Lang StringUtils 처럼 순전히 static 함수들만을 가지고 있고, 객체를 생성하지 않고 사용하는 클래스를 의미한다(Java 이야기이다).이에 대한 정
kwon37xi.egloos.com
Static method
위 글에서 제시하는 기준은 딱 한가지이다. 바로 '파라미터가 동일할 경우 항상 동일한 결과를 리턴하는지?' 여부이다.
JAVA 클래스를 예로 들면 String.format과 같이 원하는 형식과 문자열이라는 두 가지 파라미터를 넣어주면 항상 동일한 결과를 보여주는 것이 있다. 또 다른 예로는 Math 클래스가 있다. Math.abs, Math.floor, Math.ceil 등이 바로 그 예시이다. 각각 파라미터로 숫자를 넣었을 때 절대값, 내림, 올림한다.
이처럼 파라미터가 동일할 경우 항상 동일한 결과를 나타내는 메소드에 대해서는 static으로 정의하여 util 처럼 사용하는 것이 메모리 사용에도 유리한 측면이 있다.
Spring Bean
반면 spring bean을 사용해야되는 경우는 어떤 경우 일까? 바로 util처럼 사용하고 싶지만 위에 조건이 충족하지 못할 때 이다. 위 글에서는 예시로 외부의 의존성을 주입받는 경우를 들었다
암호화 util의 경우 보통 관련 key를 직접 class에 넣기보다는 local 또는 test 서버, 운영 서버 등으로 구분지은 resource 파일에서 관리하는 경우가 많다. 이처럼 외부 자원에 의존하는 경우는 결국 외부 자원에 따라 결과가 달라지기 때문에 static으로 만들기 보다는 bean으로 만드는 것이 좋다.
또 다른 예시로는 실행 결과가 일관성이 없는 경우가 있다. Restemplate과 같은 클래스를 이용해 client로서 다른 서버로 요청을 보내다 보면 항상 성공하는 것이 아니라 서버의 물리적인 상태에 따라 실패하는 경우도 있다. 이처럼 일관성이 보장되지 않는 경우에는 static으로 만들어 util을 사용하는 것이 좋지 않다.
오늘은 이만 마치고
다음 시간에는 올바른 질문인 ' Java static 싱글톤 VS Spring Bean'에 대해 살펴보겠다.
'백엔드' 카테고리의 다른 글
[Spring] 싱글톤 컨테이너 (0) | 2022.12.21 |
---|---|
[Spring] Bean (0) | 2022.12.14 |
[Spring] @Transactional (2) | 2022.11.21 |