본문 바로가기

전체 글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.
[C#] 캐시 메모리 철학 캐시의 철학 1. 방금 주문한 테이블에서 추가 주문이 나올 확률이 높다. (Temporal Locality) 2. 방금 주문한 사람 근처에 있던 사람이 추가 주문할 확률이 높다. (Spacial Locality) (Spacial Locality) int[,] arr = new int[10000, 10000]; { long now = DateTime.Now.Ticks; for (int y = 0; y 2023. 8. 26.
[C#] 쓰레드 생성 오브젝트 풀링이란? 미리 생성한 오브젝트를 필요한 순간에 가져다가 사용하는 개념이다. 프로그램 중간에 할당하지 않아 성능상 이점이 있다. C# 환경에서는 ThreadPool과 Task를 지원하고 있다. ThreadPool은 인력소 같은 느낌이고, Thread는 고용되서 일하는 Worker라고 볼 수 있다. Task는 작업해야 하는 업무의 개념이다. // 쓰레드 생성 기본 코드 static void ThreadBasic() { Thread t = new Thread(MainThread); t.Name = "TestThread"; t.IsBackground = true; // MainThread 종료시 같이 종료된다. t.Start(); Console.WriteLine("Waiting for thread").. 2023. 8. 26.
Redis란 무엇인가? Redis 레디스는 사용되는 인메모리 데이타 구조 스토어이다. 캐시, 메시지 브로커, 스트리밍 엔진, 데이터베이스로 사용된다. strings, hashs, lists, sets, sorted sets with range queries appending to string, incrementing the value in hash pushing en element to a list, computing set intersection getting the member with higher ranking in a sorted set. 인메모리 데이터셋 일시적으로 데이터셋을 덤핑하든 디스크에 저장하는 방식, 커맨드를 디스크 기반 로그에 추가하여 영속성을 제공한다. 인메모리 캐시, 네트워크, 기능을 위해 영속성을 제거.. 2023. 8. 24.
채용 정보를 통해 알아보는 게임 서버 기술 스택 정리 최흥배님의 '채용 정보를 통해 알아보는 게임 서버 기술 스택 정리' 영상을 보고 정리한 글입니다. https://youtu.be/SSPJSxqHF8c PC 게임 개발에 사용하는 기술 Windows, C++, IOCP, MS SQL Server 채용 정보에서 언급된 것들(빈도수를 위주로 볼 것) RDBMS, Nodejs, Git AWS, 쿠버네티쿠스 .Net Core, .Net Framework 언리얼, C++ C++, Nodejs, MySql, Redis C++, C# RDBMS, NoSQL 멀티쓰레드, C#서버 언리얼, 윈도우 C++, 멀티쓰레드, 자료구조, 알고리즘 병렬 처리 프로그래밍, 소켓, 웹 프로그래밍 PHP, Golang, MySQL 하나 이상의 언어(Java, Python, Javascri.. 2023. 8. 19.
웹 서버 방식의 게임 서버 정리 최흥배님의 '웹 서버 방식의 게임 서버' 영상을 보고 정리한 글입니다. https://www.youtube.com/watch?v=NuxHxHbU-jU&ab_channel=%EC%B5%9C%ED%9D%A5%EB%B0%B0 Socket 서버 방식의 게임 서버 1. 게임 서버는 일반적으로 socket 서버이다. 2. 실시간 통신이 많이 필요한 곳에서 주로 사용한다. 3. TCP/UDP, IOCP 웹서버 기반 게임 서버 1. 주로 모바일 게임에서 사용한다. 2. 수집형 RPG 게임들에서 주로 사용 3. 백엔드 개발과 다르지 않음. 4. 웹 프론트 기술 스택은 사용하지 않음. (게임 엔진을 쓰지...) 5. 주로 POST 방식의 통신 사용하는 웹서버들 C#(ASP.Net core) Java(Spring) PHP .. 2023. 8. 19.
[JPA] 프록시와 연관관계 프록시 Member가 Team을 참조하고 있다면, Member를 조회할 때 Team도 참조해야 하는가? 회원만 필요한 경우도 있고 팀도 필요한 경우가 존재하는데 최적화는? 프록시 기초 1. em.find() vs em.getReference() 2. em.find(): 데이터베이스를 통해서 실제 엔티티 객체 조회 3. em.getReference(): 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 프록시 특징 1. 실제 클래스를 상속 받아서 만들어진다. 2. 실제 클래스와 겉 모양이 같다. 3. 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 된다. (이론상) 4. 프록시 객체는 실제 객체의 참조(target)를 보관한다. 5. 프록시 객체를 호출하면 프록시는 실제 .. 2023. 8. 11.
[JPA] 상속관계 매핑 상속관계 매핑 1. 관계형 데이터베이스는 상속 관계X 2. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 3. 상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼 타입 서브 타입관계를 매핑 각각의 테이블로 변환 => 조인 전략(각각 INSERT하고 조회할 때 JOIN사용) 통합 테이블로 변환 => 단일 테이블 전략(모든 필드를 하나의 테이블에) 서브타입 테이블로 변환 => 구현 클래스마다 하나의 테이블(부모 클래스는 따로 만들지 않는다) 조인 전략 장점 1. 테이블 정규화 2. 외래키 참조 무결성 제약 조건 활용 가능 3. 저장 공간의 효율화 단점 1. 조회시 조인을 많이 사용(성능 저하) 2. 데이터 저장시 INSERT문 2번 3. 조회 쿼리가 복잡함 단일 테이블 전략 장점 1. 조인이 필요 .. 2023. 8. 10.
[JPA] 영속성 관리 JPA에서 중요한 2가지 1. 객체와 관계형 데이터베이스 매핑하기 2. 영속성 컨텍스트 영속성 컨텍스트 1. EntityManager.persist(entity) 2. JPA를 이해하는 가장 중요한 용어 3. "엔티티를 영구 저장하는 환경" 4. 영속성 컨텍스트는 논리적인 개념이다. (눈에 보이지 않음) 5. 엔티티 메지저를 통해 영속성 컨텍스트에 접근한다. 엔티티의 생명주기 1. 비영속(new/transient) 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 2. 영속(managed) 영속성 컨텍스트에 관리되는 상태 3. 준영속(detached) 영속성 컨텍스트에 저장되었다가 분리된 상태 4. 삭제(removed) 삭제된 상태 영속성 컨텍스트의 이점 1. 1차 캐시 사용(같은 트랜잭션 내에서) 2. .. 2023. 8. 10.
[JPA] 왜 JPA를 사용해야 하는가? SQL 중심적인 개발의 문제점 1. CRUD 코드를 매번 작성해야 한다. 2. 자바 객체를 SQL로, SQL을 자바 객체로 3. 객체와 관계형 데이타베이스의 패러다임 불일치 만약 중간에 필드라도 추가되면? 관련된 모든 쿼리를 수정해야 한다... public class Member { private String memberId; private String name; ... } INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES SELECT MEMBER_ID, NAME FROM MEMBER M UPDATE MEMBER SET … 객체와 관계형 데이터 베이스의 차이 1. 상속 2. 연관관계 3. 데이터 타입 4. 데이터 식별 방법 객체를 테이블에 저장하려면... 각각 객체에 맞는 쿼리.. 2023. 8. 10.
[Spring] 스프링 MVC 구조 스프링 MVC는 프론트 컨트롤러 패턴으로 되어있다. (DispatcherServlet) 1. HTTP 요청이 들어오면 DispatcherServlet이 핸들러를 조회한다. (매핑된 주소에 매칭되는 handler를 찾는다) 2. Handler Adapter를 찾아온다. (다양한 형태 Controller 함수를 지원하기 위함) 3~4. 핸들러 어댑터를 통해 핸들러의 처리를 실행한다. (Controller의 내부 구현을 따른다) 5~6. ModelAndView를 반환하면 이를 viewResolver에게 넘긴다. 7. ViewResolver가 뷰를 찾아서 반환하면 렌더링한다. 주요 인터페이스 목록 핸들러 매핑: org.springframework.web.servlet.HandlerMapping 핸들러 어댑터: .. 2023. 8. 10.