본문 바로가기
  • 개발하는 곰돌이
Development/Spring & Spring Boot

[Spring] 유틸성 메소드를 작성할 때 Spring Bean과 정적 메소드를 모아놓은 클래스 중 무엇을 사용해야 할까?

by 개발하는 곰돌이 2023. 3. 15.

목차

    개요

    프로젝트를 진행하다 보면 다양한 유틸성 메소드를 작성해서 사용하는 경우가 많다. 개인적으로는 이렇게 유틸성 메소드가 필요한 경우에는 Java라면 별도의 클래스에 유틸성 메소드를 static 메소드로 작성하고 Kotlin이라면 별도의 파일에 Top-Level 메소드로 작성해서 사용하고 있었다.

     

    그러다가 단순히 계산만 하는 유틸성 메소드가 작성된 클래스를 스프링 빈으로 등록하여 사용하고 있는 코드를 보면서 스프링 빈으로 등록해도 싱글톤으로 동작하는데 이 방법도 틀린건 아니지 않나?라는 생각이 들어 구글링을 해봤는데 비슷한 생각을 했던 분들이 계셔서 한 번 정리해보려고 한다.

     

    이하 유틸성 클래스라고 언급하는 것은 정적 메소드만을 모아놓은 별도의 클래스를 지칭한다.

    Spring Bean과 유틸성 클래스의 차이

    스프링 빈과 유틸성 클래스의 가장 큰 차이는 외부 요소에 영향을 받을 수 있는지의 여부라고 볼 수 있겠다. 기본적으로 자바 클래스의 정적 메소드는 정적 변수만, 코틀린의 Top-Level 메소드는 Top-Level 변수만을 참조할 수 있다.

     

    하지만 스프링 빈의 메소드는 다양한 외부 요소들을 참조할 수 있다. 예를 들어 스프링 빈에 작성된 메소드에서는 DB에 저장된 값을 불러와서 그것에 대한 다양한 동작을 수행할 수 있다.

    무엇을 사용해야 하는가?

    결국 각 방법의 특성에 따라 명확한 기준을 가지고 사용하는 것이 좋을 것 같다. 정적 메소드의 경우에는 그 특성 상 외부 요소를 참조할 수 없다. 다시 말해, 외부 요소에 전혀 영향을 받지 않고 항상 같은 결과를 내는 메소드라면 스프링 빈의 메소드가 아니라 유틸성 클래스에 정적 메소드로 작성하는 것이 적절할 것이다.

     

    예를 들자면 자바의 Math 클래스의 메소드들은 외부 환경이 어떻든간에 같은 파라미터에 대해서는 같은 결과를 반환한다. 별도로 유틸성 클래스를 작성하는 경우에는 해당 날짜가 주말인지를 검사하는 메소드나, 입력받은 전화번호, 이메일 등이 적합한 포맷으로 입력되었는지 검사하는 메소드 등이 작성된 유틸성 클래스를 예로 들 수 있을 것이다.

     

    반면에 외부 요소에 영향을 받아 같은 파라미터를 받아도 다른 결과를 낼 수 있는 메소드는 스프링 빈으로 등록된 클래스에 작성해야 한다.

     

    속성을 구분할 때 코드로 구분하고, 각 코드에 해당하는 실제 값을 DB에 저장하여 관리하는 경우를 예로 들어보자. 그러면 각 코드가 어떤 값을 나타내는지 확인하기 위한 메소드가 필요할 것이다. 사용자 권한의 경우 "1"은 관리자, "2"는 일반 사용자라고 DB에 저장된 상태라면 해당 메소드에 1을 파라미터로 전달하면 "관리자"를 반환할 것이고, 2를 파라미터로 전달하면 "일반 사용자"를 반환할 것이다.

     

    그런데 일반 사용자를 장기 사용자와 신규 사용자로 나누게 되어 "2"가 장기 사용자로 변경되었다고 생각해보자. 이 경우에는 코드가 어떤 값을 나타내는지 확인하기 위한 메소드에 2를 파라미터로 전달하면 "장기 사용자"를 반환할 것이다. 동일한 메소드에 동일한 파라미터를 전달했지만 외부 요소인 DB의 값이 바뀌어서 결과가 달라지게 된 것이다. 이렇게 외부 요소에 영향을 받는 메소드는 외부 요소를 참조하게 되므로 스프링 빈으로 등록된 클래스에 작성할 수 밖에 없다.

    느낀점

    사실 이 내용을 정리하면서 조금 혼란스러웠던 점이 있었다. 사실 유틸성 메소드라는 것이 스프링 빈에도 있을 수 있고, 유틸성 클래스에도 있을 수 있다. 그런데 유틸성 클래스와 스프링 빈을 비교하려고 한게 아니라 유틸성 메소드를 스프링 빈과 비교하려고 하고 있었다. 이 부분을 좀 더 확실히 해야할 것 같다.

    참조 링크

     

    언제 static 함수 모음 Class를 만들어야 할까?

    먼저 내가 말하는 static 함수 모음 class란  Apache Commons Lang StringUtils 처럼 순전히 static 함수들만을 가지고 있고, 객체를 생성하지 않고 사용하는 클래스를 의미한다(Java 이야기이다).이에 대한 정

    kwon37xi.egloos.com

     

    댓글