본문 바로가기

전체 글

(225)
인터럽트 isInterrupted()public class ThreadStopMainV3 { public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task, "work"); thread.start(); sleep(100); log("작업 중단 지시 thread.interrupt()"); thread.interrupt(); log("work 스레드 인터럽트 상태 1 = " + thread.isInterrupted()); } static class MyTask implements Runnable {..
자바에서 자식 메서드가 부모 메서드가 던지는 체크 예외의 하위 타입만 던질 수 있는 이유 자바의 예외 규칙자바에서 부모 클래스를 상속받거나, 인터페이스를 구현할 때 다음과 같은 예외 관련 규칙이 있다.체크 예외부모 메서드가 체크 예외를 던지지 않으면, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.언체크(런타임) 예외예외 처리를 강제하지 않으므로 상관없이 던질 수 있다.예외 규칙의 이유런타임 예외는 제약이 없지만, 체크 예외는 위와 같은 제약이 있다. 이런 제약을 두는 이유는 무엇일까? 위와 같은 제약이 없다면 어떻게 될까? 다음 예제는 자식 클래스에서 부모 클래스가 던진 예외보다 상위 예외를 던지는 경우이다. (예제 코드일 뿐, 실제로는 컴파일 오류 발생)class Parent { void method()..
스레드의 생명주기 자바 스레드의 생명 주기는 여러 상태로 나뉘어진다.NEW (새로운 상태)스레드가 생성되고 아직 시작되지 않은 상태이다.즉, 스레드 객체(Thread)가 생성되었지만, start() 메서드가 호출되지 않은 상태이다.Runnable (실행 가능 상태)스레드가 실행될 준비가 된 상태이다.start() 메서드가 호출되면 스레드가 Runnable 상태가 된다.CPU 코어 하나 당 한 번에 하나의 스레드만 실행이 가능하기 때문에 Runnable 상태의 스레드라고 해서 반드시 실행 중인 것은 아니다. Runnable 상태에 있는 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행된다.운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 Runnable 상태이다.Blocke..
Kafka 카프카 구조클러스터: 여러 대의 서버(브로커)로 구성된 카프카 시스템이다.브로커: 카프카 시스템을 구성하는 개별 서버이다.토픽: 메시지들의 특정 카테고리 또는 피드를 나타낸다. 토픽은 데이터를 카테고리화하여 관리할 수 있게 한다. 예를 들어, 다양한 종류의 이벤트나 메시지들을 서로 다른 토픽으로 분류할 수 있다. 또한 하나의 토픽은 여러 소비자가 구독할 수 있다.파티션: 토픽을 구성하는 하위 단위로, 여러 개의 토픽은 여러 개의 파티션으로 나누어질 수 있다. 이를 통해 카프카의 확장성과 병렬 처리 능력을 향상시킨다.세그먼트: 파티션의 데이터를 실제로 저장하는 물리적 파일이다. 카프카는 데이터를 파티션에 순차적으로 기록하지만, 이 데이터는 여러 세그먼트 파일로 나누어 저장된다.파티셔너프로듀서가 데이터를 보..
다익스트라 알고리즘 - 우선순위 큐와 방문 처리에 대해 다익스트라 문제를 풀다가 공식처럼 우선순위 큐를 사용하고, 방문 처리를 하는 느낌이 들었다. "우선순위 큐를 꼭 사용해야 하는가?", "방문 처리를 꼭 해야 하는가?" 라는 궁금증이 들어서 이 글을 작성한다. https://www.acmicpc.net/problem/1753 이 문제를 예로 들자. 입력 값이 다음과 같고, 1번 노드에서 출발한다고 가정하자.5 611 2 21 3 32 3 42 4 53 4 14 5 2 간선을 리스트로 표현하면 다음과 같고, 1 ➡️ 2 ➡️ 3번 노드 순서로 방문했을 때의 모습은 다음과 같다. 이때 큐에는 (4, 7)과 (4, 4)가 담겨있다. (노드 4번까지 오는데 걸린 비용이 각각 7, 4)우선순위 큐를 사용하지 않을 경우(4, 7)을 먼저 poll한다. 그리고 cos..
TCP/IP 네트워크 스택 이해하기 TCP/IP의 중요한 성질Connection oriented먼저 두 개의 엔드포인트(local, remote) 사이에 연결을 맺은 후 데이터를 주고받는다. 이때 TCP 연결 식별자는 형태이다. Bidirectional byte stream양방향 데이터 통신을 하고, 바이트 스트림을 사용한다. 이 바이트 스트림은 여러 패킷으로 분할되어 전송되지만, 수신측의 TCP에서 이러한 패킷을 일련의 바이트 스트림으로 재조립하여 응용 계층에서 처리할 수 있게 한다. In-order delivery송신자가 보낸 순서대로 수신자가 데이터를 받는다. 이를 위해서는 데이터 순서가 필요한데 순서를 표시하기 위해 TCP 세그먼트 필드에 32비트의 sequence number 필드가 있다. Reliability through A..
Caffeine을 통한 로컬 캐싱 스프링의 캐시 추상화스프링은 캐시 매니저를 통해 캐싱 방법을 추상화한다. 즉, 특정 캐시 기술에 종속되지 않고 AOP를 통해 적용하여 애플리케이션 코드에 캐시 기능을 추가할 수 있다.  스프링의 캐시 매니저는 다음과 같다. ConcurrentMapCacheManager: JDK의 ConcurrentHashMap을 캐시 저장소로 사용하는 캐시 매니저이다. 별도의 설정을 하지 않으면 기본으로 ConcurrentHashMap을 통해 캐싱된다. 하지만 캐시 관리에서 필요한 다양한 기능들(ex, TTL, TTI)이 부족하여, 실제 서비스에서 사용하기에 기능이 빈약하다.SimpleCacheManager: 기본적으로 제공하는 캐시가 없고 사용할 캐시를 직접 등록하여 사용하기 위한 캐시 매니저이다.EhCacheCach..
좋아요 동시성 제어 과정 문제 상황이 글은 프로젝트에서 진행했던 좋아요 동시성 제어 과정에 대한 글이다. 앞서 게시글 페이징 조회 성능 개선을 위해 좋아요 수(likeCount)를 게시글 엔티티의 필드로 추가하면서, 동시성 제어가 필요해졌다. (https://olsohee.tistory.com/169) 동시성 제어가 필요한 상황은 다음 두 경우가 있다.사용자는 같은 게시글에 좋아요를 2개 이상 누를 수 없다.여러 명의 사용자가 동시에 같은 게시글에 좋아요를 누를 경우 해당 게시글의 좋아요 수가 덮어 씌워지면 안 된다.기존 코드에서 두 경우를 테스트한 결과, 두 경우 모두 데드락이 발생했다. 데드락의 원인은 MySQL이 조회하는 레코드에 외래 키가 있을 때, 외래 키에 해당하는 테이블 레코드에 S락을 걸기 때문이다. 즉, 게시글 ..