불행하게도 MyApp가 중지되었습니다. 이 문제를 어떻게 해결할 수 있습니까?


785

응용 프로그램을 개발 중이며 실행할 때마다 메시지가 나타납니다.

불행히도 MyApp가 중지되었습니다.

이 문제를 해결하려면 어떻게해야합니까?


이 질문에 대해- 스택 추적이란 무엇이며, 응용 프로그램 오류를 디버깅하는 데 어떻게 사용할 수 있습니까? 자세한 내용없이 애플리케이션이 다운되었다는 내용의 질문이 많이 있습니다. 이 질문은 초보 Android 프로그래머에게 문제를 직접 해결하고 올바른 질문을하는 방법을 알려줍니다.


22
나는 이것으로 많은 질문을 속이는 것으로 보았습니다. 이것은 사람들이 질문에 관련 데이터를 게시하도록 돕는 좋은 참고 자료입니다. 그러나 이것은 근본 문제의 복제가 아니라 근본 문제를 파헤 치기위한 방법론입니다. 이 질문에 대한 링크를 참조로 제공하는 것이 좋으며 중복되지는 않는 것이 좋습니다.
laalto

33
나는 닫기 기능이 이것에 완벽하다고 생각합니다. 이러한 질문의 대부분은 기본 디버깅 기술에 대한 지식이 거의 없습니다. 그것들을 보류 시키면 대답에 명시된 방법을 사용하여 문제를 명확히 할 수 있습니다. 더 좋은 방법은 문제 자체를 해결할 수 있다는 것입니다. 이 토론은 meta.stackoverflow.com에 더 적합 할 수 있습니다.
nhaarman

이 질문은 너무 모호합니다. 더 좋은 질문은 '안타깝게도 MyApp가 중지되었습니다'라는 오류가 표시되는 Android 애플리케이션을 [[IDE] 디버깅하는 방법]을 사용하는 것입니다.
Chris Halcrow

7
@ChrisHalcrow이 Q / A는 전혀 디버깅에 관한 것이 아닙니다. 안드로이드 초보자에게 앱 충돌을 처리하는 방법을 안내합니다.
nhaarman

stackoverflow.com/questions/26609734/… .. apk로 변환에서 멀티 덱스 becoz 오류 활성화
RejoylinLokeshwaran

답변:


717

이 답변은 스택 추적을 검색하는 프로세스를 설명합니다. 이미 스택 추적이 있습니까? " 스택 추적이란 무엇이며 어떻게 추적하여 애플리케이션 오류를 디버깅 할 수 있습니까? " 에서 스택 추적을 읽어보십시오.

문제

잡히지 않아서 응용 프로그램이 종료되었습니다 RuntimeException.
이들 중 가장 일반적인 것은입니다 NullPointerException.

그것을 해결하는 방법?

안드로이드 응용 프로그램 (또는 그 문제에 대한 Java 응용 프로그램)이 충돌 할 때마다 a Stack trace가 콘솔 (이 경우 logcat)에 기록됩니다. 이 스택 추적에는 문제를 해결하기위한 중요한 정보가 포함되어 있습니다.

안드로이드 스튜디오

Android Studio에서 스택 추적 찾기

창의 하단 막대에서 Logcat버튼을 클릭하십시오 . 또는 alt+ 를 누를 수도 있습니다 6. Devices패널 에서 에뮬레이터 또는 장치가 선택되어 있는지 확인하십시오 . 그런 다음 빨간색으로 표시되는 스택 추적을 찾으십시오. logcat에 많은 것들이 로그인되어있을 수 있으므로 약간 스크롤해야 할 수도 있습니다. 스택 추적을 쉽게 찾을 수있는 방법은 오른쪽의 휴지통을 사용하여 로그 캣을 지우고 앱이 다시 충돌하게하는 것입니다.

스택 추적을 찾았습니다. 이제 무엇입니까?

예이! 당신은 문제를 해결하기 위해 반쯤입니다.
스택 추적을 분석하여 정확히 응용 프로그램 충돌을 일으킨 대상 만 찾으면됩니다.

