전체 글162 2025-04-07 <캐시 철학에 대하여> 캐시 철학: Temporal vs. Spatial Locality캐시(Cache)는 컴퓨터 시스템에서 자주 접근되는 데이터를 임시로 저장해두는 저장소로, 성능을 극적으로 향상시킬 수 있는 중요한 개념이다. 캐시의 핵심 철학은 지역성(Locality) 이라는 개념에 기반을 두고 있다. 지역성에는 크게 두 가지 종류가 있으며, 이를 각각 시간 지역성(Temporal Locality) 과 공간 지역성(Spatial Locality) 이라고 한다.이 글에서는 이 두 가지 지역성의 개념과 그 철학이 어떻게 캐시 설계에 영향을 미치는지를 설명하고자 한다.1. 시간 지역성 (Temporal Locality)시간 지역성이란 한 번 접근된 데이터는 가까운 미래에 다시 접근될 가능성이 높다는 개념이다.예를 들어, 루프 내.. C, C#, C++/TIL(Today I Learned) 2025. 4. 7. 2025-04-03 <DotNetEnv 패키지 활용법> C#에서 .env 파일을 사용하는 방법 - DotNetEnv 패키지 활용법C# 프로젝트에서 설정값을 관리할 때는 일반적으로 appsettings.json 또는 환경 변수를 사용한다. 하지만 Node.js처럼 .env 파일을 활용하여 설정을 외부화하고 싶을 때는 DotNetEnv 패키지를 사용할 수 있다. 이 글에서는 DotNetEnv 패키지를 이용해 .env 파일을 불러오고, 이를 코드에서 읽어 구조체 혹은 클래스로 바인딩하는 방법까지 정리한다.1. DotNetEnv란?DotNetEnv는 .env 형식의 환경 변수 파일을 읽어 시스템 환경 변수처럼 사용할 수 있게 해주는 경량 패키지이다. JavaScript의 dotenv와 매우 유사한 사용법을 제공한다.설치는 NuGet을 이용하면 된다.dotnet ad.. C, C#, C++/TIL(Today I Learned) 2025. 4. 3. 2025-04-02 <Race Condition 해소를 위한 전략> 🔒 BASIC1. Monitor (lock)C#의 대표적인 임계 구역(critical section) 보호 방법.한 번에 하나의 스레드만 진입 가능.내부적으로 Monitor.Enter()와 Monitor.Exit() 호출.유저 모드에서 동작하므로 오버헤드는 낮고 빠르지만, 블로킹이 발생하면 결국 커널 모드로 전환됨.lock (myLockObj){ // 임계 구역}💪 근성 (계속 들이대는 방식)1. SpinLocklock과 유사하지만 스레드가 잠금을 얻을 때까지 CPU를 계속 소비하며 반복 검사(spin)함.커널 모드 진입 없이 작동하기 때문에 짧은 시간 동안만 잠금이 필요한 경우 고성능.다만, 장시간 락을 잡고 있으면 CPU 점유율 급등 가능.SpinLock spinLock = new SpinL.. C, C#, C++/TIL(Today I Learned) 2025. 4. 1. 2025-03-31 <튜플에 대하여> C# 튜플(ValueTuple) 정리C#의 튜플(Tuple) 기능은 여러 데이터 요소를 하나의 가벼운 데이터 구조로 묶는 간결한 구문을 제공한다. 이 글에서는 튜플의 선언, 초기화, 멤버 접근, 주요 사용 사례, 필드 이름 지정, 형식 별칭, 할당 및 구조 분해 등의 내용을 다룬다.1. 튜플 기본 사용법(double, int) t1 = (4.5, 3);Console.WriteLine($"요소 {t1.Item1}와 {t1.Item2}를 가진 튜플.");// 출력: 요소 4.5와 3를 가진 튜플.(double Sum, int Count) t2 = (4.5, 3);Console.WriteLine($"{t2.Count}개의 요소의 합은 {t2.Sum}입니다.");// 출력: 3개의 요소의 합은 4.5입니다.튜플.. JS/TIL(Today I Learned) 2025. 3. 31. 2025-03-24 <C# 스택 클래스와 성능 최적화> C# 스택 클래스와 성능 최적화에 대하여큐(Queue)와 스택(Stack)의 성능 비교하기큐와 스택의 차이점은 명확하다.큐는 선입선출이고, 스택은 후입선출의 구조를 가진 자료형이다.사실 이런 건 너무 흔히 알려진 개념이라, 굳이 블로그에까지 정리할 필요는 없을 것이다.대신 오늘의 글에서 정리해보고 싶은 건 큐와 스택의 원리에 의해 벌어지는 성능 차이에 대한 것이다.예를 들어보자.큐와 스택을 구현해야 한다고 했을 때 가장 간단한 방식은 무엇일까.아마 배열을 고르는 게 보편적일 것이다.index : [0] [1] [2] [3] [4]value : 4 9 2 5 0 여기서 Dequeue() 혹은 Pop()을 사용해본다고 상상해보자.4번 인덱스의 0을 넣었다 빼는 건 다른 인덱스 요소에 아무런 .. C, C#, C++/TIL(Today I Learned) 2025. 3. 24. 2025-03-21 <해시 테이블(Hashtable)이란?> 해시 테이블(Hashtable)이란?해시 테이블은 (Key, Value) 쌍으로 데이터를 저장하며, key를 해시 함수(Hash Function) 에 넣어서 나온 해시 값을 기반으로 데이터를 저장하거나 검색하는 구조이다.작동 원리해시 함수(Hash Function)Key를 받아서 정수 인덱스로 변환해주는 함수이다.예: "apple" → 해시 함수 → 42이 인덱스를 이용해 내부 배열의 위치를 정한다.배열(Array)해시 테이블은 내부적으로 배열을 사용한다.배열의 인덱스는 해시 함수의 결과로 결정된다.이 때문에 평균적으로 O(1)의 성능으로 접근 가능하다.충돌(Collision)서로 다른 키가 같은 해시 값을 가질 수 있다.이를 해시 충돌이라고 부르며, 이를 처리하는 방식이 중요하다.충돌 해결 방식체이닝(.. C, C#, C++/TIL(Today I Learned) 2025. 3. 21. 2025-03-20 (2) <함수의 매개변수화 - 콜백함수와 delegate> 함수의 매개변수화 - 콜백함수와 delegateJavaScript와 C# 비교하기JS는 함수를 1급 객체 취급하므로, 함수 자체를 그냥 변수처럼 넘길 수 있다.function sayHello() { console.log("Hello!");}// JavaScript는 함수 이름만 넘기면 콜백으로 등록 가능button.addEventListener("click", sayHello); ✅ 별도의 delegate 정의 없이 함수 이름만 넘기면 된다.✅ JS 자체에서 함수의 매개변수 개수를 자동으로 맞춰주므로, 매개변수 유무도 신경 쓸 필요 없다.✅ 익명 함수(람다)도 바로 등록 가능button.addEventListener("click", () => console.log("Clicked!")); 반면, C.. C, C#, C++/TIL(Today I Learned) 2025. 3. 20. 2025-03-20(1) <내가 만든 데이터, Stack과 Heap 중 어디에 저장될까?> 내가 만든 데이터, Stack과 Heap 중 어디에 저장될까?스택(Stack)에 저장되는 데이터지역 변수(Local Variable)함수 또는 블록 내에서 선언된 변수는 기본적으로 스택에 저장된다.함수가 호출될 때 메모리가 할당되며, 함수가 끝나면 자동으로 해제된다.값 타입(Value Type) (C#, C++ 기본 타입 등)대표적으로 정수형(int, long), 실수형(float, double), 불리언(bool), 구조체(struct) 등이 포함된다.예제(C#)void SomeMethod() { int x = 10; // x는 스택에 저장됨} // 함수가 끝나면 x가 사라짐컴파일 타임에 크기가 결정되는 변수배열의 크기가 컴파일 타임에 정해진다면, 스택에 저장될 수 있다.예제(C++)int a.. C, C#, C++/TIL(Today I Learned) 2025. 3. 20. 2025-03-19 <값 타입과 참조 타입> Intro스택 : 임시 메모장힙 : 필기 노트값 타입(Value Type)스택(Stack)에 저장됨값 타입 변수는 메모리의 스택 영역에 직접 저장된다.함수나 블록이 끝나면 자동으로 메모리에서 제거된다.변수를 복사할 때 값 자체가 복사됨값 타입 변수를 다른 변수에 할당하면 값 자체가 복사되므로, 두 변수는 독립적인 값을 가진다.한 변수를 변경해도 다른 변수에는 영향을 주지 않는다.기본적으로 불변(Immutable)적 성질을 가짐변수를 다른 변수에 할당하면 복사(copy)되므로, 한쪽 변수를 변경해도 원본 값에는 영향을 주지 않는다.가비지 컬렉션(GC)의 영향을 받지 않음값 타입은 스택에 저장되므로 가비지 컬렉션의 대상이 아니다.스택에서 빠르게 생성 및 해제되므로 성능이 좋다.값 타입의 종류기본 데이터 타입.. C, C#, C++/TIL(Today I Learned) 2025. 3. 19. 2025-03-18 <ref와 out> INTRO...C#에서 ref와 out 키워드는 메서드에서 인자를 전달할 때 복사한 값이 아닌 참조(reference)를 사용할 수 있게 한다. 즉, 메서드가 호출된 후에도 원래 변수의 값이 변경될 수 있도록 돕는다.ref 키워드ref 키워드는 메서드에 전달된 변수의 기존 값을 유지하면서 수정할 수 있도록 한다. 다만 ref를 사용하여 메서드가 호출할 땐, 해당 변수에 값이 반드시 할당된 상태여야 한다.ref 사용 예시using System;class Program{ static void ModifyValue(ref int number) { number += 10; // number 값을 10 증가시킴 } static void Main() { int m.. C, C#, C++/TIL(Today I Learned) 2025. 3. 18. 2025-03-12 <최종 프로젝트 D-2> 리드미 작성 Contents🐰 Project MoonRabbits 소개🌕 게임 시나리오🌕 게임 소개🌕 게임 실행 방법🌕 게임 플로우 차트🐰 주요 컨텐츠 가이드🐰 서비스 아키텍처🐰 기술 스택🐰 Contact🐰 Project MoonRabbits 소개안녕하세요 여러분!저희는 내일배움캠프 Node.js 트랙 7기 1팀 rabbits라고 합니다!🐇지난 6주 동안 만들게 된 멀티플레이 게임 서버와 클라이언트를 무사히 선보이게 되어 너무 기쁘네요.🤗지금부터 달토끼 프로젝트에 대해 차근차근 소개해드릴 테니, 귀여운 토끼와 함께 프로젝트 저희를 따라와주세요!🌕 게임 시나리오🥕 토글을 눌러주세요! 🥕유난히 보름달이 빛나던 어느 먼 옛날, 평화롭던 지구에 외계인이 쳐들어오기 시작했다!산과 들판은 외계인들에 .. JS/TIL(Today I Learned) 2025. 3. 12. 2025-03-11 <최종 프로젝트 D-3> EC2 서버 Brute Force 공격 대응하기 🤬 TROUBLE : 사건의 발단🌊 침입 발생EC2 서버를 본격적으로 열어두기 시작한 이래로, 서버가 멈춰버리는 현상이 자주 발생했다.처음엔 프로젝트의 코드가 가진 결함을 의심했으나, 로그를 뜯어보는 중 수상한 행적을 발견할 수 있었다. 아침 7시에 열어둔 서버에 누군가 접속한 모습이다.45.33.80.243이라는 IP가 접속한 이후, 서버는 완전히 멈춰버렸다.🤔 현상 관찰즉시 AWS를 통해 모니터링 결과를 살펴봤다. 대체 들어와서 뭘 한 건지, CPU 사용률이 50%에 가까운 모습이다.JMeter 부하 테스트 결과와 비교해봤더니, 300개의 클라이언트가 동시에 패킷을 3번씩 보냈을 때와 CPU 사용량이 맞먹는 수준이다. 참고로 평소 서버의 그래프는 위와 같다.애플리케이션 실행 초기에 CPU .. JS/TIL(Today I Learned) 2025. 3. 11. 이전 1 2 3 4 ··· 14 다음