Files
document-haness/docs/clean-architecture-backend-template/final/evidence/rendered/a14-f010-no-store.svg
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

264 lines
46 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="4638" viewBox="0 0 1200 4638" role="img">
<title>terminal evidence</title>
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
<rect x="1" y="1" width="1198" height="4636" rx="14" fill="#0d1117" stroke="#30363d"/>
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
<circle cx="64" cy="22" r="6" fill="#28c840"/>
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
set -o pipefail
W=adapter/inbound/web/src/main/java/dev/caskeleton/adapter/inbound/web
P=sample-portfolio/src/m</tspan><tspan x="24" dy="22">ain/java/dev/caskeleton/sample/portfolio/adapter/inbound/web/controller
echo &quot;# 필터가 무엇을 붙이고, 그것이 되돌려질 수</tspan><tspan x="24" dy="22"> 있다고 무엇이 말하는가&quot;
sed -n &#x27;14,34p&#x27; $W/filter/CacheControlFilter.java
echo
echo &quot;# 그 정책을 이 필터가 혼자 갖도록 </tspan><tspan x="24" dy="22">보안 설정이 프레임워크 기본값을 끈다&quot;
sed -n &#x27;77,80p&#x27; $W/auth/SecurityConfig.java
echo -n &quot; 다만 픽스처 모듈은 그 설정</tspan><tspan x="24" dy="22">을 스캔에서 뺀다 : &quot;
grep -n &#x27;SecurityConfig.class&#x27; \
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/S</tspan><tspan x="24" dy="22">amplePortfolioApplication.java
echo &quot; 그 모듈이 적어 둔 제외 이유 :&quot;
sed -n &#x27;36,37p&#x27; sample-portfolio/src/main/java/dev</tspan><tspan x="24" dy="22">/caskeleton/sample/portfolio/SamplePortfolioApplication.java
echo &quot; 그 모듈이 대신 두는 체인. 캐시 기록기를 끄지 않는다</tspan><tspan x="24" dy="22"> :&quot;
sed -n &#x27;24,29p&#x27; \
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/bootstrap/security/SamplePublicAc</tspan><tspan x="24" dy="22">cessSecurityConfig.java
echo
echo &quot;# 조건부 읽기를 구현한 자리 전부와 그것을 켜는 조건&quot;
echo &quot; main 에서 응답에 개체 태</tspan><tspan x="24" dy="22">그를 쓰는 파일 (아웃바운드 S3 클라이언트는 뺐다) :&quot;
grep -rln &#x27;HttpHeaders.ETAG\|WebHeaderName.ETAG\|ApiHeaders.ETAG\|\.</tspan><tspan x="24" dy="22">eTag(&#x27; --include=*.java --exclude-dir=build . \
| grep &#x27;/main/&#x27; | grep -v &#x27;/objectstorage/&#x27; | sed -E &#x27;s#^\./[^:]*/([^/</tspan><tspan x="24" dy="22">]+)$# \1#&#x27;
echo &quot; 이 파일들과 304 판정 클래스를, 시험을 빼고 부르는 자리가 있는지 :&quot;
for n in WebSuccessResponse WebRe</tspan><tspan x="24" dy="22">sponseContract ConditionalReadEvaluator; do
echo -n &quot; $n 를 부르는 자리 : &quot;
{ grep -rln &quot;$n&quot; --include=*.java --e</tspan><tspan x="24" dy="22">xclude-dir=build . | grep -v &quot;/$n.java&quot; | grep -v &quot;Test.java&quot; \
| sed -E &quot;s#^\./[^:]*/([^/]+)\$#\1#&quot; | tr &#x27;\n&#x27; &#x27; &#x27;</tspan><tspan x="24" dy="22"> || true; }
echo &quot;(끝)&quot;
done
echo -n &quot; 같은 패키지의 ETags 를 실제로 호출하는 자리 : &quot;
{ grep -rln &#x27;ETags\.&#x27; --incl</tspan><tspan x="24" dy="22">ude=*.java --exclude-dir=build . | grep -v &#x27;/ETags.java&#x27; \
| grep -v &#x27;Test.java&#x27; | sed -E &#x27;s#^\./[^:]*/([^/]+)$#\1#&#x27;</tspan><tspan x="24" dy="22"> | tr &#x27;\n&#x27; &#x27; &#x27; || true; }
echo &quot;(끝)&quot;
echo &quot; 레지스트리가 선언한 런타임 컴포지션과 이 리프의 소속 :&quot;
sed -n &#x27;2,6p&#x27; conf</tspan><tspan x="24" dy="22">ig/architecture/modules.json
sed -n &#x27;170p&#x27; config/architecture/modules.json
sed -n &#x27;170,182p&#x27; config/architecture/module</tspan><tspan x="24" dy="22">s.json | grep -A3 &#x27;runtime_memberships&#x27;
echo &quot; 304 판정을 구현해 둔 클래스와 그 자바독 첫 줄 :&quot;
sed -n &#x27;6,7p&#x27; $W/condit</tspan><tspan x="24" dy="22">ional/ConditionalReadEvaluator.java
echo &quot; 내려받기 컨트롤러를 켜는 조건과 그 스위치의 출하값 :&quot;
grep -n &#x27;ConditionalOn</tspan><tspan x="24" dy="22">Property&#x27; $W/fileserver/controller/FileDownloadController.java
grep -n &#x27;APP_FILESERVER_PLATFORM_ENABLED&#x27; app-bootstrap/s</tspan><tspan x="24" dy="22">rc/main/resources/application.yml
grep -n &#x27;^APP_FILESERVER_PLATFORM_ENABLED&#x27; .env .env.example
echo
echo &quot;# 내려받기 경</tspan><tspan x="24" dy="22">로가 스스로 쓰는 태그와 지시자&quot;
grep -n &#x27;ETAG\|CACHE_CONTROL&#x27; $W/fileserver/http/MvcDownloadResponseWriter.java
echo &quot; </tspan><tspan x="24" dy="22">같은 문자열을 자바 밖에서 다시 쓰는 자리 :&quot;
grep -rIn &#x27;no-store&#x27; --exclude=*.java --exclude-dir=build --exclude-dir=.git</tspan><tspan x="24" dy="22"> --exclude=*.md . \
| sed -E &#x27;s#^\./# #&#x27;
grep -rn &#x27;private, no-store&#x27; --include=*.java application-core/src/main app-</tspan><tspan x="24" dy="22">bootstrap/src/main \
| sed -E &#x27;s#^[^:]*/([^:/]+):# \1:#&#x27;
echo
echo &quot;# 픽스처 모듈 쪽 조건부 읽기 경로&quot;
sed -n &#x27;137,14</tspan><tspan x="24" dy="22">8p&#x27; $P/WorkLogController.java
echo -n &quot; 이 모듈 main 에서 Cache-Control 을 스스로 정하는 자리 : &quot;
{ grep -rc &#x27;CacheCont</tspan><tspan x="24" dy="22">rol&#x27; --include=*.java sample-portfolio/src/main | grep -v &#x27;:0$&#x27; || echo &quot;(0)&quot;; }
echo
echo &quot;# 둘을 조정하라고 만들어 둔 </tspan><tspan x="24" dy="22">패키지&quot;
find $W/cache -name &#x27;*.java&#x27; | sort | while IFS= read -r f; do
printf &#x27; %3s줄 %s\n&#x27; &quot;$(grep -c &#x27;&#x27; &quot;$f&quot;)&quot; &quot;$(</tspan><tspan x="24" dy="22">basename &quot;$f&quot;)&quot;
done
echo &quot; 그 타입들을 이름으로 부르는 파일과 횟수 :&quot;
grep -rn &#x27;WebCachePolicyCatalog\|WebCachePolicy\</tspan><tspan x="24" dy="22">|WebVaryPolicy\|WebCacheHeaders&#x27; --include=*.java . \
| sed -E &#x27;s#^\./([^:]*)/src/(main|test)/[^:]*/([^:/]+):[0-9]+:.*</tspan><tspan x="24" dy="22"># \2 · \3#&#x27; | sort | uniq -c
echo -n &quot; cache 패키지 밖에서 부르는 파일 : &quot;
{ grep -rl &#x27;WebCachePolicyCatalog\|WebCach</tspan><tspan x="24" dy="22">ePolicy\|WebVaryPolicy\|WebCacheHeaders&#x27; --include=*.java . \
| grep -v &#x27;/web/cache/&#x27; || echo &quot;(0)&quot;; }
echo
echo &quot;# </tspan><tspan x="24" dy="22">그 패키지를 그렇게 둔 근거&quot;
sed -n &#x27;80,87p&#x27; $W/moduleboundary/WebStableModule.java
echo
echo &quot;# 그 근거가 말한 적용자들</tspan><tspan x="24" dy="22">이 실제로 무엇을 쓰는가&quot;
echo &quot; main 에서 Cache-Control 값을 정하는 자리 (헤더 이름 상수 두 파일은 뺐다) :&quot;
grep -rn &#x27;C</tspan><tspan x="24" dy="22">ACHE_CONTROL\|&quot;Cache-Control&quot;&#x27; --include=*.java . \
| grep -v &#x27;/test/&#x27; | grep -v &#x27;WebHeaderName.java\|ApiHeaders.java&#x27;</tspan><tspan x="24" dy="22"> \
| sed -E &#x27;s#^\./[^:]*/([^:/]+):([0-9]+):# \1:\2 #&#x27;
echo &quot; 뺀 두 파일 :&quot;
{ grep -rln &#x27;CACHE_CONTROL&#x27; --include=*.j</tspan><tspan x="24" dy="22">ava . | grep &#x27;WebHeaderName.java\|ApiHeaders.java&#x27; \
| sed -E &#x27;s#^\./[^:]*/([^:/]+)$# \1#&#x27; || echo &quot; (없음)&quot;; }
ec</tspan><tspan x="24" dy="22">ho &quot; 연산 프로파일이 이름으로 들고 있는 캐시 정책과 그것을 읽는 자리 :&quot;
grep -n &#x27;CachePolicyName cachePolicy\|CachePoli</tspan><tspan x="24" dy="22">cyName.standard()&#x27; \
$W/operation/WebOperationProfile.java | head -3
echo -n &quot; cachePolicy() 를 읽는 자리 : &quot;
{ grep </tspan><tspan x="24" dy="22">-rn &#x27;cachePolicy()&#x27; --include=*.java . | sed -E &#x27;s#^\./[^:]*/([^:/]+):# \1:#&#x27; || echo &quot;(0)&quot;; }
echo &quot; 지시자 문자열을 </tspan><tspan x="24" dy="22">직접 들고 있는 main 자리 :&quot;
grep -rnE &#x27;&quot;(no-store|no-cache|public|private)[^&quot;]*&quot;|&quot;max-age=[^&quot;]*&quot;&#x27; --include=*.java . \
</tspan><tspan x="24" dy="22"> | grep -v &#x27;/test/&#x27; | grep -E &#x27;no-store|max-age&#x27; \
| sed -E &#x27;s#^\./[^:]*/([^:/]+):([0-9]+):# \1:\2 #&#x27;
echo &quot; 목록이 </tspan><tspan x="24" dy="22">발행하는 프로파일 이름과 그 지시자 :&quot;
grep -n &#x27; &quot;[a-z][a-z0-9.-]*&quot;,&#x27; $W/cache/WebCachePolicyCatalog.java
</tspan></text>
<text x="24" y="1036" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template/src</tspan></text>
<text x="24" y="1058" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-03T00:50:42+00:00 · exit 0</tspan></text>
<line x1="24" y1="1072" x2="1176" y2="1072" stroke="#30363d"/>
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 필터가 무엇을 붙이고, 그것이 되돌려질 수 있다고 무엇이 말하는가</tspan></text>
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">/**</tspan></text>
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * Applies the skeleton&#x27;s default HTTP cache policy: every response gets {@code Cache-Control:</tspan></text>
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * no-store} and a {@code Vary: Accept, Accept-Encoding, Authorization} header. Defaults are set</tspan></text>
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * before the chain so a cacheable endpoint can opt in by returning a {@code ResponseEntity} whose</tspan></text>
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * {@code Cache-Control} header overwrites the default. See README for the design rationale.</tspan></text>
<text x="24" y="1244" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> */</tspan></text>
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">@Component</tspan></text>
<text x="24" y="1288" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">@Order(Ordered.HIGHEST_PRECEDENCE + 20)</tspan></text>
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">public class CacheControlFilter extends OncePerRequestFilter {</tspan></text>
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> static final String DEFAULT_CACHE_CONTROL = &quot;no-store&quot;;</tspan></text>
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> static final String DEFAULT_VARY = &quot;Accept, Accept-Encoding, Authorization&quot;;</tspan></text>
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> @Override</tspan></text>
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> protected void doFilterInternal(</tspan></text>
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> HttpServletRequest request, HttpServletResponse response, FilterChain chain)</tspan></text>
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> throws ServletException, IOException {</tspan></text>
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> response.setHeader(ApiHeaders.CACHE_CONTROL, DEFAULT_CACHE_CONTROL);</tspan></text>
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> response.setHeader(ApiHeaders.VARY, DEFAULT_VARY);</tspan></text>
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> chain.doFilter(request, response);</tspan></text>
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 정책을 이 필터가 혼자 갖도록 보안 설정이 프레임워크 기본값을 끈다</tspan></text>
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> http.cors(c -&gt; c.configurationSource(corsConfigurationSource()))</tspan></text>
<text x="24" y="1662" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // Disable Spring Security&#x27;s default Cache-Control writer; CacheControlFilter</tspan></text>
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // owns the cache header policy. See README for the design rationale.</tspan></text>
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .headers(headers -&gt; headers.cacheControl(cache -&gt; cache.disable()))</tspan></text>
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 다만 픽스처 모듈은 그 설정을 스캔에서 뺀다 : 38: SecurityConfig.class,</tspan></text>
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">39: MethodSecurityConfig.class</tspan></text>
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 모듈이 적어 둔 제외 이유 :</tspan></text>
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // The standalone sample is a public demo app: URL access should not require a</tspan></text>
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // configured IdP or method-security principal. Production modules keep these guards.</tspan></text>
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 모듈이 대신 두는 체인. 캐시 기록기를 끄지 않는다 :</tspan></text>
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> http.securityMatcher(&quot;/**&quot;)</tspan></text>
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .csrf(csrf -&gt; csrf.disable())</tspan></text>
<text x="24" y="1904" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .sessionManagement(s -&gt; s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))</tspan></text>
<text x="24" y="1926" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .authorizeHttpRequests(auth -&gt; auth.anyRequest().permitAll());</tspan></text>
<text x="24" y="1948" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> return http.build();</tspan></text>
<text x="24" y="1970" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
<text x="24" y="1992" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2014" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 조건부 읽기를 구현한 자리 전부와 그것을 켜는 조건</tspan></text>
<text x="24" y="2036" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main 에서 응답에 개체 태그를 쓰는 파일 (아웃바운드 S3 클라이언트는 뺐다) :</tspan></text>
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WorkLogController.java</tspan></text>
<text x="24" y="2080" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebSuccessResponse.java</tspan></text>
<text x="24" y="2102" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebResponseContract.java</tspan></text>
<text x="24" y="2124" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MvcDownloadResponseWriter.java</tspan></text>
<text x="24" y="2146" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ReactiveDownloadResponseWriter.java</tspan></text>
<text x="24" y="2168" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이 파일들과 304 판정 클래스를, 시험을 빼고 부르는 자리가 있는지 :</tspan></text>
<text x="24" y="2190" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebSuccessResponse 를 부르는 자리 : WebResponseContract.java (끝)</tspan></text>
<text x="24" y="2212" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebResponseContract 를 부르는 자리 : WebSuccessResponse.java (끝)</tspan></text>
<text x="24" y="2234" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ConditionalReadEvaluator 를 부르는 자리 : (끝)</tspan></text>
<text x="24" y="2256" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 같은 패키지의 ETags 를 실제로 호출하는 자리 : WorkLogController.java (끝)</tspan></text>
<text x="24" y="2278" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 레지스트리가 선언한 런타임 컴포지션과 이 리프의 소속 :</tspan></text>
<text x="24" y="2300" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;runtime_compositions&quot;: [</tspan></text>
<text x="24" y="2322" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;app-bootstrap&quot;,</tspan></text>
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;sample-portfolio&quot;</tspan></text>
<text x="24" y="2366" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ],</tspan></text>
<text x="24" y="2388" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;modules&quot;: [</tspan></text>
<text x="24" y="2410" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;id&quot;: &quot;adapter-inbound-web&quot;,</tspan></text>
<text x="24" y="2432" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;runtime_memberships&quot;: [</tspan></text>
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;app-bootstrap&quot;,</tspan></text>
<text x="24" y="2476" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> &quot;sample-portfolio&quot;</tspan></text>
<text x="24" y="2498" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ]</tspan></text>
<text x="24" y="2520" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 304 판정을 구현해 둔 클래스와 그 자바독 첫 줄 :</tspan></text>
<text x="24" y="2542" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">/**</tspan></text>
<text x="24" y="2564" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * Decides whether a {@code GET} or {@code HEAD} may be answered with a 304.</tspan></text>
<text x="24" y="2586" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 내려받기 컨트롤러를 켜는 조건과 그 스위치의 출하값 :</tspan></text>
<text x="24" y="2608" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">24:import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;</tspan></text>
<text x="24" y="2630" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">41:@ConditionalOnProperty(prefix = &quot;app.fileserver-platform&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;)</tspan></text>
<text x="24" y="2652" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">854: enabled: ${APP_FILESERVER_PLATFORM_ENABLED:false}</tspan></text>
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">.env:161:APP_FILESERVER_PLATFORM_ENABLED=false</tspan></text>
<text x="24" y="2696" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">.env.example:240:APP_FILESERVER_PLATFORM_ENABLED=false</tspan></text>
<text x="24" y="2718" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="2740" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 내려받기 경로가 스스로 쓰는 태그와 지시자</tspan></text>
<text x="24" y="2762" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">37: response.setHeader(HttpHeaders.ETAG, descriptor.representation().strongEtag());</tspan></text>
<text x="24" y="2784" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">43: response.setHeader(HttpHeaders.CACHE_CONTROL, descriptor.cacheControl());</tspan></text>
<text x="24" y="2806" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 같은 문자열을 자바 밖에서 다시 쓰는 자리 :</tspan></text>
<text x="24" y="2828" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .env:181:APP_FILESERVER_PLATFORM_DOWNLOAD_CACHE_CONTROL=private, no-store</tspan></text>
<text x="24" y="2850" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> app-bootstrap/src/main/resources/application.yml:880: cache-control: ${APP_FILESERVER_PLATFORM_DOWNLOAD_CACHE_CONTROL:pri</tspan><tspan x="24" dy="22">vate, no-store}</tspan></text>
<text x="24" y="2894" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .env.example:255:APP_FILESERVER_PLATFORM_DOWNLOAD_CACHE_CONTROL=private, no-store</tspan></text>
<text x="24" y="2916" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> DownloadPolicy.java:23: /** Design default: single Range, {@code private, no-store}, attachment only. */</tspan></text>
<text x="24" y="2938" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> DownloadPolicy.java:25: return new DownloadPolicy(RangeBudget.unbounded(), &quot;private, no-store&quot;, false);</tspan></text>
<text x="24" y="2960" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> FileserverPlatformSettings.java:127: @DefaultValue(&quot;private, no-store&quot;) String cacheControl,</tspan></text>
<text x="24" y="2982" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3004" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 픽스처 모듈 쪽 조건부 읽기 경로</tspan></text>
<text x="24" y="3026" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> /** Emits an {@code ETag}; honours {@code If-None-Match} with a 304 (no body). */</tspan></text>
<text x="24" y="3048" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> @GetMapping(&quot;/worklogs/{id}&quot;)</tspan></text>
<text x="24" y="3070" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> public ResponseEntity&lt;WorkLogResponse&gt; getOne(</tspan></text>
<text x="24" y="3092" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> @PathVariable String id,</tspan></text>
<text x="24" y="3114" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> @RequestHeader(value = ApiHeaders.IF_NONE_MATCH, required = false) String ifNoneMatch) {</tspan></text>
<text x="24" y="3136" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WorkLog workLog = get.handle(new GetWorkLogQuery(toId(id)));</tspan></text>
<text x="24" y="3158" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> String etag = etagOf(workLog);</tspan></text>
<text x="24" y="3180" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> if (ETags.matches(ifNoneMatch, etag)) {</tspan></text>
<text x="24" y="3202" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> return ResponseEntity.status(HttpStatus.NOT_MODIFIED).eTag(etag).build();</tspan></text>
<text x="24" y="3224" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
<text x="24" y="3246" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> return ResponseEntity.ok().eTag(etag).body(WorkLogWebMapper.toResponse(workLog));</tspan></text>
<text x="24" y="3268" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
<text x="24" y="3290" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 이 모듈 main 에서 Cache-Control 을 스스로 정하는 자리 : (0)</tspan></text>
<text x="24" y="3312" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3334" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 둘을 조정하라고 만들어 둔 패키지</tspan></text>
<text x="24" y="3356" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 28줄 WebCacheHeaders.java</tspan></text>
<text x="24" y="3378" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 72줄 WebCachePolicy.java</tspan></text>
<text x="24" y="3400" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 120줄 WebCachePolicyCatalog.java</tspan></text>
<text x="24" y="3422" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 90줄 WebVaryPolicy.java</tspan></text>
<text x="24" y="3444" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 타입들을 이름으로 부르는 파일과 횟수 :</tspan></text>
<text x="24" y="3466" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 2 main · WebCacheHeaders.java</tspan></text>
<text x="24" y="3488" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 5 main · WebCachePolicy.java</tspan></text>
<text x="24" y="3510" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 23 main · WebCachePolicyCatalog.java</tspan></text>
<text x="24" y="3532" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 6 main · WebVaryPolicy.java</tspan></text>
<text x="24" y="3554" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 22 test · WebCachePolicyTest.java</tspan></text>
<text x="24" y="3576" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> cache 패키지 밖에서 부르는 파일 : (0)</tspan></text>
<text x="24" y="3598" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3620" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 패키지를 그렇게 둔 근거</tspan></text>
<text x="24" y="3642" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> /**</tspan></text>
<text x="24" y="3664" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * The published cache profiles, their directives and the {@code Vary} rule.</tspan></text>
<text x="24" y="3686" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> *</tspan></text>
<text x="24" y="3708" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * &lt;p&gt;CORE: a caching decision is a set of directives, not a framework call. Keeping it free of</tspan></text>
<text x="24" y="3730" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * Spring is what lets the same profile be applied by the servlet writer, the reactive writer and</tspan></text>
<text x="24" y="3752" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> * the OpenAPI document without three renderings of it.</tspan></text>
<text x="24" y="3774" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> */</tspan></text>
<text x="24" y="3796" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CACHE(&quot;cache&quot;, &quot;cache&quot;, WebModulePurity.CORE),</tspan></text>
<text x="24" y="3818" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
<text x="24" y="3840" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 근거가 말한 적용자들이 실제로 무엇을 쓰는가</tspan></text>
<text x="24" y="3862" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main 에서 Cache-Control 값을 정하는 자리 (헤더 이름 상수 두 파일은 뺐다) :</tspan></text>
<text x="24" y="3884" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MvcDownloadResponseWriter.java:43 response.setHeader(HttpHeaders.CACHE_CONTROL, descriptor.cacheControl());</tspan></text>
<text x="24" y="3906" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ReactiveDownloadResponseWriter.java:36 headers.set(HttpHeaders.CACHE_CONTROL, descriptor.cacheControl());</tspan></text>
<text x="24" y="3928" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> TusController.java:138 .header(HttpHeaders.CACHE_CONTROL, &quot;no-store&quot;);</tspan></text>
<text x="24" y="3950" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CacheControlFilter.java:24 static final String DEFAULT_CACHE_CONTROL = &quot;no-store&quot;;</tspan></text>
<text x="24" y="3972" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CacheControlFilter.java:31 response.setHeader(ApiHeaders.CACHE_CONTROL, DEFAULT_CACHE_CONTROL);</tspan></text>
<text x="24" y="3994" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 뺀 두 파일 :</tspan></text>
<text x="24" y="4016" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ApiHeaders.java</tspan></text>
<text x="24" y="4038" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebHeaderName.java</tspan></text>
<text x="24" y="4060" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 연산 프로파일이 이름으로 들고 있는 캐시 정책과 그것을 읽는 자리 :</tspan></text>
<text x="24" y="4082" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">36: CachePolicyName cachePolicy,</tspan></text>
<text x="24" y="4104" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">95: CachePolicyName.standard(),</tspan></text>
<text x="24" y="4126" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">110: CachePolicyName.standard(),</tspan></text>
<text x="24" y="4148" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> cachePolicy() 를 읽는 자리 : (0)</tspan></text>
<text x="24" y="4170" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 지시자 문자열을 직접 들고 있는 main 자리 :</tspan></text>
<text x="24" y="4192" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> DownloadPolicy.java:25 return new DownloadPolicy(RangeBudget.unbounded(), &quot;private, no-store&quot;, false);</tspan></text>
<text x="24" y="4214" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> FileserverPlatformSettings.java:127 @DefaultValue(&quot;private, no-store&quot;) String cacheControl,</tspan></text>
<text x="24" y="4236" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> TusController.java:138 .header(HttpHeaders.CACHE_CONTROL, &quot;no-store&quot;);</tspan></text>
<text x="24" y="4258" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CacheControlFilter.java:24 static final String DEFAULT_CACHE_CONTROL = &quot;no-store&quot;;</tspan></text>
<text x="24" y="4280" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicy.java:41 if (cacheControl.contains(&quot;no-store&quot;) &amp;&amp; freshness.isPresent()) {</tspan></text>
<text x="24" y="4302" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicy.java:43 &quot;no-store and a freshness lifetime contradict each other: one says never keep this, the&quot;</tspan></text>
<text x="24" y="4324" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicyCatalog.java:36 &quot;sensitive&quot;, &quot;private, no-store&quot;, WebVaryPolicy.none(), false, Optional.empty());</tspan></text>
<text x="24" y="4346" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicyCatalog.java:49 &quot;public, max-age=31536000, immutable&quot;,</tspan></text>
<text x="24" y="4368" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicyCatalog.java:65 &quot;public, max-age=0, must-revalidate&quot;,</tspan></text>
<text x="24" y="4390" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> WebCachePolicyCatalog.java:80 &quot;private, max-age=30&quot;,</tspan></text>
<text x="24" y="4412" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CachePolicyName.java:28 return new CachePolicyName(&quot;no-store&quot;);</tspan></text>
<text x="24" y="4434" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlHttpGetCachePolicy.java:13 NO_STORE(&quot;no-store&quot;),</tspan></text>
<text x="24" y="4456" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlHttpGetCachePolicy.java:16 PRIVATE(&quot;private, max-age=0&quot;),</tspan></text>
<text x="24" y="4478" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> GraphQlHttpGetCachePolicy.java:21 SHARED(&quot;public, max-age=60&quot;);</tspan></text>
<text x="24" y="4500" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 목록이 발행하는 프로파일 이름과 그 지시자 :</tspan></text>
<text x="24" y="4522" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">36: &quot;sensitive&quot;, &quot;private, no-store&quot;, WebVaryPolicy.none(), false, Optional.empty());</tspan></text>
<text x="24" y="4544" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">48: &quot;immutable-asset&quot;,</tspan></text>
<text x="24" y="4566" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">64: &quot;revalidated&quot;,</tspan></text>
<text x="24" y="4588" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">79: &quot;browser-private&quot;,</tspan></text>
</svg>