Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발의변화

도메인로직? 서비스로직? 본문

카테고리 없음

도메인로직? 서비스로직?

refindmySapporo 2023. 11. 5. 12:07
반응형

요즘 우테코 프리코스를 하면서 정말 '분리'에 대한 생각을 많이 하는 것 같다.

서비스를 분리하라, 로직을 분리하라, 함수를 분리하라, 객체를 분리하라, 클래스를 분리하라 등등..

지금까지 당연하게 생각없이 작성했던 코드형태에 대해 많은 고민을 하게 되는 것 같다.

특히 도메인로직과 서비스로직을 어떻게 분리하는 것이고 둘의 차이점이 뭘까...라는 고민을 하게 되었다.


도메인로직은 비즈니스에 대한 의사결정 을 가지고 있는 로직이다.


모바일 송금의 예시

예를 들어서, 흔한 모바일 송금 앱이 있다고 해보자.

송금 기능을 담당하는 코드가 있다.
이 코드를 자세히 뜯어보면 다음과 같은 일을 하는 코드로 이뤄져있다.

계좌 잔액이 충분한지 확인한다.
유효하다면 송금 버튼을 활성화하고, 유효하지 않다면 에러 메시지를 띄운다.
사용자의 멤버십 등급에 맞춰서 송금 수수료를 계산한다.
송금 수수료를 결제하도록 외부 결제 서비스에 요청한다.
사용자의 잔액을 감소시킨다.
사용자의 잔액을 DB에 저장한다.

이 코드들을 구분할 때, 해당 소프트웨어가 '송금'이라는 현실 문제에 대한 의사결정을 하는가를 생각해보자.


어떤 것이 도메인 로직이고, 어떤 것이 서비스 로직일까?

도메인 로직에 해당하는 것은 다음과 같다.

이 코드들은 '송금'에 대한 의사결정을 담당하고 있다.

계좌 잔액이 충분한지 확인 -> 송금이 가능한지에 대한 의사결정
송금 수수료를 계산 -> 송금에 드는 비용을 정책에 따라서 결정
사용자의 잔액을 감소시킨다 -> 송금이라는 서비스를 수행



어플리케이션 서비스 로직에 해당하는 것은 다음과 같다.

이 코드들은 도메인 로직이 의사결정을 할 수 있도록 입력을 제공하며, 결과를 외부 서비스/DB/UI에 업데이트하는 역할을 맡는다.

유효하지 않으면 에러 메시지를 띄운다 -> UI
송금 수수료를 결제하도록 외부 결제 서비스에 요청한다. -> 외부 서비스와의 네트워킹
잔액을 DB에 저장한다. -> Persistence
만약 어떤 코드가 명확하게 도메인 로직인지 아닌지 애매하다면, 해당 코드가 하는 일을 쪼개야 한다는 신호다. 도메인 로직이 분명한 부분과 서비스 로직이 섞여 있을 수도 있다.


현재 가지고 있는 원화가 미국 달러로 얼마인지 보여주는 함수가 있다고 해보자.


이 함수 하나만 가지고 생각하면 도메인 로직인지 아닌지 애매하다.
하지만 함수를 분리하고 코드를 쪼개보면 좀 더 명확해진다.

미국 달러 환율을 얼마로 할 것인가. 계산 공식은 얼마로 할 것인지 결정하는 코드. -> 도메인 로직
단위와 화폐 포맷을 바꿔서 UI에 업데이트를 하는 코드. -> 어플리케이션 서비스 로직

결국 도메인로직을 분리하는 것은 하나의 함수가 하나의 목적성을 띄우게 하는 분리의 작업에서 감을 잡을 수 있다고 생각한다.

반응형