<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://www.cheonilgukwiki.org/index.php?action=history&amp;feed=atom&amp;title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8%2F%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0</id>
	<title>충북교구레드플레그/효관 자동수집 코드리뷰 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://www.cheonilgukwiki.org/index.php?action=history&amp;feed=atom&amp;title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8%2F%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0"/>
	<link rel="alternate" type="text/html" href="https://www.cheonilgukwiki.org/index.php?title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8/%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0&amp;action=history"/>
	<updated>2026-07-14T09:51:36Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.cheonilgukwiki.org/index.php?title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8/%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0&amp;diff=49546&amp;oldid=prev</id>
		<title>애: 효관 자동수집 코드리뷰와 설명 문서 등록</title>
		<link rel="alternate" type="text/html" href="https://www.cheonilgukwiki.org/index.php?title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8/%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0&amp;diff=49546&amp;oldid=prev"/>
		<updated>2026-06-23T04:15:59Z</updated>

		<summary type="html">&lt;p&gt;효관 자동수집 코드리뷰와 설명 문서 등록&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ko&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 이전 판&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026년 6월 23일 (화) 13:15 판&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l14&quot;&gt;14번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;14번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 설정 파일 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/cbred_admin/cbred_settings.json&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 설정 파일 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/cbred_admin/cbred_settings.json&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 관리자 화면 || &amp;lt;code&amp;gt;http://172.30.1.36/cbred&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 관리자 화면 || &amp;lt;code&amp;gt;http://172.30.1.36&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;/Inner&lt;/ins&gt;/cbred&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 내부 홈페이지 코드 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/church_homepage/app.py&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;| 내부 홈페이지 코드 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/church_homepage/app.py&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l65&quot;&gt;65번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;65번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 관리자 화면 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 관리자 화면 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;내부 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;홈페이지에는 &lt;/del&gt;&amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt; 관리자 화면을 추가했다. 이 화면에서는 계정 파일 경로, 로그인 URL, 출석 경로, 다운로드 폴더, 로그 폴더, 운영 일정을 수정할 수 있다. 실제 ID/PW 원문은 화면에 표시하지 않는다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;내부 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;홈페이지 앱에는 &lt;/ins&gt;&amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt; 관리자 화면을 추가했다&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. nginx 공개 경로에서는 &amp;lt;code&amp;gt;/Inner/cbred&amp;lt;/code&amp;gt;로 접근한다&lt;/ins&gt;. 이 화면에서는 계정 파일 경로, 로그인 URL, 출석 경로, 다운로드 폴더, 로그 폴더, 운영 일정을 수정할 수 있다. 실제 ID/PW 원문은 화면에 표시하지 않는다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;관리자 화면 접근은 기존 내부 홈페이지 관리자 쿠키를 사용한다. 미로그인 사용자는 &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;code&amp;gt;/admin-login?next=/cbred&amp;lt;/code&amp;gt;로 &lt;/del&gt;이동한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;관리자 화면 접근은 기존 내부 홈페이지 관리자 쿠키를 사용한다. 미로그인 사용자는 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;관리자 로그인 화면으로 &lt;/ins&gt;이동한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 보안 검토 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 보안 검토 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l95&quot;&gt;95번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;95번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;--dry-run&amp;lt;/code&amp;gt; 옵션으로 다운로드 버튼을 누르기 전에 로그인과 화면 상태를 확인할 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &amp;lt;code&amp;gt;--dry-run&amp;lt;/code&amp;gt; 옵션으로 다운로드 버튼을 누르기 전에 로그인과 화면 상태를 확인할 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 내부 홈페이지 &amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt;에서 운영자가 설정을 수정할 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 내부 홈페이지 &amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt;에서 운영자가 설정을 수정할 수 있다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 실제 공개 확인 주소는 &amp;lt;code&amp;gt;http://172.30.1.36/Inner/cbred&amp;lt;/code&amp;gt;이다.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 주의할 점 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 주의할 점 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l103&quot;&gt;103번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;104번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 로그에는 화면 HTML과 screenshot이 저장될 수 있으므로 운영 후 로그 보존 기간과 접근 권한을 정해야 한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 로그에는 화면 HTML과 screenshot이 저장될 수 있으므로 운영 후 로그 보존 기간과 접근 권한을 정해야 한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 수요일 20:10 스케줄 등록은 아직 시스템 타이머/cron으로 연결하지 않았다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 수요일 20:10 스케줄 등록은 아직 시스템 타이머/cron으로 연결하지 않았다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* 현이 요청한 루트 경로 &amp;lt;code&amp;gt;http://172.30.1.36/cbred&amp;lt;/code&amp;gt;는 현재 nginx가 MediaWiki 루트로 사용 중이라 바로 연결되지 않는다. 루트 경로가 꼭 필요하면 nginx에 별도 &amp;lt;code&amp;gt;location /cbred&amp;lt;/code&amp;gt; 프록시를 추가해야 한다.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 남은 작업 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 남은 작업 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l112&quot;&gt;112번째 줄:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;114번째 줄:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# 수요일 20:10 자동 실행 스케줄을 등록한다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# 수요일 20:10 자동 실행 스케줄을 등록한다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# 실패 시 사무장/관리자에게 알림을 보내는 작업을 붙인다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# 실패 시 사무장/관리자에게 알림을 보내는 작업을 붙인다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;# 필요 시 nginx 설정에 &amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt; 단독 프록시를 추가해 &amp;lt;code&amp;gt;/Inner/cbred&amp;lt;/code&amp;gt;와 같은 화면을 루트 경로에서도 열리게 한다.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 수동 실행 명령 ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 수동 실행 명령 ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>애</name></author>
	</entry>
	<entry>
		<id>https://www.cheonilgukwiki.org/index.php?title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8/%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0&amp;diff=49544&amp;oldid=prev</id>
		<title>애: 효관 자동수집 코드리뷰와 설명 문서 등록</title>
		<link rel="alternate" type="text/html" href="https://www.cheonilgukwiki.org/index.php?title=%EC%B6%A9%EB%B6%81%EA%B5%90%EA%B5%AC%EB%A0%88%EB%93%9C%ED%94%8C%EB%A0%88%EA%B7%B8/%ED%9A%A8%EA%B4%80_%EC%9E%90%EB%8F%99%EC%88%98%EC%A7%91_%EC%BD%94%EB%93%9C%EB%A6%AC%EB%B7%B0&amp;diff=49544&amp;oldid=prev"/>
		<updated>2026-06-23T04:12:30Z</updated>

		<summary type="html">&lt;p&gt;효관 자동수집 코드리뷰와 설명 문서 등록&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:충북교구레드플레그/효관 자동수집 코드리뷰}}&lt;br /&gt;
