[고민] static을 쓸까? setter, getter를 쓸까?

nimoh·2024년 1월 29일
0

문제

나는 스프링부트를 사용한 웹 애플리케이션을 개발하고 있다. 업무 중 Global하게 사용되는 환경설정 파트를 개발해야 했다.
그냥 환경설정이라면 static같은 건 고려할 필요도 없었다. 하지만 환경설정 값이 1~2초 마다 도는 스케줄러에 사용되었다. 나는 static을 사용하는 것과 getter, setter를 사용하는 것 중 무엇이 좋을 지 고민하게 되었다.

setter, getter 사용

환경설정 값을 가지고 있는 Holder 객체를 만들고 해당 객체를 빈으로 등록한 뒤 초기값을 @PostContruct 메서드로 초기화하여 setter, getter로 관리하려고 했다.
이 방법으로 설정하면 객체지향적이고 객체에 자율성을 준다고 생각했다.

static 사용

이 방법 역시 전과 마찬가지로 @PostContruct로 초기화를 해줘야 하기때문에 빈으로 등록했다. 최대한 빈으로 등록하지 않는 방법을 찾아봤는데 초기화할 때 전처리해야할 것이 많아서 어쩔 수 없이 빈으로 등록했다. 이 방법은 static을 사용하여 필드를 관리하기 때문에 getter, setter를 사용하는 방법보다 객체지향적이지 않았다.
그리고 static은 애플리케이션이 시작될 때 static 영역에 생성되어 애플리케이션 종료 시 까지 유지된다. 따라서 static을 많이 사용할 수록 메모리 낭비가 발생할 수 있다. 또한 서버에 단 하나의 필드가 있는 것이기 떄문에 멀티쓰레드 환경에서 안전하지 못하다.

결정

결론부터 말하자면 나는 static을 사용하기로 했다. setter, getter를 사용하는 것이 물론 static을 사용하는 것보다 객체지향적인 것은 맞지만, setter를 사용한다는 게 그렇게 객체지향적인 것 같지도 않았다.
또, 내가 객체를 만들 때 너무 서버(여기서는 Holder 객체)를 기준으로 생각했다. 글로벌로 사용되어야하는 필드들인데 이 Holder 객체를 싱글톤으로 관리하며 getter, setter를 사용하려면 클라이언트 코드가 복잡해진다고 생각했다.
굳이 필요하지 않았던 의존관계도 주입되어야할 것이고, 사용할 때마다 메서드를 작성해줘야하는 번거로움도 있을 것이다.

valueHolder.getValue(); 
valueHolder.setValue(); 

만약 static을 사용한다면

valueHolder.value;

가 될 것이고, static import 하면 value만 사용해도 될 것이다. 또한, ValueHolder를 사용하는 객체에서 의존할 필요도 없다.
위에서도 언급했지만 static을 사용하면 동시성 문제가 발생하거나 메모리 부족 등 문제가 발생할 수 있다. 하지만 내 경우는 오히려 해당 필드가 전역에 걸쳐 단 하나의 값을 가져야 하기 때문에 쓰레드 문제는 배제할 수 있었다. 사실 스프링 빈으로 등록하더라도 싱글톤이기 때문에 쓰레드에 안전하지 못한 것은 마찬가지일 것이다.
하나 더 고민하고 있는 것이 있는데 스프링 빈으로 등록된 다른 객체를 static block 에서 사용할 수 있는 방법이다. 이 방법을 찾지 못해서 어쩔 수 없이 Holder 객체를 빈으로 등록하여 @PostContructstatic 필드들을 초기화해주었다.

나가며

회사 업무 중에 고민했던 것을 정리해봤다. 글에서는 굉장히 간단한 예시를 들었지만 실제로는 좀 복잡했다. 회사 비즈니스를 여기에서 발설할 순 없으니 순수 나의 고민만 털어보았다.
이 방법은 내 고민과 스스로 내린 결론일 뿐 정답은 아니다. 아쉬운 것은 내가 이런 고민을 할 때 같이 고민하거나 물어볼 사수가 없다는 것이다.
이런 고민이 개발하면서 필요한 고민인지, 쓸 데 없는 고민인지도 사실 가늠이 안된다. 나는 개발할 때 고민을 많이하는데 내 환경에서 할 수 있는 이런 사소한 고민들이 무의미하지 않았으면 좋겠다.

profile
부족함을 인정하는 순간이 성장의 시작점이다.

0개의 댓글

관련 채용 정보