자주자주 공지를 확인하세요!

라이믹스/매뉴얼/라이믹스 업데이트: 두 판 사이의 차이

Gaon12 (토론 / 기여)
내용울 좀 더 쉽게 개선
Gaon12 (토론 / 기여)
주제별 분류 적용: 설치와 이전; 상위 분류 중복 정리
 
(같은 사용자의 중간 판 4개는 보이지 않습니다)
1번째 줄: 1번째 줄:
상위 문서: [[라이믹스/매뉴얼]]
== 개요 ==
== 개요 ==
[[라이믹스]]는 계속해서 새로운 기능이 추가되고, 버그 수정과 보안 패치가 수시로 이루어집니다.
[[라이믹스]]의 코어를 새 버전으로 갱신하는 방법이다. 공식 매뉴얼은 압축 파일을 기존 설치 경로에 덮어쓰는 방법과 Git으로 변경 사항을 받아오는 방법을 안내한다.<ref name="manual">[https://rhymix.org/manual/introduction/update 라이믹스 업데이트 - 공식 매뉴얼]</ref> [[XpressEngine|XE]]에서 처음 전환하는 경우에는 [[라이믹스/XE에서 넘어오기]]를 참고한다.
따라서 라이믹스를 사용해 운영하는 사이트는 정기적으로 업데이트해야 안전하고 최신 기능을 유지할 수 있습니다.


업데이트 방법은 크게 두 가지입니다.
== 업데이트 전 준비 ==
# 새 버전으로 덮어씌우기 (초보자 추천) 
# 적용할 버전의 [[라이믹스/릴리즈 노트|릴리즈 노트]]와 [[라이믹스/매뉴얼/설치 환경|설치 환경]]을 확인한다. [[PHP]]·DB 요구사항과 사용 중인 서드파티 자료의 호환성을 함께 점검한다.
# Git을 이용한 업데이트 (버전 관리 시 추천)
# 설치 폴더 전체와 DB를 각각 백업한다. 코어 수정분, 추가 자료, 설정 및 첨부파일도 포함하고 복원 방법을 확인한다. 파일만 되돌려서는 DB 변경을 취소할 수 없다.
# 가능하면 별도 테스트 환경에서 먼저 갱신한다. 운영 사이트에 적용할 때는 작업 중 글쓰기 등 데이터 변경을 제한한다.
# Git 설치라면 설치 폴더에서 <code>git status</code>, <code>git branch --show-current</code>, <code>git remote -v</code>로 변경분·브랜치·원격 저장소를 확인한다. 아래 예제는 <code>origin</code>이 공식 저장소인 경우이다.


== 새 버전으로 덮어씌우기 ==
== 압축 파일로 덮어쓰기 ==
이 방법은 가장 간단하며, 라이믹스 설치 절차와 동일합니다.
# [https://rhymix.org/news/category/177 공식 릴리즈 공지]에서 적용할 버전의 공지를 열고 전체 배포 파일을 내려받는다. 공지의 Download 링크와 Changed Files Only 링크를 구분한다. GitHub Releases에 배포 파일이 등록되어 있다고 가정하지 않는다.
# '''기존 사이트 밖의 별도 작업 폴더'''에 압축을 푼다. 압축 파일에 따라 최상위 폴더 이름이 다를 수 있다.
# 압축을 푼 폴더 안의 <code>index.php</code>, <code>common</code>, <code>modules</code> 등이 기존 설치 폴더의 같은 위치에 덮어써지도록 업로드한다. <code>.htaccess</code> 등 숨김 파일도 포함한다.
# 아래 [[#업데이트 후 확인|업데이트 후 확인]] 절차를 수행한다.


# [https://github.com/rhymix/rhymix/releases 라이믹스 공식 릴리스 페이지]에서 최신 ZIP 파일을 다운로드합니다.
기존 설치 폴더에 <code>unzip ... -d 설치경로</code>만 실행하면 그 아래에 배포 폴더가 하나 더 생겨 실제 코어가 갱신되지 않을 수 있다. 업로드 후에는 새 파일이 기존 <code>index.php</code>와 같은 경로에 있는지 확인한다.
# 서버의 기존 라이믹스 설치 위치에 압축을 풀거나 덮어씌웁니다.
 
배포 파일에는 <code>files</code> 폴더가 포함되지 않으며, 사용자 설정·첨부파일은 <code>files</code>와 DB에 저장된다. 추가한 서드파티 자료도 보통 유지된다. 다만 '''배포 파일과 같은 경로를 직접 수정했다면 수정분이 덮어써질 수 있다'''. 백업 없이 안전하다는 의미는 아니다.<ref name="manual" />
 
== Git으로 업데이트 ==
Git으로 설치하여 <code>.git</code> 디렉터리가 남아 있는 사이트에서 사용한다. 압축 파일로 설치한 사이트에서는 이 절차를 그대로 실행할 수 없다.
 
=== 코어 수정이 없는 경우 ===
현재 브랜치와 추적 대상이 의도한 버전인지 확인한 뒤 실행한다.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
wget https://github.com/rhymix/rhymix/archive/master.zip
git status
unzip master.zip -d /path/to/your/site
git pull --ff-only
</syntaxhighlight>
</syntaxhighlight>


<code>files</code> 폴더와 DB에는 사용자 설정 및 첨부파일이 저장되므로, 덮어씌워도 데이터 손실 없이 안전합니다.
<code>--ff-only</code>는 이력이 갈라진 경우 임의로 병합하지 않고 중단한다. 실패하면 현재 상태를 확인하고 아래의 수정분 관리 절차를 검토한다. 새 브랜치로 전환한 경우에도 그 브랜치의 추적 대상을 확인한다.<ref>[https://git-scm.com/docs/git-pull Git 공식 문서: git-pull]</ref>
단, 코어 파일을 직접 수정한 경우 모든 변경 내역이 사라질 수 있습니다.
{{경고박스|코어 파일을 수정해서 사용 중이라면 이 방법을 쓰면 수정 내용이 전부 초기화됩니다.}} 
→ 코어를 수정한 상태에서 업데이트하려면 아래의 Git 방법을 사용하세요.


== Git으로 업데이트하기 ==
추가한 [[라이믹스/매뉴얼/확장 기능 제작|모듈]]·[[라이믹스/매뉴얼/테마 제작|스킨]]은 <code>Untracked files</code>로 표시될 수 있다. 이를 코어 변경으로 취급할 필요는 없지만, 새 코어 파일과 경로가 겹치면 업데이트가 중단될 수 있으므로 메시지를 확인한다. 강제 초기화나 일괄 삭제로 해결하지 않는다.
Git으로 설치한 경우, 명령어 몇 개만으로 손쉽게 최신 상태로 유지할 수 있습니다.


=== 소스 수정이 없는 경우 ===
=== 코어 수정이 적은 경우 ===
<code>git status</code> 명령을 실행했을 때 "modified", "deleted" 메시지가 없으면 코어 소스에 수정 사항이 없는 상태입니다. 
수정분을 임시 보관한 뒤 업데이트하고 다시 적용한다.<ref name="manual" />
(추가한 모듈·스킨 등은 "Untracked files"에 표시되지만, 이는 문제가 되지 않습니다.) 
이 상태라면 다음 한 줄로 업데이트가 완료됩니다.


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
git pull
git stash push -m "라이믹스 업데이트 전 코어 수정분"
git stash list
</syntaxhighlight>
</syntaxhighlight>


설명: 
방금 저장한 항목이 생겼는지 확인한다. 기본 <code>stash</code>는 미추적 파일과 무시된 파일을 포함하지 않으므로 추가 자료는 따로 백업한다. 저장된 항목을 확인한 뒤 다음을 실행한다.
* <code>git pull</code>은 원격 저장소의 최신 커밋을 로컬에 가져와 자동으로 병합합니다.
* 브랜치를 변경했다면, 해당 브랜치에서도 다시 <code>git pull</code>을 실행해야 합니다.
[https://git-scm.com/docs/git-pull Git 공식 문서: git-pull]


=== 소스 수정이 있는 경우 (간단한 수정) ===
코어 파일을 일부 수정해 두었다면, 업데이트 시 충돌(conflict)이 발생할 수 있습니다. 
작은 수정만 있을 때는 <code>git stash</code>로 임시 보관했다가 업데이트 후 다시 꺼내는 방법이 편리합니다.
==== 단계별 가이드 ====
# 변경 사항을 임시 저장합니다: 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
git stash
git pull --ff-only
git stash apply 'stash@{0}'
</syntaxhighlight>
</syntaxhighlight>
<ol start="2">
<li>이때 <code>git status</code>를 실행하면 "clean" 상태가 됩니다.</li>
<li>이제 원격 저장소에서 변경 사항을 가져옵니다:</li>
</ol>
<syntaxhighlight lang="bash>
git pull
</syntaxhighlight>
<ol start="4">
<li>업데이트가 완료되면, 숨겨둔 변경 사항을 다시 적용합니다:</li>
</ol>
<syntaxhighlight lang="bash">
git stash apply
</syntaxhighlight>
<ol start="5">
<li>충돌이 없으면 이걸로 끝납니다.</li>
</ol>


{{경고박스|동일한 파일의 동일한 부분을 수정했다면 <code>git stash apply</code> 단계에서 충돌이 발생합니다. 충돌 표시(<nowiki><<<<<<<, =======, >>>>>>></nowiki>)를 찾아 직접 수정한 뒤 저장하세요.}} 
위의 <code>stash@{0}</code>은 방금 만든 항목이 최신 항목인 경우의 예이다. 기존 stash를 잘못 적용하지 않도록 <code>git stash list</code>로 구분한다. 충돌이 발생하면 해당 파일을 열어 <nowiki><<<<<<<, =======, >>>>>>></nowiki> 표시를 해결하고 동작을 검증한다. <code>apply</code>는 보관본을 자동 삭제하지 않는다.
 
업데이트 후 점검까지 끝난 다음, 더 이상 필요 없는 '''해당 항목 하나만''' 삭제한다.


<ol start="6">
<li>작업이 모두 완료되면, 더 이상 필요 없는 임시 저장 데이터를 삭제합니다:</li>
</ol>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
git stash clear
git stash drop 'stash@{0}'
</syntaxhighlight>
</syntaxhighlight>


[https://git-scm.com/docs/git-stash Git 공식 문서: git-stash]
<code>git stash clear</code>는 기존 보관본까지 모두 지우므로 이 절차의 정리 명령으로 사용하지 않는다.<ref>[https://git-scm.com/docs/git-stash Git 공식 문서: git-stash]</ref>


=== 소스 수정이 있는 경우 (대규모 수정) ===
=== 코어 수정이 많은 경우 ===
수정 분량이 많거나 여러 차례 커밋하며 작업했다면, 별도 브랜치에서 관리하는 편이 안전합니다.
별도 브랜치에서 수정분을 커밋하고 공식 브랜치의 변경을 병합한다. 다음은 <code>master</code>의 변경을 가져오는 예이다.<ref name="manual" />


==== 단계별 가이드 ====
# 새 브랜치를 만듭니다 (브랜치명은 사이트 이름 등으로 구분): 
<syntaxhighlight lang="bash">
git checkout -b mybranch
</syntaxhighlight>
<ol start="2">
<li>현재 변경 내역을 모두 커밋합니다:</li>
</ol>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
git checkout -b mysite
git add -u .
git add -u .
git commit -m "사이트 커스터마이징 커밋"
git commit -m "사이트 코어 수정분 보관"
</syntaxhighlight>
git fetch origin
<ol start="3">
git merge origin/master
<li>공식 저장소의 master(또는 develop) 브랜치를 로컬로 가져옵니다:</li>
</ol>
<syntaxhighlight lang="bash">
git fetch origin master:master
git fetch origin develop:develop
</syntaxhighlight>
<ol start="4">
<li>작업 브랜치에서 master를 병합합니다:</li>
</ol>
<syntaxhighlight lang="bash">
git merge master
</syntaxhighlight>
<ol start="5">
<li>충돌이 없다면 완료. 충돌이 발생하면 표시된 파일을 열어 수정하고, 아래를 실행하세요:</li>
</ol>
<syntaxhighlight lang="bash">
git add -u .
git commit -m "충돌 해결 및 업데이트 반영"
</syntaxhighlight>
</syntaxhighlight>


{{정보박스|이 워크플로우는 대규모 커스터마이징 상태에서도 안전하게 업데이트와 충돌 관리를 할 수 있는 정석 방법입니다.}}
<code>git add -u</code>는 이미 추적 중인 파일의 수정·삭제만 포함한다. 새로 만든 코어 파일이 있다면 필요한 파일을 개별적으로 추가하고, 설정 파일이나 첨부파일을 실수로 커밋하지 않도록 확인한다. 이미 수정분 관리 브랜치가 있으면 새로 만들지 않고 그 브랜치에서 진행한다.
 
충돌이 발생하면 수정 후 해결한 파일만 <code>git add</code>하고 병합 커밋을 완료한다. 개발 브랜치 이름은 시기마다 달라질 수 있으므로 과거 문서의 <code>develop</code>을 그대로 지정하지 말고 실제 공식 저장소와 적용 대상 릴리즈를 확인한다.
 
== 여러 버전을 건너뛸 때 ==
현재 버전과 대상 버전 사이의 공지에서 PHP 요구 사항, 삭제·변경된 API와 권한 제한을 함께 확인한다. 변경 파일만 적용할 때는 해당 파일 묶음이 전제로 하는 이전 버전을 확인한다. 오래된 버전에서 바로 최신 변경 파일만 덮어쓰면 중간 변경이 누락될 수 있다.
 
예를 들어 2.1.37은 보안 수정과 <code>array_escape()</code>의 자료형 처리 변경을 포함하고, 2.1.38은 HTMLFilter 옵션 제거와 게시판 관리자의 스크립트 수정 권한 제한을 포함한다. [[라이믹스/릴리즈 노트/2.1.37]]·[[라이믹스/릴리즈 노트/2.1.38]]과 [[라이믹스/매뉴얼/서드파티 자료 호환성 체크리스트]]를 함께 확인한다.
 
== 업데이트 후 확인 ==
# 관리자 화면(<code>/admin</code>)에 접속하여 안내되는 모듈 업데이트·DB 변경 작업을 완료한다.
# 관리자 화면에서 캐시 재생성을 실행한다. PHP OPcache 등 별도 캐시가 남는 환경은 해당 서버의 운영 절차에 따라 갱신한다.
# 관리자 화면의 버전을 확인하고 메인 화면, 로그인, 글·댓글 작성, 파일 업로드, 짧은주소, 사용 중인 메일·알림 기능을 점검한다.
# PHP·웹서버 오류 로그와 서드파티 자료의 동작을 확인한 뒤 사이트를 다시 연다.
 
문제가 생겼다면 오류 메시지와 적용 버전을 기록하여 원인을 확인한다. 복원이 필요하면 같은 시점에 백업한 '''파일과 DB를 함께''' 복원한다. 업데이트 후 새로 작성된 데이터가 있다면 복원으로 사라질 수 있으므로 쓰기 제한을 유지한 상태에서 판단한다.
 
== 운영 보충 안내 ==
* [[라이믹스/매뉴얼/백업과 복원]] — 파일·DB 시점을 맞추고 복원을 연습하는 방법
* [[라이믹스/매뉴얼/캐시와 성능 점검]] — [[라이믹스]] 캐시 재생성과 PHP OPcache·CDN 캐시의 차이
* [[라이믹스/매뉴얼/업로드 오류와 서버 진단]] — 갱신 후 업로드·서버 오류의 진단
 
== 같이 보기 ==
* [[라이믹스/설치]]
* [[라이믹스/매뉴얼/설치 환경]]
* [[라이믹스/매뉴얼/서드파티 자료 호환성 체크리스트]]
* [[라이믹스/릴리즈 노트]]
 
== 출처 ==
이 문서는 [https://rhymix.org/manual/introduction/update 라이믹스 공식 매뉴얼]을 바탕으로 경로 확인, 백업 및 점검 절차를 보완하였다. 공식 매뉴얼은 CC BY-SA 4.0으로 배포된다.
 
== 각주 ==
<references />


== 관련 문서 ==
{{라이믹스 매뉴얼}}
* [[Git#stash]] – stash 사용법 
* [[Git#merge]] – merge 전략 
* [https://git-scm.com/docs Git 공식 문서 전체]


<!-- 분류 -->
[[분류:라이믹스/매뉴얼/설치와 이전|라이믹스 업데이트]]
[[분류:라이믹스]] [[분류:라이믹스/매뉴얼]]

2026년 10월 17일 (토) 09:19 기준 최신판

상위 문서: 라이믹스/매뉴얼

개요[편집 / 원본 편집]

라이믹스의 코어를 새 버전으로 갱신하는 방법이다. 공식 매뉴얼은 압축 파일을 기존 설치 경로에 덮어쓰는 방법과 Git으로 변경 사항을 받아오는 방법을 안내한다.[1] XE에서 처음 전환하는 경우에는 라이믹스/XE에서 넘어오기를 참고한다.

업데이트 전 준비[편집 / 원본 편집]

  1. 적용할 버전의 릴리즈 노트와 설치 환경을 확인한다. PHP·DB 요구사항과 사용 중인 서드파티 자료의 호환성을 함께 점검한다.
  2. 설치 폴더 전체와 DB를 각각 백업한다. 코어 수정분, 추가 자료, 설정 및 첨부파일도 포함하고 복원 방법을 확인한다. 파일만 되돌려서는 DB 변경을 취소할 수 없다.
  3. 가능하면 별도 테스트 환경에서 먼저 갱신한다. 운영 사이트에 적용할 때는 작업 중 글쓰기 등 데이터 변경을 제한한다.
  4. Git 설치라면 설치 폴더에서 git status, git branch --show-current, git remote -v로 변경분·브랜치·원격 저장소를 확인한다. 아래 예제는 origin이 공식 저장소인 경우이다.

압축 파일로 덮어쓰기[편집 / 원본 편집]

  1. 공식 릴리즈 공지에서 적용할 버전의 공지를 열고 전체 배포 파일을 내려받는다. 공지의 Download 링크와 Changed Files Only 링크를 구분한다. GitHub Releases에 배포 파일이 등록되어 있다고 가정하지 않는다.
  2. 기존 사이트 밖의 별도 작업 폴더에 압축을 푼다. 압축 파일에 따라 최상위 폴더 이름이 다를 수 있다.
  3. 압축을 푼 폴더 안의 index.php, common, modules 등이 기존 설치 폴더의 같은 위치에 덮어써지도록 업로드한다. .htaccess 등 숨김 파일도 포함한다.
  4. 아래 업데이트 후 확인 절차를 수행한다.

기존 설치 폴더에 unzip ... -d 설치경로만 실행하면 그 아래에 배포 폴더가 하나 더 생겨 실제 코어가 갱신되지 않을 수 있다. 업로드 후에는 새 파일이 기존 index.php와 같은 경로에 있는지 확인한다.

배포 파일에는 files 폴더가 포함되지 않으며, 사용자 설정·첨부파일은 files와 DB에 저장된다. 추가한 서드파티 자료도 보통 유지된다. 다만 배포 파일과 같은 경로를 직접 수정했다면 수정분이 덮어써질 수 있다. 백업 없이 안전하다는 의미는 아니다.[1]

Git으로 업데이트[편집 / 원본 편집]

Git으로 설치하여 .git 디렉터리가 남아 있는 사이트에서 사용한다. 압축 파일로 설치한 사이트에서는 이 절차를 그대로 실행할 수 없다.

코어 수정이 없는 경우[편집 / 원본 편집]

현재 브랜치와 추적 대상이 의도한 버전인지 확인한 뒤 실행한다.

git status
git pull --ff-only

--ff-only는 이력이 갈라진 경우 임의로 병합하지 않고 중단한다. 실패하면 현재 상태를 확인하고 아래의 수정분 관리 절차를 검토한다. 새 브랜치로 전환한 경우에도 그 브랜치의 추적 대상을 확인한다.[2]

추가한 모듈·스킨은 Untracked files로 표시될 수 있다. 이를 코어 변경으로 취급할 필요는 없지만, 새 코어 파일과 경로가 겹치면 업데이트가 중단될 수 있으므로 메시지를 확인한다. 강제 초기화나 일괄 삭제로 해결하지 않는다.

코어 수정이 적은 경우[편집 / 원본 편집]

수정분을 임시 보관한 뒤 업데이트하고 다시 적용한다.[1]

git stash push -m "라이믹스 업데이트 전 코어 수정분"
git stash list

방금 저장한 항목이 생겼는지 확인한다. 기본 stash는 미추적 파일과 무시된 파일을 포함하지 않으므로 추가 자료는 따로 백업한다. 저장된 항목을 확인한 뒤 다음을 실행한다.

git pull --ff-only
git stash apply 'stash@{0}'

위의 stash@{0}은 방금 만든 항목이 최신 항목인 경우의 예이다. 기존 stash를 잘못 적용하지 않도록 git stash list로 구분한다. 충돌이 발생하면 해당 파일을 열어 <<<<<<<, =======, >>>>>>> 표시를 해결하고 동작을 검증한다. apply는 보관본을 자동 삭제하지 않는다.

업데이트 후 점검까지 끝난 다음, 더 이상 필요 없는 해당 항목 하나만 삭제한다.

git stash drop 'stash@{0}'

git stash clear는 기존 보관본까지 모두 지우므로 이 절차의 정리 명령으로 사용하지 않는다.[3]

코어 수정이 많은 경우[편집 / 원본 편집]

별도 브랜치에서 수정분을 커밋하고 공식 브랜치의 변경을 병합한다. 다음은 master의 변경을 가져오는 예이다.[1]

git checkout -b mysite
git add -u .
git commit -m "사이트 코어 수정분 보관"
git fetch origin
git merge origin/master

git add -u는 이미 추적 중인 파일의 수정·삭제만 포함한다. 새로 만든 코어 파일이 있다면 필요한 파일을 개별적으로 추가하고, 설정 파일이나 첨부파일을 실수로 커밋하지 않도록 확인한다. 이미 수정분 관리 브랜치가 있으면 새로 만들지 않고 그 브랜치에서 진행한다.

충돌이 발생하면 수정 후 해결한 파일만 git add하고 병합 커밋을 완료한다. 개발 브랜치 이름은 시기마다 달라질 수 있으므로 과거 문서의 develop을 그대로 지정하지 말고 실제 공식 저장소와 적용 대상 릴리즈를 확인한다.

여러 버전을 건너뛸 때[편집 / 원본 편집]

현재 버전과 대상 버전 사이의 공지에서 PHP 요구 사항, 삭제·변경된 API와 권한 제한을 함께 확인한다. 변경 파일만 적용할 때는 해당 파일 묶음이 전제로 하는 이전 버전을 확인한다. 오래된 버전에서 바로 최신 변경 파일만 덮어쓰면 중간 변경이 누락될 수 있다.

예를 들어 2.1.37은 보안 수정과 array_escape()의 자료형 처리 변경을 포함하고, 2.1.38은 HTMLFilter 옵션 제거와 게시판 관리자의 스크립트 수정 권한 제한을 포함한다. 라이믹스/릴리즈 노트/2.1.37·라이믹스/릴리즈 노트/2.1.38과 라이믹스/매뉴얼/서드파티 자료 호환성 체크리스트를 함께 확인한다.

업데이트 후 확인[편집 / 원본 편집]

  1. 관리자 화면(/admin)에 접속하여 안내되는 모듈 업데이트·DB 변경 작업을 완료한다.
  2. 관리자 화면에서 캐시 재생성을 실행한다. PHP OPcache 등 별도 캐시가 남는 환경은 해당 서버의 운영 절차에 따라 갱신한다.
  3. 관리자 화면의 버전을 확인하고 메인 화면, 로그인, 글·댓글 작성, 파일 업로드, 짧은주소, 사용 중인 메일·알림 기능을 점검한다.
  4. PHP·웹서버 오류 로그와 서드파티 자료의 동작을 확인한 뒤 사이트를 다시 연다.

문제가 생겼다면 오류 메시지와 적용 버전을 기록하여 원인을 확인한다. 복원이 필요하면 같은 시점에 백업한 파일과 DB를 함께 복원한다. 업데이트 후 새로 작성된 데이터가 있다면 복원으로 사라질 수 있으므로 쓰기 제한을 유지한 상태에서 판단한다.

운영 보충 안내[편집 / 원본 편집]

같이 보기[편집 / 원본 편집]

출처[편집 / 원본 편집]

이 문서는 라이믹스 공식 매뉴얼을 바탕으로 경로 확인, 백업 및 점검 절차를 보완하였다. 공식 매뉴얼은 CC BY-SA 4.0으로 배포된다.

각주[편집 / 원본 편집]

최근 바뀜

더 보기