Java 15

클래스로더는 .class 파일을 어떻게 실행시키나?

자바는 "한 번 작성하면 어디서나 실행된다"는 철학으로 유명합니다. 이 철학의 중심에는 JVM 클래스 로딩 시스템이 있습니다.이번 글에서는 JVM이 .class 파일을 어떻게 메모리에 올리고 실행하는지, 그 핵심 매커니즘을 상세히 설명합니다. 1. 클래스 로딩이란 무엇인가?자바 프로그램은 .java 소스 파일을 컴파일하면 .class 파일(바이트코드)이 생성됩니다.JVM은 이 .class 파일을 메모리에 로드하고 실행하는데, 이 과정을 클래스 로딩(Class Loading)이라고 부릅니다.굳이 java파일을 class 파일로 변환하는 이유는, JVM이 이를 읽을 수 없어서가 아니라 효율성, 이식성, 보안성을 위해서 JVM이 읽기 쉬운 파일로 변환한다고 보시면 됩니다. 자바 프로그램의 실행 흐름 개요자바 ..

Java & Kotlin 2025.08.02

JVM 메모리 참조 – GC와 참조 상태의 변화 흐름

과거에 GC에 대한 내부 메모리영역과 최적의 GC 튜닝에 대해서 알아보았습니다.https://youseong.tistory.com/30 자바의 Garbage Collection 이해와 성능 최적화 방법1. Garbage Collection이란?Garbage Collection(GC)는 동적으로 할당된 메모리 중 필요하지 않은 부분을 해제하는 JVM의 기능입니다.더 이상 사용하지 않는 객체의 메모리 자원을 해제하여 메모리의 여유 공youseong.tistory.com 이번 글에서는 GC 과정 중 객체의 참조 상태가 어떻게 변화하는지에 대해 다룹니다. 객체 상태에 대한 이해객체 참조 상태는 총 4가지로 간단하게 설명하면 다음과 같습니다.Strong Reference : 직접 접근이 가능한 객체 참조 상태,..

NIO(New I/O)와 Webflux 비동기 프로그래밍

Java의 New Input/Output을 사용해보며 대규모 처리에서 중요한 개념이라고 생각되어 이를 소개합니다. 1. NIO는 어떤것이고 왜 사용하는가NIO가 등장하기 이전에 사용된던 방식은 Blocking I/O입니다.글에서는 편하게 과거 방식의 Blocking I/O 를 BIO 라고 부르겠습니다. BIO에서는 클라이언트당 하나의 스레드를 할당해야 하며, 클라이언트가 많아질 경우 OOM(Out Of Memory)이 발생하거나 과도한 context switching 등의 문제가 발생합니다. 예를 들어, 하나의 스레드를 생성하는 데 약 1MB의 메모리가 필요하다고 가정하면,10,000명의 클라이언트 요청을 동시에 처리할 경우 10GB의 메모리가 필요합니다. 이를 해결하기 위해 2002년 Sun Micro..

Java & Kotlin 2025.07.07

Java Stream API의 핵심 개념과 병렬 처리의 함정

Java 8에 도입된 Stream API는 반복문 위주의 명령형 코드를 선언형 스타일로 바꾸고,더 나아가 병렬 처리를 손쉽게 구현할 수 있도록 도와주는 강력한 도구입니다. 이 글에서는 기본적인 사용법은 다루지 않고,실무에서 주의해야 할 핵심 개념들과 병렬 처리 시 발생할 수 있는 문제들에 대해 정리해보려 합니다. 1. Java Stream API가 무엇인지?Stream API는 2014년 4월, Java 8과 함께 등장한 기능으로, 컬렉션 또는 배열 데이터를 데이터 흐름(stream) 형태로 처리할 수 있게 합니다. 기존에는 for/while 루프를 사용해 명시적으로 데이터를 처리했다면,Stream은 데이터 처리 과정을 선언적으로 구성할 수 있습니다. 이를 통해 가독성이 좋아지고, 병렬 처리도 간결하게 ..

Java & Kotlin 2025.06.15

Java 에서의 데이터 입출력(I/O), Byte Stream

자바에서 입출력(I/O)은 생각보다 매우 단순합니다. 네트워크든 파일이든 결국 하나의 입구(InputStream)와 하나의 출구(OutputStream)로 통일됩니다.InputStream과 OutputStream은 바이트 스트림으로이 글에서는 특히 자주 사용되는 Socket과 File입출력을 중심으로 Java의 I/O 구조를 쉽게 살펴보겠습니다. InputStream과 OutputStream 바이트 스트림자바의 I/O 핵심은 InputStream과 OutputStream입니다. 이들은 모든 바이트 스트림의 최상위 추상 클래스이며, 데이터를 읽거나 쓸 수 있는 공통 메서드를 제공합니다.InputStream: 데이터 입력(읽기, 수신)을 위한 스트림OutputStream: 데이터 출력(쓰기, 송신)을 위한 ..

