{ "version": "1.1", "id": "version-conditional-results", "title": "같은 주입, 정반대 결과", "question": "Keycloak 버전과 설정이 결론을 어떻게 뒤집는가", "type": "architecture", "direction": "LR", "audience": [ "Keycloak 을 업그레이드하며 세션 동작을 확인하려는 엔지니어" ], "summary": "persistent-user-sessions 가 켜져 있으면 세션이 데이터베이스에 있고, 꺼져 있으면 메모리에 있다. 같은 주입이 정반대 결과를 낸다.", "alt": "세션을 데이터베이스에 쓰는 경로와 Infinispan 으로 복제하는 경로가 설정 하나로 갈리는 구성.", "long_description": "Keycloak 26 은 persistent-user-sessions 가 기본값이라 세션을 PostgreSQL 에 쓴다. 24 이전은 메모리에 두고 Infinispan 으로 복제했다. 그래서 7800 을 끊었을 때, 롤링 재시작했을 때, DB 를 세웠을 때의 결과가 세 항목 모두 정반대로 나온다. 이 실험대의 A층 결론 전체가 이 설정 위에 서 있다.", "source_context": { "document": "docs/keycloak-session-store/final/document.md", "document_sha256": "1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe", "anchor": { "kind": "heading", "value": "그리고 이 결론에는 버전 조건이 붙어 있었다", "line": 64 } }, "composition": { "profile": "component-flow", "diagram_only": true, "reference_ids": [ "payment-event-flow" ], "rationale": "두 설정에서 같은 주입이 다른 결과를 내는 것이 지배적 질문이다. 경로 비교이므로 comparison 을 골랐다." }, "groups": [], "nodes": [ { "id": "persistent", "label": "persistent-user-sessions 켜짐", "kind": "component", "role": "source", "emphasis": "primary", "description": "Keycloak 26 기본값.", "details": [ "세션 → DB" ], "evidence": [ { "start_line": 62, "end_line": 66 } ], "assumption": false }, { "id": "volatile", "label": "persistent-user-sessions 꺼짐", "kind": "component", "role": "source", "emphasis": "warning", "description": "24 이전 방식.", "details": [ "세션 → 메모리" ], "evidence": [ { "start_line": 62, "end_line": 66 } ], "assumption": false }, { "id": "db-session", "label": "PostgreSQL 의 세션 행", "kind": "datastore", "role": "target", "emphasis": "primary", "description": "노드가 바뀌어도 남는다. 7800 과 무관하다.", "details": [ "OFFLINE_USER_SESSION" ], "evidence": [ { "start_line": 67, "end_line": 73 } ], "assumption": false }, { "id": "memory-session", "label": "노드 메모리의 세션", "kind": "component", "role": "target", "emphasis": "warning", "description": "노드가 죽거나 분단되면 사라진다.", "details": [ "Infinispan 복제에 의존" ], "evidence": [ { "start_line": 67, "end_line": 73 } ], "assumption": false } ], "edges": [ { "id": "p-to-db", "from": "persistent", "to": "db-session", "label": "세션 기록", "kind": "write", "evidence": [ { "start_line": 62, "end_line": 68 } ], "assumption": false }, { "id": "v-to-mem", "from": "volatile", "to": "memory-session", "label": "세션 보관", "kind": "write", "evidence": [ { "start_line": 62, "end_line": 68 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "설정 하나가 세션의 거처를 바꾸고, 그 거처가 장애 결과를 결정한다는 인과를 한 그림에 담았다." } }