launchd macOS 백그라운드 작업 실행 기본 사용법

launchd macOS는 시스템 시작, 사용자 로그인, 일정 시간, 특정 조건에 따라 백그라운드 작업을 실행하도록 관리하는 macOS의 기본 서비스 관리 구조입니다. 사용자는 launchd를 직접 조작하기보다 launchctl 명령어와 plist 설정 파일을 통해 데몬과 에이전트를 등록하고 관리합니다.

macOS에서 특정 스크립트를 매일 실행하거나 로그인할 때 자동으로 실행되도록 만들고 싶을 때가 있습니다. 단순히 터미널에서 직접 실행하는 방식은 컴퓨터를 재시동하거나 로그아웃하면 다시 설정해야 하므로 반복 작업에는 적합하지 않을 수 있습니다.

이런 상황에서 launchd를 사용하면 macOS가 작업을 대신 관리하도록 설정할 수 있습니다. 예를 들어 백업 스크립트, 로그 정리, 개발 서버 보조 작업, 개인 자동화 스크립트 등을 정해진 조건에 맞춰 실행할 수 있습니다.

필자의 경우 macOS에서 반복 실행이 필요한 스크립트를 처음에는 cron으로 처리하려 했지만, macOS에서는 launchd 방식이 더 자연스럽게 연결되는 경우가 많았습니다. 처음에는 plist 파일 구조가 낯설 수 있지만, LaunchAgent와 LaunchDaemon의 차이만 이해하면 기본적인 자동화 작업은 충분히 구성할 수 있습니다.

launchd

launchd는 macOS에서 데몬과 에이전트를 관리하는 시스템 프로세스입니다. Apple의 터미널 사용자 가이드에서는 launchd가 macOS에서 데몬과 에이전트를 관리하며, 사용자는 launchd와 직접 상호작용하지 않고 launchctl 명령어로 로드와 언로드를 수행한다고 설명합니다.

macOS 부팅 과정에서도 launchd는 중요한 역할을 합니다. Apple 문서에 따르면 시스템 시작 시 커널이 컴퓨터를 설정하기 위해 처음 실행하는 프로세스가 launchd이며, 셸 스크립트를 데몬처럼 실행하려면 launchd로 시작해야 합니다.

launchd에서 관리하는 작업은 보통 plist 형식의 설정 파일로 정의됩니다. launchd.plist 매뉴얼에서는 launchd.plist가 시스템 전체 또는 사용자별 데몬과 에이전트 설정 파일이며, launchctl을 통해 launchd에 로드할 수 있는 XML property list 매개변수를 설명한다고 정리하고 있습니다. XML 더 알아보기

launchd를 이해할 때 가장 먼저 구분해야 하는 개념은 LaunchDaemon과 LaunchAgent입니다. Apple 개발자 문서에서는 사용자별 백그라운드 프로세스를 user agent라고 설명하며, 이는 데몬과 유사하지만 특정 로그인 사용자에게 속하고 해당 사용자가 로그인한 동안 실행된다고 설명합니다.

macOS에서 DNS 서버 변경하기

launchd 특징

launchd macOS 구조의 핵심은 작업을 직접 실행하는 것이 아니라, 실행 조건을 plist 파일에 작성해 macOS가 관리하도록 맡기는 방식입니다. 그래서 단순 명령 실행 도구라기보다 macOS의 백그라운드 작업 관리 체계로 이해하는 것이 좋습니다.

Apple 문서 기준으로 launchd를 직접 다루는 것이 아니라 launchctl 명령어를 사용해 데몬과 에이전트를 로드하거나 언로드합니다. 또한 설정 파일은 목적에 따라 System, Library, 사용자 홈 Library 아래의 LaunchDaemons 또는 LaunchAgents 폴더에 배치됩니다.

장점

