- generic [ref=f6e3]: - link "본문으로 건너뛰기" [ref=f6e4] [cursor=pointer]: - /url: "#main-content" - banner [ref=f6e5]: - generic [ref=f6e6]: - link "TechLog Studio" [ref=f6e7] [cursor=pointer]: - /url: /studio - text: TechLog - generic [ref=f6e8]: Studio - navigation "Studio 주 탐색" [ref=f6e10]: - link "작업본" [ref=f6e11] [cursor=pointer]: - /url: /studio/documents - link "게시 기록" [ref=f6e12] [cursor=pointer]: - /url: /studio/publications - link "새 문서" [ref=f6e13] [cursor=pointer]: - /url: /studio/documents/new - link "주제·프로젝트" [ref=f6e14] [cursor=pointer]: - /url: /studio/taxonomy - link "릴리즈" [ref=f6e15] [cursor=pointer]: - /url: /studio/releases - link "공개 사이트 보기" [ref=f6e16] [cursor=pointer]: - /url: / - button "로그아웃" [ref=f6e17] - main [ref=f6e18]: - generic [ref=f6e19]: - generic [ref=f6e20]: - generic [ref=f6e21]: - paragraph [ref=f6e22]: WORKSPACE - heading "작업 흐름" [level=1] [ref=f6e23] - paragraph [ref=f6e24]: 작성 중인 기록을 이어서 정리하고 검증·게시 흐름으로 연결합니다. - link "새 문서" [ref=f6e25] [cursor=pointer]: - /url: /studio/documents/new - region "Studio 요약" [ref=f6e26]: - generic [ref=f6e27]: - generic [ref=f6e28]: 전체 작업본 - strong [ref=f6e29]: "48" - generic [ref=f6e30]: - generic [ref=f6e31]: 검증할 기록 - strong [ref=f6e32]: "5" - generic [ref=f6e33]: - generic [ref=f6e34]: 게시 준비 - strong [ref=f6e35]: "0" - generic [ref=f6e36]: - generic [ref=f6e37]: 게시 기록 - strong [ref=f6e38]: "21" - generic [ref=f6e39]: - generic [ref=f6e40]: - heading "이어서 작성" [level=2] [ref=f6e41] - link "전체 보기" [ref=f6e42] [cursor=pointer]: - /url: /studio/documents - paragraph [ref=f6e44]: 이어서 작성할 문서가 없습니다. - generic [ref=f6e45]: - generic [ref=f6e46]: - heading "검증과 미리보기" [level=2] [ref=f6e47] - link "전체 보기" [ref=f6e48] [cursor=pointer]: - /url: /studio/documents - generic [ref=f6e49]: - article [ref=f6e50]: - paragraph [ref=f6e51]: 검증 기록 - generic [ref=f6e52]: - heading [level=3] [ref=f6e53]: - link "DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1" [ref=f6e54] [cursor=pointer]: - /url: /studio/documents/58c2d5d9-5865-4b2c-b1cc-3c5c955c33dc/edit - paragraph [ref=f6e55]: Liner N + 1문제 · 검증하기 - time [ref=f6e56]: 2026. 9. 4. - article [ref=f6e57]: - paragraph [ref=f6e58]: 검증 기록 - generic [ref=f6e59]: - heading [level=3] [ref=f6e60]: - link "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우" [ref=f6e61] [cursor=pointer]: - /url: /studio/documents/bf675775-4f3e-4744-8014-f0efff51422a/edit - paragraph [ref=f6e62]: KeyCloak Patterns · 검증하기 - time [ref=f6e63]: 2026. 9. 3. - article [ref=f6e64]: - paragraph [ref=f6e65]: 검증 기록 - generic [ref=f6e66]: - heading [level=3] [ref=f6e67]: - link "Collection Fetch Join Pagination의 In-memory Paging" [ref=f6e68] [cursor=pointer]: - /url: /studio/documents/c1158754-e3d2-47b8-bb41-81787c0ca84b/edit - paragraph [ref=f6e69]: Liner N + 1문제 · 검증하기 - time [ref=f6e70]: 2026. 9. 1. - article [ref=f6e71]: - paragraph [ref=f6e72]: 검증 기록 - generic [ref=f6e73]: - heading [level=3] [ref=f6e74]: - link "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제" [ref=f6e75] [cursor=pointer]: - /url: /studio/documents/7ed75172-fd56-42bf-956a-8f9fc1cca235/edit - paragraph [ref=f6e76]: Liner N + 1문제 · 검증하기 - time [ref=f6e77]: 2026. 9. 1. - article [ref=f6e78]: - paragraph [ref=f6e79]: 검증 기록 - generic [ref=f6e80]: - heading [level=3] [ref=f6e81]: - link "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [ref=f6e82] [cursor=pointer]: - /url: /studio/documents/32d0be7d-d88e-4760-8d91-35d3a233a99a/edit - paragraph [ref=f6e83]: Liner N + 1문제 · 검증하기 - time [ref=f6e84]: 2026. 9. 1. - generic [ref=f6e85]: - generic [ref=f6e86]: - heading "게시 준비" [level=2] [ref=f6e87] - link "전체 보기" [ref=f6e88] [cursor=pointer]: - /url: /studio/documents - paragraph [ref=f6e90]: 게시 준비가 끝난 문서가 없습니다. - region [ref=f6e91]: - generic [ref=f6e92]: - paragraph [ref=f6e93]: PUBLIC HOME - heading "지금 집중하는 것" [level=2] [ref=f6e94] - paragraph [ref=f6e95]: 공개 홈 맨 위 영역입니다. 셋 다 비워 두면 그 영역은 나타나지 않습니다. - generic [ref=f6e96]: - generic [ref=f6e97]: - generic [ref=f6e98]: - generic [ref=f6e99]: 현재 작업 (프로젝트) - combobox "현재 작업 (프로젝트) 단계·현재 목표·다음 작업이 카드에 함께 나옵니다." [ref=f6e100]: - option "고르지 않음" - option "Liner N + 1문제" - option "Backend Clean Architecture" - option "KeyCloak Patterns" [selected] - generic [ref=f6e101]: 단계·현재 목표·다음 작업이 카드에 함께 나옵니다. - generic [ref=f6e102]: - generic [ref=f6e103]: 열린 질문 - combobox "열린 질문" [ref=f6e104]: - option "고르지 않음" - option "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가" - option "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가" [selected] - option "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가" - option "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가" - generic [ref=f6e105]: - generic [ref=f6e106]: 최근 결정 - combobox "최근 결정" [ref=f6e107]: - option "고르지 않음" - option "브라우저에 OAuth token을 노출하지 않으면서 애플리케이션이 Resource Server 호출을 중계하고 조합해야 하는 경우, BFF가 authorization code 교환과 token 보관, downstream API 호출을 소유한다. 브라우저에는 애플리케이션 session만 제공한다." [selected] - option "외부 IdP 연동은 별도의 인증 구조가 아니다. Google과 같은 외부 IDP는 사용자의 인증을 담당하고, Keycloak은 그 인증 결과를 받아 애플리케이션이 신뢰할 수있는 토큰을 발급한다. SPA, Mediator, BFF, OAuth2-proxy와 같은 4가지 구조는 이렇게 발급된 토큰이나 세션을 애플리케이션에서 어디까지 노출하고 관리할지를 구분한다." - generic [ref=f6e108]: - button "홈 설정 저장" [ref=f6e109] - paragraph [ref=f6e110]: - text: 저장하면 공개 홈에 바로 반영됩니다. - link "주제·프로젝트" [ref=f6e111] [cursor=pointer]: - /url: /studio/taxonomy - text: 에서 프로젝트를 만들고 게시할 수 있습니다. - generic [ref=f6e112]: - generic [ref=f6e113]: - heading "최근 게시" [level=2] [ref=f6e114] - link "게시 기록 보기" [ref=f6e115] [cursor=pointer]: - /url: /studio/publications - generic [ref=f6e116]: - article [ref=f6e117]: - paragraph [ref=f6e118]: 게시 - generic [ref=f6e119]: - heading "Collection Fetch Join Pagination의 In-memory Paging" [level=3] [ref=f6e120] - paragraph [ref=f6e121]: Liner N + 1문제 - time [ref=f6e122]: 2026. 9. 1. - article [ref=f6e123]: - paragraph [ref=f6e124]: 게시 - generic [ref=f6e125]: - heading "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제" [level=3] [ref=f6e126] - paragraph [ref=f6e127]: Liner N + 1문제 - time [ref=f6e128]: 2026. 9. 1. - article [ref=f6e129]: - paragraph [ref=f6e130]: 게시 - generic [ref=f6e131]: - heading "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [level=3] [ref=f6e132] - paragraph [ref=f6e133]: Liner N + 1문제 - time [ref=f6e134]: 2026. 9. 1. - article [ref=f6e135]: - paragraph [ref=f6e136]: 게시 - generic [ref=f6e137]: - heading "외부 IdP Brokering의 동작" [level=3] [ref=f6e138] - paragraph [ref=f6e139]: KeyCloak Patterns - time [ref=f6e140]: 2026. 9. 1. - article [ref=f6e141]: - paragraph [ref=f6e142]: 게시 - generic [ref=f6e143]: - heading "BFF가 OAuth Token을 관리하는 조건" [level=3] [ref=f6e144] - paragraph [ref=f6e145]: KeyCloak Patterns - time [ref=f6e146]: 2026. 8. 31. - paragraph [ref=f6e147]