N° 01 — 목록
'분류 전체보기' (197)
-
Backend Development/JavaJava - 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)를 그린다. 이 글은 모듈이 무엇을 막고 무엇을 여는지 풀어간다.모듈이란 — 패..
-
Backend Development/JavaJava - 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 ..
-
Backend Development/JavaJava - 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..
-
Backend Development/JavaJava - 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이 관리하는 경량 ..
-
Backend Development/JavaJava - 19. concurrent
new Thread()를 직접 만드는 것을 멈춰야 하는 이유 — Executor와 CompletableFuture100개의 HTTP 요청을 병렬로 보내야 한다. new Thread()를 100개 만들까? — OS 스레드는 메모리를 1MB씩 소비하므로(스택 크기), 100개는 100MB다. 게다가 스레드 생성/소멸 비용이 매번 발생한다. ExecutorService를 쓰면 스레드 풀을 재사용하여 이 비용을 없앤다. (java.util.concurrent 패키지)100개의 HTTP 요청을 보내야 한다. new Thread() 100개? OS 스레드는 1MB씩 잡아먹는다. 이 글은 스레드 풀로 재사용하고, CompletableFuture로 비동기를 엮고, ConcurrentHashMap으로 안전하게 공유하는 ..
-
Backend Development/JavaJava - 18. thread sync
두 스레드가 count++를 동시에 실행하면 값이 1만 증가하는가 — 가시성과 원자성// Java 25class Counter { private int count = 0; public void increment() { count++; }}두 스레드가 동시에 counter.increment()를 10,000번씩 호출하면 count가 20,000이 될까? — 아니다. 대부분 17,000~19,000 사이의 값이 나온다. count++는 하나의 연산처럼 보이지만, 실제로는 읽기 → 더하기 → 쓰기 세 단계이며, 두 스레드가 동시에 같은 값을 읽으면 하나의 증가가 사라진다(lost update).이것이 경쟁 조건(race condition)이다. 이 글은 Java 메모리 모델(JMM), synchro..