launchd는 macOS에 기본 포함되어 있으며, 시스템 구조와 자연스럽게 연결됩니다. 별도 앱을 설치하지 않아도 백그라운드 작업을 등록하고 관리할 수 있다는 점이 큰 장점입니다.

  • macOS 기본 기능입니다. 별도의 설치 없이 사용할 수 있으며, 시스템 시작과 사용자 로그인 흐름에 맞춰 작업을 관리할 수 있습니다.
  • 실행 조건을 세밀하게 지정할 수 있습니다. 로그인 시 실행, 일정 주기 실행, 특정 시간 실행, 계속 실행 유지 같은 조건을 plist 키로 구성할 수 있습니다.
  • 사용자 작업과 시스템 작업을 구분할 수 있습니다. LaunchAgent는 로그인 사용자 기준 작업에 적합하고, LaunchDaemon은 시스템 전체 백그라운드 서비스에 적합합니다.
  • 터미널과 스크립트 자동화에 잘 맞습니다. shell script, Python, Node.js, rsync 같은 명령줄 도구를 macOS 방식으로 등록해 반복 실행할 수 있습니다.
  • 로그 경로를 지정할 수 있습니다. StandardOutPathStandardErrorPath를 설정하면 실행 결과와 오류를 파일로 남길 수 있어 문제를 확인하기 쉽습니다.
macOS 맥북 Gatekeeper 특정 앱 우회 또는 비활성화하기

단점

launchd는 익숙해지면 안정적으로 사용할 수 있지만, 처음에는 plist 구조와 launchctl 명령어가 다소 어렵게 느껴질 수 있습니다. 특히 권한, 파일 위치, 소유자 설정이 맞지 않으면 작업이 로드되지 않거나 실행되지 않을 수 있습니다.

  • plist 문법이 익숙하지 않을 수 있습니다. XML 기반 property list 형식이므로 단순한 명령어보다 작성해야 할 내용이 많습니다.
  • 파일 위치에 따라 동작 범위가 달라집니다. 사용자 LaunchAgent인지 시스템 LaunchDaemon인지에 따라 실행 권한과 실행 시점이 달라지므로 처음 설정할 때 구분이 필요합니다.
  • 권한 설정이 중요합니다. launchctl 매뉴얼에서는 LaunchDaemon은 root 소유여야 하며 설정 파일은 그룹과 다른 사용자에게 쓰기 권한을 허용하지 않아야 한다고 설명합니다.
  • GUI 환경이 필요한 작업은 LaunchDaemon에 맞지 않을 수 있습니다. 사용자 화면, Finder, 알림, 앱 조작처럼 로그인 세션이 필요한 작업은 보통 LaunchAgent로 구성하는 것이 자연스럽습니다.
  • 오류 메시지가 직관적이지 않을 수 있습니다. plist 문법, 파일 권한, 실행 파일 경로, 환경 변수 문제가 섞이면 원인을 찾는 데 시간이 걸릴 수 있습니다.

launchd 시작

launchd는 macOS에 기본 포함된 시스템 구성 요소이므로 별도 설치가 필요하지 않습니다. 일반 사용자는 launchd 자체를 실행하거나 설치하는 것이 아니라 launchctl 명령어와 plist 파일을 사용해 작업을 등록합니다.

참고: Apple 공식 문서에서도 사용자가 launchd와 직접 상호작용하지 않고 launchctl 명령어를 사용한다고 설명합니다. 따라서 설치보다는 launchctl 명령어 확인과 plist 저장 위치를 이해하는 것이 먼저입니다
which launchctl

이렇게 코드를 사용하면 launchctl 명령어가 macOS에서 인식되는지 확인할 수 있습니다. 정상적인 macOS 환경이라면 보통 /bin/launchctl 경로가 표시됩니다. 경로가 표시되면 launchd 작업을 관리할 수 있는 기본 명령어가 준비되어 있는 상태입니다.

man launchctl

이 코드를 사용하면 launchctl 매뉴얼을 확인할 수 있습니다. launchctllaunchd 작업을 로드, 언로드, 시작, 중지, 상태 확인하는 데 사용하는 명령어입니다. 최신 macOS에서는 기존 load, unload 방식보다 bootstrap, bootout, enable, disable 같은 하위 명령어 사용이 권장되는 흐름입니다.

man launchd.plist

해당 코드를 사용하면 launchd.plist 설정 파일 매뉴얼을 확인할 수 있습니다. launchd.plist 매뉴얼에서는 Label, ProgramArguments, RunAtLoad, StartInterval, StartCalendarInterval 같은 주요 키를 확인할 수 있습니다. plist 파일명은 일반적으로 Label 값과 맞추어 com.example.job.plist 형태로 작성하는 것이 관례입니다.

