httppipeline 완료, mqttPipeline 개발 중. test 코드 작성 필요

This commit is contained in:
logonkhi
2025-06-09 19:29:59 +09:00
parent 4b490d79f4
commit ac3645577a
14 changed files with 2347 additions and 264 deletions

View File

@@ -8,6 +8,44 @@ using System.Linq;
namespace UVC.Data
{
/// <summary>
/// 키-값 쌍의 데이터를 관리하고 변경 사항을 추적하는 동적 데이터 객체입니다.
/// SortedDictionary를 상속하여 키를 기준으로 정렬된 데이터를 제공합니다.
/// </summary>
/// <remarks>
/// 이 클래스는 JSON과 호환되는 데이터 구조를 표현하며, 데이터 변경 추적 기능을 통해
/// 효율적인 데이터 동기화를 지원합니다.
/// </remarks>
/// <example>
/// <code>
/// // DataMask 생성 및 설정
/// var mask = new DataMask();
/// mask.ObjectIdKey = "id";
/// mask.ObjectName = "users";
///
/// // 필드 이름 변환 설정
/// mask.NamesForReplace = new Dictionary&lt;string, string&gt;
/// {
/// { "userName", "name" },
/// { "userEmail", "email" }
/// };
///
/// // JObject 속성으로 마스킹 규칙 추가
/// mask["include"] = new JArray("name", "email", "age");
/// mask["exclude"] = new JArray("password", "token");
///
/// // DataObject에 마스크 적용하는 예시
/// var dataObject = new DataObject();
/// dataObject["userName"] = "홍길동";
/// dataObject["userEmail"] = "hong@example.com";
/// dataObject["password"] = "secret123";
///
/// // 마스크 적용 결과 (개념적 예시):
/// // - userName은 name으로 변환됨
/// // - userEmail은 email로 변환됨
/// // - password는 제외됨
/// </code>
/// </example>
public class DataObject : SortedDictionary<string, object>, IDataObject
{
@@ -27,7 +65,9 @@ namespace UVC.Data
public string Name { get; internal set; } = string.Empty;
// 직접적인 변경이 있었던 키를 저장하는 리스트
/// <summary>
/// 직접적인 변경이 있었던 키를 저장하는 리스트입니다.
/// </summary>
protected List<string> changedProperies = new List<string>();
/// <summary>
@@ -132,7 +172,7 @@ namespace UVC.Data
}
/// <summary>
/// 새 속성을 추가할 때 이벤트 연결을 처리합니다.
/// 새 속성을 추가하고 변경 사항을 추적합니다.
/// </summary>
/// <param name="propertyName">추가할 속성의 이름</param>
/// <param name="value">속성의 값</param>
@@ -152,9 +192,11 @@ namespace UVC.Data
}
/// <summary>
/// 인덱서를 통 속성 설정을 처리합니다.
/// 속성 변경 변경 사항을 자동으로 추적합니다.
/// 인덱서를 통 속성값에 접근하고 설정합니다.
/// 속성값이 변경될 때마다 변경 사항을 자동으로 추적합니다.
/// </summary>
/// <param name="key">접근할 속성의 키</param>
/// <returns>속성값</returns>
public new object this[string key]
{
get => base[key];
@@ -184,7 +226,12 @@ namespace UVC.Data
}
}
/// <summary>
/// 지정된 속성의 값을 정수(int)로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 정수 값 또는 기본값</returns>
public int GetInt(string propertyName, int defaultValue = 0)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -196,6 +243,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 문자열(string)로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 null인 경우 반환할 기본값</param>
/// <returns>변환된 문자열 값 또는 기본값</returns>
public string? GetString(string propertyName, string? defaultValue = null)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -205,6 +258,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 불리언(bool)으로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 불리언 값 또는 기본값</returns>
public bool GetBool(string propertyName, bool defaultValue = false)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -216,6 +275,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 부동 소수점(float)으로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 부동 소수점 값 또는 기본값</returns>
public float GetFloat(string propertyName, float defaultValue = 0f)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -227,6 +292,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 더블 정밀도 부동 소수점(double)으로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 더블 값 또는 기본값</returns>
public double GetDouble(string propertyName, double defaultValue = 0.0)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -238,6 +309,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 DateTime으로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 DateTime 값 또는 기본값</returns>
public DateTime? GetDateTime(string propertyName, DateTime? defaultValue = null)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -249,6 +326,13 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 열거형(Enum)으로 변환하여 반환합니다.
/// </summary>
/// <typeparam name="T">변환할 열거형 타입</typeparam>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>변환된 열거형 값 또는 기본값</returns>
public T GetEnum<T>(string propertyName, T defaultValue = default) where T : Enum
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -260,6 +344,27 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 IDataObject로 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 IDataObject가 아닌 경우 반환할 기본값</param>
/// <returns>IDataObject 인터페이스를 구현한 객체 또는 기본값</returns>
public IDataObject? Get(string propertyName, IDataObject? defaultValue = null)
{
if (TryGetValue(propertyName, out object value) && value != null)
{
if (value is IDataObject dataObject) return dataObject;
}
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 DataArray로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>DataArray 객체 또는 기본값</returns>
public DataArray? GetDataArray(string propertyName, DataArray? defaultValue = null)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -272,6 +377,12 @@ namespace UVC.Data
return defaultValue;
}
/// <summary>
/// 지정된 속성의 값을 DataObject로 변환하여 반환합니다.
/// </summary>
/// <param name="propertyName">속성 이름</param>
/// <param name="defaultValue">속성이 없거나 변환할 수 없는 경우 반환할 기본값</param>
/// <returns>DataObject 객체 또는 기본값</returns>
public DataObject? GetDataObject(string propertyName, DataObject? defaultValue = null)
{
if (TryGetValue(propertyName, out object value) && value != null)
@@ -303,7 +414,7 @@ namespace UVC.Data
}
/// <summary>
/// 모든 속성을 제거할 때 기존 속성 목록과 변경된 키 목록도 초기화합니다.
/// 모든 속성을 제거하고 추적 리스트를 초기화합니다.
/// </summary>
public void RemoveAll()
{
@@ -362,6 +473,17 @@ namespace UVC.Data
return updated;
}
/// <summary>
/// 업데이트 된 속성의 수.
/// </summary>
/// <returns>업데이트된 속성의 총 개수입니다. 업데이트된 속성이 없으면 0을 반환합니다.</returns>
public int UpdatedCount { get => changedProperies.Count; }
/// <summary>
/// DataObject의 내용을 문자열로 반환합니다.
/// 각 키-값 쌍이 "키:값" 형식으로 쉼표로 구분되어 표시됩니다.
/// </summary>
/// <returns>DataObject의 내용을 나타내는 문자열</returns>
public override string ToString()
{
return string.Join(", ", this.Select(kvp => $"{kvp.Key}:{kvp.Value}"));