Program Language
-
[Flutter] Visual Studio Code에 개발환경 구축하기2020.06.25
-
[C#] 한글 2byte 로 계산 하는 방법2020.06.20
-
[Flutter] Windows에 Flutter 설치2020.06.20
-
[C#] MSBuild 빌드 시 C# 언어 버전 변경2020.03.26
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리
우연치 않은 기회가 되어, 각 프로젝트에서 사용하는 HTTP를 호출하는 상황에 대해서 여러 코드를 보게 되었습니다.
몇개의 프로젝트 및 툴들을 조사하다 보니 정말 다양한 방법으로 HTTP를 요청하고 있었는데요.
기회가 된 김에 정리를 한번 해보려고 합니다. 정리를 하다 보니 더 다양하게 알게 되는거 같아서 좋았습니다.
.NET Framework에서 사용하는 방식에 대해서만 정리를 했습니다.
.NET Framework에서 작업할 때 HTTP 요청을 사용하기 위해서는 세가지 방법이 있습니다.
WebRequest (HttpWebRequest)
WebClient
HttpClient
위 class들을 어떻게 사용하는 것이 좋은가? 세가지 class가 다 필요한 것인가? 에대한 질문을 스스로 던져보았는데요.
결론은, 각각 존재해야 하는 이유가 있었습니다. 물론 MSDN를 보게되면 HttpClient를 권장하는 것 같지만
몇가지 이유에 의해서 각각의 Class 들은 존재 해야 합니다.
System.Net.WebRequest
System.Net.WebRequest 는 추상 클래스 입니다. 따라서 이 클래스를 사용하여 HTTP 요청을 사용하려면 HttpWebRequest 또는 FileWebRequest 를 사용해서 작성해야 한다고 합니다.
이 클래스를 이용해서 작업시, Header, Cookie, Protocol 및 시간초과에 액세스 하고 작업할 수 있는 장점이 있으며,
HTTP 요청에 대한 세밀한 컨트롤이 가능한 장점이 있습니다.
가장 많이 접한 class 또한 HttpWebRequest class 였습니다.
System.Net.WebClient
WebClient는 HttpWebRequst의 Wrapper 이므로, 내부적으로는 HttpWebRequest를 사용합니다.
따라서 WebClient는 HttpWebRequest에 비해 약간 느리지만, 적은량의 소스 코드만으로도 동작 할 수 있습니다.
HttpWebRequest가 제공하는 추가 기능을 활용할 필요가 없다면 WebClient를 사용하는 것이 나은 선택입니다.
하지만 이 외에 WebClient는 HttpClient에서 지원하지 못하는, 다운로드를 위한 진행 상황을 제공합니다.
또한, WebRequest와 마찬가지로 FTP를 지원합니다.
이 두 부분이 HttpClient 와 WebClient의 사용성을 구분짓는 것 같습니다.
System.Net.Http.HttpClient
HttpClient 는 .NET Framework 4.5에서 도입되었습니다.
HttpClient는 HttpWebRequest의 유연성과 WebClient의 단순성을 결합하여 제공하기 때문에, 해당 프레임워크를 사용하는 환경이라면, HttpClient 를 사용하는 것을 권장하고 있습니다.
HttpWebRequest는 요청/응답 객체에 대한 많은 제어 기능을 제공하기 때문에, 이러한 기능이 필요하다면 HttpClient 보다는 HttpWebRequest를 사용해야 합니다만, HttpClient는 FTP를 지원하지 않습니다.
HttpClient의 모든 I/O 바인딩 메소드는 비동기식이며, 동일한 HttpClient 인스턴스를 사용해서 동시 요청을 수행할 수 있습니다. 즉, 동기 비동기식을 모두 제공합니다.
HttpClient는 한 번 인스턴스화되고 응용프로그램의 수명주기 전체에서 재사용 하도록 설계되었습니다.
만약 반복적으로 HttpClient를 사용한다면, 매번 할당 후 제거하는 방식이 아닌 한번 사용한 객체를 재사용하도록 설계하여야 합니다. new 키워드로 HttpClient를 생성 할 때마다 사용 가능한 소켓이 많은 트래픽으로 소진되기 때문에 SocketException이 발생 할 수 있습니다.
그러므로 HttpClient의 권장 사용 방법은 단일 공유 HttpClient 인스턴스를 작성 하는 것 입니다.
개인적인 정리
1. .NET Framework 4.5 를 이용하는 환경이라면 HttpClient 를 사용하는 것을 권장합니다.
2. 단. HttpClient를 사용한다면, 단일화된 HttpClient 인스턴스를 생성하고 재사용 하는 것이 좋습니다. (static)
3. HttpClient는 WebClient를 완전히 대체하지 못하기 때문에, 필요에 따라 WebClient를 사용해야 합니다.
4. .NET Framework 4.5 버전을 사용 못하는 환경이라면, HttpWebRequest 와 WebClient의 장점을 비교해서 사용하시면 됩니다.
5. 요청 및 응답에 따른 다양한 제어 및 헤더, 쿠키등등 HTTP의 구성요소를 사용해야 한다면 HttpWebRequest 를 이용하는 것이 좋습니다.
추가 사항
MSDN을 들어가 보면, 위와 같이 새로운 개발환경이라면, WebClient, HttpWebRequest 를 추천하지 않으며,
System.Net.Http.HttpClient Class를 사용하라고 안내문구가 나오고 있습니다.
필요에 따라서 HttpWebRequest는 사용해도 괜찮을거 같지만 이렇게 문구가 적혀있다보니 HttpClient로 넘어가는 작업을 해봐야겠습니다.
하지만, HttpClient는 WebClient가 지원하는 일부 기능을 지원하지 않으니...
정말 필요에 따라 선택해서 사용해야겠습니다.
참고
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
https://www.infoworld.com/article/3198673/when-to-use-webclient-vs-httpclient-vs-httpwebrequest.html
https://stackoverflow.com/questions/20530152/deciding-between-httpclient-and-webclient/27737601#27737601
'Program Language > C#' 카테고리의 다른 글
[C#] MessagePack 사용 방법 (0) | 2020.07.13 |
---|---|
[C#] Zeroformatter 사용 방법 (0) | 2020.07.08 |
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
[C#] ICloneable 인터페이스를 이용한 객체 복사 (1) | 2020.05.19 |
[C#] MSBuild 빌드 시 C# 언어 버전 변경 (0) | 2020.03.26 |
[Flutter] Visual Studio Code에 개발환경 구축하기
Android Studio 가 익숙하지 않으신 분들은 VSCode 툴을 이용해서 Flutter를 개발하실 수 있습니다.
Visual Studio Code가 Android Studio 보다는 구동이 가볍기 때문에, 환경에 맞는 툴을 이용하셔서 개발하는 것을 추천 드립니다.
1. Extension 설치
Visual Studio Code를 실행한 다음, 좌측에 보시면 아래 모양의 아이콘을 클릭하시면 각종 Extension 들을 설치 하실 수 있습니다.
Flutter Extension 설치
Flutter를 검색하셔서 설치 하시면 되며, Dart 언어도 같이 설치가 되기 때문에 Flutter 만 검색 하셔서 설치 하시면 됩니다.
Rainbow Brackets 설치
Dart 언어의 특성상 브라켓이 많아 가독성을 조금이라도 늘리고 싶으면 Rainbow Brackets 라는 플러그인을 추천 합니다.
2. 프로젝트 만들기
Windows 환경의 경우 Ctrl + Shift + P 혹은 / View -> Command Palette 를 입력하시면, 아래와 같은 입력 창이 나타납니다.
해당 입력 창에서 flutter를 입력하시면, 상단에 새로운 프로젝트를 만들 수 있는 명령어가 보여집니다.
해당 명령어를 입력하시면 새로운 프로젝트를 생성 하실 수 있습니다.
프로젝트 명을 입력하시면, 아래와 같이 기본 템플릿이 생성되어 집니다.
디바이스 선택
CMD+SHIFT+P 입력 후 Flutter: Launch Emulator 를 입력하면, 안드로이드 디바이스를 선택할 수 있습니다.
Android Studio 에서 만드신 Emulator가 보이실 겁니다.
아니면, 요즘 PC에 많이들 설치하시는 설치형 에뮬레이터를 키고 진행하셔도 됩니다.
빌드
Run 메뉴에 가서 Start Debugging을 선택하시거나, F5 키를 누르시면, 선택하신 에뮬레이터로 빌드가 되는 모습을 보실 수 있습니다.
'Program Language > Flutter' 카테고리의 다른 글
[Flutter] Windows에 Flutter 설치 (0) | 2020.06.20 |
---|
[C#] 한글 2byte 로 계산 하는 방법
한글을 2byte로 계산하기위해서 기본적으로 이해를 하셔야 하는 부분은 바로 Unicode 입니다.
해당 부분에 대한 이해없이 단순히 Encoding을 이용해서 Byte 수를 계산한다면,
한글자당 2~3 으로 byte수가 변하는 것을 경험하시게 될겁니다.
한줄로 요약한다면,
유니코드는 국제표준 문자표이고 UTF-8은 인코딩 방식입니다.
Unicode는 전세계 언어를 모두 표시할 수 있는 표준코드 입니다.
그래서 언어자체의 의미로 byte 수를 계산하려고 한다면 Unicode로 인코딩 해서 계산하여야 합니다.
그렇지 않다면, 아래와 같은 오류를 범하실 수 있습니다.
string str = "헬로우월드다";
byte[] data = Encoding.Default.GetBytes( str )
int count = data.Length;
// count = 18
기본적으로 System.Text.Encoding 클래스의 Default 를 사용하게 되면 UTF8 인코딩을 이용하게 됩니다.
UTF8 인코딩일 경우 한글 1글자당 3Byte 로 잡히기 때문에
위에 예시처럼 6글자의 한글일 경우 18byte 로 잡히게 됩니다.
즉, 일반적인 웹사이트에서 한글 1글자당 2byte로 표기 해달라는 요청에 UTF8 인코딩을 이용하게 되면,
어긋나는 결과가 나오게 됩니다.
이러한 요청에는 Unicode를 이용하여 Encoding 해줘야 합니다.
string str = "헬로우월드다";
byte[] data = Encoding.Unicode.GetBytes( str )
int count = data.Length;
// count = 12
동일한 예제를 Unicode로만 변경했을 경우, 우리가 원하는 한글 6글자에 12Byte 길이의 값을 가질 수 있습니다.
'Program Language > C#' 카테고리의 다른 글
[C#] Zeroformatter 사용 방법 (0) | 2020.07.08 |
---|---|
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
[C#] ICloneable 인터페이스를 이용한 객체 복사 (1) | 2020.05.19 |
[C#] MSBuild 빌드 시 C# 언어 버전 변경 (0) | 2020.03.26 |
[C#] C#에서 unsafe 키워드 사용 방법 (0) | 2020.03.10 |
[Flutter] Windows에 Flutter 설치
iOS와 Android 두 플랫폼을 멀티로 지원하는 플랫폼은 제가 알기로는 두개였었습니다.
첫번째가 Xamarin 이였고, 그 다음이 React 였는데요.
우연한 기회에 Flutter를 알게 되었습니다. Google에서 만든 Mobile App SDK 입니다.
Google에서 개발 하였다고 하니, 지원이 좋을것 같아서 공부해 보는 계기가 되었습니다.
1. 설치
위 설치 경로로 접속을 하시면, 아래와 같은 화면을 보실 수 있습니다.
설치가 필요한 OS에 맞게 링크를 클릭합니다.
2. 다운로드
위 경로로 진입하시면 두가지 방법으로 SDK를 다운 받으실 수 있습니다.
한가지 방식은 zip 파일을 다운 받으셔서, 압축을 풀고 진행하시는 방식이 있고,
git을 이용해서, 아래 주소의 git 파일을 다운 받아서 사용하는 방식입니다.
C:\src>git clone https://github.com/flutter/flutter.git -b stable
위 두가지 방식 중 본인에게 필요한 방식으로 다운로드를 진행하시면 됩니다.
3. 환경 변수 등록
설치형 SDK가 아니기 때문에, flutter 명령어를 자유롭게 사용하려고 하신다면, 환경변수로 등록하셔야 합니다.
flutter 를 설치한 경로의 bin 폴더까지 Path에 등록하시면 됩니다.
4. Flutter 설정
flutter를 사용하기 적절한 환경인지, 체크해주는 명령어가 있습니다.
바로 아래의 명령어 인데요.
해당 명령어를 이용하면, 총 4가지 상태를 체크하게 됩니다.
C:\>flutter doctor
위 까지 진행하셨다면, 첫번째만 체크가 되어 있을텐데요.
저는 Android Studio 가 설치 되어 있어서, 해당 부분도 체크가 되어 있었습니다.
두번째 체크를 진행하시려면, 아래의 명령어를 입력해서 licenses를 수락하셔야 합니다.
대부분 y 를 입력하시면 통과 됩니다.
c:\> flutter doctor --android-licenses
정상적으로 두번째가 체크된걸 확인 하실 수 있습니다.
이제 마지막 단계인데요. 이부분은 device 를 연결하셔도 되고,
Android Studio에 있는 디바이스 를 실행 시키고 진행하셔도 통과가 됩니다.
'Program Language > Flutter' 카테고리의 다른 글
[Flutter] Visual Studio Code에 개발환경 구축하기 (0) | 2020.06.25 |
---|
[C#] ICloneable 인터페이스를 이용한 객체 복사
List<T> 혹은 Dictionary 자료구조를 이용해서 Referance Class를 Add 할 경우, 간혹 실수 하는 부분이 있습니다.
Add 시점에 값을 변경할 경우, 기존에 Add 한 영역까지 참조 값이 바뀌는 부분인데요.
new 키워드를 이용해서 반복적으로 Add할 경우에는 문제가 없지만,
foreach ( var item in listData )
{
gamePlayData.Add( new Item{ Index = eventCount++, Score = score } );
}
부득이하게, Global로 선언된 변수를 Add 하는 시점에 값을 변경하는 경우가 발생합니다.
foreach ( var item in listData )
{
item.Index = eventCount++;
item.Score = score;
gamePlayData.Add( item );
}
이럴 경우, listData가 여러개를 가지고 있다면, 기존의 Add 한 item까지 같은 값으로 참조값이 변경되어 집니다.
예제는 간단한 class를 이용해서 new 키워드를 이용해서 값을 넣어도 상관없지만,
class의 크기가 많다면, 코드량이 상당이 증가하게 될텐데요.
이 경우 ICloneable 인터페이스를 이용하게 손쉽게 해결이 가능합니다.
IClonealbe
해당 인터페이스를 사용하면, 기존 개체의 복사본을 만드는 사용자 지정 구현을 제공할 수 있습니다.
ICloneable 인터페이스에는 Object.MemberwiseClone에서 제공 하는 것 이상의 복제 지원을 제공 하기 위한 Clone 메서드인 하나의 멤버가 포함 되어 있습니다.
복제, 전체 복사본 및 단순 복사본 및 예제에 대 한 자세한 내용은 Object.MemberwiseClone 메서드를 참조 하세요.
위 내용이 MSDN에 설명되어져 있는 내용입니다.
https://docs.microsoft.com/ko-kr/dotnet/api/system.icloneable?view=netcore-3.1
구현 방법
Clone 를 이용하려는 Class 에 IClonealbe 인터페이스를 참조하고, Clone() 메소드를 구현하면 됩니다.
이때 MemberwiseClone() 메소드를 이용하시면, 현재 Object의 단순 복사본을 만듭니다.
public class Item : ICloneable
{
public int Index { get; set; }
public int Score { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
'Program Language > C#' 카테고리의 다른 글
[C#] HttpWebRequest, WebClient, HttpClient 사용 방식에 대한 정리 (1) | 2020.06.30 |
---|---|
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
[C#] MSBuild 빌드 시 C# 언어 버전 변경 (0) | 2020.03.26 |
[C#] C#에서 unsafe 키워드 사용 방법 (0) | 2020.03.10 |
[C#] SQL Injection 예방 코드 (1) | 2020.02.12 |
[C#] MSBuild 빌드 시 C# 언어 버전 변경
.NET Framework 4.8 환경에서 개발을 진행 하던 도중, 기본 리터럴 기능을 사용할 일이 있었습니다.
직접 사용한 것은 아니지만, 다른 분이 작업한 내용을 우연히 가지고 오는 과정에서 빌드 오류가 발생해서 찾아본 내용이였습니다.
Visual Studio 에서는 정상적으로 빌드가 진행이 되지만, MSBuild 를 이용해서 빌드를 진행하는 과정에서 .NET Framework의 버전은 같으나, 언어 버전이 발생해서 빌드 오류가 발생했습니다.
1. 기본 리터럴 구문의 사용은 C# 7.0 에서는 사용 불가!
public DataModel GetData()
{
return default( DataModel );
}
'기본 리터럴' 기능은 C# 7.0에서 사용할 수 없습니다. 언어 버전 7.1 이상을 사용하세요.
2. 빌드 구성에서의 언어 버전 변경
프로젝트 속성에 들어가면, 빌드에 대한 구성을 변경하는 메뉴를 확인 할 수 있습니다.
아래 화면 우측 하단의 "고급" 메뉴를 클릭해줍니다.
고급 빌드 설정에 들어가면, 언어 버전을 변경하는 메뉴가 보여집니다.
VS에서는 최신 주버전 빌드로 되어 있어 빌드에 무리가 없지만, MSBuild 로 빌드를 할 경우에는 특정 언어 버전을 명시해주는게 좋습니다.
아래와 같이 7.3 버전으로 변경하였습니다.
3. 프로젝트 파일 편집
위 방법으로도 가능하지만, 프로젝트 파일을 직접 변경함으로써, 오류를 수정할 수 있습니다.
LangVersion 을 특정 버전으로 명시해 주면 됩니다.
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/configure-language-version
'Program Language > C#' 카테고리의 다른 글
[C#] 한글 2byte 로 계산 하는 방법 (0) | 2020.06.20 |
---|---|
[C#] ICloneable 인터페이스를 이용한 객체 복사 (1) | 2020.05.19 |
[C#] C#에서 unsafe 키워드 사용 방법 (0) | 2020.03.10 |
[C#] SQL Injection 예방 코드 (1) | 2020.02.12 |
[C#] const와 readonly의 차이 (0) | 2020.02.06 |