본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

레일즈에 Service/Decorator Layer 적용하기 (6) - Service Object으로 콜백 옮기기

이 포스팅은 Build Sleek Rails Components With Plain Old Ruby Objects을 정리한 글입니다 :)


Value Object에서 설명했듯이, model에는 콜백, 유효성 체크 로직이 없는게 좋습니다. persistence 역할만 하는게 좋은거죠. 

Form Object에서 유효성 체크하기에서는 Form Object를 사용해서, 모델에 있던 유효성 체크 로직을 지우는 방법을 설명했었습니다. 

그러나 Entry 모델에 callback 함수인 after_create가 여전히 남아있습니다. 아래 코드처럼요.


왜 모델에서 콜백 메서드를 지우는게 좋은걸까요?

model은 데이터를 저장하는 역할만 해야합니다. 

그런데 보통.. 모델의 콜백 메서드에 이것저것 붙이고 싶어지죠. 그래서 after_create, after_destroy 같은 콜백 메서드를 사용하면, 한 모델에서 여러 일들을 하게 됩니다. 

이렇게 모델에서 after_create 같은 콜백 메서드들을 사용하면, 나중에 테스트를 할 때 핵고통을 받게된다고 하네요. 


다시.. 위의 샘플 코드로 돌아가서 이야기를 해보겠습니다. 


위의 코드에서는 Entry 테이블에 데이터가 쌓일 때마다 SMS를 보내주고 있습니다. 그런데 사실 이건 Entry 도메인이랑 정말 관련있는 로직이라고 보기는 어려워요.


이런 문제를 해결하는 방법은, 콜백 메서드를 Service Object으로 옮겨주는거에요. 

Entry Model이 아니라, CreateEntry 서비스 객체에서 유저에게 SMS을 보내는 함수를 호출해주는거죠.


이렇게 하면, 모델과 서비스가 각각 자기 할 일을 잘 맡게 되면서, 단일 책임 원칙을 지킬 수 있게 됩니다