Scoop 사용법 Windows 환경 최적화를 위한 패키지 관리자

launchd 사용법

launchd 사용법은 실행할 스크립트를 준비하고, 해당 스크립트를 설명하는 plist 파일을 작성한 뒤, launchctl로 등록하는 흐름으로 이해하면 됩니다. 처음에는 로그인한 사용자 기준으로 동작하는 LaunchAgent부터 테스트하는 것이 안전합니다.

참고: LaunchAgent와 LaunchDaemon은 비슷해 보이지만 실행 범위가 다릅니다. Apple 문서에서는 사용자 에이전트가 특정 로그인 사용자에게 속하며 해당 사용자가 로그인한 동안 실행된다고 설명하므로, 개인 자동화 작업은 LaunchAgent로 시작하는 것이 좋습니다.

LaunchAgentLaunchDaemon 구분

LaunchAgent는 로그인한 사용자 환경에서 실행되는 작업입니다. 사용자 홈 폴더 접근, 알림 표시, 사용자 앱과 연결되는 작업처럼 로그인 세션이 필요한 경우에 적합합니다. LaunchDaemon은 사용자 로그인 여부와 관계없이 시스템 전체에서 실행되는 백그라운드 작업입니다. 루트 권한이나 시스템 수준 서비스가 필요한 경우 사용하지만, 일반적인 개인 자동화 작업에는 과할 수 있습니다.

구분LaunchAgentLaunchDaemon
실행 기준사용자 로그인 세션시스템 전체
대표 위치~/Library/LaunchAgents/Library/LaunchDaemons
실행 사용자로그인 사용자주로 root 또는 지정 사용자
GUI 앱 접근상대적으로 적합일반적으로 부적합
사용 예로그인 시 스크립트 실행, 알림, 사용자 자동화서버 프로세스, 시스템 서비스, 백그라운드 데몬

Apple 터미널 가이드에서는 /System/Library/LaunchDaemons는 Apple 제공 시스템 데몬, /Library/LaunchDaemons는 타사 시스템 데몬,/Library/LaunchAgents는 모든 사용자에게 적용되는 타사 에이전트, ~/Library/LaunchAgents는 로그인 사용자에게만 적용되는 타사 에이전트로 설명합니다.

빠른 파일 전송 방법 모든 운영체제에서 가능한 Blip 사용법

실행할 스크립트 준비

launchd에 등록할 작업은 먼저 터미널에서 직접 실행해 정상 동작을 확인하는 것이 좋습니다. launchd 환경에서는 터미널에서 쓰던 PATH나 환경 변수가 그대로 적용되지 않을 수 있으므로 실행 파일 경로를 가능한 한 절대 경로로 작성하는 편이 안전합니다.

mkdir -p ~/Scripts

이 명령은 사용자 홈 폴더 아래에 Scripts 폴더를 만듭니다. 이미 폴더가 있어도 오류 없이 넘어가므로 테스트용 스크립트 저장 위치로 사용할 수 있습니다.

echo 'date >> /tmp/launchd-test.log' > ~/Scripts/launchd-test.sh

위 코드를 사용하면 테스트용 셸 스크립트 파일을 생성할 수 있습니다. 이 스크립트는 실행될 때마다 현재 시간을 /tmp/launchd-test.log 파일에 기록합니다. launchd가 정상적으로 실행되는지 확인하기 위한 간단한 테스트 용도로 적합합니다.

chmod +x ~/Scripts/launchd-test.sh

위 코드를 사용하면 스크립트에 실행 권한을 부여할 수 있습니다. launchd가 스크립트를 실행하려면 해당 파일을 실행할 수 있어야 합니다. 실행 권한을 부여한 뒤에는 터미널에서 직접 실행해 로그가 기록되는지 먼저 확인하는 것이 좋습니다.

~/Scripts/launchd-test.sh

위 코드를 사용하면 스크립트를 직접 실행해 동작을 확인할 수 있습니다.명령 실행 후 /tmp/launchd-test.log 파일에 시간이 기록되면 스크립트 자체는 정상적으로 동작하는 것입니다. 이후 plist 파일을 작성해 launchd에 등록하면 됩니다.

plist 파일 작성

