C#에서 SerialPort를 사용 시 문자 인코딩 문제가 발생할 때 Microsoft에서 지정한 인코딩 목록을 참고하여 이 문제를 해결하는데 Singleton 패턴1을 적용한 SerialPort Manager class2와 닷넷의 Encoding Class를 사용하였다. 아래의 표는 대표적인 한글 관련 인코딩 목록3이다.
코드페이지 | 이름 | 표시이름 |
---|---|---|
949 | ks_c_5601-1987 | 한국어 |
51949 | euc-kr | 한국어(EUC) |
65001 | utf-8 | 유니코드(UTF-8) |
Windows 프로그램은 기본적으로 UTF-8 중심으로 문자열을 처리한다. 그러나 MS-Windows는 euc-kr을 확장한 CP949(MS949)와 Unicode로 한글을 처리하므로 MS-Windows에서는 영문, 숫자와 별개로 한글을 byte 단위로 처리할 때 2byte 또는 3byte의 문자가 혼재할 수 있다4. 아래의 예제는 2byte (AnsiString) 한글을 처리할 필요가 있을 때 참고할 만한 소스이다.
Encoding 클래스에서 기본적으로 제공하는 ‘ASCII, Default, UTF8’ 외에 Encoding.CodePages 에서 제공하는 GetEncoding 함수5를 사용하여 코드 페이지를 지정할 수 있다. SerialPort Manager class는 원저자의 소스를 수정하여 사용하였다.
DI(Dependency Injection)도 디자인 패턴의 일종이다. A 클래스의 함수를 B 클래스에서 호출하기 위해서는 클래스 의존성을 가져야 한다. 하나의 클래스를 수정할 때 다른 하나의 클래스도 수정해야 하는 높은 결합도(coupling) 문제가 발생한다1. 이러한 의존성을 제거하기 위해 의존성 제거 후 다시 의존성을 주입해주는 것이다2.
클래스의 생성자, Interface를 사용하여 Interface에만 의존하게 하면 Interface만 있으면 된다. 이런 결과로 다른 개발자가 어떤 클래스를 완성할 때까지 기다릴 필요가 없음으로 개발속도가 빨라질 수 있다.
아래의 예제3는 C# Console Application이며 .NET 버전은 5.0을 사용했다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 필요한 객체를 받아서 사용하는 것이다.
CQRS(Command and Query Responsibility Segregation, 명령과 쿼리의 역할 분리) 패턴은 데이터 저장소에 대한 읽기 및 업데이트 작업을 분리하여 구현하는 것으로 이렇게 하면 성능, 확장성 및 보안을 최대화할 수 있는 장점이 있다1.
CQRS는 정보를 업데이트할 때와 조회할 때 다른 모델을 사용하는 것이 핵심이다. 다만, 일부 경우에는 이점이 있지만, 대부분의 경우에는 CQRS를 적용하면 복잡성이 높아지는 위험성이 있다. CQRS는 시스템의 Bounded Context2에서만 사용돼야 하고, 시스템 전체에서 사용해서는 안 된다. 이러한 사고방식은 각 Bounded Context는 개별적으로 모델링을 해야 한다는 의미다3.
아래의 예제는 닷넷 API 프로젝트에 MediatR 패키지를 사용하여 CQRS를 구현한 간단한 예제이다. ‘Jonathan Williams’의 강좌4 를 참고하였으며 자세한 전체 예제는 GitHub(CQRSInDotnetCore)5에서 볼 수 있다.