I/O 기본 – 스트림과 파일 입출력
스트림(Stream)의 개념 자바에서 외부 데이터와의 입출력은 스트림(Stream)을 통해 이루어진다. 스트림은 데이터의 흐름을 나타내는 추상화된 개념으로 파일, 네트워크, 콘솔 등 다양한 입출력 작업을 일관된 방식으로 처리할 수 있게 해준다 스트림의 방향성 스트림은 단뱡향이다 따라서 양방향 통신을 위해서는 입력과 출력 스트림을 각각…
스트림(Stream)의 개념 자바에서 외부 데이터와의 입출력은 스트림(Stream)을 통해 이루어진다. 스트림은 데이터의 흐름을 나타내는 추상화된 개념으로 파일, 네트워크, 콘솔 등 다양한 입출력 작업을 일관된 방식으로 처리할 수 있게 해준다 스트림의 방향성 스트림은 단뱡향이다 따라서 양방향 통신을 위해서는 입력과 출력 스트림을 각각…
실무에서 스레드 풀이 포화 상태가 되면 어떻게 대응할지 정책을 정해야 한다. ThreadPoolExecutor는 4가지 기본 거절 정책을 제공하며, 커스텀 정책도 구현 가능하다 거절 정책이 필요한 이유 거절 상황 거절 발생 조건 대응 필요성 RejectedExecutionHandler 인터페이스 모든 거절 정책의 기반 동작 방식…
실무에서는 트래픽 패턴에 맞는 적절한 스레드 풀 전략을 선택해야 한다. Java는 Executors를 통해 세 가지 기본 전략을 제공하며, 각각 장단점이 명확하다 기본 전략 개요 단일 스레드 풀 (Single Thread Pool) 특징 고정 풀 전략 (Fixed Thread Pool) 핵심 특징 동작…
실무에서 대량의 요청을 효율적으로 처리하려면 스레드 풀의 동작 원리를 정확히 이해해야 한다. ThreadPoolExecutor 핵심 파라미터 파라미터 설명 초과 스레드 (Excess Thread) 스레드 풀 동작 원리 작업 처리 우선순위 처리 순서 단계별 실행 분석 핵심 메커니즘 스레드 생성 전략 왜 큐가…
우아한 종료란? 서버 애플리케이션을 운영하다 보면 업데이트나 유지보수를 위해 서버를 재시작해야 하는 상황이 발생한다. 이 때 처리 중인 작업을 중단 없이 완료한 후 종료하는 것이 중요하다 문제 상황 예시 이상적인 종료 프로세스 이러한 종료 방식을 우아한 종료 (Graceful Shutdown)라고 한다…
실전 예제로 보는 Future Runnable 방식의 한계 전통적인 Runnable 방식으로 1부터 100까지의 합을 병렬 처리해본다 Runnable 방식의 문제점 Callable과 Future로 개선 같은 작업을 Callable과 Future로 구현 개선된 점 💡 핵심: 마치 단일 스레드에서 일반 메서드를 호출하는 것처럼 느껴진다 Future가 필요한…
Runnable의 한계를 극복하고 반환 값을 받을 수 있는 Callable과 Future에 대해 알아본다 Runnable의 한계 기존 Runnable 인터페이스를 살펴본다 Runnable은 다음과 같은 명확한 한계가 있다 반환 값이 없음 예외 처리의 제약 자식은 부모의 예외 범위를 넘어설 수 없기 때문이다 💡 참고:…
스레드를 직접 사용할 때의 문제점 실무에서 스레드를 직접 생성해서 사용하면 다음과 같은 세 가지 문제가 발생한다 스레드 생성 비용으로 인한 성능 문제 스레드는 단순한 자바 객체가 아니다. 스레드를 생성하고 시작(start()) 하는 과정은 다음과 같은 이유로 매우 무겁다 메모리 할당 운영체제…
실무에서 날짜와 시간을 다루다 보면 사용자에게 보여주기 위해 특정 형식으로 변환하거나, 반대로 사용자가 입력한 문자열을 날짜 객체로 변환해야 하는 경우가 빈번하다 핵심 개념 포맷팅은 날짜/시간 객체 → 문자열, 파싱은 문자열 → 날짜/시간 객체 변환이다 날짜 포맷팅과 파싱 (LocalDate) 기본 출력의…
Java 8에서 도입된 java.time 패키지는 기존 Date와 Calendar의 문제점들을 해결한 현대적인 날짜/시간 API이다. 이번 포스트에는 ChronoUnit와 ChronoField에 대해 알아본다 날짜와 시간의 핵심 개념 날짜와 시간을 다룰 때 가장 먼저 이해해야 할 개념은 특정 시점의 시간과 시간의 간격을 명확히 구분하는 것이다.…