plist 파일은 launchd에게 어떤 작업을 언제, 어떤 방식으로 실행할지 알려주는 설정 파일입니다. launchd.plist 매뉴얼에서는 launchctllaunchd에 로드할 수 있는 XML property list매개변수를 이 파일에 작성한다고 설명합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.example.launchd-test</string>

    <key>ProgramArguments</key>
    <array>
        <string>/Users/사용자이름/Scripts/launchd-test.sh</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>StandardOutPath</key>
    <string>/tmp/launchd-test.out.log</string>

    <key>StandardErrorPath</key>
    <string>/tmp/launchd-test.err.log</string>
</dict>
</plist>

위 예시는 로그인 시 한 번 실행되는 LaunchAgent 설정입니다. 멀티라인 설정이 필요한 부분이므로 하나의 코드블록에 전체 plist 구조를 함께 작성합니다. 사용자이름 부분은 실제 macOS 사용자 이름으로 바꾸어야 합니다. Label은 작업을 식별하는 고유 이름이며, ProgramArguments는 실행할 명령과 인수를 배열 형태로 작성하는 영역입니다.

Espanso 설치 및 사용법 크로스 플랫폼 무료 텍스트 확장 프로그램

plist 파일 저장 위치

사용자 로그인 기준으로 실행할 작업은 보통 ~/Library/LaunchAgents 폴더에 저장합니다. 이 위치는 현재 사용자에게만 적용되는 LaunchAgent 위치로, 개인 자동화 작업을 테스트하기에 적합합니다.

mkdir -p ~/Library/LaunchAgents

위 코드를 사용하면 LaunchAgents 폴더를 만들 수 있습니다. 이 폴더 안에 com.example.launchd-test.plist 같은 이름으로 plist 파일을 저장합니다. launchd.plist 매뉴얼에서도 plist 파일명은 .plist로 끝나야 하며, 일반적으로 Label 값과 같은 이름을 사용하는 것이 관례라고 설명합니다.

launchctl로 등록하기

plist 파일을 저장한 뒤에는 launchctl로 현재 사용자 세션에 등록합니다. 최신 macOS에서는 사용자 LaunchAgent를 등록할 때 gui/사용자ID 도메인을 지정하는 bootstrap 방식을 사용할 수 있습니다.

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.launchd-test.plist

위 코드를 사용하면 현재 사용자 GUI 세션에 LaunchAgent를 등록할 수 있습니다. 이 명령은 지정한 plist 파일을 현재 로그인 사용자 GUI 도메인에 등록합니다. 등록 후 RunAtLoadtrue이면 로드되는 시점에 스크립트가 실행됩니다.

launchctl kickstart gui/$(id -u)/com.example.launchd-test

아래 코드를 사용하면 등록된 작업을 즉시 실행할 수 있습니다. kickstart는 등록된 작업을 수동으로 시작할 때 사용할 수 있습니다. 설정은 정상인데 실행 시점을 기다리기 어렵다면 이 명령으로 바로 테스트할 수 있습니다.

launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.launchd-test.plist

위 코드를 사용하면 등록된 작업을 해제할 수 있습니다. bootout은 등록된 작업을 도메인에서 제거할 때 사용합니다. plist 파일을 수정한 뒤 다시 적용하려면 기존 작업을 bootout한 뒤 bootstrap하는 방식으로 진행하는 것이 깔끔합니다.

UTM 네트워크 연결 모드 Bridge Host Only 변경하기

주기적으로 실행하기

특정 간격마다 작업을 실행하려면 StartInterval 키를 사용할 수 있습니다. Apple 개발자 문서에서도 300초마다 실행되는 예시를 통해 StartInterval 키를 소개하고 있습니다.

<key>StartInterval</key>
<integer>300</integer>

plist에서 위와 같이 작성하면 300초(5분)마다 작업을 실행하도록 설정합니다. 너무 짧은 간격으로 설정하면 로그가 빠르게 쌓이거나 시스템 리소스를 불필요하게 사용할 수 있으므로 실제 작업에 맞게 조정해야 합니다.

특정 시간에 실행하기

매일 특정 시간에 실행하려면 StartCalendarInterval 키를 사용할 수 있습니다. 이 방식은 매일 정해진 시간에 백업, 정리, 동기화 같은 작업을 실행할 때 사용하기 좋습니다.

