inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

비전공자도 이해할 수 있는 MSA 입문/실전 (feat. Spring Boot)

MSA 프로젝트 요구사항 및 설계

MSA 프로젝트 요구사항 및 설계 에서의 FK

64

SJ

작성한 질문수 155

0

안녕하세요 강의 잘 듣고있습니다.

MSA 프로젝트 요구사항 및 설계 부분에서

모놀로식으로 설계하게 될때는

FK 를 걸지만 MSA 에서는

DB가 독립적으로 분리되어 있어서 FK 를 걸 수 없을것 같습니다 .

Application 단에서도 하지않나요 ??

예를들어서

 

@ManyToOne

user: User;

 

아키텍처 spring-cloud kafka msa devops

답변 2

0

JSCODE 박재성

안녕하세요 ! 질문 잘 해주셨어요 ~

질문해주신 내용에 답변 드려볼게요 !

"MSA 프로젝트 요구사항 및 설계 부분에서 모놀로식으로 설계하게 될때는 FK 를 걸지만 MSA 에서는 DB가 독립적으로 분리되어 있어서 FK 를 걸 수 없을것 같습니다 . Application 단에서도 하지않나요 ??"

-> 맞아요 ! MSA에서는 서비스별로 DB가 분리되어 있기 때문에 DB 레벨의 FK 제약은 걸 수 없고, 말씀하신 것처럼 @ManyToOne 같은 ORM 연관관계 매핑도 사용하지 않아요 ~

대신 연관된 데이터가 필요할 때는 다른 서비스의 ID 값만 가지고 있다가, 필요한 시점에 해당 서비스에 API 호출을 해서 데이터를 가져오는 방식으로 처리해요 !

예를 들어 Order 서비스에서 User 정보가 필요하다면 @ManyToOne으로 User를 직접 참조하는 게 아니라 userId만 저장해두고, 필요할 때 User 서비스에 REST API나 메시지 큐를 통해 요청하는 식이죠 !

그래서 MSA 환경에서는 데이터 정합성을 DB가 아닌 애플리케이션 로직과 서비스 간 통신으로 보장해야 하기 때문에 설계가 더 복잡해지는 트레이드오프가 있죠 :)

추가로 궁금하신 점 있으시면 또 질문 남겨주세요~~

0

SJ

만약에 그렇게 된다면 ORM 에서 기능으로 User 이런 객체를 넘겨서 where 조건 걸기도 하는데

예를들어서
foudUser = User

find({ where: { user: foundUser } )

등 이런식으로는 하지 못하는건가요 ??

 

그리고 예를들어서 left join 을 가져오게 될때 ,

leftJoin('user.board ' )

application 단에서 @OneToMany 가 걸려있다면 이런식으로 가져올수있는데

이렇게도 못가져오게 되나요 ??

 

만약 그렇다면 어떤식으로 하시게 되나요 ?

1

JSCODE 박재성

안녕하세요 ! 추가 질문 잘 해주셨어요 ~

질문해주신 내용에 답변 드려볼게요 !

"foudUser = User find({ where: { user: foundUser } ) 등 이런식으로는 하지 못하는건가요 ??"

-> 맞아요! MSA에서는 서비스 간 DB가 완전히 분리되어 있기 때문에 ORM을 통해 다른 서비스의 엔티티를 직접 참조하는 방식은 사용하지 않아요 ~

대신 userId처럼 ID 값만 저장해두고 find({ where: { userId: foundUser.id } }) 이런 식으로 ID 기반으로 조회하게 돼요 !

" left join 을 가져오게 될때 , leftJoin('user.board ' ) application 단에서 @OneToMany 가 걸려있다면 이런식으로 가져올수있는데 이렇게도 못가져오게 되나요 ??"

-> 이것도 마찬가지에요 ! DB가 물리적으로 분리되어 있기 때문에 서비스 간 JOIN 자체가 불가능해요 !

그래서 MSA에서는 각 서비스에서 필요한 데이터를 따로 조회한 다음 애플리케이션 레벨에서 직접 합치는 방식으로 처리해요 ~

예를 들어 게시글 목록에 유저 정보가 함께 필요하다면, Board 서비스에서 게시글 목록을 먼저 조회하고 거기에 담긴 userId들을 모아서 User 서비스에 API 호출로 유저 정보를 가져온 다음 애플리케이션 코드에서 두 데이터를 조합하는 식이죠!

이런 구조 때문에 MSA는 모놀리식에 비해 데이터 조회 로직이 훨씬 복잡해지고 네트워크 비용도 늘어나는 트레이드오프가 있어요 !

그래서 MSA가 항상 정답은 아니고, 서비스 규모와 팀 상황에 맞게 선택하는 게 중요해요 :)

