Community

명령어-쿼리 분리(CQS) 원칙

명령-쿼리 분리(CQS) 원칙은 말 그대로 명령과 쿼리를 분리하여 구현하는 것을 말합니다. 특별히 너무 많은 작업을 수행하는 메서드를 식별하는 데 도움이 되는 원칙이며, 소프트웨어의 모듈성과 테스트 가능성, 유지보수성을 높이는 원칙입니다. 먼저, 쿼리는 결과를 반환하는 Getter의 역할을 해야 하고, 내부 구현에 의해 상태가 변경되는 부작용이 없어야 합니다. 명령은 내부 구현에 의해 상태를 변경하는 Setter의 역할을 하지만 결과를 반환하지 않아야 합니다. iOS 개발에서 이 원칙을 잘 적용할 수 있는 사례를 하나 들어보자면, 페이스북과 같은 앱을 만들었고, 앱 실행 후에 매번 피드(Feed)를 새롭게 불러오기에는 큰 부담이라 썸네일 이미지만이라도 캐싱하기로 했습니다. 최초 개발한 Feed Load 동작을 잠깐 보자면, 👀 캐싱 load 동작의 흐름 1️⃣ 캐싱 된 이미지가 있는지 확인한다. 2️⃣ 캐싱 유효기간이 만료됐다면 삭제한다. 3️⃣ 캐싱 유효기간이 만료되지 않았다면 Feed를 반환한다. 이 흐름은 앞서 설명한 명령-쿼리 분리 원칙을 위배한다. 캐싱 이미지를 반환하는 쿼리와 상태를 변경하는 명령이 함께 수행됩니다. 이 흐름은 이렇게 변경하면 좋습니다. 💡load 메서드와 validateCache 메서드라는 별개의 메서드로 구현된 두 가지 UseCase로 분리합니다. load 메서드는 유효한 캐싱 이미지를 반환하거나 Load에 실패할 때 에러를 발생시키는 쿼리의 역할을 감당하고, validateCache 메서드는 유효기간이 지난 캐싱 이미지를 삭제시키고, 캐싱 이미지를 찾는 도중 에러를 발생시켜도 삭제시킵니다. 이렇게 두 기능을 분리 함으로써 얻을 수 있는 이점은 두 기능을 서로 다른 컨텍스트에서 재사용할 수 있다는 것입니다. 예를 들어, 10분마다 또는 앱이 백그라운드로 이동하거나 돌아올 때마다(사용자가 Feed를 보려고 요청할 때만 수행하는 대신) 캐시 유효성 검사를 예약할 수 있습니다.

알림

알림이 없습니다