<key>StartCalendarInterval</key>
<dict><key>Hour</key><integer>9</integer><key>Minute</key><integer>30</integer></dict>

위와 같이 하면 매일 오전 9시 30분에 실행되도록 설정하는 plist 일부입니다. 간단한 예시를 한 줄로 표시했지만 실제 plist에서는 가독성을 위해 여러 줄로 나누어 작성하는 것이 좋습니다. 시간 기반 작업은 Mac이 잠자기 상태이거나 꺼져 있는 경우 기대한 시점에 실행되지 않을 수 있으므로, 중요한 작업은 실행 로그를 함께 남기는 것이 안전합니다.

macOS에서 Thorium 브라우저 설치하기

상태 확인과 문제 확인

launchd 작업이 실행되지 않을 때는 등록 상태와 로그를 먼저 확인하는 것이 좋습니다. plist 문법 오류, 실행 권한, 경로 문제, 소유자 권한 문제가 자주 발생합니다.

launchctl print gui/$(id -u)/com.example.launchd-test

위와 같이 사용하면 등록된 작업 목록에서 특정 Label을 찾을 수 있습니다.이 명령은 해당 작업이 현재 사용자 GUI 도메인에 등록되어 있는지 확인할 때 사용할 수 있습니다. 출력 내용에서 마지막 종료 상태, 실행 상태, 설정 정보를 확인할 수 있습니다.

plutil -lint ~/Library/LaunchAgents/com.example.launchd-test.plist

위 코드를 사용하면 plist 문법이 올바른지 확인할 수 있습니다. plist 문법에 문제가 있으면 launchctl 명령어가 실패하거나 작업이 로드되지 않을 수 있습니다. 먼저 plutil로 문법을 확인한 뒤 launchctl 명령을 실행하는 것이 좋습니다.

대안 이나 비교

launchd는 macOS 기본 백그라운드 작업 관리 방식이지만, 모든 자동화에 가장 쉬운 방법은 아닐 수 있습니다. 목적에 따라 cron, Shortcuts, Automator, 로그인 항목, 별도 자동화 앱과 비교해 선택하는 것이 좋습니다.

명령줄 기반의 안정적인 반복 실행이 필요하면 launchd가 적합합니다. 반면 사용자가 직접 눌러 실행하는 작업이나 시각적으로 구성하는 자동화라면 Shortcuts나 Automator가 더 편할 수 있습니다.

구분launchdcronShortcutsAutomator
주요 용도macOS 데몬과 에이전트 관리시간 기반 명령 실행사용자 중심 자동화파일 처리와 macOS 작업 자동화
macOS 기본 연동높음제한적높음높음
설정 방식plist 파일crontab시각적 액션시각적 워크플로우
로그인 사용자 작업LaunchAgent로 적합환경 설정이 까다로울 수 있음적합적합
시스템 백그라운드 작업LaunchDaemon으로 적합제한적부적합한 경우 많음부적합한 경우 많음
초보자 접근성중간중간쉬움쉬움
추천 상황반복 실행, 서비스 관리, 백그라운드 작업간단한 시간 기반 실행버튼식 자동화, 앱 연동Finder 작업, 파일 변환
UTM 가상 머신 스냅샷 클론 저장 또는 공유하기

FAQ

launchd와 launchctl은 무엇이 다른가요.

launchd는 macOS에서 데몬과 에이전트를 관리하는 시스템 프로세스이고, launchctl은 사용자가 launchd에 작업을 등록하거나 해제할 때 사용하는 명령어입니다. 사용자가 launchd 자체를 직접 조작하는 것이 아니라 launchctl을 통해 작업을 관리한다고 이해하면 됩니다.

  • launchd는 시스템 백그라운드에서 실행되는 관리 주체입니다.
  • launchctl은 터미널에서 사용하는 관리 도구입니다.
  • plist 파일은 launchd가 어떤 작업을 어떻게 실행할지 설명하는 설정 파일입니다.

LaunchAgent와 LaunchDaemon 중 무엇을 사용해야 하나요.

