1. 파일 URL 대신 스토리지 키를 저장하라

    안정적인 스토리지 키와 서버에서 조합하는 주소, 중복 없는 내부 이름, 별도로 보존하는 원본 파일명으로 업로드 구조를 단순화합니다.

  2. 임시 저장의 의미로 상태와 별도 저장소 선택하기

    일반적인 생명주기 단계는 상태로, 별도 의미를 가진 준비 데이터는 버전 저장소로 다루되 도메인 의미와 호환 비용을 기준으로 선택합니다.

  3. 익명 서비스에서 순번 키의 연결 고리 끊기

    신원 관련 레코드에 독립적인 무작위 식별자를 사용해 순번 키의 직접 연결을 끊되, UUID만으로 익명성이 보장되지는 않음을 짚습니다.

  4. 어댑터·듀얼 라이트·플래그로 Oracle을 MySQL로 이관하기

    호환 어댑터, 사전 배포, 듀얼 라이트, 검증된 스위치와 롤백으로 Oracle 레거시를 MySQL로 점진 이관합니다.

  5. 회원 탈퇴 데이터의 보관·분리·복구 설계

    탈퇴 회원 데이터를 검증된 보관 기준, 분리 저장, 암호화, 만료와 취소·재가입 같은 운영 흐름에 맞춰 설계합니다.

  6. 정보와 행동을 함께 보는 도메인 개념 도출법

    정보와 프로세스 또는 행동을 사례별 관점에서 살펴 전송 이벤트와 도메인 개념을 구분하는 방법입니다.

  7. 도메인 개념과 데이터베이스 테이블이 일대일이 아닌 이유

    모든 테이블을 도메인 객체와 리포지토리로 복제하지 않고 비즈니스 중요도, 위계와 행동을 기준으로 모델링하는 법을 설명합니다.

  8. 엉망인 레거시 스키마를 코드 경계 뒤에서 개선하는 법

    의미 없는 테이블과 컬럼을 리포지토리와 타입 뒤에 숨겨 코드 통제력을 회복한 뒤 데이터베이스를 점진 개선하는 전략입니다.

  9. 분산 추적과 안전한 운영 로그를 함께 설계하는 법

    서비스 간 요청을 추적하면서 로그 용량, 민감정보 마스킹, 접근 권한과 보관 기간을 함께 설계하는 실무 기준을 다룹니다.

  10. 페이징 카운트 쿼리가 데이터베이스를 느리게 하는 이유

    정확한 전체 건수가 제한 조회보다 비싼 이유와 슬라이스, 캐시 메타데이터, 추정치 또는 요구사항 변경을 선택할 기준을 설명합니다.

  11. 배치 재실행 비용을 줄이기 위해 수신과 가공을 분리하는 법

    외부 데이터를 저장한 뒤 제공자 호출 없이 내부 가공만 재실행해 대형 배치의 트래픽과 복구 비용을 줄이는 방법입니다.

  12. 계정과 프로필 연결 가능성을 낮추는 익명 설계

    식별자 분리, 휘발성 매핑 키, 최소 보관과 계정 복구 제약을 통해 익명 계정 모델의 트레이드오프를 살펴봅니다.

  13. 좋아요 정렬을 위한 핵심 데이터와 집계 데이터 분리

    집계 분리, 명시적인 최신성 기준, 비동기 갱신, 정합성 보정, 검색 경계로 좋아요 기반 정렬을 확장합니다.

  14. 아이디 범위를 띄워 DB 마이그레이션 롤백을 안전하게 만들기

    레거시와 신규 아이디 범위를 분리해 롤백 충돌을 막고, 역마이그레이션과 운영 트래픽 추적을 단순하게 만듭니다.

  15. 개념의 생명주기로 도메인 경계를 찾는 법

    생성, 조회, 수정, 삭제 주기를 비교해 상품, 주문, 결제, 배송, 정산의 응집과 경계를 판단합니다.

  16. 목록 좋아요 수는 단순한 조회부터 시작하라

    현재 페이지의 좋아요만 제한적으로 조회하고, 카운터 컬럼이나 Redis는 규모가 커져 필요할 때 관리 비용과 함께 검토합니다.

  17. 주문 스냅샷을 지키는 소프트 삭제와 도메인 경계

    현재 상품과 주문 스냅샷의 경계를 나누고, 환불 이력을 보존하며 파괴적 삭제 전에 상태 전환과 보관을 검토합니다.

  18. 핵심 엔티티를 가볍게 지키는 연관관계 설계

    생명주기와 책임으로 ORM 연관관계를 판단하고, 검색용 부가 데이터를 분리해 핵심 엔티티를 단순하게 유지합니다.

  19. 운영 테이블을 지키는 별도 조회 모델 설계

    운영 테이블은 비즈니스 개념에 맞게 설계하고, 복잡한 이력·어드민 검색은 별도 조회 모델에서 제공하는 방법을 다룬다.

  20. 열거형인가 코드 테이블인가: 변화 주기로 결정하라

    안정적인 값은 열거형으로, 자주 바뀌는 데이터는 전용 테이블로 관리해 공통 코드 테이블이 잡동사니 저장소가 되는 일을 막는다.

  21. 하나의 DB에서도 도메인별 데이터 접근 경계를 나누는 법

    같은 DB 테이블을 쓰더라도 엔티티와 저장소 경계를 나눠 외부 연동 코드로부터 핵심 규칙을 보호하는 방법을 설명한다.

  22. 덮어쓰지 말고 쌓아라: 불변 운영 데이터 설계

    이력을 선명하게 하고 동기화를 단순화하는 추가 전용 상환 데이터 구조와, 그 대신 늘어나는 저장 및 조회 비용을 살펴본다.

  23. 널인가 0인가: 코틀린 JPA 엔티티 ID 전략

    코틀린 JPA 엔티티의 숫자 ID를 nullable 또는 0으로 둘 때 신규 판별, 모호성, 검증 방법을 비교한다.

  24. DB 변경 쿼리를 작업과 배포 단위로 추적하기

    DB 변경을 해당 이슈와 PR에 모아 개발 환경에서 검증하고, 코드 배포 전에 릴리스에 필요한 최종 쿼리만 전달한다.

  25. 코어 책임과 대리키로 변경에 대비하기

    공유 등록 규칙을 코어에 모으고 필요할 때만 격리를 강화하며, 바뀔 수 있는 비즈니스 유일성은 기본키와 분리하는 설계를 다룬다.

  26. 재개발에서는 새 구조를 먼저 설계하라

    재개발의 목적에 맞춰 새 시스템을 먼저 설계하고, 레거시 데이터는 명시적인 매핑과 폐기 조건을 둔 전환 계층으로 옮긴다.

  27. 요구사항과 규모에서 시작하는 리액션 기능 설계

    모호한 좋아요 요구를 정책으로 구체화하고, 데이터 증가량과 조회 비용을 계산해 리액션 모델과 변경 시점을 설계한다.

  28. 오버엔지니어링을 막는 되돌릴 수 있는 설계

    현재 요구사항을 담백하게 구현하고 조금만 앞을 보며, 추측으로 만든 구조를 쉽게 확장하거나 제거하고 다른 방향으로 바꿀 수 있게 하는 기준입니다.

  29. 외래키는 규칙이 아니라 운영상의 선택이다

    무결성 요구, 장애 대응, 배포 절차, 운영 DB의 주체를 기준으로 외래키와 인덱스, ORM 연관관계를 각각 선택하는 방법입니다.

  30. 공유 테스트 DB 없이 신뢰할 수 있는 데이터베이스 테스트 만들기

    잡아야 할 실패에 따라 목, 인메모리 DB, Testcontainers, 실제 DB를 고르고 일반 테스트는 공유 인프라에서 격리합니다.

  31. 요구사항과 객체 관계로 정규화와 반정규화를 선택하기

    정규화 수준을 점수처럼 높이기보다 값의 변경 의미, 조회 비용, 데이터가 보존해야 할 객체 관계를 기준으로 테이블을 설계합니다.