728x90

전체 글 231

가상 스레드와 코루틴 한번에 보기 : Spring MVC, WebFlux 흐름으로 이해하기

가상 스레드와 코루틴은 무엇이 다를까? Spring MVC, WebFlux 흐름으로 이해하기들어가며동시에 많은 요청을 처리하는 서버를 설계할 때, 오래된 화두가 다시 표면 위로 올라온다. “스레드를 얼마나 쓸 것인가”, “블로킹 코드를 유지할 것인가, 논블로킹으로 갈 것인가”다.Java Virtual Thread(Project Loom) 와 Kotlin Coroutine은 둘 다 “더 많은 동시성을 더 적은 비용으로”라는 방향으로 겹쳐 보인다. 그래서 흔히 가벼운 스레드와 더 가벼운 스레드처럼 한 줄에 묶여 오해가 생긴다.이 글에서는 그 오해를 끊고, 아래 순서로 문제의식(왜) 부터 스프링에서의 연결(MVC vs WebFlux) 까지 정리한다.왜 가상 스레드·코루틴 이야기가 나오는가 기존 thread-..

CS/JAVA 2026.04.04

Tomcat과 Nginx 한눈에 보기 : 관문과 실행기 — Nginx 문법 분해까지

Tomcat과 Nginx: 관문과 실행기 — 같이 쓸 때 이해해야 할 것들백엔드 입문 단계에서 “서버”라는 말이 Tomcat인지 Nginx인지 헷갈리기 쉽다. 둘 다 HTTP를 다루지만, 하나는 자바 애플리케이션을 돌리는 실행기이고 하나는 트래픽을 정리하는 앞단에 가깝다. 이 글에서는 역할을 나누는 이유, Nginx 설정 파일이 말하는 구조, 그리고 Tomcat(및 Spring MVC) 안에서 요청이 어떻게 메서드 호출로 바뀌는지까지 한 번에 정리한다. 목차Tomcat과 Nginx는 서로 다른 일을 한다트래픽이 흐르는 그림Nginx가 앞단에서 자주 맡는 역할HTTPS를 어디서 끊을까: TLS 종료버퍼링이 필요한 이유보안·운영: 리버스 프록시를 쓸 때 빠지기 쉬운 것Tomcat은 무엇을 하는 프로그램인가n..

CS/JAVA 2026.04.04

JAVA Lambda 한눈에 보기 : Lambda와 함수형 인터페이스: 자바는 왜 람다를 도입했을까?

Lambda와 함수형 인터페이스: 자바는 왜 람다를 도입했을까?들어가며람다는 “문법이 짧아졌다”는 이야기만으로 끝나기 쉽다. 그런데 실제로 코드를 읽다 보면 아래에서 계속 막힌다.컴파일러는 어느 인터페이스의 구현으로 이 람다를 붙이는가(타깃 타이핑)Function이면 되는데 왜 ToIntFunction을 쓰는가 (박싱·성능)람다가 잡는 this는 누구의 this인가검사 예외(checked) 를 던지는 람다는 왜 잘 안 되는가메서드 참조 String::length는 “어떤 형태의 함수형 인터페이스”에만 들어갈 수 있는가이 글은 왜 필요했는지에서 시작해, 언어 규칙(타깃 타이핑·SAM·캡처) 과 java.util.function 설계, 메서드 참조의 분류, 그리고 실무/면접에서 나오는 골든 질문까지 한 번에..

CS/JAVA 2026.04.04

Java Stream 한눈에 보기 : 컬렉션에 담지 않고 흘려보내며 가공하는 파이프라인

Java Stream: 컬렉션에 담지 않고 흘려보내며 가공하는 파이프라인들어가며for 문이 나쁜 것이 아니다. 어떤 일을 하는지를 한눈에 드러내기 어려울 때가 문제다.스트림은 “필터하고, 바꾸고, 모으자” 같은 선언적(declarative) 표현을 자바에 가져왔다. 람다가 동작을 넘기는 문법이었다면, 스트림은 그 동작을 데이터 흐름에 엮는 API다. 막히기 쉬운 지점은 이것이다.스트림은 컬렉션의 또 다른 종류가 아니다 (데이터를 다시 “담는 그릇”이 아니다)중간 연산만 있으면 아무 일도 안 일어난다 (지연)한 번 소비하면 같은 스트림은 다시 못 탄다forEach로 부작용을 밀어 넣다가 나중에 버그로 돌아온다parallelStream()이 항상 빠르지 않다 (때로는 틀린 결과·성능 역전)이 글은 왜 나왔는..

CS/JAVA 2026.04.04

자바 입출력 한눈에 보기 : IO vs NIO: 왜 Buffer, Channel, Selector를 들고 나왔을까?

들어가며InputStream.read() 한 줄과 ByteBuffer.put() 한 줄은 겉으로 비슷해 보인다. 그런데 운영 방식은 완전히 다르다.전통 java.io 는 스트림 파이프와 블로킹 read/write가 중심이다. “바이트가 흘러온다”에 가깝게 생각하면 읽기 쉽다.java.nio 는 버흼는 조각을 두고, position / limit / capacity 로 내가 어디까지 썼고 어디까지 읽을지를 직접 맞춘다. 채널은 그 버퍼와 짝을 이룬다.Selector 는 “여러 채널을 한 스레드가 감시한다”는 이벤트 루프 모델이다. 필기에서 별표 친 ACCEPT / READ 가 왜 핵심인지까지 연결해야 서버 그림이 선명해진다.목차1) IO와 NIO를 공부할 때 먼저 던질 질문2) 전통적인 java.io는 어..