" 스택 추적이란 무엇이며 어떻게 추적하여 애플리케이션 오류를 디버깅 할 수 있습니까? " 에서 스택 추적을 읽어보십시오.

여전히 내 문제를 해결할 수 없습니다!

귀하 Exception와 귀하 의 회선을 찾았 지만 여전히 고치는 방법을 알 수 없다면 언제든지 주저하지 말고 StackOverflow에 질문하십시오.

가능한 한 간결하게 작성하십시오. 스택 추적 및 관련 코드를 게시하십시오 (예 :을 던진 줄까지 몇 줄 Exception).


33
나는이 게시물이 오래되었다는 것을 알고 있지만 IntelliJ IDEA를 사용하면 안으로 들어가서 Android > Devices|Logcat새 필터 ( i.imgur.com/145dtkx.png )를 추가하고 by Log Message여기에 대해 필터링 할 수 있습니다 FATAL EXCEPTION( i.imgur.com/HpELhaU .png )이 상자에서 Exceptions응용 프로그램이 던지는 모든 것을 읽을 수 있습니다 . 이를 통해 logcat을 지우고 충돌을 다시 수행 할 필요가 없습니다. Android Studio 에도이 옵션이 있다고 생각합니다.
Marco Acierno

1
Eclipse의 logcat 필터링은 필터의 애플리케이션 이름 필드에 Java 패키지 이름을 입력하여 수행 할 수 있습니다.
Stephane

요점은 예외가 발생할 때 얻는 추적을 이해하는 것입니다. FC는 추적이 없거나 사용 가능한 것이 없는데 약간 나빠서 털이 나옵니다. 그러나 나는이 설명이 그러한 버그를 발견 / 식별하는 좋은 첫 소개라고 생각합니다.
DooMMasteR

4
logcat에 약간의 오류가있을 때 상황이 쉽지만 logcat에 아무것도없는 경우는 무엇입니까? stackoverflow.com/questions/32455645/…
Marian Paździoch

4
문제는 줄에 스택 추적으로 작성되고 지적 된 오류가 포함되어 있지 않다는 것입니다.
Hilal

115

당신이 사용할 수있는 구글의 ADB 도구를 얻기 위해 Logcat file문제를 분석 할 수 있습니다.

adb logcat > logcat.txt

logcat.txt파일을 열고 응용 프로그램 이름을 검색하십시오. 실패한 이유, 줄 번호, 클래스 이름 등에 대한 정보가 있어야합니다.


이것은 훌륭합니다. 디버거가 장치를 잡는 데 실패하더라도 장치에서 발생하는 모든 것을 빠르게 보여줍니다. 런타임이로드되지 않으면 Xamarin에 발생할 수 있습니다.
jvenema

1
안드로이드 스튜디오 로그 캣에서 내 앱이 충돌하는 이유를 알 수 없었으며 오류가 전혀 없었습니다. 이 대답은 내가 필요한 것을 주었다. 그러나 나중에 스튜디오 로그 캣에 필터가 있음을 깨달았으므로 오류가 표시되지 않습니다. "선택한 응용 프로그램 만 표시"로 다시 전환했고 백업 및 실행 중이었습니다.
Yannick

을 추가해야합니다 -d. 그렇지 않으면 ctrl-C로 이동하여 logcat을 종료하십시오. 나는adb logcat -v time -d > filename.txt
Karakuri

37

먼저 앱이 중단 된 지점을 확인합니다 ( Unfortunately, MyApp has stopped.). 이를 Log.e("TAG", "Message");위해을 사용할 수 있습니다 .이 줄을 사용하면 logcat에서 앱 로그를 볼 수 있습니다.

그 후, 앱이 어느 지점에서 멈췄는지 알게되면 쉽게 해결할 수 있습니다.


28

로그 고양이에서 오류를 확인하십시오.

일식에서 log cat 옵션을 얻습니다.

창->보기보기-> 기타-> Android-> Logcat

로그 고양이에 오류가 있습니다.

그렇지 않으면 디버그 모드에서 응용 프로그램을 실행하여 오류를 확인할 수도 있습니다. 먼저 다음을 수행하여 중단 점을 설정하십시오.