추가로 궁금하신 점 있으시면 언제든 추가 질문 남겨주세요!

1

SJ

답변 감사합니다 !! 🙂

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. SJ님.

MSA(Microservices Architecture)에서의 외래 키 사용에 대해 궁금하신 점이 있으시군요. MSA에서는 각 마이크로서비스가 독립적으로 운영되기 때문에 데이터베이스도 각 서비스에 맞춰 분리하여 사용하는 경우가 많습니다. 이러한 구조에서는 전통적인 데이터베이스의 외래 키(FK) 제약 조건을 적용하기 어려운 경우가 많습니다.

MSA에서의 FK 사용에 관한 주요 포인트:

  1. 독립된 데이터베이스: 각 서비스는 자신의 데이터를 독립적으로 관리하고, 다른 서비스의 데이터와 직접적인 외래 키 관계를 설정하지 않습니다.

  2. Application 단에서의 관계 관리: MSA에서는 데이터베이스의 외래 키 대신, 애플리케이션 단에서 데이터 간의 관계를 관리합니다. 예를 들어, JPA의 @ManyToOne 어노테이션과 같은 ORM 매핑을 활용하여 객체 간의 관계를 명시적으로 표현할 수 있습니다. 하지만 이는 데이터베이스 수준에서의 FK를 설정하는 것과는 다릅니다.

  3. 데이터 일관성: 대신, 서비스 간의 일관성을 유지하기 위해 이벤트 기반 아키텍처를 사용하거나, 각 서비스의 API를 통해 필요한 데이터를 인정받는 방식으로 데이터를 동기화할 수 있습니다.

관련된 학습 자료나 유사 질문의 답변을 통해 더 구체적인 내용을 확인해 보시면 도움이 될 것입니다:

현재 본 강의에서 다루는 MSA 설계에 대한 좋은 예시와 일반적인 프랙티스들은 질문 해결에 큰 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Ingress 생성하기 ingressclass 질문

0

2

1

deployment 업데이트 및 롤백 실행하기 -2

1

18

2

강의 듣는 중인데,

0

19

1

36강 오탈자가 있는 거 같습니다.

0

14

2

라우팅 테이블 설정 중 궁금한게 있습니다.

0

33

1

user-service jwt

0

31

2

애그리거트 질문있습니다!

0

29

2

젠킨스버전과 플러그인설치

1

31

2

DDD 는 마이바티스와 잘 맞지 않는건가요?

0

44

1

스프링부트 버전 문의드립니다.

0

38

1

cpu&memory 재설정하기에 질문이 있습니다.

1

43

2

Redlock 알고리즘 관해 궁금한게 있습니다!

0

37

2

시험 시작하기 전에 한 가지 질문 있습니다.

1

43

2

yml 작성하다가 에러 발생해서 문의 드립니다.

0

38

2

좋아요/조회수 카운팅 병목현상에 대해서 궁금한점이 있습니다.

0

31

2

MSA에서 서비스별 DB 작성에 관해

0

80

2

Microservice 에 DB 띄우기

0

61

2

보상 트랜잭션을 위한 catch 문 안에서 에러가 발생한다면 어떻게 되는 건가요?

0

64

2

하나의 consumer에서 두가지 이상의 topic의 메세지를 받고자 할때 받는 메세지에 시간차와 상관없이 하나의 consumer에서 받을수 있나요?

0

77

2

카프카에서 발행한 이벤트를 처리중에 실패한 경우 보통 어떻게 처리하는지 궁금합니다

0

108

2

Kafka 비동기방식 적용하면서 질문 있습니다!

0

81

2

가용성에대한 질의..

0

64

2

궁금한게있어요..

0

78

2

MSA강의 보다 궁금해서 질문드립니다.

0

91

2