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>
264 lines
46 KiB
XML
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 "# 필터가 무엇을 붙이고, 그것이 되돌려질 수</tspan><tspan x="24" dy="22"> 있다고 무엇이 말하는가"
|
|
sed -n '14,34p' $W/filter/CacheControlFilter.java
|
|
echo
|
|
echo "# 그 정책을 이 필터가 혼자 갖도록 </tspan><tspan x="24" dy="22">보안 설정이 프레임워크 기본값을 끈다"
|
|
sed -n '77,80p' $W/auth/SecurityConfig.java
|
|
echo -n " 다만 픽스처 모듈은 그 설정</tspan><tspan x="24" dy="22">을 스캔에서 뺀다 : "
|
|
grep -n 'SecurityConfig.class' \
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/S</tspan><tspan x="24" dy="22">amplePortfolioApplication.java
|
|
echo " 그 모듈이 적어 둔 제외 이유 :"
|
|
sed -n '36,37p' sample-portfolio/src/main/java/dev</tspan><tspan x="24" dy="22">/caskeleton/sample/portfolio/SamplePortfolioApplication.java
|
|
echo " 그 모듈이 대신 두는 체인. 캐시 기록기를 끄지 않는다</tspan><tspan x="24" dy="22"> :"
|
|
sed -n '24,29p' \
|
|
sample-portfolio/src/main/java/dev/caskeleton/sample/portfolio/bootstrap/security/SamplePublicAc</tspan><tspan x="24" dy="22">cessSecurityConfig.java
|
|
echo
|
|
echo "# 조건부 읽기를 구현한 자리 전부와 그것을 켜는 조건"
|
|
echo " main 에서 응답에 개체 태</tspan><tspan x="24" dy="22">그를 쓰는 파일 (아웃바운드 S3 클라이언트는 뺐다) :"
|
|
grep -rln 'HttpHeaders.ETAG\|WebHeaderName.ETAG\|ApiHeaders.ETAG\|\.</tspan><tspan x="24" dy="22">eTag(' --include=*.java --exclude-dir=build . \
|
|
| grep '/main/' | grep -v '/objectstorage/' | sed -E 's#^\./[^:]*/([^/</tspan><tspan x="24" dy="22">]+)$# \1#'
|
|
echo " 이 파일들과 304 판정 클래스를, 시험을 빼고 부르는 자리가 있는지 :"
|
|
for n in WebSuccessResponse WebRe</tspan><tspan x="24" dy="22">sponseContract ConditionalReadEvaluator; do
|
|
echo -n " $n 를 부르는 자리 : "
|
|
{ grep -rln "$n" --include=*.java --e</tspan><tspan x="24" dy="22">xclude-dir=build . | grep -v "/$n.java" | grep -v "Test.java" \
|
|
| sed -E "s#^\./[^:]*/([^/]+)\$#\1#" | tr '\n' ' '</tspan><tspan x="24" dy="22"> || true; }
|
|
echo "(끝)"
|
|
done
|
|
echo -n " 같은 패키지의 ETags 를 실제로 호출하는 자리 : "
|
|
{ grep -rln 'ETags\.' --incl</tspan><tspan x="24" dy="22">ude=*.java --exclude-dir=build . | grep -v '/ETags.java' \
|
|
| grep -v 'Test.java' | sed -E 's#^\./[^:]*/([^/]+)$#\1#'</tspan><tspan x="24" dy="22"> | tr '\n' ' ' || true; }
|
|
echo "(끝)"
|
|
echo " 레지스트리가 선언한 런타임 컴포지션과 이 리프의 소속 :"
|
|
sed -n '2,6p' conf</tspan><tspan x="24" dy="22">ig/architecture/modules.json
|
|
sed -n '170p' config/architecture/modules.json
|
|
sed -n '170,182p' config/architecture/module</tspan><tspan x="24" dy="22">s.json | grep -A3 'runtime_memberships'
|
|
echo " 304 판정을 구현해 둔 클래스와 그 자바독 첫 줄 :"
|
|
sed -n '6,7p' $W/condit</tspan><tspan x="24" dy="22">ional/ConditionalReadEvaluator.java
|
|
echo " 내려받기 컨트롤러를 켜는 조건과 그 스위치의 출하값 :"
|
|
grep -n 'ConditionalOn</tspan><tspan x="24" dy="22">Property' $W/fileserver/controller/FileDownloadController.java
|
|
grep -n 'APP_FILESERVER_PLATFORM_ENABLED' app-bootstrap/s</tspan><tspan x="24" dy="22">rc/main/resources/application.yml
|
|
grep -n '^APP_FILESERVER_PLATFORM_ENABLED' .env .env.example
|
|
echo
|
|
echo "# 내려받기 경</tspan><tspan x="24" dy="22">로가 스스로 쓰는 태그와 지시자"
|
|
grep -n 'ETAG\|CACHE_CONTROL' $W/fileserver/http/MvcDownloadResponseWriter.java
|
|
echo " </tspan><tspan x="24" dy="22">같은 문자열을 자바 밖에서 다시 쓰는 자리 :"
|
|
grep -rIn 'no-store' --exclude=*.java --exclude-dir=build --exclude-dir=.git</tspan><tspan x="24" dy="22"> --exclude=*.md . \
|
|
| sed -E 's#^\./# #'
|
|
grep -rn 'private, no-store' --include=*.java application-core/src/main app-</tspan><tspan x="24" dy="22">bootstrap/src/main \
|
|
| sed -E 's#^[^:]*/([^:/]+):# \1:#'
|
|
echo
|
|
echo "# 픽스처 모듈 쪽 조건부 읽기 경로"
|
|
sed -n '137,14</tspan><tspan x="24" dy="22">8p' $P/WorkLogController.java
|
|
echo -n " 이 모듈 main 에서 Cache-Control 을 스스로 정하는 자리 : "
|
|
{ grep -rc 'CacheCont</tspan><tspan x="24" dy="22">rol' --include=*.java sample-portfolio/src/main | grep -v ':0$' || echo "(0)"; }
|
|
echo
|
|
echo "# 둘을 조정하라고 만들어 둔 </tspan><tspan x="24" dy="22">패키지"
|
|
find $W/cache -name '*.java' | sort | while IFS= read -r f; do
|
|
printf ' %3s줄 %s\n' "$(grep -c '' "$f")" "$(</tspan><tspan x="24" dy="22">basename "$f")"
|
|
done
|
|
echo " 그 타입들을 이름으로 부르는 파일과 횟수 :"
|
|
grep -rn 'WebCachePolicyCatalog\|WebCachePolicy\</tspan><tspan x="24" dy="22">|WebVaryPolicy\|WebCacheHeaders' --include=*.java . \
|
|
| sed -E 's#^\./([^:]*)/src/(main|test)/[^:]*/([^:/]+):[0-9]+:.*</tspan><tspan x="24" dy="22"># \2 · \3#' | sort | uniq -c
|
|
echo -n " cache 패키지 밖에서 부르는 파일 : "
|
|
{ grep -rl 'WebCachePolicyCatalog\|WebCach</tspan><tspan x="24" dy="22">ePolicy\|WebVaryPolicy\|WebCacheHeaders' --include=*.java . \
|
|
| grep -v '/web/cache/' || echo "(0)"; }
|
|
echo
|
|
echo "# </tspan><tspan x="24" dy="22">그 패키지를 그렇게 둔 근거"
|
|
sed -n '80,87p' $W/moduleboundary/WebStableModule.java
|
|
echo
|
|
echo "# 그 근거가 말한 적용자들</tspan><tspan x="24" dy="22">이 실제로 무엇을 쓰는가"
|
|
echo " main 에서 Cache-Control 값을 정하는 자리 (헤더 이름 상수 두 파일은 뺐다) :"
|
|
grep -rn 'C</tspan><tspan x="24" dy="22">ACHE_CONTROL\|"Cache-Control"' --include=*.java . \
|
|
| grep -v '/test/' | grep -v 'WebHeaderName.java\|ApiHeaders.java'</tspan><tspan x="24" dy="22"> \
|
|
| sed -E 's#^\./[^:]*/([^:/]+):([0-9]+):# \1:\2 #'
|
|
echo " 뺀 두 파일 :"
|
|
{ grep -rln 'CACHE_CONTROL' --include=*.j</tspan><tspan x="24" dy="22">ava . | grep 'WebHeaderName.java\|ApiHeaders.java' \
|
|
| sed -E 's#^\./[^:]*/([^:/]+)$# \1#' || echo " (없음)"; }
|
|
ec</tspan><tspan x="24" dy="22">ho " 연산 프로파일이 이름으로 들고 있는 캐시 정책과 그것을 읽는 자리 :"
|
|
grep -n 'CachePolicyName cachePolicy\|CachePoli</tspan><tspan x="24" dy="22">cyName.standard()' \
|
|
$W/operation/WebOperationProfile.java | head -3
|
|
echo -n " cachePolicy() 를 읽는 자리 : "
|
|
{ grep </tspan><tspan x="24" dy="22">-rn 'cachePolicy()' --include=*.java . | sed -E 's#^\./[^:]*/([^:/]+):# \1:#' || echo "(0)"; }
|
|
echo " 지시자 문자열을 </tspan><tspan x="24" dy="22">직접 들고 있는 main 자리 :"
|
|
grep -rnE '"(no-store|no-cache|public|private)[^"]*"|"max-age=[^"]*"' --include=*.java . \
|
|
</tspan><tspan x="24" dy="22"> | grep -v '/test/' | grep -E 'no-store|max-age' \
|
|
| sed -E 's#^\./[^:]*/([^:/]+):([0-9]+):# \1:\2 #'
|
|
echo " 목록이 </tspan><tspan x="24" dy="22">발행하는 프로파일 이름과 그 지시자 :"
|
|
grep -n ' "[a-z][a-z0-9.-]*",' $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'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 = "no-store";</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 = "Accept, Accept-Encoding, Authorization";</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 -> 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'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 -> headers.cacheControl(cache -> 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("/**")</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 -> 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 -> 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 -> 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"> "runtime_compositions": [</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"> "app-bootstrap",</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"> "sample-portfolio"</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"> "modules": [</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"> "id": "adapter-inbound-web",</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"> "runtime_memberships": [</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"> "app-bootstrap",</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"> "sample-portfolio"</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 = "app.fileserver-platform", name = "enabled", havingValue = "true")</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(), "private, no-store", 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("private, no-store") 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("/worklogs/{id}")</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<WorkLogResponse> 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"> * <p>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("cache", "cache", 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, "no-store");</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 = "no-store";</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(), "private, no-store", 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("private, no-store") 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, "no-store");</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 = "no-store";</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("no-store") && 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 "no-store and a freshness lifetime contradict each other: one says never keep this, the"</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 "sensitive", "private, no-store", 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 "public, max-age=31536000, immutable",</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 "public, max-age=0, must-revalidate",</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 "private, max-age=30",</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("no-store");</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("no-store"),</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("private, max-age=0"),</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("public, max-age=60");</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: "sensitive", "private, no-store", 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: "immutable-asset",</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: "revalidated",</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: "browser-private",</tspan></text>
|
|
</svg>
|