Java
-
[Java] 절차 지향적인 자바 코드를 객체 지향적이게 바꾸기Java 2025. 12. 11. 01:49
저번 글에서는 절차지향과 절차지향적으로 작성된 자바 코드를 알아보았습니다. 이번 글에서는 절차지향적인 자바 코드를 어떻게 객체지향적으로 바꾸는지 알아보겠습니다. 이 글에서 가장 중요한 키워드는 역할, 책임, 협력입니다. [Java] 절차지향적인 자바 코드Java, Kotlin 등과 같이 흔히 객체지향 프로그래밍 언어를 사용하더라도 무조건 객체지향적인 코드가 나오는 것은 아닙니다. 코드 작성자가 절차지향(procedure oriented)적인 사고를 가지고 있다면 절msj9965.tistory.com 1. 책임의 이동: 함수(Function)에서 객체(Object)로지난 포스팅에서 우리는 서비스 레이어(OrderService) 안에 있는 함수들에 비즈니스 로직의 책임들이 집중되어 있고 OrderServ..
-
[Java] 절차지향적인 자바 코드Java 2025. 12. 10. 18:02
Java, Kotlin 등과 같이 흔히 객체지향 프로그래밍 언어를 사용하더라도 무조건 객체지향적인 코드가 나오는 것은 아닙니다. 코드 작성자가 절차지향(procedure oriented)적인 사고를 가지고 있다면 절차지향적인 코드가 나올 수 있습니다. 이번 Java 코드가 절차지향적인지, 객체지향적인지 판단하는 기준을 중심적으로 알아보겠습니다.1. 절차지향 프로그래밍(Procedural Programming)이란 무엇인가?'절차지향(procedure oriented)'이라는 단어를 들으면 무엇이 가장 먼저 떠오르시나요? 많은 개발자분들이 "위에서 아래로 코드가 순서대로 실행되는 것"이라고 답하곤 합니다. 하지만 이것은 반은 맞고 반은 틀린 설명입니다.엄밀히 말해 위에서 아래로 흐르는 것은 순차적(Sequ..
-
[Java] 현대적인 병렬처리와 비동기: Fork/Join과 CompletableFutureJava 2025. 12. 1. 16:55
1. Java 7: Fork/Join 프레임워크와 데이터 병렬화Java 5의 ExecutorService는 훌륭했지만, 작업의 크기가 균일하지 않은 경우(예: 어떤 작업은 1초, 어떤 작업은 10초 소요) 코어 간의 부하 불균형(Load Imbalance)이 발생하는 구조적 한계가 있었습니다.한가한 스레드가 바쁜 스레드를 도와주지 못하고 낭비되는 현상을 해결하기 위해, Java 7은 Fork/Join Framework를 도입했습니다. 이는 단순히 작업을 나누는 것을 넘어, CPU 자원을 쥐어짜듯 효율적으로 사용하는 매커니즘을 제공합니다.1) 핵심 원리: 분할 정복 (Divide and Conquer)Fork/Join 프레임워크는 거대한 작업을 더 이상 쪼갤 수 없는 단위(Threshold)까지 잘게 나눈..
-
[Java] 모던 자바 스레딩의 시작: ExecutorService와 FutureJava 2025. 12. 1. 16:26
1. 레거시(Legacy)의 한계: 왜 new Thread()는 위험한가?실무 환경, 특히 높은 트래픽을 처리하는 백엔드 서버에서 new Thread().start()를 사용하여 온디맨드(On-demand)로 스레드를 생성하는 패턴은 시스템의 안정성을 해치는 안티 패턴(Anti-Pattern)입니다.그 이유는 단순히 객체를 생성하는 비용 때문이 아니라, 운영체제(OS) 리소스와의 1:1 매핑 구조에서 생기는 자원의 한계 때문입니다.1) 리소스 고갈 (Resource Exhaustion)① Native Thread 생성 비용과 LatencyJava의 스레드(HotSpot VM 기준)는 운영체제의 네이티브 스레드(Native Thread)와 1:1로 매핑됩니다. (Java 21 Virtual Thread 제..
-
[Java] 멀티스레드의 위험과 동시성 제어Java 2025. 12. 1. 15:38
1. 멀티스레딩의 문제점: 힙(Heap) 스레드를 여러 개 쓰면 작업 속도는 빨라지지만, JVM 메모리 중 모든 스레드가 공유하는 힙(Heap) 영역의 객체에 동시에 접근하는 순간 문제가 발생합니다.참고: 메서드 안에서 선언된 지역 변수(Local Variable)는 스택(Stack) 영역에 생기므로 동시성 문제가 절대 발생하지 않습니다. 문제는 항상 객체의 필드(Member Variable) 처럼 힙 영역에 있는 데이터에서 발생합니다.1) 경쟁 상태 (Race Condition)경쟁 상태란, 두 개 이상의 스레드가 공유 자원(Shared Resource)에 동시에 접근하여, 자원의 상태를 변경(Write)하려 할 때 발생하는 문제입니다.이때 "누가 더 먼저 실행되는가" 혹은 "언제 컨텍스트 스위칭이 일..
-
[Java] Thread란?Java 2025. 12. 1. 14:19
1. 프로세스(Process)와 스레드(Thread)의 물리적 차이이 부분은 "운영체제 레벨에서 Java가 어떻게 자원을 쓰는지" 명확히 짚고 넘어가야 합니다.이전 포스팅에서 작성했던 내용을 참고해주세요.https://msj9965.tistory.com/362. 스레드의 생명주기 (Lifecycle)Thread.getState()로 확인할 수 있는 6가지 상태는 스레드 덤프를 분석하거나 교착 상태(Deadlock)를 해결할 때 필수적인 지식입니다.1) NEW스레드 객체는 생성되었지만, 아직 start()가 호출되지 않은 상태입니다.커널 레벨의 스레드(Native Thread)는 아직 생성되지 않은 순수한 자바 객체 상태입니다.2) RUNNABLE (실행 대기 + 실행 중)주의: 이름은 '실행 가능'이지만..
-
[Java] I/O 모델의 4가지 조합Java 2025. 12. 1. 13:49
이번 글에서는 이 두 가지 축이 결합된 4가지 I/O 모델이 커널(Kernel)과 유저 애플리케이션(User Application) 사이에서 기술적으로 어떻게 상호작용하는지 분석합니다.1. Synchronous + Blocking (동기 + 블로킹)"가장 기본적인 I/O 모델"Java의 전통적인 InputStream, JDBC 등이 작동하는 방식입니다. 호출자(Caller)는 I/O 작업이 완료될 때까지 쓰레드 자원을 점유한 채 대기합니다.1-1. 동작 메커니즘 (System Flow)요청: User Thread가 커널에 I/O 작업(예: read())을 요청하는 시스템 콜(System Call)을 수행합니다.Blocking: 커널은 데이터가 준비될 때까지 즉시 응답하지 않습니다. 이때 User Thre..
-
[Java] Sync vs AsyncJava 2025. 12. 1. 13:18
1. 핵심 정의: 관점의 차이Sync와 Async를 구분하는 가장 중요한 기준은 "호출된 함수의 결과(Return Value)를 누가, 언제 처리하는가?"입니다.1-1. Synchronous (동기)"작업을 요청한 후, 그 결과가 나올 때까지 계속 확인하거나 기다리는 방식"동작: 호출자(Caller)는 피호출자(Callee)에게 작업을 시키고, 그 결과가 반환될 때까지 다음 로직을 실행하지 않거나, 결과가 왔는지 계속 확인(Polling)합니다.특징: 작업의 순서(Ordering)가 보장됩니다. A가 끝나야 B가 실행됩니다.1-2. Asynchronous (비동기)"작업을 요청해두고, 결과는 나중에 통보받는 방식"동작: 호출자(Caller)는 작업을 요청(Request)만 하고, 결과에는 당장 신경을 끄..