CS 6

OS 4편 - 실무 병목 찾기

에러 로그도 없는데 특정 시간대에 API가 느려진다. 이걸 어떻게 찾아야 할까. 지금까지 배운 OS 개념을 전부 연결하는 파트다.1. 전형적인 장애 패턴스케줄러 대용량 쿼리 실행└── DB 커넥션 오래 점유 └── HikariCP 커넥션 풀 소진 └── 일반 API 요청들이 커넥션 대기 └── 스레드 점유 시간 길어짐 └── Tomcat Thread Pool 소진 └── 전체 API 느려짐 (에러는 없음)에러가 없으니 로그만 봐선 원인을 못 찾는다. 스레드와 커넥션 풀 상태를 직접 봐야 한다. 2. Tomcat 스레드 풀 확인Spring Actuator로 현재 스레드 상태를 볼 수 있다. yaml# app..

CS/OS 00:18:53

OS 3편 - Race Condition, synchronized (feat. volatile)

여러 스레드가 같은 메모리를 동시에 건드릴 때 생기는 문제다. 로컬에선 안 터지다가 운영에서 트래픽 몰릴 때 갑자기 데이터가 이상해지는 버그의 주범이다. 1. Race Condition이란count++ 한 줄처럼 보이지만 CPU 입장에선 3단계다.1. count 값을 메모리에서 읽어옴 (READ)2. 1을 더함 (ADD)3. 결과를 메모리에 저장 (WRITE)스레드 2개가 동시에 실행되면 이 사이에 끼어들 수 있다.스레드 1 스레드 2READ → count = 0 READ → count = 0ADD → 0 + 1 = 1 A..

CS/OS 2026.04.07

OS 2편 - 동기 vs 비동기, 그리고 언제 써야 하는가

스레드가 "기다리는 시간"을 어떻게 쓰느냐의 차이다. 단순히 빠르고 느린 게 아니라, 상황에 따라 골라 써야 한다.1. 동기(Synchronous)란동기 방식에서 스레드는 작업이 끝날 때까지 그 자리에서 기다린다. DB 쿼리를 날리면 응답이 올 때까지, 외부 API를 호출하면 결과가 올 때까지 스레드는 아무것도 못 하고 점유만 한다. 이걸 블로킹(Blocking) 이라 한다.스레드 1├── 요청 받음├── DB 쿼리 날림├── ⏳ DB 응답 기다리는 중... (CPU 안 씀, 스레드 점유 중)├── ⏳ 기다리는 중...├── DB 응답 옴├── 결과 가공└── 응답 반환DB 쿼리 100ms 중 실제 CPU를 쓰는 시간은 5ms 정도다. 나머지 95ms는 그냥 대기다. 그런데 스레드는 그 시간 내내 자리를..

CS/OS 2026.04.07

OS 1편 - 프로세스, 스레드, Thread Pool

프로세스 vs 스레드프로세스는 OS가 프로그램 실행 시 만드는 독립된 단위다. 각자 메모리 공간을 가지고 있어서 서로 침범하지 못한다. java -jar로 Spring 앱을 띄우면 프로세스 1개가 생긴다.스레드는 프로세스 안에서 실제로 코드를 실행하는 단위다. 같은 프로세스 안의 스레드끼리는 메모리를 공유한다. Tomcat은 HTTP 요청이 들어오면 스레드 1개를 할당해서 처리한다.컨텍스트 스위칭CPU는 한 번에 스레드 하나만 실행한다. "동시에 처리"처럼 보이는 건 CPU가 스레드들을 극도로 빠르게 오가기 때문이다. 이 전환 과정 자체가 CPU 자원을 소모한다.스레드가 많아질수록 전환 비용이 증가해서, 일정 수를 넘으면 오히려 전체 처리 속도가 떨어진다.Thread Pool스레드를 매번 만들고 없애는 ..

CS/OS 2026.04.07

커맨드 패턴(Command Pattern)

개발을 하다 보면 이런 상황을 자주 만난다."어떤 요청을 해야 하는지는 알지만, 그 요청을 어떻게 처리할지는 나중에 정하고 싶을 때""요청을 큐에 넣어놨다가 나중에 실행하고 싶을 때""실행한 작업을 나중에 취소하거나 되돌리고 싶을 때"이런 상황에 딱 맞는 디자인 패턴이 바로 커맨드 패턴(Command Pattern)이다.커맨드 패턴이란?한마디로 말하면,"요청 자체를 객체로 만들어서 캡슐화하는 방법"이다.요청하는 쪽(Invoker) 과 요청을 실제로 처리하는 쪽(Receiver) 사이에Command 객체가 중간에 끼어들면서 요청을 깔끔하게 분리시켜준다.왜 커맨드 패턴을 쓸까?요청과 실행을 분리할 수 있다.요청을 큐에 저장해뒀다가 나중에 실행할 수 있다.요청을 취소(Undo) 할 수 있다.요청을 기록(Log..

CS/Design Patterns 2025.04.29

1. 싱글톤 패턴

싱글톤(Singleton) 패턴은 자바에서 가장 많이 사용되는 디자인 패턴 중 하나다.한 번쯤은 "인스턴스를 하나만 만들고 싶다"라는 생각을 해봤다면, 싱글톤을 이미 직간접적으로 써봤을 수도 있다.이 글에서는 싱글톤 패턴이 무엇이고, 왜 쓰는지, 그리고 어떻게 구현하면 좋은지를 처음부터 차근차근 정리해본다. 싱글톤이란?간단히 말해,"클래스의 인스턴스를 애플리케이션 전체에서 하나만 존재하도록 보장하는 패턴"이다.설정 정보, 로그 기록기, 캐시 등 공통으로 쓰이고 하나만 있어야 하는 객체들에 주로 쓰인다. 왜 싱글톤을 쓸까?중복 인스턴스 방지→ 동일한 객체를 여러 번 만들지 않아 메모리 낭비를 막을 수 있다.공유 상태 유지→ 모든 코드에서 같은 객체를 참조하므로 설정값이나 상태가 일관된다.전역 접근→ 어디서..

CS/Design Patterns 2025.04.14