컴파일러가 C++11을 완전히 지원하는 경우 싱글톤을 구현하는 가장 좋은 방법은 ‘Magic Static’을 사용하는 것이다1. C++11부터는 static 객체 생성이 스레드에 안전하게 보장하도록 표준에 추가되었다2. 참고로 Qt(C++)에서 QThread, QMutex 사용법에 대한 예제는 msjo.kr, Qt(C++) QThread, QMutex에서 볼 수 있다.
#ifndef SINGLETON_H
#define SINGLETON_H
template <typename T> class Singleton final
{
public:
static T &GetInstance()
{
static T instance;
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
Singleton(Singleton &&) = delete;
Singleton &operator=(Singleton &&) = delete;
};
#endif // SINGLETON_H
‘Async Void’ 사용은 일반적으로 아래의 이유를 들어 좋지 않은 것으로 간주한다1.
C#에서 악명 높은 ‘Async Void’를 방지하는 좋은 방법으로 ‘ContinueWith’를 사용하는 것인데 아래의 소스는 SingletonSean(유튜브채널)의 ‘C# ASYNC/AWAIT’2 강좌에서 필요한 부분만 추출하여 전체 소스 형태로 편집한 것이다.
using System;
using System.Threading.Tasks;
namespace AsyncAwaitDemo
{
internal class Program
{
private static void Main()
{
var car = Car.CreateCarWithStartedEngine(OnEngineStarted);
Console.WriteLine(car.Status);
Console.ReadKey(true);
}
private static void OnEngineStarted(Task task)
{
if (task.Exception != null)
{
Console.WriteLine("Failed to start engine");
}
else
{
Console.WriteLine("Car.IsEngineStarted=" + Car.IsEngineStarted + ", Done.");
}
}
}
}
대용량의 데이터를 한 번에 입력, 수정, 삭제할 때 대부분의 개발자는 ‘for’와 같은 루프 문을 사용하여 이를 처리하는 데 처리할 ‘row’의 개수만큼 operation이 발생하므로 RDBMS가 SQL Server의 경우 Bulk Operation 기법을 사용하여 한 번에 처리하도록 해야 한다. 또는 Table 변수를 사용하여 한 번에 모든 데이틀 넘겨주고 데이터베이스에서는 이를 한 번의 로직으로 처리하도록 유도해야 한다(ASP.NET MVC, Delete Multiple Rows With Checkbox).
소스 예제는 ‘Thumb IKR - Programming Examples’의 유튜브 강좌를 참고하였고 일부 소스는 수정하였다. VS2019에서 ASP.NET Core 웹 애플리케이션(MVC) 프로젝트를 생성하고 기본값을 그대로 사용하였으며 변경된 부분의 코드 위주로 아래에 소소를 나열하였다. 추가한 nuget package는 RepoDb.SqlServer와 RepoDb.SqlServer.BulkOperations이다(repodb.net).
{
"ConnectionStrings": {
"testdb": "Server=아이피주소;Database=디비;User Id=아이디;Password=패스워드;"
}
}
namespace BulkCRUD.Models
{
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
public string Roll { get; set; }
}
}