인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ultimates님의 프로필 이미지

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

댓글 최대 2 depth - CUD API 테스트 & 테스트 데이터 삽입

article_id에 대해서

해결된 질문

작성

·

104

0

comment기능에서 comment테이블에 article_id을 shard key로 사용한다고 하셨는데 comment기능은 article기능에 뎃글을 다는 기능으로 article테이블에 article_id와 연관관계를 맺는 컬럼이 아닌건가요? 만약맞다면 article테이블에 article_id를 comment테이블에 article_id에 저장되게끔 해야 할 듯 한거 같은데 1고정값으로 넣는게 이해가 안되서 질문드렸습니다.

답변 2

0

쿠케님의 프로필 이미지
쿠케
지식공유자

ultimates님, 안녕하세요!

말씀하신대로 "게시글의 댓글"이 맞고,

comment 테이블의 article_id가 article 테이블과 연관 관계를 맺기 위한 참조키(외래키)입니다.

강의에서는 1번 게시글(article_id=1)의 댓글을 "테스트" 데이터로 삽입하는 것이고,

"게시글별 댓글 목록"이라는 쿼리 패턴을 만족하고, 그 동작의 빠름을 "테스트" 하기 위해,

1번 게시글에 "댓글 테스트 데이터"를 삽입하는 것입니다.

1번 게시글이 실제로 없는데 갑자기 어디서 나온 값인지 혼동이 있으신 걸까요? 테스트 조건만 충족할 수 있다면, 어떠한 값을 넣든 자유입니다.

그저 테스트라는 것에 초점을 맞춰주시면 될 것 같습니다!

"하나의 게시글에 작성된 댓글 목록을 테스트"하려는 데이터입니다.

 

혹시 더 궁금한 점 있으시면 편히 문의 주세요!

ultimates님의 프로필 이미지
ultimates
질문자

이해되었습니다 ㅎ

그렇다면 article_id가shard key로 사용된다고 하셨는데 DB가 shard화 되어있다고 하면 DB에는 어떠한 식으로 나누어져서 저장되는 걸까요?

쿠케님의 프로필 이미지
쿠케
지식공유자

“shard key가 동일한 데이터는, 동일한 샤드에 저장된다.”

일단 위 관점만 이해하시면 됩니다!

따라서, article_id가 동일한 데이터는, 동일한 샤드에 위치하게 됩니다.

게시글의 댓글 목록은 단일 샤드에 들어가 있기 때문에, 단일 샤드에서만 빠르게 쿼리할 수 있는 것입니다!

 

만약, 2개의 샤드(0번과 1번)가 있고, 샤드 키를 결정하는 방법이 게시글ID % 2라면,

샤드0 = [article_id 짝수인 게시글들의 댓글 목록]

샤드1 = [article_id 홀수인 게시글들의 댓글 목록]

ultimates님의 프로필 이미지
ultimates
질문자

아 감사합니다!! comment테이블 데이터는 article테이블의 DB보존위치를 따라가는거였군요...

comment테이블의 데이터도 article테이블처럼 랜덤으로 DB보존위치가 바뀐다고 생각했습니다 ㅎ

쿠케님의 프로필 이미지
쿠케
지식공유자

정확히는 article 테이블과는 무관하고,

comment 테이블의 article_id에 의해 샤드가 결정된다고 보시면 될 것 같네요.

article 테이블과 comment 테이블은 서로 다른 데이트베이스에 위치해있다는 관점입니다. (MSA DB 격리)

ultimates님의 프로필 이미지
ultimates
질문자

서로 다른데이터 베이스라고 하시면 article 테이블의 article_id를 기준으로 comment 테이블에서 해당 뎃글을 검색하는 그러한 방식이 되는건가요? 결국 DB위치가 다르면 join을 쓸 수가 없을듯한데..

쿠케님의 프로필 이미지
쿠케
지식공유자

네 맞습니다!

DB join을 이용하는게 아니라, 애플리케이션 join을 이용할 수 있습니다.

"게시글 조회 최적화" 챕터에서 위 내용과 최적화하는 방법을 배우게 됩니다.

0

인프런 AI 인턴님의 프로필 이미지

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

스프링 부트로 대규모 시스템을 설계하면서 Comment와 Article 엔티티 간의 연관 관계 설정과 관련된 질문을 주셨네요. 질문하신 내용은 데이터베이스 설계와 관련된 중요한 개념을 다루고 있습니다. 아래에 몇 가지 설명을 드리겠습니다.

Comment와 Article의 연관 관계

  1. 연관 관계 설정:

    • Comment 테이블에서 article_id를 사용하여 Article 테이블과의 관계를 맺는 것이 일반적입니다. 이는 각 Comment가 특정 Article에 달린 댓글임을 나타내기 위해 필요합니다.
    • JPA나 다른 ORM을 사용한다면 @ManyToOne@JoinColumn 등의 어노테이션을 사용하여 Comment 엔티티가 Article 엔티티와 연관되어 있음을 나타낼 수 있습니다.
  2. Shard Key 사용:

    • Shard Key는 데이터의 저장 위치를 결정하는 키입니다. article_id를 Shard Key로 사용하는 경우, 같은 Article에 속한 Comment들은 같은 Shard에 위치할 수 있도록 함으로써 데이터 조회 시 성능을 향상시키는 데 도움을 줄 수 있습니다.
  3. 값 설정:

    • article_id가 Comment에 올바르게 설정되어야 Article과의 관계가 성립됩니다. 질문하신 “1 고정값”에 대한 부분은 특정히 설계된 부분이 아니라면, 각 Comment가 본인의 Article에 맞는 article_id를 갖고 있어야 합니다. article_id를 Comment를 생성하면서 자동으로 매칭시키는 로직이 필요합니다.

이와 관련된 실용적인 구현 예제나 더 구체적인 코드 설명이 필요한 경우, 아래 유사한 질문을 다룬 링크들을 참고하시길 추천드립니다:

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