서론
Spring으로 프로젝트를 하다보면 이런저런 Util과 Service를 만들게 된다.
근데 Util과 Service의 차이점이 뭘까?
우리는 뭘 기준으로 이름을 Util로 할지 Service로 할지를 정할까?
배경
프로젝트를 진행하며 Gps 관련 데이터를 다룰 일이 생겼다.
좌표 간 거리를 계산하거나 주소를 좌표로 변환하는 등의 작업이 필요했다.
그래서 아래처럼 GpsUtil로 클래스를 분리해서 메소드를 모아놓았다.
근데 이걸 적다가 문득 든 생각이..
이거 GpsService라고 해도 되지 않나?
뭔가 Util이 맞을 거 같긴 한데, GpsService였어도 별로 위화감이 들진 않았을 것 같다.
이 위화감을 느낀 건 나뿐만이 아닐 것이므로 자료 조사를 해보았다.
지선생님의 답변
답변:
1. Util 클래스 (~Util)
Util 클래스는 재사용 가능한 공통 기능을 제공하는 유틸리티 역할을 하며,
애플리케이션의 특정 로직이나 상태와 독립적으로 설계됩니다.
- 주요 특징:
- 독립성: 특정 비즈니스 로직에 의존하지 않고,
애플리케이션 어디서나 호출할 수 있는 독립적인 함수들로 구성됩니다. - Stateless: 대체로 상태를 가지지 않으며, 입력 값만을 받아
결과를 반환하는 순수 함수 형태로 작성됩니다. - 공통 기능: 문자열 변환, 날짜/시간 계산, 파일 처리 등
특정 비즈니스 로직과 무관한 공통 작업을 처리합니다.
- 독립성: 특정 비즈니스 로직에 의존하지 않고,
2. Service 클래스 (~Service)
Service 클래스는 특정 비즈니스 로직을 처리하는 데 초점을 맞추며,
애플리케이션의 비즈니스 컨텍스트와 밀접하게 연관되어 있습니다.
- 주요 특징:
- 비즈니스 로직 담당: 특정 엔티티나 도메인과 관련된
비즈니스 로직을 구현하는 역할을 합니다. - 상태와 종속성 관리: 상태가 없거나 최소화하려 하지만,
종종 Repository나 다른 Service의 의존성을 가질 수 있습니다. - 계층 구조: 애플리케이션의 계층 구조 중 비즈니스 계층에서
역할을 수행하며, Controller와 Repository 간의 로직을 중개합니다.
- 비즈니스 로직 담당: 특정 엔티티나 도메인과 관련된
결론적으로, Util 클래스는 Stateless한 공통 기능 제공에 초점을 두며
Service 클래스는 비즈니스 로직에 초점을 둔다.
결론
GpsUtil은 GpsService로 개명하는 게 맞을까?
내 GpsUtil은 Gps 좌표를 다루는 메소드들의 집합이다.
이 메소드들은 비즈니스 로직에 사용되긴 하지만, Gps 자체가 핵심 도메인은 아니다.
그리고 GpsUtil 내 메소드들은 전부 Stateless하다.
즉 상태를 가지지 않아 어떤 상황에서든 동일한 input에 대해선 동일한 결과를 준다.
그러므로 GpsUtil로 유지하는 게 올바른 선택이 되겠다.
Util과 Service 간 차이점이 애매했었는데, 함 정리하니까 이해가 되는 것 같다.
자료조사라 해놓고 지피티한테만 물어본 것처럼 보일 수도 있는데, 실제로 구글링도 꽤 했다..
'기타' 카테고리의 다른 글
[주절주절] 노션은 이미지를 S3에 저장한다 (3) | 2024.11.11 |
---|---|
[Linux] ec2 초보자를 위한 리눅스 명령어 정리 (3) | 2024.10.14 |