설계 면접 문제 20 · 7부 무엇을 남길지 우리가 정할 때

최근 본 상품 설계 면접 질문: 조회 화면에 쓰기가 붙을 때

시스템 디자인 Vol.1 · 20장 「보기만 했는데 쓰기가 생깁니다」에서

이런 화면입니다

상품 상세 화면 아래에 「최근 본 상품」을 열 개 보여 주기로 했습니다. 화면 하나에 줄 하나 붙이는 일로 보입니다.

그런데 상품 상세는 서비스에서 가장 많이 열리는 화면입니다. 이 기능을 붙이는 순간 그 조회 하나하나가 쓰기가 됩니다. 읽기만 하던 화면이 쓰는 화면으로 바뀝니다.

면접관이 이렇게 묻습니다

면접관

쇼핑몰의 「최근 본 상품」을 설계해 보세요. 화면 아래에 열 개를 보여 줍니다.

범위부터 좁힙니다

먼저 이 데이터가 무엇인지 묻습니다. 이 기록이 통째로 사라지면 손님은 무엇을 잃는지, 주문 기록과 같은 무게로 다뤄야 하는지에 따라 그 뒤 설명이 달라집니다.

그다음 「열 개」를 가릅니다. 화면에 열 개가 보인다는 말이 무엇을 얼마나 들고 있어야 한다는 뜻인지 면접관과 맞춰 봅니다.

이 문제의 무게

보는 일에 쓰는 일이 붙습니다. 쓰기가 실패하거나 느려질 때 보는 화면에 무슨 일이 생기는지가 핵심 질문입니다.

가장 많이 나오는 답

볼 때마다 행을 하나 쌓고, 열한 번째가 생기면 넣을 때 가장 오래된 것을 지웁니다. 상세 조회와 같은 트랜잭션 안에서 합니다.

@Transactional
public ProductDetail view(long me, long productId) {
  recentRepo.insert(me, productId);
  recentRepo.deleteOldestIfOver(me, 10);
  return productRepo.find(productId);
}

한 사람이 상품 몇 개를 둘러보는 시연에서는 잘 돕니다.

그런데 여기서 깨집니다

인기 상품 하나를 여러 번 오가면 한 사람의 행이 수백 개가 됩니다. 두 탭에서 동시에 보면 지울 대상이 겹칩니다.

기록이 느려지면 상품 상세 화면도 같이 느려집니다. 곁에 붙은 기능 하나가 가장 많이 열리는 화면을 끌어내립니다.

떨어지는 답은 이런 모양입니다

  • 볼 때마다 쌓고, 조회할 때 묶어서 보여 줍니다.
  • 삽입할 때 열한 번째를 지웁니다.
  • 상세 조회와 같은 트랜잭션에 넣습니다.
  • 쌓인 기록을 지우는 규칙이 없습니다.

면접관은 여기서 멈추지 않습니다

  1. 로그인하기 전에 본 상품은요?

    비로그인 조회를 버릴지 담을지 정했는지 봅니다.

  2. 같은 상품을 세 번 보면 세 줄인가요?

    같은 상품을 여러 번 본 기록을 어떻게 다룰지 봅니다.

  3. 기록 저장이 느려지면 상품 상세도 느려지나요?

    기록 저장과 상품 화면이 서로에게 주는 영향을 생각했는지 봅니다.

VOL.1 · 20장

이 다음 판단은 책에서 이어집니다

책은 중복을 어디서 막을지 정하고, 보여 줄 열 개와 쌓인 기록을 어떻게 다룰지 정한 뒤, 로그인하기 전에 본 상품을 어떻게 이어 붙일지까지 풉니다.

20장에서 이어지는 것

  • 중복을 막는 자리
  • 보여 줄 개수와 쌓인 기록
  • 로그인하기 전에 본 것
  • 이 장이 만든 테이블을 행으로 읽어 보기
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기