CS/JAVA 2026.04.04

Java 비교 한눈에 보기 : Comparable vs Comparator: 정렬 기준은 객체 안에 둘까, 밖에 둘까?

Comparable vs Comparator: 정렬 기준은 객체 안에 둘까, 밖에 둘까?들어가며compareTo와 compare는 “음수면 앞, 양수면 뒤”로 외우면 잠깐 편하다. 그런데 실무·면접에서 막히는 지점은 다른 데에 있다.equals와 compareTo가 말하는 동치가 다르면 TreeMap·TreeSet이 어떤 괴현상을 일으키는가Comparator 체인을 읽을 때 thenComparing이 “언제” 발동하는가“자바 정렬은 퀵소트 아닌가요?” 라는 질문에 어디까지가 사실인가원시형 int[] 과 List 은 왜 다른 정렬 엔진으로 가는 게 자연스러운가이 글은 정렬 기준을 어디에 둘지(내장 vs 주입) 를 정리한 뒤, Comparator 유틸 전부를 실무 관점에서, 마지막으로 TimSort와 퀵소트..

CS/JAVA 2026.04.04

Java 동시성 한눈에 보기 : 프로세스, 스레드, Thread Pool, Sync/Async, CompletableFuture까지

Java 동시성 한눈에 보기 : 프로세스, 스레드, Thread Pool, Sync/Async, CompletableFuture까지들어가며Java 동시성을 공부할 때 가장 헷갈리는 이유는 여러 질문이 한꺼번에 등장하기 때문이다.프로세스와 스레드는 무엇이 다른가왜 여러 스레드가 동시에 돌면 값이 꼬이는가synchronized, Lock, Atomic은 각각 무엇을 해결하는가스레드가 많으면 왜 오히려 느려질 수 있는가동기 / 비동기와 Blocking / Non-blocking은 무엇이 다른가ExecutorService, Future, CompletableFuture, WebFlux는 어디에 연결되는가즉 동시성은 단순히 "여러 개를 동시에 실행한다"는 이야기가 아니다.실행 단위를 이해해야 하고공유 자원을 안전..

CS/JAVA 2026.03.26

자바 컬렉션 한눈에 보기 4편: HashSet과 TreeSet, 중복 판정의 기준

자바 컬렉션 한눈에 보기 4편: HashSet과 TreeSet, 중복 판정의 기준들어가며Set은 API만 보면 매우 단순하다.중복을 허용하지 않는다그런데 이 단순한 규칙 뒤에는 사실 이미 배운 거의 모든 개념이 녹아 있다.HashSet은 HashMap의 이해가 그대로 필요하고TreeSet은 TreeMap의 비교 기반 정렬 철학이 그대로 들어가며중복 판정 기준도 hash냐 compare냐에 따라 달라진다즉 Set은 별도 세계가 아니라Map 개념을 "값 자체만 저장"하도록 변형한 구조에 가깝다.목차17) HashSet은 왜 중복을 허용하지 않을까18) TreeSet 내부 구조17) HashSet은 왜 중복을 허용하지 않을까17-1) HashSet은 별도 마법 구조가 아니다Set은 원소만 저장하고 Map은 k..

CS/JAVA 2026.03.19

자바 컬렉션 한눈에 보기 3편: ArrayList부터 Iterator, fail-fast까지

자바 컬렉션 한눈에 보기 3편: ArrayList부터 Iterator, fail-fast까지들어가며실무에서 가장 많이 쓰는 Collection을 하나만 고르라면 아마 List일 가능성이 높다.문제는 List를 많이 쓴다고 해서 내부 동작까지 잘 안다고 보긴 어렵다는 점이다.예를 들어 이런 질문은 전부 연결되어 있다.ArrayList와 LinkedList는 왜 이론과 실무 체감이 다를까ArrayList는 왜 크기가 계속 늘어날 수 있을까Iterator는 왜 필요한가왜 for-each 중 remove()는 터질 수 있을까fail-fast는 왜 존재하는가왜 Iterator.remove()는 안전한가CopyOnWriteArrayList는 왜 예외가 덜 보일까이 구간은 사실 "리스트"만의 이야기가 아니라반복 중 ..

CS/JAVA 2026.03.19

자바 컬렉션 한눈에 보기 1편: 해시부터 hashCode, equals, 충돌까지

자바 컬렉션 한눈에 보기 1편: 해시부터 hashCode, equals, 충돌까지들어가며HashMap, HashSet, ConcurrentHashMap을 제대로 이해하려면 제일 먼저 hash를 잡아야 한다.문제는 hash를 처음 배우면 설명이 지나치게 압축돼 있다는 점이다.입력을 고정 길이 값으로 바꾼다빠른 탐색을 위해 쓴다충돌이 난다틀린 말은 아니지만, 이 정도 설명만으로는 왜 HashMap이 빠른지,왜 equals()와 hashCode()를 함께 구현해야 하는지까지 연결되지 않는다.이번 글은 hash를 수학적 정의보다왜 비교를 줄이기 위해 hash라는 우회로를 쓰는가라는 관점에서 정리한다.목차1) 해시란 무엇인가2) Java hashCode는 어떻게 동작하는가3) equals와 hashCode는 왜 ..

CS/JAVA 2026.03.19
728x90