프로젝트-> 다른 이름으로 디버그-> Android 응용 프로그램을 마우스 오른쪽 버튼으로 클릭하십시오.


27

참고 : 이 답변은 Android Studio 2.2.2를 사용하고 있습니다.

참고 2 : 장치가 성공적으로 연결되어 있다고 생각합니다.


응용 프로그램이 충돌 할 때 가장 먼저해야 할 일은 LogCat을 보는 것입니다 .Android Studio의 맨 아래에는 메뉴 목록이있는 도구 모음이 있습니다.

영상

"Android 모니터"를 클릭하십시오 (위의 이미지에서 밑줄이 그어진 것입니다. ^)

이제 다음과 같은 것을 얻을 수 있습니다 :

영상

" Verbose"를 " Error"로 변경하십시오. 이제 기록 된 오류 만 표시됩니다. 이 모든 오류에 대해 걱정하지 마십시오.

영상

확인. 이제 앱을 다운시키기 위해했던 일을하십시오. 앱이 다운되면 logcat으로 이동하십시오. 예를 들어 , at:x.x.x다음과 같은 많은 크래시 로그를 찾아야합니다 Caused by: TrumpIsPresidentException. Caused by:logcat에서 해당 문장으로 이동 하십시오.

영상

다음에Caused By:, 일어난 예외가 있어야한다. 내 경우에는 a RuntimeException와 그 아래에 다음 과 같은 파란색 링크 가 포함 된 줄이 있어야합니다 .

영상

Caused by:그 아래 어딘가에 파란색 텍스트가있는 줄이 없다면 다른 Caused by:것을 찾으십시오 .

파란색 링크를 클릭하십시오 . 문제가 발생한 곳으로 이동해야합니다. 제 경우에는 다음 줄로 인한 것입니다.

throw new RuntimeException();

이제 왜 충돌하는지 알고 있습니다. 내가 직접 예외를 던지기 때문입니다. 이것은 명백한 오류 였다.


그러나 다른 오류가 있다고 가정 해 봅시다.

java.lang.NullPointerException

나는 logcat을 확인하고 그것이 나에게주는 파란색 링크를 클릭했고 여기로 데려 갔다.

mTextView.setText(myString);

이제 디버깅하고 싶습니다. 이 StackOverflow 질문 에 따르면 NullPointerException은 무언가가 있다고 말합니다 null.

null이 무엇인지 알아 봅시다 . 두 가지 가능성이 있습니다. 어느 쪽이 mTextViewnull의 경우, 또는 myStringnull입니다. mTextView.setText(mString)줄 앞에, 다음 두 줄을 추가합니다.

