문제
프로젝트 전체를 Spring Cloud를 이용하여 기본 뼈대를 MSA구조로 구축했다.
하지만 여기서 문제가 생겼다.
public class App extends BaseTimeEntity {
//...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
}
기존에 설계했던 App Entity 는 User Entity와 연관관계 매핑으로 해결하려고 설계했다.
하지만, 지금 프로젝트 구성상 app-service와 user-service를 나누어 두었다.
그래서 app-service에선 user를 참조할 수 없는 것이다.
이에 관련해서 몇 가지 글들을 찾아봤다.
여러가지 방법이 있어보이지만, 내가 생각하기에 가장 효율적인 방법은
마지막 글에서 보았던 것 처럼 객체 참조를 직접 사용하지 않고 전역 고유 식별자를 사용하는 것이다.
public class App extends BaseTimeEntity {
//...
@Column(name = "user_id", nullable = false)
private Long userId;
}
물론 이렇게 하면 User 객체에 대한 참조가 필요하지 않아서 시간을 절약할 수 있다.
또한 서비스간에 경계가 명확해진다.
한계점
하지만, 이렇게 구현한다면 app-service에서 app에 대한 user 정보가 필요할 때 마다 user-service의 API를 호출해야 한다.
서비스들 간의 통신이 많아질수록 서비스간 결합이 세지게 된다.
이를 해결하기 위해 App에서 필요한 User의 정보 일부분을 복제하여 필드 값으로 갖고있는 방법도 해결이 되겠다.
복제를 선택했다면, user의 컬럼이 수정되었을 경우에 App에도 같은 상태를 유지해야하는 번거로움이 있을 수 있으니 잘 변경되지 않는 값을 복제하는게 좋겠다.
만약 통신이 불가피한 상황이라면, 앱의 플로우를 확인하고 통신의 부담을 줄이는 방향을 생각해 보는 것이 과제가 될 것이다.
App과 User의 관계가 아닌 Order와 Stock과 같이 단방향으로 처리가 되는 로직이라면,
Kafka나 RabbitMQ와 같은 메세지 큐 시스템을 이용하여 구현하거나
다른 Event Driven, 비동기 방식을 사용해도 되겠다.
'BackEnd > Server' 카테고리의 다른 글
자꾸 지각하는 이벤트는 어떻게 해야할까 (0) | 2025.01.14 |
---|---|
MSA 마이그레이션 : 데이터 해방 (0) | 2025.01.05 |
Apache JMeter로 NGNIX의 로드밸런싱 성능 테스트 (0) | 2023.09.02 |
[NGNIX] 서버 SSL 설정 (0) | 2023.09.02 |
[SLASH23] 실시간 데이터 처리 (0) | 2023.09.02 |