개인 자동화 작업이나 로그인한 사용자 환경에서 실행할 작업이라면 LaunchAgent를 먼저 고려하는 것이 좋습니다. 반대로 사용자 로그인 여부와 관계없이 시스템 전체에서 실행해야 하는 작업이라면 LaunchDaemon이 더 적합합니다.

  • 알림 표시, 사용자 폴더 접근, 앱 실행, GUI 세션과 연결된 작업은 LaunchAgent가 적합합니다.
  • 서버 프로세스, 시스템 서비스, 루트 권한이 필요한 작업은 LaunchDaemon이 적합합니다.
  • 판단이 어렵다면 먼저 LaunchAgent로 테스트하고, 실제로 시스템 서비스가 필요한 경우에만 LaunchDaemon으로 옮기는 방식이 안전합니다.

launchd 작업이 실행되지 않을 때 어디부터 확인하면 되나요.

launchd 작업이 실행되지 않으면 plist 문법, 파일 위치, 파일 권한, 실행 파일 경로를 순서대로 확인하는 것이 좋습니다. 특히 터미널에서는 실행되지만 launchd에서는 실행되지 않는 경우 절대 경로와 환경 변수 문제가 원인인 경우가 많습니다.

  • plutil -lint 명령으로 plist 문법을 확인합니다.
  • ProgramArguments에 작성한 실행 파일 경로가 절대 경로인지 확인합니다.
  • 스크립트 파일에 실행 권한이 있는지 확인합니다.
  • StandardErrorPath를 지정해 오류 로그가 남는지 확인합니다.
  • launchctl print 명령으로 작업이 실제로 등록되었는지 확인합니다.

launchd에서 PATH 환경 변수가 다르게 동작하나요.

launchd로 실행되는 작업은 사용자가 터미널에서 실행할 때와 환경 변수가 다를 수 있습니다. 그래서 brew로 설치한 명령어, 사용자 셸 설정에 등록된 alias, .zshrc에 설정한 PATH가 그대로 적용되지 않을 수 있습니다.

  • 실행 파일은 가능한 한 절대 경로로 작성하는 것이 좋습니다.
  • which 명령으로 실제 실행 파일 위치를 확인한 뒤 ProgramArguments에 반영합니다.
  • 복잡한 환경 설정이 필요하면 셸 스크립트 안에서 PATH를 직접 지정하는 방식이 안정적입니다.
  • 터미널에서만 동작하고 launchd에서는 실패한다면 환경 변수 차이를 먼저 의심해볼 수 있습니다.

launchd plist 파일 이름은 어떻게 정하는 것이 좋나요.

launchd plist 파일 이름은 보통 Label 값과 동일하게 맞추는 것이 좋습니다. launchd.plist 매뉴얼에서도 plist 파일은 .plist로 끝나야 하며, Label 값과 같은 이름을 사용하는 것이 관례라고 설명합니다.

  • 예를 들어 Labelcom.example.backup이면 파일명은 com.example.backup.plist로 정리하는 방식이 좋습니다.
  • Label은 다른 작업과 충돌하지 않도록 도메인 역순 형식을 사용하는 경우가 많습니다.
  • 개인용이라면 com.username.taskname처럼 구분 가능한 이름을 사용하는 것도 관리에 도움이 됩니다.

cron 대신 launchd를 사용하는 것이 더 좋은가요.

macOS에서는 반복 작업을 구성할 때 launchd가 시스템 구조와 더 자연스럽게 연결되는 경우가 많습니다. cron도 사용할 수 있지만 macOS의 로그인 세션, 사용자 에이전트, 시스템 데몬 관리까지 고려하면 launchd가 더 적합한 경우가 많습니다.

  • 단순 시간 기반 명령만 필요하면 cron도 이해하기 쉽습니다.
  • macOS 로그인 시 실행, 사용자 세션 작업, 시스템 서비스 관리가 필요하면 launchd가 더 적합합니다.
  • 새로 macOS 자동화 작업을 구성한다면 launchd 방식을 먼저 익히는 것이 장기적으로 관리하기 좋습니다.

관련 글

댓글로 남기기 어려운 내용은 Mail로 문의 하실 수 있습니다. 해당 글과 연관 된 내용은 여기를 클릭하거나 터치해 현재 페이지의 주소를 복사 후 함께 전달하시면 보다 정확한 답을 얻을 수 있습니다.

댓글 남기기