<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>slow-er.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 01 Oct 2025 05:18:43 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>slow-er.log</title>
            <url>https://velog.velcdn.com/images/slow-er/profile/b5badec1-be43-46d1-8cde-bafba891376d/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. slow-er.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/slow-er" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[실무 데이터 모델링: Entity 설계의 핵심 노하우]]></title>
            <link>https://velog.io/@slow-er/%EC%8B%A4%EB%AC%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-Entity-%EC%84%A4%EA%B3%84%EC%9D%98-%ED%95%B5%EC%8B%AC-%EB%85%B8%ED%95%98%EC%9A%B0</link>
            <guid>https://velog.io/@slow-er/%EC%8B%A4%EB%AC%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-Entity-%EC%84%A4%EA%B3%84%EC%9D%98-%ED%95%B5%EC%8B%AC-%EB%85%B8%ED%95%98%EC%9A%B0</guid>
            <pubDate>Wed, 01 Oct 2025 05:18:43 GMT</pubDate>
            <description><![CDATA[<p>데이터 모델링의 첫 단계인 엔터티 설계의 핵심 원리와 실무 적용 방법을 단계별로 정리해보겠습니다.
이론적 지식을 넘어 현장에서 바로 활용할 수 있는 실무 노하우를 중심으로 다뤄보려고 합니다.</p>
<h3 id="1단계-entity-분류---우선순위-기반-설계-전략"><strong>1단계: Entity 분류 - 우선순위 기반 설계 전략</strong></h3>
<h4 id="왜-엔터티를-분류해야-할까"><em><strong>왜 엔터티를 분류해야 할까?</strong></em></h4>
<p>데이터 모델링에서 가장 먼저 해야 할 일은 엔터티의 우선순위를 정하는 것입니다. 실무 프로젝트에서 수백 개의 엔터티가 도출되는 상황에서 모든 엔터티를 동시에 설계할 수는 없기 때문입니다. 마치 건축에서 기둥을 먼저 세우고 벽을 쌓는 것처럼, 데이터 모델링도 핵심이 되는 엔터티부터 차근차근 설계해야 합니다.</p>
<h4 id="엔터티-3단계-분류법">엔터티 3단계 분류법</h4>
<blockquote>
<p>** ① Key 엔터티 (핵심의 핵심)**</p>
</blockquote>
<ul>
<li>정의: 데이터를 발생시키는 행위의 주체나 목적어로, 부모 엔터티를 갖지 않는 최상위 개념</li>
<li>특징: 독립적으로 존재하며, 다른 엔터티들의 기반이 되는 마스터 데이터</li>
<li>온라인 쇼핑몰 예시:
고객 (Customer): 모든 거래의 주체
상품 (Product): 판매하는 모든 상품 정보
카테고리 (Category): 상품 분류의 기준
직원 (Employee): 시스템 운영 주체</li>
</ul>
<blockquote>
<p>** ② Main 엔터티 (비즈니스의 중심)**</p>
</blockquote>
<ul>
<li>정의: Key 엔터티로부터 파생되지만 비즈니스 프로세스의 중심 역할을 담당하며, 많은 하위 엔터티를 생성</li>
<li>특징: 업무의 핵심 트랜잭션을 담당하고, 데이터 발생량이 많음</li>
<li>온라인 쇼핑몰 예시:
주문 (Order): 고객의 구매 요청
장바구니 (Cart): 구매 전 상품 임시 보관
결제 (Payment): 거래 완료 처리
배송 (Shipment): 상품 전달 과정</li>
<li>카페 체인점 예시:
매장 (Store): 각 지점 정보
메뉴 (Menu): 판매 상품 관리
주문서 (OrderForm): 고객 주문 접수</li>
</ul>
<blockquote>
<p>** ③ Action 엔터티 (세부 실행 단위)**</p>
</blockquote>
<ul>
<li>정의: Key와 Main 엔터티에서 파생되어 구체적인 업무 행위나 이벤트를 담당</li>
<li>특징: 주로 거래 상세, 이력, 로그 데이터를 관리하며 데이터 변경이 빈번함</li>
<li>온라인 쇼핑몰 예시:
주문상세 (OrderDetail): 주문한 개별 상품 정보
결제이력 (PaymentHistory): 결제 처리 과정 추적
배송추적 (DeliveryTracking): 배송 단계별 상태 변화
상품리뷰 (ProductReview): 구매 후 고객 평가
쿠폰사용이력 (CouponUsageHistory): 할인 적용 내역</li>
</ul>
<p>실무에서의 핵심 엔터티 비율과 적용 전략</p>
<p>_프로젝트 현장에서 고객사로부터 자주 받는 질문이 있습니다.
<strong>&quot;핵심 엔터티의 비율이 보통 어느 정도 되나요?&quot;</strong>
_</p>
<p>업계 별로, 사이트 별로 다르겠지만 다년간의 프로젝트 경험상의 황금 비율은 <strong>10~30개</strong> 정도 인 것 같습니다. 비율이 너무 높으면 세분화가 부족하고, 너무 낮으면 과도하게 복잡하게 설계했을 가능성이 있습니다.</p>
<p>[실무 적용 시나리오 간단 예제 : 은행 시스템]</p>
<blockquote>
<p>Key 엔터티:</p>
</blockquote>
<ul>
<li>고객(Customer), 직원(Employee), 상품(Product), 지점(Branch)</li>
</ul>
<blockquote>
<p>Main 엔터티:</p>
</blockquote>
<ul>
<li>계좌(Account) ← 고객+상품에서 파생</li>
<li>대출(Loan) ← 고객+상품에서 파생  </li>
<li>거래(Transaction) ← 계좌에서 파생</li>
</ul>
<blockquote>
<p>Action 엔터티:</p>
</blockquote>
<ul>
<li>거래내역(TransactionHistory) ← 거래에서 파생</li>
<li>대출상환내역(LoanRepaymentHistory) ← 대출에서 파생</li>
<li>고객상담내역(CustomerConsultationHistory) ← 고객+직원에서 파생</li>
</ul>
<p>CRUD 매트릭스를 통한 엔터티 검증
엔터티 분류가 끝나면 CRUD 매트릭스를 활용하여 분류의 적절성을 검증합니다.</p>
<blockquote>
<p>Create: 어떤 업무 기능에서 이 엔터티를 생성하는가?
Read: 어떤 화면/보고서에서 이 엔터티를 조회하는가?
Update: 어떤 업무에서 이 엔터티를 수정하는가?
Delete: 어떤 상황에서 이 엔터티를 삭제하는가?</p>
</blockquote>
<p><em><strong>Key 엔터티의 경우: Read 빈도가 높고, Create/Update는 상대적으로 적어야 함
Action 엔터티의 경우: Create 빈도가 높고, Update/Delete는 제한적이어야 함</strong></em></p>
<p><img src="https://velog.velcdn.com/images/slow-er/post/018a1034-9599-4948-943a-9ec576749814/image.png" alt=""> <a href="https://www.youtube.com/watch?v=lRfHJm--H0Q">https://www.youtube.com/watch?v=lRfHJm--H0Q</a></p>
<p><strong>엔터티 분류의 부수적 효과</strong>
우선순위 선별이 주목적이지만, 분류 과정에서 얻을 수 있는 추가적인 가치들</p>
<ul>
<li>엔터티의 정체성 명확화: 각 엔터티의 역할과 중요도가 명확해짐</li>
<li>설계 순서 최적화: 의존 관계를 고려한 체계적인 설계 가능</li>
<li>팀 업무 분장: 핵심 엔터티는 시니어가, Action 엔터티는 주니어가 담당</li>
<li>개발 우선순위 결정: Key → Main → Action 순으로 개발 진행</li>
<li>테스트 시나리오 구성: 핵심 엔터티 중심의 통합 테스트 설계</li>
<li>실무 팁: Main과 Action 구분이 애매하다면 너무 많은 에너지를 쏟지 말고, 중요한 것부터 먼저 하는 목적에 집중하세요. 완벽한 분류보다는 실행 가능한 우선순위가 더 중요합니다.</li>
</ul>
<h3 id="2단계-entity-자격-검증---진짜-엔터티인가">2단계: Entity 자격 검증 - 진짜 엔터티인가?</h3>
<h4 id="①-집합의-순수성-검증-관계-vs-엔터티"><strong>① 집합의 순수성 검증: 관계 vs 엔터티</strong></h4>
<p>데이터 모델링에서 흔히 실수하는 부분이 관계를 엔터티로 착각하는 것입니다.
특히 업무에서 사용하는 용어가 명사 형태라고 해서 무조건 엔터티는 아닙니다.</p>
<p><strong>실무 사례 분석: 피보험자의 정체</strong></p>
<blockquote>
<p>잘못된 접근:</p>
</blockquote>
<ul>
<li>엔터티명: 피보험자</li>
<li>속성: 피보험자ID, 성명, 생년월일, 보험가입일...</li>
<li>올바른 분석:
&quot;피보험&quot;: 보험의 보장을 받는 행위 (관계)
&quot;자&quot;: 그 행위의 대상인 사람 (개체)</li>
</ul>
<blockquote>
<p>결론: 피보험자 = 보험 + 고객 간의 관계
<strong>올바른 모델링:
보험(Insurance) ←→ 보험가입(InsuranceContract) ←→ 고객(Customer)</strong></p>
</blockquote>
<p>업무 용어의 함정들
실무에서 자주 마주치는 관계를 엔터티로 오해하기 쉬운 용어들:</p>
<p>금융권:
예금자 → 예금 + 고객의 관계
대출자 → 대출 + 고객의 관계
투자자 → 투자상품 + 고객의 관계</p>
<p>병원:
환자 → 의료서비스 + 고객의 관계 (단, 병원에서는 관습적으로 환자 엔터티 사용)
처방자 → 처방전 + 의사의 관계</p>
<p>교육기관:
수강생 → 강의 + 학생의 관계
강사 → 강의 + 교수의 관계</p>
<p>*<em>엔터티 순수성 검증 체크리스트
*</em>순수한 엔터티의 조건</p>
<ul>
<li>단일 개념: 하나의 명확한 의미만 담고 있는가?</li>
<li>독립적 존재: 다른 엔터티와의 관계 없이도 의미가 있는가?</li>
<li>고유한 속성: 그 엔터티만의 고유한 특성들을 가지고 있는가?</li>
</ul>
<h4 id="②-집합의-동질성-결정-통합-vs-분리"><strong>② 집합의 동질성 결정: 통합 vs 분리</strong></h4>
<p>역사적 관점에서의 동질성 사례
예를 들어, 삼국시대 당나라가 고구려·백제·신라를 바라본다면
 &quot;한반도&quot; 라는 하나의 엔터티로 관리했을 가능성이 있지 않을까 상상해봅니다.
같은 언어, 비슷한 문화라는 동질성 때문입니다.</p>
<p><strong>실무에서의 동질성 판단 기준</strong></p>
<blockquote>
<ul>
<li>통합이 유리한 경우
고객 엔터티: 개인고객, 법인고객을 하나로 통합
공통점: 이름, 연락처, 주소 등 기본 정보 구조 유사
구분: 고객유형 코드로 구분
통합의 장점: 
모델 단순화로 유지보수성 향상, 업무 규칙 변경 시 코드 값만 추가하면 됨, 통합 통계나 분석 작업 용이</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>분리가 유리한 경우:
상품 엔터티: 물리적 상품 vs 디지털 상품
물리적 상품: 재고, 무게, 크기 등 물리적 속성 필요
디지털 상품: 다운로드 횟수, 라이선스 등 디지털 속성 필요
분리의 장점:
각 유형별 최적화된 속성 관리, 보안 정책 개별 적용 가능, 성능 튜닝의 유연성</li>
</ul>
</blockquote>
<p>실무 적용 Tips (통합 결정 가이드라인)</p>
<ul>
<li>속성 중복도: 공통 속성이 70% 이상이면 통합 고려</li>
<li>업무 프로세스: 동일한 업무 프로세스를 거치는가?</li>
<li>확장성: 미래에 새로운 유형이 추가될 가능성은?</li>
<li>성능: 통합으로 인한 테이블 크기 증가가 성능에 미치는 영향은?</li>
</ul>
<h3 id="3단계-엔터티-형태-결정---서브타입-활용법">3단계: 엔터티 형태 결정 - 서브타입 활용법</h3>
<h4 id="데이터-통합의-두-가지-패턴">데이터 통합의 두 가지 패턴</h4>
<p>집합 통합 시 유의사항: 물과 기름의 법칙</p>
<blockquote>
<p>바람직하지 않은 통합 (잉크 + 물):
고객 테이블에 개인고객과 법인고객을 구분 없이 섞어놓은 경우</p>
</blockquote>
<ul>
<li>개인: 주민등록번호, 생년월일</li>
<li>법인: 사업자등록번호, 설립일<br>→ NULL 값이 많아지고 데이터 의미가 모호해짐</li>
</ul>
<blockquote>
<p>** 이상적인 통합 (기름 + 물 + 용기)**:
고객 테이블 (슈퍼타입)
├── 개인고객 (서브타입)
└── 법인고객 (서브타입)
→ 함께 있으면서도 명확하게 구분됨</p>
</blockquote>
<p><strong>서브타입 설계 전략</strong></p>
<blockquote>
<p><strong>전자상거래 주문 엔터티</strong>
주문유형
├── 일반주문 (서브타입)
├── 예약주문 (서브타입)<br>└── 정기주문 (서브타입)</p>
</blockquote>
<ul>
<li>서브타입 세트명: 주문유형</li>
<li>서브타입명: &#39;일반&#39;, &#39;예약&#39;, &#39;정기&#39;</li>
</ul>
<p>서브타입 사용 시 명확한 장점들</p>
<ol>
<li><p>직관적 업무 규칙 표현
→ 한눈에 고객 구성과 각 유형별 특징 파악 가능</p>
</li>
<li><p>개발 효율성 극대화
개발자가 업무 로직을 구현할 때:
컨디션 좋은 날🤗🥰: 업무 담당자에게 확인 후 정확한 구현 👍
컨디션 나쁜 날🥱😴: 추정으로 구현 → 나중에 버그 발생 😣
서브타입이 명확하게 정의되어 있으면 추정의 여지를 줄이고 정확한 구현 가능</p>
</li>
</ol>
<ol start="3">
<li>유지보수성 향상
예: 새로운 고객 유형 추가 시
서브타입 없는 경우: 테이블 구조 변경, 기존 코드 수정
서브타입 있는 경우: 코드 값만 추가, 해당 서브타입 속성만 추가</li>
</ol>
<p>이유와 근거</p>
<ul>
<li>ERD 복잡성: 거의 모든 테이블에 공통코드 관계를 표현하면 다이어그램이 읽기 어려워짐</li>
<li>의사소통 도구: ERD는 업무 규칙을 직관적으로 전달하는 도구여야 함</li>
<li>관계의 성격: 공통코드는 값 참조이지 업무적 관계가 아님</li>
<li>올바른 접근:
고객 테이블: 고객상태코드(VARCHAR) → &#39;A01&#39;, &#39;A02&#39;, &#39;A03&#39;
공통코드 테이블: 코드값=&#39;A01&#39;, 코드명=&#39;정상&#39;
→ ERD에는 관계선 표시하지 않음</li>
</ul>
<p>[실무에서 자주 발생하는 개념 모호성]</p>
<blockquote>
<p>잘못된 엔터티 정의 사례들:
고객: &quot;우리 회사를 이용하는 사람&quot; (기준 모호)</p>
</blockquote>
<blockquote>
<p><strong>올바른 엔터티 정의</strong> 방법:
고객: &quot;회원 가입을 완료하고 고객번호가 부여된 자. 탈퇴 후 1년 이내 고객 포함&quot;</p>
</blockquote>
<p><strong>미지수를 상수로 만드는 과정 (개념 정립 실무 프로세스)</strong></p>
<ul>
<li>범위 명확화: 포함/제외 기준 명시</li>
<li>예외 상황 정의: 애매한 경우의 처리 방법</li>
<li>시점 기준 설정: 언제부터 언제까지의 데이터인가?</li>
<li>상태 변화 규칙: 상태가 변할 때의 처리 방법</li>
</ul>
<p>*실무 팁:
익숙한 단어(학생, 교사, 고객)일수록 깊이 생각하지 않고 지나칠 위험이 있습니다. 이런 단어들을 만날 때마다 &quot;정말 우리가 생각하는 그 의미가 맞나?&quot; 한 번 더 되짚어보는 습관이 중요합니다. 엔터티 설계는 단순히 테이블을 만드는 작업이 아닙니다. 비즈니스 규칙을 데이터 구조로 번역하는 과정입니다.</p>
<blockquote>
<p><strong>성공적인 엔터티 설계</strong>를 위한 4단계</p>
</blockquote>
<ol>
<li>명확한 개념 정립 → 미지수를 상수로 변환</li>
<li>체계적인 분류 → 우선순위 기반의 효율적 설계</li>
<li>엄격한 자격 검증 → 진짜 엔터티와 가짜 엔터티 구분</li>
<li>효과적인 형태 결정 → 서브타입을 통한 입체적 표현</li>
</ol>
<h4 id="기억해야-할-핵심">기억해야 할 핵심!</h4>
<p>각 단계에서 실무 적용 가능성과 유지보수성을 항상 염두에 두어야 합니다.
특히 서브타입을 활용한 입체적 모델링은 개발자들이 업무 규칙을 명확하게 이해할 수 있도록 도와주어, 추정에 의한 구현을 줄이고 품질 높은 시스템 구축에 기여합니다. 완벽한 모델보다는 실무에서 활용 가능하고 지속적으로 진화할 수 있는 모델이 진정 가치 있는 모델입니다.</p>
<h4 id="참고-실습-erd-tool-httpswwwsmatidacom">[참고] 실습 ERD Tool <a href="https://www.smatida.com/">https://www.smatida.com/</a></h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[데이터 모델링 ERD 실습]]></title>
            <link>https://velog.io/@slow-er/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-ERD-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@slow-er/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%8D%B8%EB%A7%81-ERD-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 01 Oct 2025 04:46:06 GMT</pubDate>
            <description><![CDATA[<p>ERD(Entity-Relationship Diagram)</p>
<p>ERD는 데이터베이스 설계 단계에서 엔터티(Entity), 관계(Relationship), 속성(Attribute) 간의 구조적 연관성을 시각화하는 다이어그램입니다. ERD를 통해 요구사항을 모델링하고, 데이터베이스 스키마로 전환하기 전 전체 구조를 명확히 파악할 수 있습니다.</p>
<p><strong>1. 주요 구성 요소</strong></p>
<blockquote>
<p><strong>엔터티(Entity)</strong>
현실 세계의 개체(Entity)를 데이터베이스 상의 테이블로 표현
사각형으로 표시하며, 내부에 엔터티명을 기재
예: 고객, 주문, 상품</p>
</blockquote>
<blockquote>
<p><strong>속성(Attribute)</strong>
엔터티가 갖는 정보의 단위(테이블의 컬럼)
타원형으로 표시하고 엔터티와 선으로 연결
기본키(Primary Key)는 밑줄, 외래키(Foreign Key)는 기울임꼴로 표기
예: 고객 엔터티의 고객ID, 이름, 연락처</p>
</blockquote>
<blockquote>
<p><strong>관계(Relationship)</strong>
엔터티 간 연관성을 나타내며, 마름모(또는 선)로 표시
관계명은 동사형으로 기술하여 의미 명확화
카디널리티(Cardinality) 표기로 1:1, 1:N, N:M 등 연결 강도 표현
예: 고객—(주문한다)—주문 엔터티</p>
</blockquote>
<p>카디널리티(Cardinality) 및 참여도(Participation)</p>
<ul>
<li>[1:1] 한 엔터티의 한 레코드가 다른 엔터티의 한 레코드와만 연관</li>
<li>[1:N] 한 엔터티의 한 레코드가 다른 엔터티의 여러 레코드와 연관</li>
<li>[N:M] 양쪽 엔터티의 여러 레코드가 서로 연관 (교차 테이블로 해소)</li>
<li>[참여도][ 엔터티가 관계에 반드시 참여(총수) 또는 선택적 참여(부분수)인지 표시</li>
</ul>
<p><strong>2. ERD 작성 절차</strong></p>
<blockquote>
<p><strong>개념적 모델링</strong>
업무 도메인 분석을 통해 엔터티와 관계 도출
용어 사전(Glossary) 작성으로 개념 정의</p>
</blockquote>
<blockquote>
<p><strong>논리적 모델링</strong>
엔터티별 속성 정의, 기본키·외래키 지정
정규화 과정을 거쳐 테이블 구조 최적화</p>
</blockquote>
<blockquote>
<p><strong>물리적 모델링</strong>
실제 DBMS 문법에 맞춰 테이블 생성 문작성
데이터 타입, 인덱스, 제약조건 지정</p>
</blockquote>
<p><strong>[실습 영상]</strong> <a href="https://youtu.be/lRfHJm--H0Q?si=gu8hItW3tCc5p-NW">https://youtu.be/lRfHJm--H0Q?si=gu8hItW3tCc5p-NW</a>
<img src="https://velog.velcdn.com/images/slow-er/post/2b86bfd1-e0c5-4b3e-9710-2f72992d3d7b/image.png" alt=""></p>
<p><strong>3. ERD 활용 효과</strong></p>
<ul>
<li>의사소통 도구: 개발자, DBA, 비즈니스 담당자 간 설계 공유</li>
<li>문서화: 데이터 구조 및 업무 규칙을 한눈에 파악 가능한 문서</li>
<li>품질 검증: CRUD 매트릭스, 정규화 검토로 모델의 완결성·무결성 확보</li>
<li>유지보수: 변경 관리 시 영향 범위 분석과 스키마 업데이트 용이</li>
</ul>
<p><strong>4. ERD 작성 시 주의사항</strong></p>
<ul>
<li>과도한 복잡성 지양: 공통코드·로그 테이블 등은 생략하거나 별도로 관리</li>
<li>명명 규칙 통일: 엔터티·속성명 일관된 스타일(카멜, 스네이크 등) 적용</li>
<li>관계선 정리: 선이 교차하지 않도록 배치하여 가독성 확보</li>
<li>버전 관리: 변경 이력 기록 및 리뷰 세션을 통해 품질 유지</li>
</ul>
<p>ERD는 데이터 모델링의 <strong>“나침반”</strong>과 같습니다.
이 다이어그램 하나를 기반으로 설계·구현·운영 전 과정에서 일관된 이해와 효율적 협업을 도울 수 있습니다.</p>
<h4 id="참고-실습-erd-tool-httpswwwsmatidacom">[참고] 실습 ERD Tool <a href="https://www.smatida.com/">https://www.smatida.com/</a></h4>
]]></description>
        </item>
    </channel>
</rss>