[CS지식] side effect와 CQRS원칙
- side effect : 말 그대로 해석하면 예상치 못한 부작용이라는 뜻
그러나 프로그래밍에서는 부작용?스러운 부정적인 의미는 아니다.
빈 구문이 아닌 한, 항상 가지게 되는 것이 하나의 side effect라는 것.
코드에 조금의 변화라도 일어난다면 당연히 발생하게 되는 현상이라는 것으로
'실행 도중에 어떠한 객체에 접근하여 변화가 발생하는 행위'라는 것이다.
그렇다면 왜 side effect는 그다지 나쁜 건 아닌 거 같은데 왜 경계를 하는 것일까나?
A. 이유는 side effect가 많이 발생할 수록 디버깅 과정이 까다로워지기 때문이다.
디버깅 과정이 까다로워지면, 코드를 디버깅하는데 쓰는 시간도 많아지고, 리팩토링이나 다른 사람이 내 코드를 리뷰할 때 복잡해지기 때문이다.
Q. 그렇다면 보통 side effect는 언제 발생하는가?
A. 위에서는 조금의 변화에도 발생하는 것이 side effect라고 하였지만, 단순 조회(select)에는 side effect가 발생할 일이 없고 CRUD 중 CUD에서 side effect가 발생한다.
- CQRS원칙 : command(명령)과 query(쿼리)의 역할을 구분한다는 것
커맨드 (Create - Insert, Update, Delete - 데이터 상태를 변경)와 쿼리 (Select - Read - 데이터 단순 조회)의 역할과 책임을 분리한다는 뜻.
기존의 CRUD를 하나의 세트, 하나의 Model, 하나의 State로 처리하던 것을 CUD / R로 나누어서 처리하는 방법을 의미한다.
메인 비즈니스 로직은 주로 CUD에 있고 R은 거의 단순한 로직에 속하는데 굳이, 단순한 로직과 복잡한 비즈니스 로직을 한 바구니에 모아놓아서 복잡성을 야기시키는 문제를 해결할 수 있다.
코드를 가지고 예시를 들어보겠다.
@Repository
public class MemberRepository {
@PersistenceContext
private EntityManager em;
public Long save(Member member) {
em.persist(member);
return member.getId();
}
}
위는 MemberRepository의 코드 일부분이다.
save 메소드는 ID를 Insert하는 CUD 중 하나이고 사이드 이펙트를 일으키는 커맨드에 속하기 때문에,
member 자체가 아닌, Id값만 return해오는 것인것이다!! (뭉탱이로 가져오기보다는 딱 데이터를 찝어서 가지고 오는 거지..)
이것도 커맨드와 쿼리의 분리의 일환으로 보면 되는 것이다.