최근 본 상품 설계 면접 질문: 조회 화면에 쓰기가 붙을 때
시스템 디자인 Vol.1 · 20장 「보기만 했는데 쓰기가 생깁니다」에서
이런 화면입니다
상품 상세 화면 아래에 「최근 본 상품」을 열 개 보여 주기로 했습니다. 화면 하나에 줄 하나 붙이는 일로 보입니다.
그런데 상품 상세는 서비스에서 가장 많이 열리는 화면입니다. 이 기능을 붙이는 순간 그 조회 하나하나가 쓰기가 됩니다. 읽기만 하던 화면이 쓰는 화면으로 바뀝니다.
면접관이 이렇게 묻습니다
쇼핑몰의 「최근 본 상품」을 설계해 보세요. 화면 아래에 열 개를 보여 줍니다.
범위부터 좁힙니다
먼저 이 데이터가 무엇인지 묻습니다. 이 기록이 통째로 사라지면 손님은 무엇을 잃는지, 주문 기록과 같은 무게로 다뤄야 하는지에 따라 그 뒤 설명이 달라집니다.
그다음 「열 개」를 가릅니다. 화면에 열 개가 보인다는 말이 무엇을 얼마나 들고 있어야 한다는 뜻인지 면접관과 맞춰 봅니다.
보는 일에 쓰는 일이 붙습니다. 쓰기가 실패하거나 느려질 때 보는 화면에 무슨 일이 생기는지가 핵심 질문입니다.
가장 많이 나오는 답
볼 때마다 행을 하나 쌓고, 열한 번째가 생기면 넣을 때 가장 오래된 것을 지웁니다. 상세 조회와 같은 트랜잭션 안에서 합니다.
@Transactional
public ProductDetail view(long me, long productId) {
recentRepo.insert(me, productId);
recentRepo.deleteOldestIfOver(me, 10);
return productRepo.find(productId);
}
한 사람이 상품 몇 개를 둘러보는 시연에서는 잘 돕니다.
그런데 여기서 깨집니다
인기 상품 하나를 여러 번 오가면 한 사람의 행이 수백 개가 됩니다. 두 탭에서 동시에 보면 지울 대상이 겹칩니다.
기록이 느려지면 상품 상세 화면도 같이 느려집니다. 곁에 붙은 기능 하나가 가장 많이 열리는 화면을 끌어내립니다.
떨어지는 답은 이런 모양입니다
- 볼 때마다 쌓고, 조회할 때 묶어서 보여 줍니다.
- 삽입할 때 열한 번째를 지웁니다.
- 상세 조회와 같은 트랜잭션에 넣습니다.
- 쌓인 기록을 지우는 규칙이 없습니다.
면접관은 여기서 멈추지 않습니다
로그인하기 전에 본 상품은요?
비로그인 조회를 버릴지 담을지 정했는지 봅니다.
같은 상품을 세 번 보면 세 줄인가요?
같은 상품을 여러 번 본 기록을 어떻게 다룰지 봅니다.
기록 저장이 느려지면 상품 상세도 느려지나요?
기록 저장과 상품 화면이 서로에게 주는 영향을 생각했는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 중복을 어디서 막을지 정하고, 보여 줄 열 개와 쌓인 기록을 어떻게 다룰지 정한 뒤, 로그인하기 전에 본 상품을 어떻게 이어 붙일지까지 풉니다.
20장에서 이어지는 것
- 중복을 막는 자리
- 보여 줄 개수와 쌓인 기록
- 로그인하기 전에 본 것
- 이 장이 만든 테이블을 행으로 읽어 보기