본문 바로가기

분류 전체보기241

[TypeORM] Eager and Lazy Relations https://orkhan.gitbook.io/typeorm/docs/eager-and-lazy-relations Eager relations 즉시 관계는 엔티티를 로드할 때 마다 자동으로 같이 로드된다. import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from "typeorm" import { Question } from "./Question" @Entity() export class Category { @PrimaryGeneratedColumn() id: number @Column() name: string @ManyToMany((type) => Question, (question) => question.categories) questio.. 2023. 8. 31.
[TypeORM] What is EntityManager and Repository https://orkhan.gitbook.io/typeorm/docs/working-with-entity-manager https://orkhan.gitbook.io/typeorm/docs/working-with-repository What is EntityManager EntityManager를 사용하여 entity를 관리할 수 있다. EntityManager는 단지 단일 공간 내에 모든 엔티티 레포지토리의 집합이다. 데이터소스를 통해 entityManager에 접근할 수 있다. import { DataSource } from "typeorm" import { User } from "./entity/User" const myDataSource = new DataSource(/*...*/) const u.. 2023. 8. 31.
[TypeORM] Working with DataSource https://orkhan.gitbook.io/typeorm/docs/data-source What is DataSource 데이터 소스를 설정해야 DB와 소통이 가능하다. 데이터베이스 연결 설정 정보를 가지고 잇고 초기 데이터베이스 연결이나 커넥션 풀 설립을 담당한다. 초기 연결 설립, 커넥션 풀 설립을 위해 initialize 메소드를 호출해야 한다. destroy 메소드가 불릴 때, 연결이 끊긴다. 일반적으로 어플리케이션 bootstrap에서 initialize 메소드를 호출한다. DB와 완전히 처리가 끝난 이후에 destroy를 호출한다. 예를 들어 백엔드 개발을 하고 있고 서버가 닫히지 않는다면, destroy를 절대 호출되지 않는다. Creating a new DataSource 데이타소스 인.. 2023. 8. 30.
[TypeORM] DataSource API https://orkhan.gitbook.io/typeorm/docs/data-source-api dataSource.isInitialized 데이터소스 초기화와 데이터베이스 연결, 커넥션 풀 여부 dataSource.driver 데이터 소스에서 사용된 기본 DB 드라이버 dataSource.manager 엔티티 매니저 dataSource.mongoManager 몽고DB 매니저 await dataSource.initialize() 데이터소스 초기화, DB 커넥션 풀을 연다. await dataSource.destroy() 데이터 소스 종료 및 모든 DB커넥션을 종료한다. 주로 어플리케이션 종료시 사용 await dataSource.synchronize() 데이터베이스 스키마를 동기화한다. 데이터소스 옵션.. 2023. 8. 30.
[C#] Thread Local Storage 쓰레드는 힙 영역과 데이터 영역을 공유한다. Thread마다 가질 수 있는 공유한 영역을 만드려면 Thread Local Storage(TLS) 를 사용하면 된다. 다음 예제는 TLS로 생성한 영역에 이름을 넣고 출력하는 예제이다. Sleep을 걸어서 다른 쓰레드가 값을 건드리는지 확실하게 체크한다. class ThreadProgram { static ThreadLocal ThreadName = new ThreadLocal(); //static string ThreadName; static void WhoAmI() { ThreadName.Value = $"My name is {Thread.CurrentThread.ManagedThreadId}"; Thread.Sleep(1000); Console.Writ.. 2023. 8. 28.
[C#] AutoResetEvent AutoResetEvent는 키를 얻고 문을 닫는(다른 스레드 접근 불가) 처리를 자동으로 진행해준다. class Lock { // 문을 닫는 행위를 자동으로 해준다. 커널 단위의 실행. SpinLock은 커널에 요청하지 않음 AutoResetEvent _available = new AutoResetEvent(true); public void Acquire() { _available.WaitOne(); // 입장 시도 } public void Release() { _available.Set(); // flag = true } } class ThreadProgram { static int _num = 0; static Lock _lock = new Lock(); static void Thread_1() {.. 2023. 8. 26.
[C#] SpinLock 키를 가진 사람은 하나이고 화장실에 들어가서 문을 잠근다. 볼일을 보고 나가면서 키를 두고 나간다. 다음 코드는 SpinLock이 제대로 동작하지 않는 코드이다. class SpinLock { volatile bool _locked = false; public void Acquire() { while (_locked) { // 잠김이 풀릴 때까지 기다린다. } _locked = true; } public void Release() { _locked = false; } } class ThreadProgram { static int _num = 0; static SpinLock _lock = new SpinLock(); static void Thread_1() { for (int i = 0; i 우선순위가 .. 2023. 8. 26.
[C#] Interlocked 원자성이란? 어떠한 동작이 한번에 일어나야 하는 것을 의미한다. 예시) 돈을 송금하는 상황 1. 돈을 내 계좌에서 줄인다. 2. 상대 계좌에 돈을 늘린다. 만약 1번까지만 성공하고, 2번에서 문제가 생겼다면? 원자성을 보장하지 않는 것이다. 이를 막기 위해 Interlocked 함수를 이용한다. 다음 코드는 쓰레드를 실행시켜 공유 변수인 number에 접근하는 예제이다. 0이 나오지 않는다. class ThreadProgram { static int number = 0; static void Thread_1() { for (int i = 0; i 2023. 8. 26.
[C#] MessagePack MessagePack https://github.com/MessagePack-CSharp/MessagePack-CSharp Serializer for C# 퍼포먼스가 중요한 게임, 분산 컴퓨팅, 마이크로 서비스, 데이타 캐시 목적으로 사용된다. 사용 방법 Serialize 하길 원하는 class 또는 struct에 [MessagePackObject]를 붙인다. 처리되어야 하는 필드에 [Key] 속성을 붙인다. 처리하길 원하지 않는 필드에 [IgnoreMember] 속성을 붙인다 [MessagePackObject] public class MyClass { // Key attributes take a serialization index (or string name) // The values must be u.. 2023. 8. 26.
[C#] 메모리 베리어 하드웨어는 최적화를 위해 연관성이 없는 연산의 순서를 바꿀 수 있다. 이러한 최적화를 막기 위해 메모리 베리어를 사용한다. 메모리 베리어의 기능 1. 코드 재배치 억제 2. 가시성 재배치 억제는 하드웨어의 연산 최적화를 허용하지 않는 것이다. 가시성은 데이터를 메모리에 올리고, 다시 받아오는 개념이다. 메모리 베리어의 종류 1. Full Memory Barrier: Store/Load 둘 다 막는다. 2. Store Memory Barrier: Store만 막는다. 3. Load Memmory Barrier: Load만 막는다. 다음 프로그램에서 r1과 r2에는 0이 들어가지 않을 것처럼 보이지만, 실제로는 0이 들어가 loop를 빠져나온다. 이는 컴파일러에서 최적화를 위해 연산 순서를 재배치하기 때문이.. 2023. 8. 26.