Architecture 2025.05.20

Spring Security 없이 OAuth2 클라이언트 직접 구현

OAuth2 인증 절차OAuth2 클라이언트를 Spring Boot 만 사용하여 구현해보겠습니다.Spring Security 없이, 순수 HTTP 통신과 세션 기반으로 인증 흐름을 직접 설계함으로써OAuth2의 내부 동작을 보다 깊이 있게 이해해보는 것이 목적입니다. 매우 간단합니다. 깃허브에서 전체 코드 확인하기:https://github.com/youseonghyeon/oauth2-client GitHub - youseonghyeon/oauth2-client: oauth2-client 구현을 위한 리포지토리oauth2-client 구현을 위한 리포지토리. Contribute to youseonghyeon/oauth2-client development by creating an account on Gi..

Architecture 2025.04.13

Socket 통신

1. Socket 통신이란 무엇인가?Socket은 네트워크 프로그래밍에서 가장 기본적이고 중요한 개념 중 하나입니다. 다양한 네트워크 애플리케이션(채팅, 실시간 게임, 파일 전송 등)을 개발하려면 클라이언트-서버 간 통신이 필수적입니다. 이때 Socket은 데이터를 주고받는 양 끝단의 연결점을 의미합니다. 2. Socket 통신의 기본 개념2.1. Socket이란?Socket은 네트워크 상의 두 호스트 간 통신을 위한 인터페이스입니다.주로 TCP/IP 또는 UDP 프로토콜 위에서 데이터를 주고받을 때 사용됩니다. 2.2. TCP와 UDP의 차이구분TCPUDP프로토콜 타입연결형(Connection-oriented)비연결형(Connectionless)신뢰성데이터 무결성 및 순서 보장신뢰성 보장 안 함속도느림..

Java & Kotlin 2024.12.15

CachedThreadPool의 한계와 ThreadPoolExecutor 커스터마이징

CachedThreadPool의 동작 방식과 한계Java의 CachedThreadPool은 많은 짧은 작업을 빠르게 처리하기 위해 설계되었지만, 동시 작업 수가 급증하거나 개별 작업이 오래 걸리는 경우에는 주의해야 합니다. CachedThreadPool 구성 및 동작 방식 public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor( 0, // corePoolSize Integer.MAX_VALUE, // maximumPoolSize 60L, TimeUnit.SECONDS, // keepAliveTime ..

Architecture 2024.10.28

Java Thread로 직접 구현하는 커스텀 쓰레드 풀: 기본 원리부터 동작까지

오늘은 Java의 Thread 객체만을 이용해 직접 Executors 클래스의 쓰레드 풀을 구현하는 방법에 대해 소개하겠습니다. Java에서는 Executors 클래스를 사용해 쉽게 쓰레드 풀을 만들 수 있지만, 내부적으로 어떻게 작동하는지 이해하면 더 유연하고 자신만의 커스텀 쓰레드 풀을 설계할 수 있습니다. 이번 글에서는 Thread와 BlockingQueue를 이용해 최소한의 쓰레드 풀을 구현하고, 이를 통해 기본적인 원리를 설명해보겠습니다. 코드는 GitHub에서 확인하실 수 있습니다: https://github.com/youseonghyeon/threadpool 요구 사항구현하려는 Thread Pool의 주요 기능은 다음과 같습니다: 최소 쓰레드 개수 설정: 항상 일정한 최소 개수의 쓰레드가 살..

Java & Kotlin 2024.10.06

JPA와 Hibernate의 차이점은 무엇인가요?

JPA와 Hibernate는 둘 다 자바 환경에서 관계형 데이터베이스를 다루기 위한 도구입니다. 몇 가지 중요한 차이점이 있습니다. JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 위한 표준 API를 제공합니다.JPA 자체는 구현이 없으며, 인터페이스만 제공합니다. 그러므로 Hibernate라는 ORM이 없을 경우 JPA의 기능들을 사용할 수 없습니다.JPA는 JPQL이라는 언어를 제공합니다. 객체 지향적인 쿼리를 작성할 수 있습니다. Hibernate는 JPA의 표준 사양을 구현한 구현체이며 라이브러리 중 하나입니다. 따라서 JPA의 모든 기능을 Hibernate에서도 사용할 수 있습니다.Hibernate는 JPA기능 외에도, Lazy Loading, Caching, Dirty Checking 등..

Spring Data 2023.09.02