https://github.com/Team983/synnote-server/commit/81e88a06505dcd8709e4a5291a00016d6bfbdbb6

개선 사항

현재 Note 엔티티와 User 엔티티는 N:1 관계를 가지고 있고, Note 엔티티가 User 엔티티를 직접 참조하고 있다.

이를 간접 참조로 개선하여 Note가 User의 ID만을 가지게 하여 엔티티 사이의 결합도를 낮춘다.

이와 같이 변경한 이유와 간접 참조에서 발생하는 N+1 문제 가능성에 대해 말하자면 아래와 같다.

  1. Synnote 요구 사항에 맞는 전략

직접 참조는 한 번의 쿼리로 연관된 엔티티를 바로 가져와서 데이터베이스 I/O 작업을 줄일 수 있지만, 간접 참조는 ID 값만 가지고 있기 때문에 추가적인 쿼리가 필요하다.

하지만 Synnote는 사용자는 오직 자신의 노트만 볼 수 있고 다른 사용자가 만든 노트는 절대 볼 수 없는 요구사항이 있다. 그리고 노트 전체 조회를 요청할 때 사용자 세부 정보는 필요하지 않다. 즉, 한 번의 쿼리로 특정 사용자가 만든 모든 노트를 조회할 수 있다. 따라서 N+1 문제가 발생하지 않는다.

  1. 데이터 일관성

Note 엔티티가 User 엔티티를 직접 참조하게 된다면, User 에그리거트가 안전하게 보호되지 않는다. Note 엔티티를 저장하기 위해 User 엔티티 자체를 가져오게 되면, setter든지 도메인 서비스든지 User 엔티티를 변경할 가능성을 열어두게 된다.

따라서 User 에그리거트가 안전하게 보호되고, Note 에그리거트에만 집중할 수 있는 간접참조를 이용한다.

  1. 결합도 낮추기

위에서 언급했듯이 직접 참조를 하게 되면, Note와 User 사이의 결합도가 높아지게 된다. MSA에서는 각 마이크로서비스가 가능한 독립적이고 느슨하게 결합되어야 함을 감안하면 직접 참조는 부적절하다. User 정보는 User 서비스에서만 관리하고, Note 서비스는 User의 상세 정보를 알 필요가 없기 때문에 Note에서는 userId 만 사용하는 것이 충분하다.