N° 01 — 목록

'Backend Development/Java' (25)

  1. Backend Development/Java

    Java - 25. classloader jit

    JVM이 new ArrayList()를 처음 실행할 때 일어나는 일 — 클래스 로딩과 JIT 컴파일Java 애플리케이션을 시작하면, 모든 클래스를 한 번에 로드하지 않는다 — 처음 참조되는 순간에 로드한다(lazy loading). 그리고 실행 초기에는 인터프리터로 바이트코드를 한 줄씩 해석하지만, 특정 메서드가 충분히 "hot"해지면 JIT 컴파일러가 네이티브 기계어로 변환한다.이 두 단계 — 클래스 로딩과 JIT 컴파일 — 가 JVM의 성능과 유연성을 동시에 만드는 핵심 메커니즘이다. (JVM Specification §5 - Loading) 이 글은 클래스 로딩의 계층 구조, 바이트코드 검증, JIT 컴파일(C1/C2), 그리고 프로파일링의 작동 원리를 풀어간다.클래스 로딩 — lazy, 계층적, ..

    · 댓글
  2. Backend Development/Java

    Java - 24. jvm gc

    GC 로그에서 "pause"가 200ms인 이유 — JVM 메모리 구조와 가비지 컬렉터 선택프로덕션 서버의 응답 시간이 주기적으로 200ms로 튄다. GC 로그를 보면 GC pause (G1 Evacuation Pause) 187ms가 찍혀 있다. 사용자는 "왜 갑자기 느려지나요?"라고 묻는다. 답은 GC의 stop-the-world — GC가 객체를 회수하는 동안 애플리케이션 스레드가 모두 멈추기 때문이다.서버 응답이 주기적으로 200ms로 튄다. GC 로그를 보면 "GC pause 187ms". 누가 멈추게 하는가? — 가비지 컬렉터가 객체를 청소하는 동안 모든 스레드가 잠시 멈춘다(stop-the-world). 이 글은 왜 멈추는지, G1/ZGC/Shenandoah가 각각 다르게 해결하는지를 풀어간..

    · 댓글
  3. Backend Development/Java

    Java - 23. modules

    module-info.java가classpath 지옥을 끝낸 방법 — JPMS와 모듈 시스템Java 9 이전에는 모든 클래스가 classpath에 평등하게 놓여 있었다. 의존성 충돌(Guava 20 vs 30이 동시에 필요), 내부 API 무단 사용(sun.misc.Unsafe), 공개 API와 내부 API의 구분 불가 — 이 문제들을 해결하기 위해 JPMS(Java Platform Module System)가 도입됐다. (JEP-261)classpath는 "모든 클래스가 평등하게 섞여 있는 거대한 주머니"다. 의존성 충돌, 내부 API 무단 사용, "이 클래스가 어디서 왔는지" 모르는 혼란. JPMS는 이것에 경계(wall)를 그린다. 이 글은 모듈이 무엇을 막고 무엇을 여는지 풀어간다.모듈이란 — 패..

    · 댓글
  4. Backend Development/Java

    Java - 22. networking

    HttpURLConnection을 버려야 하는 이유 — HttpClient(Java 11+)와 현대 네트워킹// Java 1.1 — 레거시 HttpURLConnection (1997년) HttpURLConnection conn = (HttpURLConnection) new URL("https://api.example.com/users").openConnection();conn.setRequestMethod("GET");conn.setRequestProperty("Accept", "application/json");int responseCode = conn.getResponseCode(); // 워낙 구식이라 설정이 복잡// 타임아웃 설정, 스트리밍, HTTP/2 — 모두 어렵거나 불가능// Java ..

    · 댓글
  5. Backend Development/Java

    Java - 21. jdbc

    Statement와 PreparedStatement의 차이가 SQL Injection을 막는 이유 — JDBC 기초// Java 25 — 위험: SQL Injection 취약Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery( "SELECT * FROM users WHERE name = '" + userInput + "'");// userInput = "'; DROP TABLE users; --" → 테이블 삭제!이 코드를 작성한 개발자는 악의가 없었다. 그냥 문자열을 연결했을 뿐이다. 하지만 공격자가 '; DROP TABLE users; --를 입력하면 SQL 문이 두 개로 나뉘어 실행된다. PreparedStateme..

    · 댓글
  6. Backend Development/Java

    Java - 20. virtual threads

    100만 개의 스레드를 만들 수 있게 된 Java — Virtual Threads와 pinning의 함정// Java 25try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 0; i { Thread.sleep(Duration.ofSeconds(1)); return null; }); }} // 100만 개의 가상 스레드가 1초 만에 완료된다Java 21 이전에는 불가능했다. 100만 개의 platform thread는 각각 ~1MB 스택을 사용하여 1TB의 메모리가 필요하다. Virtual Thread는 OS 스레드가 아니라 JVM이 관리하는 경량 ..

    · 댓글