= 충북교구레드플레그/효관 자동수집 코드리뷰 =&lt;br /&gt;
&lt;br /&gt;
이 문서는 2026년 6월 23일 작성한 효관 출석자료 자동수집 코드의 설명과 코드리뷰 기록이다. 계정 ID와 비밀번호 원문은 문서에 기록하지 않는다.&lt;br /&gt;
&lt;br /&gt;
== 대상 코드 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 항목 !! 위치&lt;br /&gt;
|-&lt;br /&gt;
| 자동수집기 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/cbred_admin/hyogwan_collect.py&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 설정 파일 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/cbred_admin/cbred_settings.json&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 관리자 화면 || &amp;lt;code&amp;gt;http://172.30.1.36/cbred&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 내부 홈페이지 코드 || &amp;lt;code&amp;gt;/home/ruyjin/.openclaw/workspace/church_homepage/app.py&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 계정 파일 || &amp;lt;code&amp;gt;/home/ruyjin/ffwpu.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 구현 요약 ==&lt;br /&gt;
&lt;br /&gt;
자동수집기는 Python 스크립트에서 &amp;lt;code&amp;gt;agent-browser&amp;lt;/code&amp;gt; CLI를 호출해 효관 로그인, 출석조회 화면 이동, 엑셀/다운로드 버튼 탐색을 수행한다. 효관 계정은 코드에 직접 저장하지 않고 &amp;lt;code&amp;gt;ffwpu.txt&amp;lt;/code&amp;gt; 형식의 외부 파일에서 읽는다.&lt;br /&gt;
&lt;br /&gt;
기본 흐름은 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;cbred_settings.json&amp;lt;/code&amp;gt;에서 로그인 URL, 출석 경로, 다운로드 폴더, 로그 폴더를 읽는다.&lt;br /&gt;
# &amp;lt;code&amp;gt;ffwpu.txt&amp;lt;/code&amp;gt;에서 &amp;lt;code&amp;gt;ID:&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;PW:&amp;lt;/code&amp;gt; 값을 읽는다.&lt;br /&gt;
# &amp;lt;code&amp;gt;agent-browser&amp;lt;/code&amp;gt; 세션을 열고 효관 로그인 화면에 접속한다.&lt;br /&gt;
# 여러 후보 selector로 아이디/비밀번호 입력칸을 찾아 값을 입력한다.&lt;br /&gt;
# 로그인 버튼을 누르거나 Enter 키로 로그인한다.&lt;br /&gt;
# 출석조회 경로로 이동한다.&lt;br /&gt;
# &amp;lt;code&amp;gt;엑셀&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Excel&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;다운로드&amp;lt;/code&amp;gt; 버튼을 찾아 파일 다운로드를 시도한다.&lt;br /&gt;
# 실패 시 현재 URL, 접근성 snapshot, body HTML, screenshot을 로그 폴더에 저장한다.&lt;br /&gt;
&lt;br /&gt;
== 설정 구조 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cbred_settings.json&amp;lt;/code&amp;gt;의 핵심 필드는 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 필드 !! 의미&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || 자동수집 사용 여부&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;credential_file&amp;lt;/code&amp;gt; || 효관 계정 파일 경로&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;login_url&amp;lt;/code&amp;gt; || 효관 로그인 URL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;attendance_path&amp;lt;/code&amp;gt; || 출석조회 상대경로 또는 전체 URL&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;download_dir&amp;lt;/code&amp;gt; || 다운로드 원자료 저장 폴더&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;log_dir&amp;lt;/code&amp;gt; || 실행 로그와 실패 진단 자료 저장 폴더&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;church_scope&amp;lt;/code&amp;gt; || 수집 범위 메모&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lookback_weeks&amp;lt;/code&amp;gt; || 레드플레그 판별 주차&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;browser_session&amp;lt;/code&amp;gt; || agent-browser 세션명&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 관리자 화면 ==&lt;br /&gt;
&lt;br /&gt;
내부 홈페이지에는 &amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt; 관리자 화면을 추가했다. 이 화면에서는 계정 파일 경로, 로그인 URL, 출석 경로, 다운로드 폴더, 로그 폴더, 운영 일정을 수정할 수 있다. 실제 ID/PW 원문은 화면에 표시하지 않는다.&lt;br /&gt;
&lt;br /&gt;
관리자 화면 접근은 기존 내부 홈페이지 관리자 쿠키를 사용한다. 미로그인 사용자는 &amp;lt;code&amp;gt;/admin-login?next=/cbred&amp;lt;/code&amp;gt;로 이동한다.&lt;br /&gt;
&lt;br /&gt;
== 보안 검토 ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 항목 !! 검토 결과&lt;br /&gt;
|-&lt;br /&gt;
| 계정 하드코딩 || 코드에 ID/PW를 직접 넣지 않았다.&lt;br /&gt;
|-&lt;br /&gt;
| 계정 파일 권한 || &amp;lt;code&amp;gt;/home/ruyjin/ffwpu.txt&amp;lt;/code&amp;gt; 권한을 &amp;lt;code&amp;gt;600&amp;lt;/code&amp;gt;으로 낮췄다.&lt;br /&gt;
|-&lt;br /&gt;
| 관리자 화면 노출 || 화면에는 계정 파일 경로만 표시하고 원문 비밀번호는 표시하지 않는다.&lt;br /&gt;
|-&lt;br /&gt;
| 로그 민감정보 || 현재 로그에는 명령 결과와 화면 진단이 남을 수 있으므로 효관 화면에 개인정보가 보이면 로그 폴더 접근을 제한해야 한다.&lt;br /&gt;
|-&lt;br /&gt;
| 외부 발송 || 자동수집 코드는 문자/메일/카카오 발송을 수행하지 않는다.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 코드리뷰 결과 ==&lt;br /&gt;
&lt;br /&gt;
=== 좋은 점 ===&lt;br /&gt;
&lt;br /&gt;
* 계정 정보를 코드에 직접 넣지 않고 외부 파일에서 읽도록 분리했다.&lt;br /&gt;
* 수집 실패 시 진단 파일을 남기므로 효관 화면 변경에 대응할 수 있다.&lt;br /&gt;
* 다운로드 폴더와 로그 폴더를 설정으로 분리했다.&lt;br /&gt;
* &amp;lt;code&amp;gt;--dry-run&amp;lt;/code&amp;gt; 옵션으로 다운로드 버튼을 누르기 전에 로그인과 화면 상태를 확인할 수 있다.&lt;br /&gt;
* 내부 홈페이지 &amp;lt;code&amp;gt;/cbred&amp;lt;/code&amp;gt;에서 운영자가 설정을 수정할 수 있다.&lt;br /&gt;
&lt;br /&gt;
=== 주의할 점 ===&lt;br /&gt;
&lt;br /&gt;
* 효관 화면의 실제 input name, 로그인 버튼, 엑셀 버튼이 현재 추정과 다르면 dry-run 후 selector 보정이 필요하다.&lt;br /&gt;
* &amp;lt;code&amp;gt;agent-browser&amp;lt;/code&amp;gt; CLI가 서버에 설치되어 있어야 한다.&lt;br /&gt;
* 자동수집 성공 후 내려받은 엑셀 구조를 파싱하는 코드는 아직 별도 구현이 필요하다.&lt;br /&gt;
* 로그에는 화면 HTML과 screenshot이 저장될 수 있으므로 운영 후 로그 보존 기간과 접근 권한을 정해야 한다.&lt;br /&gt;
* 수요일 20:10 스케줄 등록은 아직 시스템 타이머/cron으로 연결하지 않았다.&lt;br /&gt;
&lt;br /&gt;
== 남은 작업 ==&lt;br /&gt;
&lt;br /&gt;
# 효관 실제 로그인 dry-run을 실행해 로그인 selector와 출석조회 경로를 확인한다.&lt;br /&gt;
# 실제 다운로드 파일이 생성되는지 확인한다.&lt;br /&gt;
# 다운로드한 엑셀/CSV 컬럼 구조를 분석한다.&lt;br /&gt;
# 4주 연속 미출석 판별 파서를 작성한다.&lt;br /&gt;
# 수요일 20:10 자동 실행 스케줄을 등록한다.&lt;br /&gt;
# 실패 시 사무장/관리자에게 알림을 보내는 작업을 붙인다.&lt;br /&gt;
&lt;br /&gt;
== 수동 실행 명령 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
python3 /home/ruyjin/.openclaw/workspace/cbred_admin/hyogwan_collect.py --dry-run&lt;br /&gt;
python3 /home/ruyjin/.openclaw/workspace/cbred_admin/hyogwan_collect.py&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 결론 ==&lt;br /&gt;
&lt;br /&gt;
현재 코드는 자동수집 MVP의 첫 단계로 볼 수 있다. 로그인, 화면 이동, 다운로드 시도, 실패 진단 저장까지는 준비됐지만, 실제 효관 화면 검증과 다운로드 파일 파싱은 아직 남아 있다. 따라서 운영 투입 전에는 반드시 dry-run과 실제 다운로드 테스트를 거쳐야 한다.&lt;br /&gt;
&lt;br /&gt;
[[분류:프로젝트]]&lt;br /&gt;
[[분류:충북교구]]&lt;br /&gt;
[[분류:코드리뷰]]&lt;/div&gt;</summary>
		<author><name>애</name></author>
	</entry>
</feed>