Log.d("AppDebug","mTextView is null: " + String.valueOf(mTextView == null);
Log.d("AppDebug","myString is null: " + String.valueOf(myString== null);

이제 이전과 마찬가지로 (Verose를 Error로 변경) "Error"를 "Debug"로 변경하려고합니다. 우리는 디버깅으로 로깅하기 때문에. 모든 Log 메소드는 다음과 같습니다.

Log.
  d means Debug
  e means error
  w means warning
  v means verbose
  i means information
  wtf means "What a terrible failure". This is similar to Log.e

그래서 Log.d우리는를 사용했기 때문에 디버그를 점검하고 있습니다. 이것이 우리가 디버그로 변경 한 이유입니다.

통지 Log.d에는 첫 번째 매개 변수가 있습니다 (이 경우 "AppDebug"). logcat의 오른쪽 상단에있는 "No Filters"드롭 다운 메뉴를 클릭하십시오. "필터 구성 편집"을 선택하고 필터 이름을 지정한 다음 "로그 태그"에서 "앱 디버그"를 입력하십시오. "확인"을 클릭하십시오. 이제 logcat에 두 줄이 나타납니다.

yourPackageNameAndApp: mTextView is null: true
yourPackageNameAndApp: myString is null: false

이제 mTextView가 null이라는 것을 알았습니다.

내 코드를 관찰했는데 이제 무언가를 발견했습니다.

나는 private TextView mTextView수업의 최상위에 선언했다. 그러나 나는 그것을 정의하지 않습니다.

기본적으로 onCreate () 에서이 작업을 잊어 버렸습니다.

mTextView = (TextView) findViewById(R.id.textview_id_in_xml);

그래서 mTextView내 응용 프로그램이 무엇인지 알려주는 것을 잊었 기 때문에 왜 null이 됩니까 ? 따라서 해당 줄을 추가하고 앱을 실행하면 앱이 중단되지 않습니다.



1
이것은 좋은 정보이지만 스택 추적의 이미지를 사용하면 유용성이 떨어집니다. 이미지를 검색 할 수없고, 복사하여 붙여 넣을 수없고, 스크린 리더로 읽을 수 없으며 읽기가 더 어렵습니다. (저는 그것을 지적하지 않았습니다.)
EJoshuaS-Monica Monica 복원

1
@ EJoshuaS 나는 이미지를 제공한다고 말하지 않았다.
Ab의

19

이 팝업은 코드에서 치명적인 예외가 발생하여 앱 실행이 중지 된 경우에만 표시됩니다. 그것은 예외가 될 수 NullPointerException, OutOfMemoryException

확인하는 가장 좋은 방법 은 Android Studio에서 여전히 앱을 개발하는 경우 Logcat을 사용 하는 것입니다.이 방법은 스택 추적을 읽고 앱의 원인을 확인하는 빠른 방법입니다.

앱이 이미 활성화 된 경우 logcat을 사용할 수 없습니다 . 따라서 Crashlytics발생하는 예외에 대한 버그 보고서를 제공하도록 구현할 수 있습니다 .


17

Logcat메시지를 확인 하고 Manifest파일을 확인하십시오 . Activity,사용자 권한 정의 등과 같이 누락 된 것이 있어야합니다 .


14

다음 도구 중 하나를 사용할 수 있습니다.

  1. adb logcat

  2. adb logcat> logs.txt (편집기를 사용하여 오류를 열고 검색 할 수 있습니다.)

  3. 이클립스 logcat (이클립스에 표시되지 않으면 Windows->보기 표시-> 기타-> Android-> LogCat로 이동하십시오)

  4. Android 디버그 모니터 또는 Android 장치 모니터 (유형 명령 모니터 또는 UI를 통해 열기)

여기에 이미지 설명을 입력하십시오

  1. 안드로이드 스튜디오

Android Debug Monitor 를 사용 하는 것이 좋습니다. 너무 많은 로그가있을 때, adb logcat 필터를 통해 일식이 멈추기 때문에 모두 어렵습니다.


12

당신은 확인해야 Stack trace

그렇게하는 방법?

LOGCAT에서 창을 확인하십시오.

logcat 창이 보이지 않으면이 경로로 이동하여 엽니 다.

window->show view->others->Android->Logcat

Google-Api를 사용하는 경우이 경로로 이동하십시오.

adb logcat> logcat.txt


10

아래 showToast () 메소드에서 컨텍스트 또는 애플리케이션 컨텍스트에 대한 다른 매개 변수를 전달하여 시도해야합니다.

  public void showToast(String error, Context applicationContext){
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.custom_toast, (ViewGroup)      
        findViewById(R.id.toast_root));
        TextView text = (TextView) findViewById(R.id.toast_error);
        text.setText(error);
        Toast toast = new Toast(applicationContext);
        toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setView(view);
        toast.show();
}

9

Force Close를 만날 때 (앱이 작동을 멈출 때)에 대한 기본 Logcat 분석을 공유하겠습니다.

DOCS

로그 수집 / 분석을위한 Android의 기본 도구는 logcat입니다.

여기 logcat에 대한 안드로이드 페이지입니다

android Studio를 사용하는 경우이 링크를 확인할 수도 있습니다 .

캡처

기본적으로 다음 명령을 사용하여 수동으로 logcat을 캡처 할 수 있습니다 (또는 AndroidStudio에서 AndroidMonitor 창을 확인하십시오).

adb logcat

원하는 메시지를 필터링하고 표시하는 데 도움이되는 명령에 추가 할 수있는 많은 매개 변수가 있습니다. 이것은 개인적인 것입니다 ... 나는 항상 아래 명령을 사용하여 메시지 타임 스탬프를 얻습니다.

adb logcat -v time

출력을 파일로 리디렉션하고 텍스트 편집기에서 분석 할 수 있습니다.

분석하는

앱이 충돌하는 경우 다음과 같은 결과가 나타납니다.

07-09 08:29:13.474 21144-21144/com.example.khan.abc D/AndroidRuntime: Shutting down VM
07-09 08:29:13.475 21144-21144/com.example.khan.abc E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.khan.abc, PID: 21144
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference
     at com.example.khan.abc.AudioFragment$1.onClick(AudioFragment.java:125)
     at android.view.View.performClick(View.java:4848)
     at android.view.View$PerformClick.run(View.java:20262)
     at android.os.Handler.handleCallback(Handler.java:815)
     at android.os.Handler.dispatchMessage(Handler.java:104)
     at android.os.Looper.loop(Looper.java:194)
     at android.app.ActivityThread.main(ActivityThread.java:5631)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-09 08:29:15.195 21144-21144/com.example.khan.abc I/Process: Sending signal. PID: 21144 SIG: 9

로그의이 부분에는 많은 정보가 표시됩니다.

  • 문제가 발생했을 때 : 07-09 08:29:13.475

문제가 발생한시기를 확인하는 것이 중요합니다 ... 로그에 여러 오류가있을 수 있습니다 ... 올바른 메시지를 확인하고 있는지 확인해야합니다. :)

  • 충돌 한 앱 : com.example.khan.abc

