WebClient 클래스
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
URI로 식별된 리소스에서 데이터를 보내고 받는 일반적인 메서드를 제공합니다.
public ref class WebClient : System::ComponentModel::Component
public ref class WebClient sealed : System::ComponentModel::Component
public class WebClient : System.ComponentModel.Component
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class WebClient : System.ComponentModel.Component
[System.Runtime.InteropServices.ComVisible(true)]
public class WebClient : System.ComponentModel.Component
type WebClient = class
inherit Component
[<System.Runtime.InteropServices.ComVisible(true)>]
type WebClient = class
inherit Component
Public Class WebClient
Inherits Component
Public NotInheritable Class WebClient
Inherits Component
- 상속
- 특성
다음 코드 예제에서는 리소스의 URI를 가져와서 검색하고 응답을 표시합니다.
#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::IO;
int main()
{
array<String^>^args = Environment::GetCommandLineArgs();
if ( args == nullptr || args->Length == 1 )
{
throw gcnew ApplicationException( "Specify the URI of the resource to retrieve." );
}
WebClient^ client = gcnew WebClient;
// Add a user agent header in case the
// requested URI contains a query.
client->Headers->Add( "user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)" );
Stream^ data = client->OpenRead( args[ 1 ] );
StreamReader^ reader = gcnew StreamReader( data );
String^ s = reader->ReadToEnd();
Console::WriteLine( s );
data->Close();
reader->Close();
delete client;
}
using System;
using System.Net;
using System.IO;
public class Test
{
public static void Main(string[] args)
{
if (args == null || args.Length == 0)
{
throw new ApplicationException("Specify the URI of the resource to retrieve.");
}
using WebClient client = new WebClient();
// Add a user agent header in case the
// requested URI contains a query.
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
using Stream data = client.OpenRead(args[0]);
using StreamReader reader = new StreamReader(data);
string s = reader.ReadToEnd();
Console.WriteLine(s);
}
}
Imports System.Net
Imports System.IO
Public Class Test
Public Shared Sub Main(args() As String)
If args Is Nothing OrElse args.Length = 0 Then
Throw New ApplicationException("Specify the URI of the resource to retrieve.")
End If
Using client As New WebClient()
' Add a user agent header in case the
' requested URI contains a query.
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
Using data As Stream = client.OpenRead(args(0))
Using reader As New StreamReader(data)
Dim s As String = reader.ReadToEnd()
Console.WriteLine(s)
End Using
End Using
End Using
End Sub
End Class
주의
WebRequest
, HttpWebRequest
, ServicePoint
및 WebClient
사용되지 않으므로 새 개발에 사용하면 안 됩니다. 대신 HttpClient 사용합니다.
WebClient 클래스는 URI로 식별되는 로컬, 인트라넷 또는 인터넷 리소스에서 데이터를 보내거나 받는 일반적인 메서드를 제공합니다.
WebClient 클래스는 WebRequest 클래스를 사용하여 리소스에 대한 액세스를 제공합니다. WebClient 인스턴스는 WebRequest.RegisterPrefix 메서드에 등록된 모든 WebRequest 하위 항목으로 데이터에 액세스할 수 있습니다.
참고
기본적으로 .NET Framework는 http:
, https:
, ftp:
및 file:
체계 식별자로 시작하는 URI를 지원합니다.
다음 표에서는 리소스에 데이터를 업로드하는 WebClient 방법에 대해 설명합니다.
메서드 | 묘사 |
---|---|
OpenWrite | 리소스에 데이터를 보내는 데 사용되는 Stream 검색합니다. |
OpenWriteAsync | 호출 스레드를 차단하지 않고 리소스에 데이터를 보내는 데 사용되는 Stream 검색합니다. |
UploadData | 바이트 배열을 리소스에 보내고 응답을 포함하는 Byte 배열을 반환합니다. |
UploadDataAsync | 호출 스레드를 차단하지 않고 리소스에 Byte 배열을 보냅니다. |
UploadFile | 리소스에 로컬 파일을 보내고 응답을 포함하는 Byte 배열을 반환합니다. |
UploadFileAsync | 호출 스레드를 차단하지 않고 리소스에 로컬 파일을 보냅니다. |
UploadValues | 리소스에 NameValueCollection 보내고 응답을 포함하는 Byte 배열을 반환합니다. |
UploadValuesAsync | NameValueCollection 리소스에 보내고 호출 스레드를 차단하지 않고 응답을 포함하는 Byte 배열을 반환합니다. |
UploadString | 리소스에 String 보내고 응답이 포함된 String 반환합니다. |
UploadStringAsync | 호출 스레드를 차단하지 않고 리소스에 String 보냅니다. |
다음 표에서는 리소스에서 데이터를 다운로드하는 WebClient 방법에 대해 설명합니다.
메서드 | 묘사 |
---|---|
OpenRead | 리소스의 데이터를 Stream반환합니다. |
OpenReadAsync | 호출 스레드를 차단하지 않고 리소스에서 데이터를 반환합니다. |
DownloadData | 리소스에서 데이터를 다운로드하고 Byte 배열을 반환합니다. |
DownloadDataAsync | 호출 스레드를 차단하지 않고 리소스에서 데이터를 다운로드하고 Byte 배열을 반환합니다. |
DownloadFile | 리소스에서 로컬 파일로 데이터를 다운로드합니다. |
DownloadFileAsync | 호출 스레드를 차단하지 않고 리소스에서 로컬 파일로 데이터를 다운로드합니다. |
DownloadString | 리소스에서 String 다운로드하고 String반환합니다. |
DownloadStringAsync | 호출 스레드를 차단하지 않고 리소스에서 String 다운로드합니다. |
CancelAsync 메서드를 사용하여 비동기 작업을 취소할 수 있습니다.
WebClient 인스턴스는 기본적으로 선택적 HTTP 헤더를 보내지 않습니다. 요청에 선택적 헤더가 필요한 경우 Headers 컬렉션에 헤더를 추가해야 합니다. 예를 들어 응답에 쿼리를 유지하려면 사용자 에이전트 헤더를 추가해야 합니다. 또한 서버는 사용자 에이전트 헤더가 누락된 경우 500(내부 서버 오류)을 반환할 수 있습니다.
AllowAutoRedirect
WebClient 인스턴스에서 true
설정됩니다.
파생 클래스는 파생 클래스가 예상대로 작동하는지 확인하기 위해 WebClient 기본 클래스 구현을 호출해야 합니다.
Web |
사용되지 않음.
WebClient 클래스의 새 인스턴스를 초기화합니다. |
Allow |
사용되지 않음.
WebClient 인스턴스에 대한 인터넷 리소스에서 읽은 데이터를 버퍼링할지 여부를 나타내는 값을 가져오거나 설정합니다. |
Allow |
사용되지 않음.
WebClient 인스턴스에 대한 인터넷 리소스에 기록된 데이터를 버퍼링할지 여부를 나타내는 값을 가져오거나 설정합니다. |
Base |
WebClient요청의 기본 URI를 가져오거나 설정합니다. |
Cache |
WebRequest 개체를 사용하여 이 WebClient 인스턴스에서 가져온 리소스에 대한 애플리케이션의 캐시 정책을 가져오거나 설정합니다. |
Can |
구성 요소가 이벤트를 발생시키는지 여부를 나타내는 값을 가져옵니다. (다음에서 상속됨 Component) |
Container |
Component포함하는 IContainer 가져옵니다. (다음에서 상속됨 Component) |
Credentials |
호스트로 전송되고 요청을 인증하는 데 사용되는 네트워크 자격 증명을 가져오거나 설정합니다. |
Design |
Component 현재 디자인 모드인지 여부를 나타내는 값을 가져옵니다. (다음에서 상속됨 Component) |
Encoding |
문자열을 업로드하고 다운로드하는 데 사용되는 Encoding 가져오거나 설정합니다. |
Events |
이 Component연결된 이벤트 처리기 목록을 가져옵니다. (다음에서 상속됨 Component) |
Headers |
요청과 연결된 헤더 이름/값 쌍의 컬렉션을 가져오거나 설정합니다. |
Is |
웹 요청이 진행 중인지 여부를 가져옵니다. |
Proxy |
이 WebClient 개체에서 사용하는 프록시를 가져오거나 설정합니다. |
Query |
요청과 연결된 쿼리 이름/값 쌍의 컬렉션을 가져오거나 설정합니다. |
Response |
응답과 연결된 헤더 이름/값 쌍의 컬렉션을 가져옵니다. |
Site | (다음에서 상속됨 Component) |
Use |
DefaultCredentials 요청과 함께 전송되는지 여부를 제어하는 Boolean 값을 가져오거나 설정합니다. |
Cancel |
보류 중인 비동기 작업을 취소합니다. |
Create |
원격 개체와 통신하는 데 사용되는 프록시를 생성하는 데 필요한 모든 관련 정보를 포함하는 개체를 만듭니다. (다음에서 상속됨 MarshalByRefObject) |
Dispose() |
Component사용하는 모든 리소스를 해제합니다. (다음에서 상속됨 Component) |
Dispose(Boolean) |
Component 사용하는 관리되지 않는 리소스를 해제하고 필요에 따라 관리되는 리소스를 해제합니다. (다음에서 상속됨 Component) |
Download |
지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
비동기 작업으로 지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
비동기 작업으로 지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
작업 개체를 사용하여 비동기 작업으로 지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
작업 개체를 사용하여 비동기 작업으로 지정된 URI에서 리소스를 Byte 배열로 다운로드합니다. |
Download |
지정된 URI가 있는 리소스를 로컬 파일에 다운로드합니다. |
Download |
지정된 URI가 있는 리소스를 로컬 파일에 다운로드합니다. |
Download |
지정된 URI가 있는 리소스를 로컬 파일에 다운로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Download |
지정된 URI가 있는 리소스를 로컬 파일에 다운로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Download |
작업 개체를 사용하여 지정된 리소스를 로컬 파일에 비동기 작업으로 다운로드합니다. |
Download |
작업 개체를 사용하여 지정된 리소스를 로컬 파일에 비동기 작업으로 다운로드합니다. |
Download |
|
Download |
|
Download |
Uri지정된 리소스를 다운로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Download |
지정된 문자열을 지정된 리소스에 다운로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Download |
작업 개체를 사용하여 비동기 작업으로 지정된 URI에서 리소스를 String 다운로드합니다. |
Download |
작업 개체를 사용하여 비동기 작업으로 지정된 URI에서 리소스를 String 다운로드합니다. |
Equals(Object) |
지정된 개체가 현재 개체와 같은지 여부를 확인합니다. (다음에서 상속됨 Object) |
Get |
기본 해시 함수로 사용됩니다. (다음에서 상속됨 Object) |
Get |
사용되지 않음.
이 인스턴스의 수명 정책을 제어하는 현재 수명 서비스 개체를 검색합니다. (다음에서 상속됨 MarshalByRefObject) |
Get |
Component 또는 해당 Container제공하는 서비스를 나타내는 개체를 반환합니다. (다음에서 상속됨 Component) |
Get |
현재 인스턴스의 Type 가져옵니다. (다음에서 상속됨 Object) |
Get |
지정된 리소스에 대한 WebRequest 개체를 반환합니다. |
Get |
지정된 WebRequest대한 WebResponse 반환합니다. |
Get |
지정된 IAsyncResult사용하여 지정된 WebRequest 대한 WebResponse 반환합니다. |
Initialize |
사용되지 않음.
이 인스턴스의 수명 정책을 제어하는 수명 서비스 개체를 가져옵니다. (다음에서 상속됨 MarshalByRefObject) |
Memberwise |
현재 Object단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
Memberwise |
현재 MarshalByRefObject 개체의 단순 복사본을 만듭니다. (다음에서 상속됨 MarshalByRefObject) |
On |
DownloadDataCompleted 이벤트를 발생합니다. |
On |
DownloadFileCompleted 이벤트를 발생합니다. |
On |
DownloadProgressChanged 이벤트를 발생합니다. |
On |
DownloadStringCompleted 이벤트를 발생합니다. |
On |
OpenReadCompleted 이벤트를 발생합니다. |
On |
OpenWriteCompleted 이벤트를 발생합니다. |
On |
UploadDataCompleted 이벤트를 발생합니다. |
On |
UploadFileCompleted 이벤트를 발생합니다. |
On |
UploadProgressChanged 이벤트를 발생합니다. |
On |
UploadStringCompleted 이벤트를 발생합니다. |
On |
UploadValuesCompleted 이벤트를 발생합니다. |
On |
사용되지 않음.
WriteStreamClosed 이벤트를 발생합니다. |
Open |
String지정된 URI를 사용하여 리소스에서 다운로드한 데이터에 대해 읽을 수 있는 스트림을 엽니다. |
Open |
Uri지정된 URI를 사용하여 리소스에서 다운로드한 데이터에 대해 읽을 수 있는 스트림을 엽니다. |
Open |
지정된 리소스를 포함하는 읽기 가능한 스트림을 엽니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Open |
지정된 리소스를 포함하는 읽기 가능한 스트림을 엽니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Open |
작업 개체를 사용하여 지정된 리소스를 비동기 작업으로 포함하는 읽기 가능한 스트림을 엽니다. |
Open |
작업 개체를 사용하여 지정된 리소스를 비동기 작업으로 포함하는 읽기 가능한 스트림을 엽니다. |
Open |
지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. |
Open |
지정된 메서드를 사용하여 지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. |
Open |
지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. |
Open |
지정된 메서드를 사용하여 지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. |
Open |
지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Open |
지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Open |
지정된 메서드를 사용하여 지정된 리소스에 데이터를 쓰기 위한 스트림을 엽니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Open |
작업 개체를 사용하여 지정된 리소스에 데이터를 비동기 작업으로 쓰기 위한 스트림을 엽니다. |
Open |
작업 개체를 사용하여 지정된 리소스에 데이터를 비동기 작업으로 쓰기 위한 스트림을 엽니다. |
Open |
작업 개체를 사용하여 지정된 리소스에 데이터를 비동기 작업으로 쓰기 위한 스트림을 엽니다. |
Open |
작업 개체를 사용하여 지정된 리소스에 데이터를 비동기 작업으로 쓰기 위한 스트림을 엽니다. |
To |
Component이름이 포함된 String 반환합니다(있는 경우). 이 메서드는 재정의해서는 안 됩니다. (다음에서 상속됨 Component) |
Upload |
URI로 식별되는 리소스에 데이터 버퍼를 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 리소스에 데이터 버퍼를 업로드합니다. |
Upload |
URI로 식별되는 리소스에 데이터 버퍼를 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 리소스에 데이터 버퍼를 업로드합니다. |
Upload |
POST 메서드를 사용하여 URI로 식별되는 리소스에 데이터 버퍼를 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 메서드를 사용하여 URI로 식별되는 리소스에 데이터 버퍼를 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 메서드를 사용하고 토큰을 식별하여 URI로 식별되는 리소스에 데이터 버퍼를 업로드합니다. |
Upload |
Byte 배열이 포함된 데이터 버퍼를 작업 개체를 사용하여 비동기 작업으로 지정된 URI에 업로드합니다. |
Upload |
Byte 배열이 포함된 데이터 버퍼를 작업 개체를 사용하여 비동기 작업으로 지정된 URI에 업로드합니다. |
Upload |
Byte 배열이 포함된 데이터 버퍼를 작업 개체를 사용하여 비동기 작업으로 지정된 URI에 업로드합니다. |
Upload |
Byte 배열이 포함된 데이터 버퍼를 작업 개체를 사용하여 비동기 작업으로 지정된 URI에 업로드합니다. |
Upload |
지정된 URI를 사용하여 지정된 로컬 파일을 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 로컬 파일을 지정된 리소스에 업로드합니다. |
Upload |
지정된 URI를 사용하여 지정된 로컬 파일을 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 로컬 파일을 지정된 리소스에 업로드합니다. |
Upload |
POST 메서드를 사용하여 지정된 로컬 파일을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
POST 메서드를 사용하여 지정된 로컬 파일을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
POST 메서드를 사용하여 지정된 로컬 파일을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
작업 개체를 사용하여 지정된 로컬 파일을 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 로컬 파일을 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 로컬 파일을 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 로컬 파일을 리소스에 비동기 작업으로 업로드합니다. |
Upload |
POST 메서드를 사용하여 지정된 문자열을 지정된 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 문자열을 지정된 리소스에 업로드합니다. |
Upload |
POST 메서드를 사용하여 지정된 문자열을 지정된 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 문자열을 지정된 리소스에 업로드합니다. |
Upload |
지정된 문자열을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 문자열을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 문자열을 지정된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
작업 개체를 사용하여 지정된 문자열을 지정된 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 문자열을 지정된 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 문자열을 지정된 리소스에 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 문자열을 지정된 리소스에 비동기 작업으로 업로드합니다. |
Upload |
지정된 이름/값 컬렉션을 지정된 URI로 식별된 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 업로드합니다. |
Upload |
지정된 이름/값 컬렉션을 지정된 URI로 식별된 리소스에 업로드합니다. |
Upload |
지정된 메서드를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 업로드합니다. |
Upload |
지정된 이름/값 컬렉션의 데이터를 지정된 URI로 식별된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 메서드를 사용하여 지정된 이름/값 컬렉션의 데이터를 지정된 URI로 식별된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않습니다. |
Upload |
지정된 메서드를 사용하여 지정된 이름/값 컬렉션의 데이터를 지정된 URI로 식별된 리소스에 업로드합니다. 이 메서드는 호출 스레드를 차단하지 않으며 호출자가 작업이 완료될 때 호출되는 메서드에 개체를 전달할 수 있도록 합니다. |
Upload |
작업 개체를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 비동기 작업으로 업로드합니다. |
Upload |
작업 개체를 사용하여 지정된 URI로 식별된 리소스에 지정된 이름/값 컬렉션을 비동기 작업으로 업로드합니다. |
Disposed |
구성 요소가 Dispose() 메서드 호출에 의해 삭제될 때 발생합니다. (다음에서 상속됨 Component) |
Download |
비동기 데이터 다운로드 작업이 완료되면 발생합니다. |
Download |
비동기 파일 다운로드 작업이 완료되면 발생합니다. |
Download |
비동기 다운로드 작업이 데이터의 일부 또는 전부를 성공적으로 전송할 때 발생합니다. |
Download |
비동기 리소스 다운로드 작업이 완료되면 발생합니다. |
Open |
리소스를 포함하는 스트림을 여는 비동기 작업이 완료되면 발생합니다. |
Open |
리소스에 데이터를 쓰는 스트림을 여는 비동기 작업이 완료되면 발생합니다. |
Upload |
비동기 데이터 업로드 작업이 완료되면 발생합니다. |
Upload |
비동기 파일 업로드 작업이 완료되면 발생합니다. |
Upload |
비동기 업로드 작업이 데이터의 일부 또는 전부를 성공적으로 전송할 때 발생합니다. |
Upload |
비동기 문자열 업로드 작업이 완료되면 발생합니다. |
Upload |
이름/값 컬렉션의 비동기 업로드가 완료되면 발생합니다. |
Write |
사용되지 않음.
쓰기 스트림을 사용하여 리소스에 데이터를 쓰는 비동기 작업이 닫히면 발생합니다. |
제품 | 버전 |
---|---|
.NET | Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9 |
.NET Framework | 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1 |
.NET Standard | 2.0, 2.1 |
.NET 피드백
.NET은(는) 오픈 소스 프로젝트입니다. 다음 링크를 선택하여 피드백을 제공해 주세요.