본문 바로가기

전체 글

(192)
임계영역 임계영역이란?여러 프로세스(또는 스레드)가 공유 자원(shared resource)에 동시에 접근하면 문제가 생길 수 있는 코드 영역을 말합니다. 공유 자원 예시로는전역 변수파일DB 커넥션메모리 버퍼 등이 있습니다.class Counter { private int count = 0; public void increment() { count++; // 임계영역 }} 만약 2개의 스레드가 동시에 increment()를 실행하면A 스레드B 스레드count 값count 읽음 (0) 0 count 읽음 (0)0count++ (1 계산) 0count 저장(1) 1 count++ (1 계산)1 count 저장(1)1기대한 값은 2, 실제 결과는 1이런 문제를 경쟁 상태(Race Condi..
장기, 단기, 중기 스케줄러 운영체제(OS)는 동시에 여러 프로그램을 실행시키기 위해 CPU, 메모리, 디스크 등의 자원을 효율적으로 관리합니다.이때 핵심적인 역할을 하는 것이 바로 스케줄러(Scheduler) 입니다.스케줄러는 “누가 CPU를 쓸지 누가 메모리에 머물지 누구를 잠시 디스크로 내보낼지”를 결정하는운영체제의 자원 분배 관리자라고 할 수 있습니다.스케줄러의 3가지 종류운영체제의 스케줄러는 일반적으로 다음의 세 종류로 나뉩니다.구분이름주요 역할상태 전이실행 빈도장기 스케줄러Long-term Scheduler어떤 프로세스를 메모리에 올릴지 결정디스크 → 메모리(준비 상태)드물게중기 스케줄러Medium-term Scheduler메모리 부족 시 프로세스를 디스크로 내보냄 (Swap)메모리 ↔ 디스크필요할 때만단기 스케줄러Sho..
Blocking vs Non-Blocking & Synchronous vs Asynchronous 안녕하세요 이번 포스팅에서는 두 가지 개념 블로킹/논블로킹(Blocking/Non-Blocking)과 동기/비동기(Synchronous/Asynchronous)를 명확하게 구분할까 합니다.두 개념은 언뜻 비슷해 보이지만 사실상 서로 다른 관점을 다룹니다. 1. Blocking vs Non-Blocking: "제어권"의 관점이 두 개념은 메인 작업의 '제어권'이 누구에게 있느냐에 따라 나뉩니다. 즉, "작업을 시킨 쪽이 다른 작업이 끝날 때까지 기다려야 하는가?"에 대한 이야기입니다. Blocking (블로킹)Non-Blocking (논블로킹)제어권다른 주체에게 제어권을 넘긴다.제어권을 계속 유지한다.작업 방식다른 주체의 작업이 완료될 때까지 자신의 작업을 멈추고 대기한다.다른 주체의 작업과 관계없이 자..
Javascript isEmpty 함수 만들기 프론트엔드 개발을 하다 보면 데이터가 비어 있는지 확인하는 작업은 피할 수 없습니다. 이때마다 if (data === null || data === undefined || data === '')와 같이 길고 복잡한 조건문을 작성하다 보면 코드가 지저분해지기 쉽습니다. 하나의 함수로 만들어두면 코드가 훨씬 간결하고 읽기 쉬워집니다. isEmpty & isNotEmpty 함수이 함수들은 null, undefined, 빈 문자열('')은 물론, 공백만 있는 문자열(' '), 빈 배열([]), 빈 객체({})까지 '사실상 비어있는 모든 값'을 정확하게 판단합니다.const CommonUtil = { isEmpty: function (value) { // 1. null 또는 undefined인지 확인 ..
퀵 정렬(Quick Sort)이란? 퀵 정렬(Quick Sort)이란?퀵 정렬은 분할 정복(Divide and Conquer) 방식을 사용하는 효율적인 정렬 알고리즘입니다. "퀵(Quick)"이라는 이름처럼, 평균적으로 가장 빠른 정렬 속도를 자랑합니다.퀵 정렬의 핵심 아이디어는 간단합니다.분할(Divide): 배열 안의 한 원소(이를 피벗, Pivot이라 부릅니다)를 기준으로, 피벗보다 작은 값들은 모두 왼쪽으로, 큰 값들은 모두 오른쪽으로 옮깁니다. 이렇게 하면 피벗은 정렬된 상태에서 자신의 최종 위치를 찾게 됩니다.정복(Conquer): 이제 피벗의 왼쪽과 오른쪽에 있는 두 개의 작은 배열을 각각 다시 퀵 정렬로 정렬합니다.결합(Combine): 퀵 정렬은 피벗이 제자리를 찾아가는 과정 자체가 정렬이므로, 별도의 결합 과정이 필요 없..
무한 스크롤 구현 무한 스크롤이란사용자가 화면을 아래로 스크롤할 때마다 현재 보여주고 있는 데이터의 끝에서 자동으로 다음 데이터를 계속해서 로드하는 방식입니다. 사용자 입장에서는 마치 콘텐츠가 끝없이 이어지는 것처럼 자연스럽게 스크롤이 계속됩니다.구현한 이유개발 중인 프로젝트에서 알림을 발생시킬 때 기존에는 제한 없이 모든 알림을 한 번에 불러와 클라이언트에 표시하고 있었습니다. 데이터 양이 적을 때는 큰 문제가 없었지만 알림이 100개, 1000개 이상 누적되면서 클라이언트에 과부하가 걸리고 성능 저하가 발생하는 이슈가 생겼습니다. 이를 해결하기 위해 무한 스크롤 방식을 도입하게 되었습니다.구현 코드let lastScroll = 0; // 마지막 스크롤 위치let limit_PageNo = 0let pageSize = ..
SSE 구현 및 정리 SSE(Server Send Event)서버에서 이벤트 발생 시 클라이언트로 실시간으로 데이터를 보내주는 방식입니다.HTTP 프로토콜을 사용하며 클라이언트가 서버에 연결을 열어두면 서버가 이벤트를 계속 보낼 수 있습니다. 특징으로는단방향 통신입니다.HTTP 기반으로 특별한 프로토콜 없이 동작합니다.네트워크 문제로 연결이 끊기면 브라우저가 자동으로 다시 연결합니다.서버에서 text/event-stream 타입으로 데이터를 전송합니다.기존 프로젝트에서 Polling 방식을 사용해 서버로부터 실시간 데이터를 받아오고 있었습니다.Polling은 간단하게 말해 일정 주기마다 서버에 HTTP 요청을 보내서 데이터를 받아오는 방식인데 간단하고 구현하기도 쉬웠지만 서버에 무분별하게 요청이 쌓이고 데이터에 변동이 없더라..
@RequiredArgsConstructor 어노테이션 @RequiredArgsConstructor 어노테이션은 롬복(Lombok) 에서 제공하는 어노테이션이다.- 필수 의존성 (final 또는 @NotNull 필드)에 대해 자동으로 생성자를 만들어주는 기능을 한다. 여러 의존성 주입이 있는데 @RequiredArgsConstructor어노테이션을 사용하는 이유로는불변성 유지 : final 필드를 초기화하지 않으면 컴파일 에러 -> 안전한 설계 가능하다.스프링 생성자 주입에 적합 : final 필드만 주입되도록 자동 생성자 생성한다.코드 간결화 : 반복적인 생성자 코드를 줄일 수 있다.테스트 용이성 향상 : 의존성을 명시적으로 주입받기 때문에 mocking 등 용이하다.등이 있다. 비교하자면 생성자 주입의 예시는public class MyService { ..