이렇게하면 어떤 앱이 다운되었는지 알 수 있습니다 (메시지에 대한 로그를 확인하고 있는지 확인하기 위해)

  • 어떤 오류 : java.lang.NullPointerException

NULL 포인터 예외 오류

  • 오류에 대한 자세한 정보 : Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.onBackPressed()' on a null object reference

객체 onBackPressed()에서 메소드를 호출하려고했습니다 FragmentActivity. 그러나 그 대상은 null당신이 그것을했을 때였습니다.

  • 스택 추적 : 스택 추적은 메서드 호출 순서를 보여줍니다. 때로는 호출 된 메서드가 아니라 호출 된 메서드에서 오류가 발생합니다.

    com.example.khan.abc.AudioFragment $ 1.onClick (AudioFragment.java:125)에서

line 메소드의 com.example.khan.abc.AudioFragment.java내부 파일에서 오류가 발생했습니다 onClick(): 125(stacktrace는 오류가 발생한 행을 보여줍니다)

다음에 의해 호출되었습니다.

at android.view.View.performClick(View.java:4848)

다음에 의해 호출되었습니다.

at android.view.View$PerformClick.run(View.java:20262)

이것은 다음에 의해 호출되었습니다.

at android.os.Handler.handleCallback(Handler.java:815)

기타....

개요

이것은 단지 개요 일뿐입니다 ... 모든 로그가 단순하지는 않습니다 ... 단지 아이디어를 공유하고 엔트리 레벨 정보를 제공하는 것입니다 ...

어쨌든 당신을 도울 수 있기를 바랍니다 ... 감사합니다


8

LogCat을 사용하여 앱 충돌의 원인을 찾으십시오.

Android Studio 를 사용하는 경우 Logcat을 보려면 ALT + 6 또는

Eclipse 를 사용하는 경우 Window-> Open Perspective-> Other-LogCat

드롭 다운 메뉴에서 오류를 선택하여 LogCat으로 이동하십시오. 여기에는 디버그에 도움이되는 모든 필수 정보가 포함됩니다. 그래도 문제가 해결되지 않으면 LogCat을 질문에 대한 편집 내용으로 게시하면 누군가 도와 줄 것입니다.


7

어떤 이유로 든 좋은 추적 추적없이 앱이 충돌하는 경우. 첫 번째 줄에서 디버깅을 시도하고 충돌 할 때까지 한 줄씩 이동하십시오. 그러면 어떤 줄이 문제를 일으키는 지에 대한 답을 얻게 될 것입니다. 아마도 당신은 그것을 catch catch 블록 및 인쇄 오류 출력에 랩핑 할 수 있습니다.


5

