본문 바로가기
728x90

전체 글41

[TDD] Test Double [TDD] Test Double테스트를 위해 실제 구현을 대체하는 대역 객체를 통칭합니다. 종류설명Dummy파라미터 전달용, 실제 동작 없음Fake간단한 실제 동작(예: 인메모리 DB)Stub미리 정의된 응답만 제공SpyStub 기능 + 호출 기록 기능Mock기대 행위 설정 및 호출 검증 1. 예시 코드1-1. Dummy// Dummy 구현: 실제로는 아무런 동작도 수행하지 않음public class DummyPaymentGateway implements PaymentGateway { @Override public void pay(int amount) { // no-op }}class OrderServiceTest { @Test void placeOrder_wit.. 2025. 8. 3.
[Java] RestTemplate 대신 WebClient를 선택하는 이유 [Java] RestTemplate 대신 WebClient를 선택하는 이유Spring Boot 기반 애플리케이션에서 외부 HTTP API 호출을 위해 오랫동안 RestTemplate을 사용해 왔습니다. 하지만 Spring 5부터 소개된 WebClient는 비동기·논블로킹 호출, 리액티브 스트림 기반 처리 등으로 마이크로서비스 아키텍처와 대용량 트래픽 환경에서 뛰어난 Spring Boot 성능 최적화를 제공합니다.이 글에서는 RestTemplate의 한계를 짚어보고, WebClient로 전환해야 하는 이유에 대해서 알아보고자 합니다. 1. RestTemplate의 한계1-1. 블로킹 I/O로 인한 스레드 낭비RestTemplate은 내부적으로 HttpURLConnection·Apache HttpClient.. 2025. 5. 25.
[Java] 파일 입출력의 진화: 전통 I/O에서 현대적 비동기·리액티브 방식까지 [Java] 파일 입출력의 진화: 전통 I/O에서 현대적 비동기·리액티브 방식까지Java는 출시 초기부터 지금까지 다양한 파일 입출력(File I/O) API를 제공해 왔습니다. 각 버전마다 성능, 사용 편의성, 비동기 처리 능력 등을 개선해 왔는데요, 이 글에서는 시간의 흐름에 따라 주요 변화를 짚어보고, 현재 어떤 방식으로 파일을 다루는지 살펴보겠습니다. 아래 코드들은 깃허브에 테스트 코드까지 구현해 놓았습니다. 필요하신분들은 참고하시길 바랍니다. 1. Java 1.x: java.io 전통 스트림 방식시기: Java 1.0~1.4주요 클래스: FileInputStream/FileOutputStream, FileReader/FileWriter, BufferedInputStream/BufferedOutp.. 2025. 5. 24.
[Java] CompletableFuture를 활용한 비동기 프로그래밍 [Java] CompletableFuture를 활용한 비동기 프로그래밍1. 기존 Future의 한계// ExecutorService + Future 사용 예시ExecutorService exec = Executors.newFixedThreadPool(4);Future future = exec.submit(() -> { simulate(); // 작업 수행 return "서버 응답 데이터";});String result = future.get(); // 블로킹: 호출 스레드가 여기서 멈춰 대기// Future 작업이 완료 된 후 이후 로직 실행 블로킹 호출: Future.get() 호출 시 작업이 끝날 때까지 스레드가 멈춥니다.콜백 구성 번거로움: 작업 완료 후 후속 로직을.. 2025. 5. 5.
[Java] ☕ Executor 프레임 워크 [Java] ☕ Executor 프레임 워크Executor 프레임워크는 Java에서 스레드를 생성하고 관리하는 표준화된 방법을 제공한다.전통적으로 우리는 new Thread()를 사용해 스레드를 하나하나 직접 만들었을 때 잘못사용하게 되면 다음과 같은 문제점들이 있었다.리소스 낭비 (새 스레드를 만들 때마다 메모리/CPU 소모)스레드 수 관리 실패 (수천 개 스레드가 생성되어 시스템 다운)코드 복잡도 증가 (어디서 누가 스레드를 돌리고 있는지 추적하기 힘듦)직접 만든 스레드는 작업이 끝나도 계속 살아있거나 제대로 종료되지 않아서 리소스를 점유한다.직접 만든 스레드에서는 예외를 잡기 어렵고, 작업 결과를 받아오기 힘듦 Executor 프레임워크는 이 모든 문제를 해결하기 위해 등장했다. Executor는 .. 2025. 4. 27.
[Java] 🚦 자바 메모리 가시성(Java Memory Visibility) [Java] 🚦 자바 메모리 가시성(Java Memory Visibility) Java와 같은 멀티스레드 환경에서 각 스레드는 성능 향상을 위해 메인 메모리(Heap)에 있는 변수의 복사본을 자신의 캐시(CPU 캐시 등)에 저장하여 사용합니다. 스레드가 변수 값을 변경하면, 이 변경 내용은 즉시 메인 메모리에 반영되지 않고 자신의 캐시에만 반영될 수 있습니다. 이때 다른 스레드가 해당 변수 값을 읽으려 하면, 메인 메모리에 아직 반영되지 않은 오래된 캐시 값을 읽거나 전혀 다른 값을 읽을 수 있습니다. 이처럼 한 스레드의 변수 변경 결과를 다른 스레드가 즉시(또는 적절한 시점에) 볼 수 없는 현상을 메모리 가시성 문제라고 합니다. Spring 애플리케이션에서 여러 웹 요청이 같은 서비스 빈의 상태를 .. 2025. 4. 20.
728x90