Files
document-haness/.playwright-mcp/page-2026-09-04T05-03-00-413Z.yml

386 lines
29 KiB
YAML

- generic [ref=f16e3]:
- link "본문으로 건너뛰기" [ref=f16e4] [cursor=pointer]:
- /url: "#main-content"
- banner [ref=f16e5]:
- generic [ref=f16e6]:
- link "TechLog Studio" [ref=f16e7] [cursor=pointer]:
- /url: /studio
- text: TechLog
- generic [ref=f16e8]: Studio
- navigation "Studio 주 탐색" [ref=f16e10]:
- link "작업본" [ref=f16e11] [cursor=pointer]:
- /url: /studio/documents
- link "게시 기록" [ref=f16e12] [cursor=pointer]:
- /url: /studio/publications
- link "새 문서" [ref=f16e13] [cursor=pointer]:
- /url: /studio/documents/new
- link "주제·프로젝트" [ref=f16e14] [cursor=pointer]:
- /url: /studio/taxonomy
- link "릴리즈" [ref=f16e15] [cursor=pointer]:
- /url: /studio/releases
- link "공개 사이트 보기" [ref=f16e16] [cursor=pointer]:
- /url: /
- button "로그아웃" [ref=f16e17]
- main [ref=f16e18]:
- generic [ref=f16e19]:
- generic [ref=f16e20]:
- region [ref=f16e21]:
- generic [ref=f16e22]:
- paragraph [ref=f16e23]: PROJECT_DECISION · VERSION 4
- heading "문서 편집" [level=1] [ref=f16e24]
- paragraph [ref=f16e25]: Query Plan은 실제 PostgreSQL에서 측정한다
- region [ref=f16e26]:
- generic [ref=f16e27]:
- paragraph [ref=f16e28]: DOCUMENT
- heading "기본 정보" [level=2] [ref=f16e29]
- generic [ref=f16e30]:
- generic [ref=f16e31]:
- generic [ref=f16e32]: 제목
- textbox "제목" [ref=f16e33]: Query Plan은 실제 PostgreSQL에서 측정한다
- generic [ref=f16e34]:
- generic [ref=f16e35]: slug
- textbox "slug" [ref=f16e36]:
- /placeholder: 비우면 제목에서 만듭니다 (영문 소문자·숫자·하이픈)
- text: measure-plan-on-real-postgresql
- generic [ref=f16e37]:
- generic [ref=f16e38]: 요약
- textbox "요약" [ref=f16e39]: 조회 성능 측정은 인메모리 대체 DB가 아니라 운영과 같은 PostgreSQL에서 실행한다. 실행계획과 인덱스 동작이 측정 대상이므로 DB는 대체재가 아니라 측정 대상의 일부다.
- generic [aria-hidden] [ref=f16e40]: 목록 카드에는 약 90자까지 보입니다 · 99 / 2000
- generic [ref=f16e41]:
- generic [ref=f16e42]: Topic
- combobox "Topic" [ref=f16e43]:
- option "선택하지 않음"
- option "JPA 피드 조회 성능" [selected]
- option "OAuth/OIDC 인증 경계"
- generic [ref=f16e44]:
- generic [ref=f16e45]: Project
- combobox "Project" [ref=f16e46]:
- option "미지정"
- option "Backend Clean Architecture"
- option "KeyCloak Patterns"
- option "Liner N + 1문제" [selected]
- status [ref=f16e47]
- group "축 — 고르지 않으면 이 주제의 공통 기록이 됩니다" [ref=f16e48]:
- generic [ref=f16e50] [cursor=pointer]:
- checkbox "파생 쿼리 그대로" [ref=f16e51]
- generic [ref=f16e52]: 파생 쿼리 그대로
- generic [ref=f16e53] [cursor=pointer]:
- checkbox "컬렉션 fetch join" [ref=f16e54]
- generic [ref=f16e55]: 컬렉션 fetch join
- generic [ref=f16e56] [cursor=pointer]:
- checkbox "fetch join + 페이징" [ref=f16e57]
- generic [ref=f16e58]: fetch join + 페이징
- group "근거 기록" [ref=f16e59]:
- generic [ref=f16e61]:
- generic [ref=f16e62]:
- generic [ref=f16e63]: 근거 1 대상
- combobox "근거 1 대상" [ref=f16e64]:
- option "대상 선택"
- option "Browser Token을 없애면서 BFF에 Session과 CSRF 책임이 생긴 과정"
- option "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제"
- option "Collection Fetch Join Pagination의 In-memory Paging"
- option "DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1"
- option "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [disabled]
- option "Forward-Auth에서 Client가 보낸 Identity Header를 신뢰하면 안 되는 이유"
- option "Projection 이후에도 1,509행을 읽은 Row Over-fetch"
- option "Refresh Token 관리만 서버로 이전, Access Token은 여전히 Browser에 노출"
- option "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우"
- option "Visibility OR이 Keyset Index를 깨뜨린 문제" [disabled]
- option "Authorization Code와 PKCE가 보호하는 구간"
- option "Bearer JWT가 인증된 principal이 되기까지"
- option "Cookie로 인증하는 요청에서 CSRF token이 하는 일"
- option "브라우저가 credential을 보관하는 위치와 그 성질"
- option "Forward-Auth와 Nginx auth_request의 동작"
- option "외부 IdP Brokering의 동작"
- option "Authorization Code Flow의 Endpoint와 Credential 이동 기준"
- option "BFF 인증 구조 설계 기준"
- option "Feed Visibility Query Pattern"
- option "Fetch Join · Batch · Projection 선택 기준"
- option "Fetch Type과 Fetch Strategy 구분"
- option "Forward-Auth에서 Identity Header를 신뢰하기 위한 조건"
- option "외부 IdP 연동과 Application 인증 구조의 경계"
- option "JPA N+1 정량 진단 기준"
- option "Keyset Pagination 설계 기준"
- option "OAuth/OIDC 인증 패턴 선택 기준"
- option "OAuth Token과 Application Session을 구분하는 기준"
- option "PostgreSQL Query Plan 측정 기준" [selected]
- option "Public Client와 Confidential Client 구분 기준"
- option "Top-N-per-group 선택 기준"
- option "실제 동시 트래픽에서도 이 구조가 안정적인가"
- option "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가"
- option "ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가"
- option "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가"
- option "feed_visible을 Production CQRS로 승격할 것인가"
- option "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가"
- option "Highlight 없는 FeedItem을 허용할 것인가"
- option "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가"
- option "Round Trip과 Row Volume을 독립 측정할 것인가"
- option "BFF가 OAuth Token을 관리하는 조건"
- option "Collection Fetch Join과 Pagination을 같이 사용하지 않는다"
- option "Entity Graph 조회에는 Batch Fetch를 사용한다"
- option "Feed Pagination은 Keyset을 사용한다"
- option "외부 IdP와의 연동이라도 별도의 인증 방식이 아니다."
- option "Query Plan은 실제 PostgreSQL에서 측정한다"
- option "Query Strategy는 FeedQueryPort 뒤에서 소유한다"
- option "현재 Read Model은 CQRS-lite로 유지한다"
- option "화면 조회는 Read Projection을 사용한다"
- generic [ref=f16e65]:
- generic [ref=f16e66]: 근거 1 이유
- textbox "근거 1 이유" [ref=f16e67]: 이 결정을 규칙으로 편 기준이다.
- generic [aria-hidden] [ref=f16e68]: 공개 화면의 「다음에 읽을 것」에 그대로 나갑니다.
- generic [ref=f16e69]:
- button "위로" [disabled] [ref=f16e70]
- button "아래로" [ref=f16e71]
- button "삭제" [ref=f16e72]
- generic [ref=f16e73]:
- generic [ref=f16e74]:
- generic [ref=f16e75]: 근거 2 대상
- combobox "근거 2 대상" [ref=f16e76]:
- option "대상 선택"
- option "Browser Token을 없애면서 BFF에 Session과 CSRF 책임이 생긴 과정"
- option "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제"
- option "Collection Fetch Join Pagination의 In-memory Paging"
- option "DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1"
- option "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [selected]
- option "Forward-Auth에서 Client가 보낸 Identity Header를 신뢰하면 안 되는 이유"
- option "Projection 이후에도 1,509행을 읽은 Row Over-fetch"
- option "Refresh Token 관리만 서버로 이전, Access Token은 여전히 Browser에 노출"
- option "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우"
- option "Visibility OR이 Keyset Index를 깨뜨린 문제" [disabled]
- option "Authorization Code와 PKCE가 보호하는 구간"
- option "Bearer JWT가 인증된 principal이 되기까지"
- option "Cookie로 인증하는 요청에서 CSRF token이 하는 일"
- option "브라우저가 credential을 보관하는 위치와 그 성질"
- option "Forward-Auth와 Nginx auth_request의 동작"
- option "외부 IdP Brokering의 동작"
- option "Authorization Code Flow의 Endpoint와 Credential 이동 기준"
- option "BFF 인증 구조 설계 기준"
- option "Feed Visibility Query Pattern"
- option "Fetch Join · Batch · Projection 선택 기준"
- option "Fetch Type과 Fetch Strategy 구분"
- option "Forward-Auth에서 Identity Header를 신뢰하기 위한 조건"
- option "외부 IdP 연동과 Application 인증 구조의 경계"
- option "JPA N+1 정량 진단 기준"
- option "Keyset Pagination 설계 기준"
- option "OAuth/OIDC 인증 패턴 선택 기준"
- option "OAuth Token과 Application Session을 구분하는 기준"
- option "PostgreSQL Query Plan 측정 기준" [disabled]
- option "Public Client와 Confidential Client 구분 기준"
- option "Top-N-per-group 선택 기준"
- option "실제 동시 트래픽에서도 이 구조가 안정적인가"
- option "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가"
- option "ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가"
- option "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가"
- option "feed_visible을 Production CQRS로 승격할 것인가"
- option "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가"
- option "Highlight 없는 FeedItem을 허용할 것인가"
- option "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가"
- option "Round Trip과 Row Volume을 독립 측정할 것인가"
- option "BFF가 OAuth Token을 관리하는 조건"
- option "Collection Fetch Join과 Pagination을 같이 사용하지 않는다"
- option "Entity Graph 조회에는 Batch Fetch를 사용한다"
- option "Feed Pagination은 Keyset을 사용한다"
- option "외부 IdP와의 연동이라도 별도의 인증 방식이 아니다."
- option "Query Plan은 실제 PostgreSQL에서 측정한다"
- option "Query Strategy는 FeedQueryPort 뒤에서 소유한다"
- option "현재 Read Model은 CQRS-lite로 유지한다"
- option "화면 조회는 Read Projection을 사용한다"
- generic [ref=f16e77]:
- generic [ref=f16e78]: 근거 2 이유
- textbox "근거 2 이유" [ref=f16e79]: 실제 엔진에서 실행계획과 통계 차이를 관측한 기록이다.
- generic [aria-hidden] [ref=f16e80]: 공개 화면의 「다음에 읽을 것」에 그대로 나갑니다.
- generic [ref=f16e81]:
- button "위로" [ref=f16e82]
- button "아래로" [ref=f16e83]
- button "삭제" [ref=f16e84]
- generic [ref=f16e85]:
- generic [ref=f16e86]:
- generic [ref=f16e87]: 근거 3 대상
- combobox "근거 3 대상" [ref=f16e88]:
- option "대상 선택"
- option "Browser Token을 없애면서 BFF에 Session과 CSRF 책임이 생긴 과정"
- option "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제"
- option "Collection Fetch Join Pagination의 In-memory Paging"
- option "DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1"
- option "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [disabled]
- option "Forward-Auth에서 Client가 보낸 Identity Header를 신뢰하면 안 되는 이유"
- option "Projection 이후에도 1,509행을 읽은 Row Over-fetch"
- option "Refresh Token 관리만 서버로 이전, Access Token은 여전히 Browser에 노출"
- option "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우"
- option "Visibility OR이 Keyset Index를 깨뜨린 문제" [selected]
- option "Authorization Code와 PKCE가 보호하는 구간"
- option "Bearer JWT가 인증된 principal이 되기까지"
- option "Cookie로 인증하는 요청에서 CSRF token이 하는 일"
- option "브라우저가 credential을 보관하는 위치와 그 성질"
- option "Forward-Auth와 Nginx auth_request의 동작"
- option "외부 IdP Brokering의 동작"
- option "Authorization Code Flow의 Endpoint와 Credential 이동 기준"
- option "BFF 인증 구조 설계 기준"
- option "Feed Visibility Query Pattern"
- option "Fetch Join · Batch · Projection 선택 기준"
- option "Fetch Type과 Fetch Strategy 구분"
- option "Forward-Auth에서 Identity Header를 신뢰하기 위한 조건"
- option "외부 IdP 연동과 Application 인증 구조의 경계"
- option "JPA N+1 정량 진단 기준"
- option "Keyset Pagination 설계 기준"
- option "OAuth/OIDC 인증 패턴 선택 기준"
- option "OAuth Token과 Application Session을 구분하는 기준"
- option "PostgreSQL Query Plan 측정 기준" [disabled]
- option "Public Client와 Confidential Client 구분 기준"
- option "Top-N-per-group 선택 기준"
- option "실제 동시 트래픽에서도 이 구조가 안정적인가"
- option "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가"
- option "ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가"
- option "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가"
- option "feed_visible을 Production CQRS로 승격할 것인가"
- option "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가"
- option "Highlight 없는 FeedItem을 허용할 것인가"
- option "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가"
- option "Round Trip과 Row Volume을 독립 측정할 것인가"
- option "BFF가 OAuth Token을 관리하는 조건"
- option "Collection Fetch Join과 Pagination을 같이 사용하지 않는다"
- option "Entity Graph 조회에는 Batch Fetch를 사용한다"
- option "Feed Pagination은 Keyset을 사용한다"
- option "외부 IdP와의 연동이라도 별도의 인증 방식이 아니다."
- option "Query Plan은 실제 PostgreSQL에서 측정한다"
- option "Query Strategy는 FeedQueryPort 뒤에서 소유한다"
- option "현재 Read Model은 CQRS-lite로 유지한다"
- option "화면 조회는 Read Projection을 사용한다"
- generic [ref=f16e89]:
- generic [ref=f16e90]: 근거 3 이유
- textbox "근거 3 이유" [ref=f16e91]: 부분 인덱스와 정렬 인덱스 기능에 기댄 측정 기록이다.
- generic [aria-hidden] [ref=f16e92]: 공개 화면의 「다음에 읽을 것」에 그대로 나갑니다.
- generic [ref=f16e93]:
- button "위로" [ref=f16e94]
- button "아래로" [disabled] [ref=f16e95]
- button "삭제" [ref=f16e96]
- button "근거 추가" [ref=f16e97]
- region [ref=f16e98]:
- generic [ref=f16e99]:
- paragraph [ref=f16e100]: PROJECT DECISION
- heading "프로젝트 결정" [level=2] [ref=f16e101]
- generic [ref=f16e102]:
- generic [ref=f16e103]:
- generic [ref=f16e104]: 결정 상태
- combobox "결정 상태" [ref=f16e105]:
- option "아직 정하지 않음"
- option "PROPOSED" [selected]
- option "ADOPTED"
- generic [ref=f16e106]:
- generic [ref=f16e107]: 결정일
- textbox "결정일" [ref=f16e108]
- generic [ref=f16e109]:
- generic [ref=f16e110]: 결정문
- textbox "결정문" [ref=f16e111]: 퍼시스턴스 조회 측정은 Testcontainers로 띄운 실제 PostgreSQL에서 수행한다. 인메모리 대체 DB로 실행계획이나 인덱스 동작을 판단하지 않는다. 스키마는 운영 마이그레이션을 그대로 적용하고 엔티티와의 불일치를 조기에 잡는다.
- generic [ref=f16e112]:
- generic [ref=f16e113]: 판단 이유
- textbox "판단 이유" [ref=f16e114]: 비용 기반 옵티마이저는 가능한 계획의 비용을 추정해 고른다. 그 추정값도, 고를 수 있는 선택지도 엔진마다 다르다. 비용 상수, 수집하는 통계, 저장 구조와 가시성 처리, 사용할 수 있는 인덱스 종류가 모두 갈린다. 이 프로젝트의 측정은 이 축들에 직접 걸린다. 추정 행수와 실제 행수가 500배 차이 난 관측은 통계 수집 방식에 달렸고, 순차 스캔과 인덱스 스캔의 판정은 비용 모델과 선택도 추정의 산물이며, 가시성 조건과 정렬 페이징은 부분 인덱스와 정렬 인덱스 기능에 기댄다. 다른 엔진에서 재면 스캔 방식 선택이 뒤집히고, 한쪽에만 있는 접근 경로가 통째로 사라지며, 그 엔진 특유의 동작이 재현되지 않는다. 세 지점에서 체계적으로 틀린 결론에 이른다. 측정 대상이 계획과 인덱스 동작인 이상 DB를 바꾸면 측정 자체가 달라진다.
- group "영향" [ref=f16e115]:
- generic [ref=f16e117]:
- generic [ref=f16e118]:
- generic [ref=f16e119]: 영향 1
- textbox "영향 1" [ref=f16e120]: 측정 실행에 컨테이너 런타임이 필요하다. Docker가 없는 환경에서는 이 테스트가 비활성화된다.
- generic [ref=f16e121]:
- button "위로" [disabled] [ref=f16e122]
- button "아래로" [ref=f16e123]
- button "삭제" [ref=f16e124]
- generic [ref=f16e125]:
- generic [ref=f16e126]:
- generic [ref=f16e127]: 영향 2
- textbox "영향 2" [ref=f16e128]: 인메모리 DB보다 기동과 실행이 느리다. 컨테이너를 클래스당 하나로 공유해 비용을 줄였다.
- generic [ref=f16e129]:
- button "위로" [ref=f16e130]
- button "아래로" [ref=f16e131]
- button "삭제" [ref=f16e132]
- generic [ref=f16e133]:
- generic [ref=f16e134]:
- generic [ref=f16e135]: 영향 3
- textbox "영향 3" [ref=f16e136]: 재현성을 위해 이미지 태그보다 patch 버전이나 digest를 고정하는 편이 낫다. 같은 태그가 시점에 따라 다른 patch를 가리킬 수 있다.
- generic [ref=f16e137]:
- button "위로" [ref=f16e138]
- button "아래로" [ref=f16e139]
- button "삭제" [ref=f16e140]
- generic [ref=f16e141]:
- generic [ref=f16e142]:
- generic [ref=f16e143]: 영향 4
- textbox "영향 4" [ref=f16e144]: 스키마 검증만으로 모든 드리프트를 막지 못한다. 인덱스 구성, 부분 인덱스 조건, check 제약, 외래키 정책은 따로 확인해야 한다.
- generic [ref=f16e145]:
- button "위로" [ref=f16e146]
- button "아래로" [ref=f16e147]
- button "삭제" [ref=f16e148]
- generic [ref=f16e149]:
- generic [ref=f16e150]:
- generic [ref=f16e151]: 영향 5
- textbox "영향 5" [ref=f16e152]: 측정값은 warm cache 상태의 로컬 값이다. 운영 지연으로 옮겨 읽을 수 없다.
- generic [ref=f16e153]:
- button "위로" [ref=f16e154]
- button "아래로" [disabled] [ref=f16e155]
- button "삭제" [ref=f16e156]
- button "영향 추가" [ref=f16e157]
- region [ref=f16e158]:
- generic [ref=f16e159]:
- paragraph [ref=f16e160]: LIVE
- heading "즉시 미리보기" [level=2] [ref=f16e161]
- generic [ref=f16e164]:
- navigation "문서 경로" [ref=f16e165]:
- link "Project" [ref=f16e166] [cursor=pointer]:
- /url: /projects
- generic [aria-hidden] [ref=f16e167]: /
- link "Liner N + 1문제" [ref=f16e168] [cursor=pointer]:
- /url: /projects/liner-n-plus-1
- generic [aria-hidden] [ref=f16e169]: /
- link "Decision" [ref=f16e170] [cursor=pointer]:
- /url: /projects/liner-n-plus-1/decisions
- list [ref=f16e171]:
- listitem [ref=f16e172]:
- article [ref=f16e173]:
- generic [ref=f16e174]:
- generic [ref=f16e175]:
- generic [ref=f16e176]: PROPOSED
- generic [ref=f16e177]: 결정일 미정
- heading "Query Plan은 실제 PostgreSQL에서 측정한다" [level=2] [ref=f16e178]
- paragraph [ref=f16e179]: 조회 성능 측정은 인메모리 대체 DB가 아니라 운영과 같은 PostgreSQL에서 실행한다. 실행계획과 인덱스 동작이 측정 대상이므로 DB는 대체재가 아니라 측정 대상의 일부다.
- generic [ref=f16e180]:
- heading "결정" [level=3] [ref=f16e181]
- paragraph [ref=f16e182]: 퍼시스턴스 조회 측정은 Testcontainers로 띄운 실제 PostgreSQL에서 수행한다. 인메모리 대체 DB로 실행계획이나 인덱스 동작을 판단하지 않는다.
- paragraph [ref=f16e183]: 스키마는 운영 마이그레이션을 그대로 적용하고 엔티티와의 불일치를 조기에 잡는다.
- generic [ref=f16e184]:
- heading "판단 이유" [level=3] [ref=f16e185]
- paragraph [ref=f16e186]: 비용 기반 옵티마이저는 가능한 계획의 비용을 추정해 고른다. 그 추정값도, 고를 수 있는 선택지도 엔진마다 다르다. 비용 상수, 수집하는 통계, 저장 구조와 가시성 처리, 사용할 수 있는 인덱스 종류가 모두 갈린다.
- paragraph [ref=f16e187]: 이 프로젝트의 측정은 이 축들에 직접 걸린다. 추정 행수와 실제 행수가 500배 차이 난 관측은 통계 수집 방식에 달렸고, 순차 스캔과 인덱스 스캔의 판정은 비용 모델과 선택도 추정의 산물이며, 가시성 조건과 정렬 페이징은 부분 인덱스와 정렬 인덱스 기능에 기댄다.
- paragraph [ref=f16e188]: 다른 엔진에서 재면 스캔 방식 선택이 뒤집히고, 한쪽에만 있는 접근 경로가 통째로 사라지며, 그 엔진 특유의 동작이 재현되지 않는다. 세 지점에서 체계적으로 틀린 결론에 이른다.
- paragraph [ref=f16e189]: 측정 대상이 계획과 인덱스 동작인 이상 DB를 바꾸면 측정 자체가 달라진다.
- generic [ref=f16e190]:
- heading "영향" [level=3] [ref=f16e191]
- list [ref=f16e192]:
- listitem [ref=f16e193]:
- paragraph [ref=f16e194]: 측정 실행에 컨테이너 런타임이 필요하다. Docker가 없는 환경에서는 이 테스트가 비활성화된다.
- listitem [ref=f16e195]:
- paragraph [ref=f16e196]: 인메모리 DB보다 기동과 실행이 느리다. 컨테이너를 클래스당 하나로 공유해 비용을 줄였다.
- listitem [ref=f16e197]:
- paragraph [ref=f16e198]: 재현성을 위해 이미지 태그보다 patch 버전이나 digest를 고정하는 편이 낫다. 같은 태그가 시점에 따라 다른 patch를 가리킬 수 있다.
- listitem [ref=f16e199]:
- paragraph [ref=f16e200]: 스키마 검증만으로 모든 드리프트를 막지 못한다. 인덱스 구성, 부분 인덱스 조건, check 제약, 외래키 정책은 따로 확인해야 한다.
- listitem [ref=f16e201]:
- paragraph [ref=f16e202]: 측정값은 warm cache 상태의 로컬 값이다. 운영 지연으로 옮겨 읽을 수 없다.
- generic [ref=f16e203]:
- heading "근거 기록" [level=3] [ref=f16e204]
- list [ref=f16e205]:
- listitem [ref=f16e206]:
- link "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [ref=f16e207] [cursor=pointer]:
- /url: /cases/eager-toone-nplus1-without-access
- complementary [ref=f16e208]:
- heading "작업 상태" [level=2] [ref=f16e209]
- status "편집 상태" [ref=f16e210]: 저장되지 않음
- generic [ref=f16e211]:
- generic [ref=f16e212]:
- term [ref=f16e213]: 저장 버전
- definition [ref=f16e214]: "4"
- generic [ref=f16e215]:
- term [ref=f16e216]: 종류
- definition [ref=f16e217]: 설계 결정
- paragraph [ref=f16e218]: 불완전한 초안도 저장할 수 있습니다. Ctrl+S 로도 저장합니다. 게시를 누르면 채워야 할 칸을 그 자리에 표시합니다.
- generic [ref=f16e219]:
- button "저장" [ref=f16e220]
- button "게시" [ref=f16e221]
- paragraph [ref=f16e222]