특정 클래스의 인스턴스 하나만 생성되도록 하고 전체 애플리케이션에 대해 해당 인스턴스에 대한 간단한 글로벌 액세스를 제공해야 하는 경우 Singleton 패턴을 사용할 수 있다. 이번 예제에서는 심플하게 사용할 수 있는 예제를 ‘The Singleton Design Pattern - Part of the Gang of Four’ - IAmTimCorey 유튜브 강좌에서 참고하여 정리하여 보았다.
using System;
namespace ConsoleUI
{
internal class Program
{
private static readonly TableServers Host1List = TableServers.GetTableServers();
private static readonly TableServers Host2List = TableServers.GetTableServers();
private static void Main()
{
for (var i = 0; i < 5; i++)
{
Host1GetNextServer();
Host2GetNextServer();
}
}
private static void Host1GetNextServer()
{
Console.WriteLine("Next Server 1 : " + Host1List.GetNextServer());
}
private static void Host2GetNextServer()
{
Console.WriteLine("Next Server 2 : " + Host2List.GetNextServer());
}
}
}
프로그래밍 언어인 Rust와 C#을 OOP 관점에서 비교해 보았다. Rust는 OOP라기보다는 모듈/함수 지향형 프로그래밍 언어라고 보는 게 더 합당하다고 생각한다. What does “Rust & OOP” mean to you?
struct Door {
is_open: bool,
}
trait Openable {
fn new(is_open: bool) -> Door;
fn open(&mut self);
fn foo1(txt: &str);
fn foo2(&mut self);
}
impl Openable for Door {
fn new(is_open: bool) -> Door {
Door { is_open: is_open }
}
fn open(&mut self) {
self.is_open = true;
}
fn foo1(txt: &str) {
println!("{} {}", "Print foo ...", txt);
}
fn foo2(&mut self) {
Self::foo1("2");
}
}
fn main() {
let mut door = Door::new(false);
println!("{}", if door.is_open { "참" } else { "거짓" });
door.open();
println!("{}", if door.is_open { "참" } else { "거짓" });
Door::foo1("1");
door.foo2();
}
Rust 언어에 기반한 web framework로는 Actix, Rocket, Gotham 등이 있다. 이 중에서 최근에 많이 사용하는 Actix를 이용하여 basic 인증을 포함한 간단한 WebAPI 예제를 구현해보았다. 추가로 데이터베이스와 연동은 하단의 ‘추천강좌’와 ‘Reference’를 참고하자.
[package]
name = "hello_actix"
version = "0.1.0"
authors = ["DebugJO <me@msjo.kr>"]
edition = "2018"
[dependencies]
actix-rt = "1.1.1"
actix-web = "2.0.0"
actix-web-httpauth = "0.4.1"
serde = {version = "1.0.113", features = ["derive"]}
dotenv = "0.15.0"
config = "0.10.1"