SYNC는 어떤 구조로 만들어졌나
SYNC는 지식을 쓰고, 모으고, 나누는 플랫폼이다. 기능을 하나씩 나열하기보다 두 개의 축으로 이해하는 편이 빠르다. 글의 모양과 글이 놓이는 공간이다.
글의 모양 — PostType
타입 | 비유 | 특징 |
|---|---|---|
| 트위터, 채널 메모 | 제목이 없다. 제목이 선택인 유일한 타입 |
| 블로그 글, 포럼 스레드 | 발행하려면 제목이 필요하다 |
| Stack Overflow | 제목 필수. 해결 상태를 가진다 |
질문은 댓글로 해결된다. 별도의 답변 엔티티는 없고 앞으로도 만들지 않는다. 질문 글에 달린 댓글이 곧 답변이고, Comment.isAccepted가 채택된 답변을 표시하며 Post.resolved가 그 상태를 반영한다. Q&A 관련 요구사항은 새로운 객체를 추가하는 대신 댓글을 강화하는 방향으로 푼다.
글이 놓이는 공간 — Project
개인 글은 어떤 프로젝트에도 속하지 않고(PostScope.PUBLIC), 나머지는 모두 프로젝트 안에 있다(PostScope.WORKSPACE).
여기서 중요한 설계 결정 하나. PostScope는 저장되지 않고 파생된다. Post.getScope()가 PostScope.fromProject(project)를 돌려줄 뿐, scope 컬럼도 없고 프로젝트와 스코프를 묶는 CHECK 제약도 없다. 두 값이 어긋나는 상태 자체가 표현 불가능하다.
프로젝트는 세 가지 모양 중 정확히 하나를 가진다.
공간 | 공개 여부 | 참여 방식 | 글을 쓸 수 있는 사람 | 비유 |
|---|---|---|---|---|
커뮤니티 | 공개 | 누구나 바로 참여 | 모든 멤버 | 서브레딧 |
쇼케이스 | 공개 | 요청 후 승인 | 승인된 멤버 | 공개 GitHub 저장소 |
팀 | 비공개 | 초대 전용, 외부에 보이지 않음 | 멤버 | 비공개 슬랙 채널 |
Project의 두 축으로 표현된다.
isPublic— 보이는가joinPolicy—OPEN/REQUEST/INVITE, 기본값은INVITE
세 모드 모두 구현되어 있다. ProjectJoinService.joinProject가 정책에 따라 분기한다. OPEN이면 즉시 Teammate를 만들고, REQUEST면 관리자가 승인/거절할 ProjectJoinRequest를 만들고, INVITE면 예외를 던진다.
"커뮤니티는 아무나 글을 쓸 수 있다"는 성질은 별도의 권한 레벨이 아니라 즉시 가입으로 달성된다. 모든 모드에서 프로젝트에 글을 쓰려면 멤버여야 한다.
정책이라는 단어가 두 번 쓰인다
헷갈리기 쉬운 지점이라 따로 적어둔다.
역할 정책(role policy) — 멤버가 된 뒤에 무엇을 할 수 있는가.
Teammate.Role{ADMIN, MEMBER}+isOwner,ProjectPermissionEvaluator가 해석한다.참여 정책(join policy) — 비멤버가 어떻게 멤버가 되는가.
둘은 다른 문제다.
글을 묶는 세 가지 방법
이것도 서로 다른 개념이라 섞으면 안 된다.
Collection — 아무 글이나 담는 큐레이션 묶음. 플레이리스트에 가깝다.
Series — 순서가 있는 연속물. 한 글은 최대 하나의 시리즈에만 속한다(
UNIQUE(post_id)).Reference — 글과 글 사이의 방향 있는 인용. 양방향으로 조회된다(
/posts/{slug}/references,/posts/{slug}/referenced-by).
여기에 관련 글이 하나 더 있는데, 이건 위 셋과 성격이 다르다. 사용자가 큐레이션한 게 아니라 post_embeddings 위에서의 최근접 이웃 탐색이다. AI 기능이 켜져 있어야 동작한다.
소셜은 부차적이다
팔로우, 좋아요, 북마크, 추천은 발견을 위한 배관으로 존재한다. 의도적으로 제품의 중심이 아니다. 발견이라는 정당한 이유 없이 이 영역을 키우지 않고, 참여 유도 장치(engagement mechanics)는 추가하지 않는다.
명시적으로 범위 밖인 것들도 적어둔다. 평판/카르마/신뢰 등급, 글과 답변에 대한 투표, 창작자 수익화, 광고.
읽기 권한과 쓰기 권한은 다른 문제
쇼케이스는 누구나 읽을 수 있지만 기여자는 제한된다. 커뮤니티는 누구나 읽고 누구나 쓴다. 즉 읽기와 쓰기는 독립적으로 결정된다.
글 읽기 권한의 규칙은 한 줄로 요약된다. 개인 글은 항상 보이고, 프로젝트 글은 그 프로젝트가 공개일 때만 외부인에게 보인다. 비공개 프로젝트의 글은 작성자나 팀원만 볼 수 있다.
이 규칙이 중요한 이유는 글 목록을 보여주는 모든 화면이 같은 규칙을 써야 하기 때문이다. 피드, 슬러그 페이지, 검색, 좋아요 목록, 북마크, 컬렉션, 시리즈, 추천 — 전부. 그래서 조건은 PostVisibilityConditions 한 곳에 모여 있고, 새로운 목록 쿼리를 추가할 때는 여기 있는 걸 재사용하거나 그대로 따라 쓴다. 각자 조건을 새로 쓰기 시작하는 순간 어딘가 한 곳이 비공개 글을 흘린다.
댓글도 같은 원칙을 따르되 쓰기 쪽이 더 좁다. 읽기는 글의 공개 범위를 그대로 따라가고, 쓰기는 프로젝트 글의 경우 멤버십을 요구한다. 개인 글에는 로그인한 사용자면 누구나 댓글을 달 수 있다.
댓글
아직 댓글이 없습니다.