미디어위키-1.36 설치와 설정(모든 처음 사용자를 위해)
이 기사는 너무 많은 내용을 담고 있기 때문에, 최신 상태를 유지하기가 쉽지 않습니다. 반면에 이 기사에 필요한 각각의 프로그램 등은 해당 기사에서 가능한 최신 정보를 기록해 두려고 합니다. 따라서, 이 기사에서 동작하지 않는 부분은 해당 기사로 가셔서 확인하시기 바랍니다!!
새로운 버전의 출시와 함께, 처음 사용자들이 이 사이트의 정보에 따라 미디어위키를 설치하는 순서를 소개하고자 합니다. 이 기사에서 소개한 것 외에 개별 프로그램의 기사에서 구성과 최적화 과정은 별도로 진행하는 것이 좋습니다.
게다가, 가상 기계 아래에서 설정할 것이기 때문에, http://localhost를 대상으로 진행합니다. 추후에 추가적인 여러 설정에서 이 부분을 수정해야 합니다.
여기서 소개된 설정은 대체로 몇 년에 걸쳐 조금씩 추가된 것들로써, 대체로 영문 위키피디아의 설정을 많이 참고했습니다. 각 설정의 의미는 이 위키의 Category:Manual에서 찾아볼 수 있고, 번역되지 않은 것들은 mw:Category:Manual에서 찾아보시기 바랍니다.
Prerequisites
PHP
PHP는 ondrej 저장소의 것을 사용합니다:
- sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2
- echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
- wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
- sudo apt update
- sudo apt install php8.1-fpm
- sudo apt install php8.1-curl php8.1-gd php8.1-intl php8.1-mbstring php8.1-mysql php8.1-xml
다음 패키지가 추가적으로 필요할 수 있습니다:
MariaDB
개발자의 저장소를 이용합니다:
- sudo apt-get install software-properties-common dirmngr
- sudo curl -LsSO https://mariadb.org/mariadb_release_signing_key.asc
- sudo chmod -c 644 mariadb_release_signing_key.asc
- sudo mv -vi mariadb_release_signing_key.asc /etc/apt/trusted.gpg.d/
- sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://sfo1.mirrors.digitalocean.com/mariadb/repo/10.7/debian bullseye main'
- sudo apt update
- sudo apt install mariadb-server
처음 설치후 작업.
- sudo mysql_secure_installation
데이터베이스 만들기.
- sudo mysql -u root -p
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS `wikidb` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
MariaDB [(none)]> use mysql;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wikidb.* TO wikiuser@localhost IDENTIFIED BY 'password';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;
여기서 'wikidb', 'wikiuser'의 이름과 'password'를 적절히 바꾸십시오.
Redis
메인 캐시 서버는 Redis를 이용하는데, 데비안 저장소에서 설치합니다:
- sudo apt update
- sudo apt install redis-server php-redis
또는 최신의 패키지를 사용할 수 있습니다:
Nginx
데비안 저장소의 패키지를 이용하지 않고, 직접 빌드한 패키지를 이용합니다. 물론 이 패키지는 데비안에서 제공하는 패키지에 ngx_speed, ngx_brotli 모듈만 추가한 것입니다:
다음 패키지를 설치하십시오.
- libnginx-mod-http-geoip
- libnginx-mod-http-image-filter
- libnginx-mod-http-lua
- libnginx-mod-http-ndk
- libnginx-mod-http-xslt-filter
- libnginx-mod-mail
- libnginx-mod-stream
- libnginx-mod-stream-geoip
- nginx
- nginx-common
- nginx-core
- sudo apt install -f
Nginx_configurations
기본적인 설정 파일을 받아서 사용하십시오.
Installations
웹에서 설치하는 과정은 MediaWiki#Setup의 과정을 따라 하시면 됩니다. 그리고, Nginx 설정 파일은 이 파일을 받으셔서 사용하시고, 일부 나중에 필요한 부분을 수정하셔야 합니다.
설치를 진행하기 전에 위에서 받은 nginx 설정 파일을 일부 수정해야 합니다. 먼저, nginx 설정 파일을 /etc/nginx/sites-available/로 옮기고, 다음 줄을 찾아서 아래와 같이 주석처리합니다:
#location /w/mw-config { deny all; } 설치가 완료되면, 주석 해제하고 서비스를 다시 시작해야 합니다.
다음으로, pagespeed를 설정하시기 귀찮으시면, 맨 아래에 있는 다음 줄을 아래와 같이 주석처리합니다.
#include pagespeed/optimize.conf;
다음으로, /etc/nginx/snippets/fastcgi-php.conf 파일에서 다음 줄을 주석처리합니다.
#try_files $fastcgi_script_name =404;
이제 서비스를 재시작합니다:
- sudo systemctl restart nginx
이때, 서비스에서 문제가 발생할 수 있습니다. 그럴 때에는 status를 확인해서, 필요한 사항을 바로잡고 서비스를 시작해야 합니다.
그런-다음 미디어위키 다운로드 지면에서 최신 안정 버전을 받으십시오.
- /var/www/html/w 아래에 소스를 풉니다.
- sudo chown -R root:root /var/www/html/w
- 웹브라우저로 http://localhost/w/mw-config/로 접근해서 설치를 진행하십시오.
다음으로 업로드 디렉토리 사용자와 허가권을 변경해야 합니다.
- cd /var/www/html/w
- sudo chmod 775 images cache
- sudo chown root:www-data images cache
- sudo cp /home/user/Downloads/LocalSettings.php .
웹에서 localhost로 접근합니다.
시각 편집기가 동작하기 위해서 nginx 설정을 추가해야 합니다: 이 부분은 설정 파일에 반영되어 있습니다!
location /w/rest.php/ {
try_files $uri $uri/ /w/rest.php?$query_string;
}
Configurations
미디어위키 디버깅
미디어위키에서 문제가 생겨 흰 화면만 출력될 때, 오류 메시지를 확인하고 디버깅을 하기 위해 출력 메시지 저장해야 합니다. 평소에는 아래와 같이 주석처리해 두었다가 문제 생겼을 때, 주석을 해제하고 사용하시기 바랍니다.
#error_reporting( E_ALL );
#ini_set( 'display_errors', 1 );
#$wgResourceLoaderDebug = true;
#$wgShowDBErrorBacktrace = true;
#$wgDebugLogFile= "/tmp/MediaWikiDebug.log";
#$wgShowExceptionDetails = true;
Pretty URI
다음 내용을 LocalSettings.php에 추가하십시오.
$wgScriptPath = "/w"; # 원래 있던 줄.
$wgScriptExtension = ".php";
// Pretty URIs MW
$wgArticlePath = "/wiki/$1";
$wgUsePathInfo = true;
Redis
다음 내용을 LocalSettings.php에 추가하십시오.
$wgObjectCaches['redis'] = array(
'class' => 'RedisBagOStuff',
'servers' => array( '127.0.0.1:6379' ),
'persistent' => true,
);
$wgMainCacheType = 'redis';
$wgSessionCacheType = 'redis';
$wgSessionsInObjectCache = true;
$wgMessageCacheType = 'redis';
$wgParserCacheType = 'redis';
$wgLanguageConverterCacheType = 'redis';
$wgJobTypeConf['default'] = [
'class' => 'JobQueueRedis',
'redisServer' => '127.0.0.1:6379',
'redisConfig' => [],
'claimTTL' => 3600,
'daemonized' => true
];
# Job queue
$wgJobRunRate = 0;
Job queue
미디어 위키 설정은 위의 파일에 넣었습니다.
Manual:Job queue#Simple service to run jobs의 순서에 따라 진행하시고, 파일의 내용은 그대로 사용하셔도 됩니다:
- sudo nano /usr/local/bin/mwjobrunner
- sudo chmod 755 /usr/local/bin/mwjobrunner
- sudo nano /etc/systemd/system/mw-jobqueue.service
- sudo systemctl daemon-reload
- sudo systemctl enable mw-jobqueue
- sudo systemctl start mw-jobqueue
- sudo systemctl status mw-jobqueue
- sudo systemctl restart nginx
Email enable
사용자 사이의 전자우편을 활성화합니다.
$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO
$wgEmergencyContact = "관리자_email";
$wgPasswordSender = "관리자_email";
$wgEnotifUserTalk = true; # UPO
$wgEnotifWatchlist = true; # UPO
$wgEmailAuthentication = true;
Timezone & ExteranlLink
$wgLocaltimezone = "Asia/Seoul";
date_default_timezone_set( $wgLocaltimezone );
#외부링크 새 탭에서 열기
$wgExternalLinkTarget = '_blank';
File upload & related
$wgEnableUploads = true;
$wgUploadPath = "{$wgScriptPath}/images";
$wgGenerateThumbnailOnParse = false;
$wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php";
$wgFileExtensions = array('png','gif','jpg','jpeg','doc','ogg','xls','ppt','tiff','tif','bmp','docx','xlsx','pptx','mp3','sxc','pdf','ebuild','gz','bz2','xz','tar','patch','svg','zip','ogv');
# Files with these extensions will never be allowed as uploads.
$wgFileBlacklist = array(
# HTML may contain cookie-stealing JavaScript and web bugs
'html', 'htm',
# PHP scripts may execute arbitrary code on the server
'php', 'phtml', 'php3', 'php4', 'php5', 'phps',
# Other types that may be interpreted by some servers
'shtml', 'jhtml', 'pl', 'py',
# May contain harmful executables for Windows victims
'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl' );
$wgAllowTitlesInSVG = true;
$wgSVGConverter = 'rsvg-secure';
$wgSVGConverterPath = '/usr/bin';
$wgSVGMaxSize = 4096;
$wgSVGConverters['rsvg-secure'] = '$path/rsvg-convert -w $width -h $height -o $output < $input';
$wgCheckFileExtensions = true;
$wgStrictFileExtensions = true;
$wgUploadSizeWarning = 30000000;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = "/usr/bin/convert";
$wgMaxShellFileSize = 512 * 1024; // Kilobytes
$wgMaxShellMemory = 1024 * 1024; // Kilobytes
$wgMaxShellTime = 50; // seconds
$wgUseInstantCommons = true;
$wgShellLocale = "C.UTF-8";
$wgHashedUploadDirectory = true;
Recent changes
새로운 인터페이스가 약간은 늦은 응답을 보여주기도 합니다. 이전 형식으로 바꿀 수 있습니다.
$wgDefaultUserOptions['rcenhancedfilters-disable'] = true;
$wgDefaultUserOptions['wlenhancedfilters-disable'] = true;
$wgHiddenPrefs = ['rcenhancedfilters-disable', 'wlenhancedfilters-disable'];
소스 가져오기
간혹 다른 곳의 템플릿(Template), 모듈(Module), 또는 기사를 가져올 필요가 있습니다.
$wgImportSources = array(
'wikipedia' => array( 'en' )
);
Vector skin
$wgDefaultSkin = "Vector";
$wgVectorResponsive = false;
$wgVectorShowSkinPreferences = true;
$wgVectorDefaultSkinVersion = 2;
$wgVectorDefaultSkinVersionForExistingAccounts = 2;
$wgVectorDefaultSkinVersionForNewAccounts = 2;
$wgVectorLayoutMaxWidth = true;
$wgVectorDefaultSidebarVisibleForAnonymousUser = true;
$wgVectorUseWvuiSearch = true;
$wgVectorWvuiSearchOptions['showThumbnail'] = true;
$wgVectorWvuiSearchOptions['showDescription'] = true;
Extensions
아래의 것이 미디어위키 1.36과 함께 번들로 제공되는 확장입니다.
wfLoadExtension( 'CategoryTree' );
wfLoadExtension( 'Cite' );
wfLoadExtension( 'CiteThisPage' );
wfLoadExtension( 'CodeEditor' );
wfLoadExtension( 'ConfirmEdit' );
wfLoadExtension( 'Gadgets' );
wfLoadExtension( 'ImageMap' );
wfLoadExtension( 'InputBox' );
wfLoadExtension( 'Interwiki' );
#wfLoadExtension( 'LocalisationUpdate' );
wfLoadExtension( 'MultimediaViewer' );
wfLoadExtension( 'Nuke' );
#wfLoadExtension( 'OATHAuth' );
wfLoadExtension( 'PageImages' );
wfLoadExtension( 'ParserFunctions' );
wfLoadExtension( 'PdfHandler' );
wfLoadExtension( 'Poem' );
wfLoadExtension( 'Renameuser' );
wfLoadExtension( 'ReplaceText' );
wfLoadExtension( 'Scribunto' );
wfLoadExtension( 'SecureLinkFixer' );
wfLoadExtension( 'SpamBlacklist' );
wfLoadExtension( 'SyntaxHighlight_GeSHi' );
wfLoadExtension( 'TemplateData' );
wfLoadExtension( 'TextExtracts' );
wfLoadExtension( 'TitleBlacklist' );
wfLoadExtension( 'VisualEditor' );
wfLoadExtension( 'WikiEditor' );
추가적인 확장은 미디어위키 확장 배포 지면에서 검색을 통해 받으실 수 있습니다.
그런 다음, 예를 들어, Extension:Math 확장을 아래와 같이 풀어줍니다.
- sudo tar xvf Math-REL1_36-8c7c35b.tar.gz -C /var/www/html/w/extensions
수식 입력
설정 파일 LocalSettings.php에 다음을 추가하십시오.
wfLoadExtension( 'Math' );
물론 네트워크 속도 품질을 일정하게 개선하기 위해, 로컬에 RESTBase와 Mathoid를 설치할 필요가 있지만, 크게 속도에 영향을 받지 않을 때에는 그냥 사용하셔도 무방합니다.
검색 개선
먼저, Elasticsearch를 설치하십시오.
- wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
- sudo apt install apt-transport-https uuid-runtime pwgen
jre 다운로드 페이지에서 최근 버전을 받습니다:
- sudo mkdir -p /usr/lib/jvm/
- sudo tar -zxvf jre-8u333-linux-x64.tar.gz -C /usr/lib/jvm/
- sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jre1.8.*/bin/java 1
- sudo update-alternatives --config java
1번을 선택하십시오.
- echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
- sudo apt update
- sudo apt install elasticsearch
- sudo systemctl start elasticsearch
- sudo systemctl enable elasticsearch
제대로 동작하지 않을 경우 해당 지면의 설정을 확인하십시오.
AdvancedSearch, Elastica, CirrusSearch를 설치하십시오.
wfLoadExtension( 'AdvancedSearch' );
wfLoadExtension( 'Elastica' );
wfLoadExtension( 'CirrusSearch' );
$wgDisableSearchUpdate = true;
인덱스 생성.
- cd /var/www/html/w
- php extensions/CirrusSearch/maintenance/UpdateSearchIndexConfig.php
위의 설정에서 $wgDisableSearchUpdate = true; 주석처리하십시오.
다음으로 다음을 실행하여 검색 인덱스를 부트스트랩합니다:
- php extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipLinks --indexOnSkip
- php extensions/CirrusSearch/maintenance/ForceSearchIndex.php --skipParse
설정 파일에 $wgSearchType = 'CirrusSearch';를 추가하십시오.
필요하다면, Extension:CirrusSearch#Completion_Suggester를 설정하십시오. 어렵지 않으니, 가능한 설정하십시오.
에디터 개선
CodeMirror, CharInsert를 설치하고, 설정 파일에 추가하십시오.
wfLoadExtension( 'CodeMirror' );
$wgDefaultUserOptions['usecodemirror'] = 1;
wfLoadExtension( 'CharInsert' );
다음 파일을 만드십시오. 영문 위키피디아의 것을 그대로 이용하셔도 좋겠습니다.
- MediaWiki:Common.css
- MediaWiki:Edittools
- Mediawiki:Gadgets-definition
- MediaWiki:Gadget-charinsert-core.js
- MediaWiki:Gadget-charinsert-styles.css
- MediaWiki:Gadget-charinsert.js
- MediaWiki:Gadget-charinsert
토론 개선
Extension:Echo, Extension:Flow, Extension:CheckUser, Extension:CLDR, 및 Extension:Thanks를 설치하십시오.
wfLoadExtension( 'Echo' );
wfLoadExtension( 'Flow' );
$wgNamespaceContentModels[NS_TALK] = 'flow-board';
$wgNamespaceContentModels[NS_USER_TALK] = 'flow-board';
$wgGroupPermissions['sysop']['flow-create-board'] = true;
$wgContentHandlerUseDB = true;
$wgFlowContentFormat = 'html';
wfLoadExtension( 'CheckUser' );
$wgGroupPermissions['sysop']['checkuser'] = true;
$wgGroupPermissions['sysop']['checkuser-log'] = true;
$wgGrantPermissionGroups['checkuser'] = 'administration';
wfLoadExtension( 'cldr' );
wfLoadExtension( 'Thanks' );
$wgThanksSendToBots = false;
$wgThanksLogging = true;
$wgThanksConfirmationRequired = true;
$wgThanksLogTypeWhitelist = [
"contentmodel",
"delete",
"import",
"merge",
"move",
"patrol",
"protect",
"tag",
"managetags",
"rights"
];
- cd /var/www/html/w
- php maintenance/update.php
- cd extensions/cldr
- sudo wget http://www.unicode.org/Public/cldr/latest/core.zip
- sudo unzip core.zip -d core
- sudo php rebuild.php
RESTBase & Mathoid
BESTBase master 버전을 사용하면, 일부 수식 표현에서 오류가 발생할 수 있으므로, 최근 안정 버전 1.1.4를 설치하는 것을 고려해 볼 수 있습니다.
- sudo apt install git npm libsqlite3-dev
- git clone https://github.com/wikimedia/restbase.git
- git clone https://github.com/wikimedia/mathoid.git
- cd restbase
- npm install
- cd ../mathoid
- rm package-lock.json
- npm install
- cd ..
- sudo chown -R root:root restbase mathoid
- sudo mv restbase mathoid /usr/local/lib
이전 수식 확장 아래에 다음 내용을 추가하십시오.
wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';
새로운 Nginx 설정 파일과 RESTBase 설정 파일을 받고, 풀어서 정해진 위치에 옮겨야 합니다. 타르 파일을 풀어서 나오는 파일을 아래의 디렉토리로 옮기십시오:
- File:Nginx restbase.tar : /etc/nginx/site-available/
- File:Restbase config.yaml.tar : /usr/local/lib/restbase/
- File:Restbase sys localhost.yaml.tar : /usr/local/lib/restbase/projects/sys/
- File:Restbase v1 localhost.yaml.tar : /usr/local/lib/restbase/projects/v1/
게다가 2개의 파일을 수정해야 합니다. 아래 파일을 열어서 wikimedia.org를 localhost로 바꿉니다:
- /usr/local/lib/restbase/sys/mathoid.js
- /usr/local/lib/restbase/v1/mathoid.yaml
시작 스크립트 파일 만들기
RESTBase 서비스에 대한 새 사용자를 만들고 해당 사용자의 홈 폴더를 만듭니다.
- sudo useradd --home=/var/lib/restbase -M --user-group --system --shell=/usr/sbin/nologin -c "RESTBase for MediaWiki" restbase
- sudo mkdir -p /var/lib/restbase
- sudo chown restbase:restbase /var/lib/restbase
Systemd 서비스 스크립트 /etc/systemd/system/restbase.service를 다음과 같이 만듭니다:
[Unit]
Description=Mediawiki RESTBase Service
Documentation=https://www.mediawiki.org/wiki/RESTBase
Wants=local-fs.target network.target
After=local-fs.target network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=restbase
Group=restbase
WorkingDirectory=/usr/local/lib/restbase
ExecStart=/usr/bin/node /usr/local/lib/restbase/server.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog
서비스를 다시 가져와서 서비스를 시작합니다.
- sudo systemctl daemon-reload
- sudo systemctl enable restbase
- sudo systemctl start restbase
- sudo systemctl status restbase
Mathoid를 독립형 데몬으로 실행하고 시작 스크립트를 만들기 위해서, 폴더를 시스템 폴더로 이동하고 다음과 같이 데몬을 실행하는 "mathoid" 사용자를 만듭니다:
- sudo useradd --home=/var/lib/mathoid -M --user-group --system --shell=/usr/sbin/nologin -c "Mathoid for MediaWiki" mathoid
- sudo mkdir -p /var/lib/mathoid
- sudo chown mathoid:mathoid /var/lib/mathoid
Systemd 시작 스크립트 /etc/systemd/system/mathoid.service로 다음과 같이 만듭니다.
[Unit]
Description=Mediawiki Mathoid Service
Documentation=https://www.mediawiki.org/wiki/Mathoid
Wants=local-fs.target network.target
After=local-fs.target network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=mathoid
Group=mathoid
WorkingDirectory=/usr/local/lib/mathoid
ExecStart=/usr/bin/node /usr/local/lib/mathoid/server.js
KillMode=process
Restart=on-success
Nice=10
OOMScoreAdjust=900
PrivateTmp=true
StandardOutput=syslog
그런 다음 서비스를 활성화하고, 시스템 시작시 자동으로 시작하도록 등록해 줍니다.
- sudo systemctl daemon-reload
- sudo systemctl enable mathoid
- sudo systemctl start mathoid
- sudo systemctl status mathoid
문제점 및 활용
만약 이 설정을 참조하고 외부에서 수식을 랜더링하기 위해서는 다른 부분은 수정할 필요가 없고, 아래의 내용에서 localhost를 FQDN으로 바꾸시면 됩니다:
wfLoadExtension( 'Math' );
$wgMathValidModes[] = 'mathml';
$wgDefaultUserOptions['math'] = 'mathml';
$wgVisualEditorFullRestbaseURL = "http://localhost/api/rest_";
$wgMathFullRestbaseURL= 'http://localhost/api/rest_';
Math 확장 vs. SimpleMathJax 확장
과거에 테스트를 했을 때, 로컬에서 SimpleMathJax 확장을 이용하는 것이 월등히 속도가 좋았습니다. 현 싯점에서, 로컬에서 Mathoid를 통한 것과 SimpleMathJax 확장을 사용했을 때, 속도 차이를 거의 느낄 수 없습니다.
한편, SimpleMathJax 확장은 여전히 허용되지 않는 키워도가 있고, 어떤 경우에는 어떤 식으로 해도 레이텍 코드를 출력하고 랜더링된 결과를 출력하지 못합니다 (가상 기계에서 테스트했을 때, 단 한번도 제대로된 출력을 하지 못했습니다).
이런 상황 아래에서, 먼저, 수식을 많이 사용하지 않은 사이트는 RESTBase, Mathoid없이 Math 확장을 고려해 볼 수 있습니다.
다음으로, 수식을 많이 사용하는 사이트는, 설정이 동작하면, 로컬에서 RESTBase, Mathoid를 운영하는 것이 바람직합니다.
그렇지 않으면, 예를 들어, 수식을 많이 사용하는데 로컬에서 RESTBase, Mathoid를 운영하는 것이 불가능한 환경에서, 대안적으로 SimpleMathJax 확장을 고려해 볼 수 있습니다.
SimpleMathJax 확장의 가장 큰 문제점은 보통의 레이텍에서 사용하던 키워드를 지원하지 않는 것에 있는데, 그런 경우가 발생하면 대안을 찾는 것이 매우 귀찮습니다.