-
프로젝트 시작 - 대략적인 구상스파르타 심화/MSA 개인프로젝트 2024. 11. 30. 18:17
문서로 제공된 요구사항 외에 내가 어떻게 구현해야할지에 대해 며칠을 고민했다.
거의 3일을 어떻게 해야할지에 대해 고민만 한 것 같다.
먼저 DB에 대한 고민
어떻게 해야할지에 대해 고민했던 것 같다.
깃허브 레포 관리에 대한 고민
이건 쉽게 결정했는데 프로젝트의 git 설정이 생각보다 귀찮았다.
처음에 잘해뒀어야했는데 프로젝트 골조를 미리 다 만들고 init commit을 날리면 msa에선 대참사가 난다는걸 알아버렸다.
이제 개인적으로 넣어보려는 것들의 목록이다.
1. 유저 권한 user / admin
a. admin은 "주문 전체 조회" 와 "상품 정보 추가", "상품 정보 수정", "상품 정보 삭제" 기능을 가진다.
b. admin이 로그인 이후 권한이 변경 된 경우를 생각해서 서비스 쪽에서 한번 더 검증해줘야한다.
이를 어떻게 할지 고민했다.
권한은 무조건 게이트웨이 필터에서 검증하는 것이었고 추가검증을 서비스에서 각자 해결할지
auth를 타게할지에 대한 고민이었는데 auth를 타는것에 대해 나는 항상 부정적이었다.
auth를 타지않는다면
게이트웨이 - 주문 - 프로덕트로 깔끔하게 끝나는 반면
auth를 탄다면
게이트웨이 - 주문 - auth - 주문 - 프로덕트로 중간과정이 2개나 추가된다.
각 서비스가 통신을 통해 연결되기 때문에 과정이 길어진다는건 처리시간 증가 및 에러 발생확률 증가와
긴밀하게 연관된다고 생각하여 전자로 구현하기로 결정했다.
2. ddd 맛보기 (값 객체, 애그리거트, 4 레이어드 아키텍처)
msa에 ddd의 몇 가지 개념을 선별해서 적용해 보려했다.
ddd 를 접목하면 도메인의 경계를 명확히하여 각 서비스의 역할과 책임을 명확히 할 수 있다.
이는 서비스가 다른 서비스의 영향을 덜 받게되며 서비스의 독립성 강화로 이어질 수 있다고 보았다.
그래서 값객체와 애그리거트 2가지 개념을 사용해보기로 하였다.
값객체
각 서비스의 중요한 컬럼을 외부의 변경으로부터 막을 수 있다.
이를 통해 데이터 일관성을 유지할 수 있음.
현재 고려중인 부분은 유저 - 유저네임, 오더 - 주문 금액, 주문 상태, 프로덕트 - 상품 가격, 수량
정도에 적용할 것 같다.
애그리거트
관련된 데이터를 묶어 루트 애그리거트로만 접근하게 만들기 때문에
애그리거트를 통해 서비스 경계를 명확히 할 수 있다.
주문 - 주문금액 + 주문상품(id 제품명 수량 가격) + 주문 상태, 프로덕트 - id 제품명 가격 수량
으로 사용할 것 같다.
4 레이어드 아키텍처
이것도 고려해보았으나 지금 사용하는 패키지 구성과 비교했을 때 들인 시간에 비해 얻는 효율이 떨어질 것
같아 다른 곳에 투자하기로 하였다.
3. rabbitMQ 사용
오더 생성 시에만 적용해보기로 하였다.
주문 생성 -> 재고 감소 메세지
재고 부족 -> 주문 취소 메세지
4. 보상트랜잭션
오더 생성에만 적용해보기로 하였다.
재고 부족 -> 주문취소 메세지 일때 보상트랜잭션을 사용하여 주문 취소 처리를 하는 것까지를 목표로 설정하였다.
주문상태를 cancelled로 변경, 주문 데이터를 취소상태로 업데이트, 주문 관련 트랜잭션 롤백
할 수 있다면 낙관적락까지 하면 좋겠지만 구현하다보면 서킷브레이커까지 엮일 것 같아
관련 시간이 매우 많이 들 것 같았다.
그래서 일단은 패스하였다.
'스파르타 심화 > MSA 개인프로젝트' 카테고리의 다른 글
동시성이 터졌다. (1) 2024.12.14