
노션 클로닝 과제를 할 때 멘토님께 다음과 같은 코드 리뷰를 받은 적이 있었다.
🧑🏻💻
유틸로 만들어주신 코드들에 도메인의 흔적이 가득합니다.
즉 횡단 관심사를 뽑아내서 노션이 아닌 다른 프로젝트에서도 사용할 수 있도록 해보시는 훈련을 해보시면 좋습니다
횡단 관심사? 도메인의 흔적?
나름 적재적소에 필요한 로직을 넣어서 하나의 컴포넌트가 독립적으로 동작하게끔 만들었다고 생각했는데 그게 아니었나 보다.
다행히 프로그래밍에서 사용하는 도메인 이라는 단어는 낯설지 않았다. 우테코 프리코스를 진행할 때 도메인 단위로 테스트 로직을 작성하라는 요구사항을 받은 적이 있어서 조사를 한 적이 있었으니까!
하지만 몇개월이 지나 가물가물한 개념이라 이 참에 다시 도메인 로직과 횡단 관심사에 대해 정확한 개념을 이해해보려 한다.
우리는 현실의 문제를 코드로 풀어낸다. 여기서 현실의 문제는 말그대로 문제 가 되며 우리가 풀어내는 코드는
해결법 이 된다.
여기서 말하는 해결법 중 하나가 바로 도메인 로직이다. 하지만 우리가 풀어내는 코드가 모두 도메인 로직이 되는 것은 아니다.
우리가 작성하는 코드의 목적이나 용도에 따라 로직의 종류는 도메인 로직과 어플리케이션 로직으로 나뉠 수 있다. 그렇다면 두 로직은 각각 어떤 로직을 의미하는 것을까?
두 로직에 대한 정의를 내리기 전에 예시를 보며 어떤 의미인지 감을 잡고 가는 게 좋을 것 같다. 컴퓨터와 사람이 가위바위보 가위바위보 게임 대결을 할 수 있도록 코드를 만든다고 가정해보자.
이 때 다음과 같은 기능을 로직으로 구현할 수 있을 것이다.
가위바위보 게임에서도 알 수 있듯이 어떤 기능을 만들 때 핵심적인 기능의 의사결정에 관여하는 코드이다. 데이터와 상태를 처리하거나 예외가 일어날 경우에 대해 처리하여 우리의 어플리케이션의 핵심 기능을 담당하도록 한다.
데이터, 상태 관리, (필수적인) 예외 처리 등이 여기에 해당된다.
어플리케이션 로직은 사용자와 상호 작용을 통해 애플리케이션의 실행 흐름을 관리한다. 어플리케이션 로직은 인터페이스 계층과 다른 계층 사이의 연결 역할을 한다.
UI 관리, 이벤트 처리 등이 이에 해당한다.
🧑🏻💻 유틸로 만들어주신 코드들에 도메인의 흔적이 가득합니다.
아하! 즉 이 말은 부가적인 로직과 필수적인 로직이 하나의 코드에 섞여있다는 뜻이다! 이를 적절히 분류하는 작업을 해야겠다.
🧑🏻💻 즉 횡단 관심사를 뽑아내서 노션이 아닌 다른 프로젝트에서도 사용할 수 있도록 해보시는 훈련을 해보시면 좋습니다
횡단 관심사는 어플리케이션 내에서 여러 부분에 걸쳐 분산되어 있는 로직이나 기능을 의미한다.
횡단 관심사를 분리하여 관리한다는 건 애플리케이션의 여러 부분에서 공통으로 적용되는 기능을 모듈화 하여 중복을 줄이고 관리하기 쉽게 만드는 것이다.
도메인 로직이나 애플리케이션 로직과는 별도의 개념이다. 왜냐하면 도메인 로직도 중복되는 코드가 여러 파일에 분포되어 있다면 횡단 관심사가 될 수 있고, 어플리케이션 로직 또한 횡단 관심사가 될 수 있기 때문이다.
즉 멘토님의 리뷰는 utils 폴더에 있는 코드들에 있는 도메인 로직들을 뽑아내서 따로 관리하라는 의미로 해석된다!
도메인 로직은 애플리케이션에 있어 필수적인 기능을 수행하는 로직을 의미하고, 애플리케이션 로직은 사용자와의 상호작용을 담당하는 로직을 의미한다.
횡단 관심사는 애플리케이션 로직 여러 계층에 걸쳐있는 비슷한 코드들을 의미하는 것이고, 횡단 관심사를 분리해냄으로써 중복되는 코드를 줄이고 모듈화 하여 쉽게 관리할 수 있다.
막연하던 개념이 이제야 좀 감이 잡힌 것 같다. 노션 클로닝 업데이트를 진행하면서 전보다 깔끔한 코드를 작성할 수 있었으면 한다.
오... 진짜 프로젝트 설계할 때 진짜 좋은 글이네요!
저도 슬랙에 올리신 글 보고 이해하려고 노력했는데 하나도 이해 안 됐는데 수연님 글 보고 한 번에 이해가 됐습니다!
최고!!