스택 추적이나 추가 오류 메시지없이이 오류 메시지를 자체적으로 얻을 수도 있습니다.

이 경우 Android 매니페스트가 올바르게 구성되어 있는지 (라이브러리에서 발생하는 매니페스트 병합 및 라이브러리에서 발생하는 모든 활동 포함) 확인해야하며 매니페스트 파일에서 애플리케이션에 표시되는 첫 번째 활동에 특히주의해야합니다. .


3
이 현상을 보여주는 프로젝트를 업로드 할 수 있다면 흥미로울 것입니다.
CommonsWare

5

개발 중 충돌

내가 좋아하는 툴 logview 를 사용하여 개발 중에 로그를 가져와 분석하십시오. Linux에서 실행할 때는
반드시 표시 ./logview하고 ./lib/logview.jar실행 파일 로 표시하십시오 .

마음에 들지 않으면 Android 용 대체 데스크탑 로그 뷰어 가 많이 있습니다.

야생에서 추락

사용자 기기에서 발생한 처리되지 않은 예외의 스택 추적 을 얻기 위해 Firebase Crashlytics 와 같은 실시간 충돌보고 도구를 통합 합니다.

읽기 (이야기를하고 라이브) 버그가 응용 프로그램을 해제하는 방법 현장에서 버그 처리에 대한 자세한 알고.


4

사람들은 실수를하고 코딩도합니다.

어떤 error일이 발생하면 항상 빨간색 텍스트로 logcat을 확인하십시오. 그러나 빨간색 텍스트에 밑줄 이있는 파란색 텍스트실제 문제를 찾을 수 있습니다 .

u는 새를 만들 경우 확인 activity항상 선언 activityAndroidManifest파일.

권한을 추가하는 경우 AndroidMainifest파일에도 권한을 선언하십시오 .


4

Logcat - Android Studio의 개발 단계에서 로그를 확인하려면

처음에는 Logcat을 지우고 앱이 다시 충돌하도록하여 충돌 한 로그 세부 정보 만 얻을 수 있습니다. 스택 추적을 확인해야합니다

불행하게도 MyApp는 중지되었습니다. 그 이유는 여러 가지가 있습니다. 로그에서 동일하게 확인할 수 있습니다. 이를 위해 Log.e ( "TAG", "Message");

앱 충돌 중 일반적인 오류 :

  1. 코딩 실수 (키워드를 잘못 사용함).
  2. 속성 이름이 일치하지 않습니다.
  3. 지원되지 않는 플러그인 (아마도).
  4. 불일치 버전 (아마도).
  5. AndroidManifest 파일에서 활동이 누락되었습니다.
  6. AndroidManifest 파일에 권한이 없습니다.
  7. 가장 흔한 NullPointerException.
  8. 선언되었지만 정의되지 않았습니다.

앱 충돌 오류를 해결하려면 :

  • 위의 사항을 명심하고 살펴보십시오.
  • 오류가 발생하면 파일 이름이 파란색으로 표시됩니다 (파일을 클릭하고 오류가 발생한 코드로 이동).

3

먼저, 앱이 중단 된 위치와 이유를 확인해야합니다. (Unfortunately, MyApp has stopped.).의 도움을 받으면 LOG무엇이 잘못되었는지 파악할 수 있습니다.

그 후, 앱이 어느 지점에서 그 지점에서 그 지점을 수정하지 못했는지 알게됩니다.


3

터미널에 흥미로운 로그가 없거나 응용 프로그램과 직접 관련이없는 경우 기본 라이브러리 때문일 수 있습니다. 이 경우 터미널 내 "tombstone"파일을 확인해야합니다.

삭제 표시 파일의 기본 위치는 모든 장치에 따라 다르지만이 경우에는 다음과 같은 로그가 나타납니다. Tombstone written to: /data/tombstones/tombstone_06

자세한 내용은 https://source.android.com/devices/tech/debug 에서 확인 하십시오 .


0

또한 터미널에서이 명령을 실행하면 문제를 찾는 데 도움이 될 수 있습니다.

gradlew build > log.txt 2>details.txt

그런 다음 위의 두 로그 파일을 읽어 gradlew 파일 위치로 이동해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.