게시판 5초 vs 5시간 · 2026-06-13
"도메인 모델은 건물의 평면도. 한번 그어지면 바꾸기 어렵다."
Post(id, ...)
Money(1000원)
자세한 건 강의 안에서. 모르는 단어 나오면 이 표 다시 보기.
"초기 모델링 1 시간 = 운영 1 년 절약."
Post(id, title, content, author, viewCount, likeCount, status, scheduledAt, ...)
단순 — 한 테이블 좋아요 +1 → 본문 락 경합 통계 추가 → 마이그레이션 큼
Post(id, title, content, authorId) PostMeta(postId, viewCnt, likeCnt) PostStatus(postId, status, schedAt)
변경 이유 분리 좋아요 → PostMeta 만 락 경합 ↓ 조회 시 조인 1~3 회
단순한 게 항상 좋은 건 아님. 변화 패턴 이 모델 결정.
같은 포스트 가 어떻게 진화했나.
모델이 덧붙는 게 아니라 재설계 된 시점이 4 번.
처음부터 _작게_, _바꾸기 쉽게_ 명확한 _경계_ (애그리거트) 책임 _분리_ (변경 이유 다름) 모든 미래 _예측_ 한 Entity 50 속성 한 테이블에 _다 때려넣기_
모델은 진화 한다. 진화하기 쉽게 만드는 게 핵심.
학습자가 자주 빠지는 모델링 실수.
1. God Object — 한 객체 _다 함_ 2. 빈혈 모델 — 데이터만, 행위 X 3. 분기 폭발 — type 검사 50번 4. 양방향 의존 — 순환 참조 5. id-만 객체 — 도메인 언어 X
class Post { String title; User author; List<Comment> comments; List<Like> likes; List<Tag> tags; Statistics stats; Notifier notifier; // ... 50 개 더 }
한 객체가 모든 것 책임 → 변경 빈도 ↑, 락 경합 ↑. 애그리거트 분리: Post / PostStats / PostNotification.
class Post { // setter, getter 만 } class PostService { void publish(Post p) { ... } void archive(Post p) { ... } }
객체 = 데이터 컨테이너, 행위 없음. 도메인 행위는 도메인 객체에: post.publish().
post.publish()
post.publish() { if (type == 'NORMAL') ... if (type == 'NOTICE') ... if (type == 'EVENT') ... if (type == 'PRIVATE') ... }
새 타입 1 개 = 메서드 전부 수정. 다형성: NormalPost / NoticePost 분리.
class Post { List<Comment> comments; } class Comment { Post post; } // Post 수정 → Comment 영향 // Comment 추가 → Post 영향
순환 의존 → 테스트 어려움 + LAZY 함정 + 캐시 무효화 복잡. 한쪽 방향만 (보통 N → 1).
class Order { Long userId; // User 아님 Long productId; // Product 아님 } User u = userRepo.findById(order.userId);
연관 의 의도가 숨음. 도메인 언어 잃음. Entity 참조 (애그리거트 안), id 참조 (애그리거트 밖).
5 개 중 3 개+ 만족 = 좋은 모델 출발.
[게시판 도메인 분리로 락 경합 97% 감소] P (문제) Post 단일 Entity — 좋아요 +1 시 본문 수정 락 충돌 12% O (옵션) 비관 락 / 애그리거트 분리 / Redis counter D (결정) PostStats 애그리거트 분리 — 변경 이유 다름 A (행동) Entity 분리 + 마이그레이션 + 부하 테스트 R (결과) 락 충돌 12% → 0.3% (-97%)
03-week2-jpa
entity-design-notes.md
막히면 → {cohort}-질문 채널 + 오피스아워 (화·목 21:00)
{cohort}-질문
21:00
이번 주 = "내 게시판 모델 다시 보기" 다음 면접 = "왜 그 모델?" 답할 수 있게
다음 격주 강의(W4): 슬로우 쿼리 사례 5선.