Posts by Category

EFFECTIVE_JAVA

맨 위로 이동 ↑

Algorithm

맨 위로 이동 ↑

SPRING

Spring WebFlux — 리액티브 프로그래밍

24 분 소요

Tomcat 스레드 200개가 모두 외부 API 응답을 기다리며 블로킹되어 있다. 새 요청은 큐에서 대기하다 타임아웃이 난다. 이 상황에서 서버를 늘리는 것보다 더 근본적인 해법이 WebFlux다.

분산 추적 (Sleuth + Zipkin)

5 분 소요

마이크로서비스 환경에서 주문 하나가 실패했다. Order Service → Payment Service → Inventory Service → Notification Service를 거치는데, 어디서 얼마나 걸렸는지 알 수가 없다. 분산 추적(Distributed Tracing)은...

Spring Security 아키텍처

7 분 소요

JWT 토큰이 없는 요청이 /api/admin에 들어왔는데 그냥 통과됐다. 필터 순서가 잘못됐거나 필터 자체가 누락된 것이다. Spring Security 아키텍처를 모르면 어디서 막혀야 하는지조차 알 수 없다.

Spring Resilience4j

7 분 소요

마이크로서비스 환경에서 외부 서비스 호출은 실패할 수 있다. 한 서비스의 장애가 연쇄적으로 전파돼 전체 시스템이 다운되는 “연쇄 장애(Cascading Failure)”가 가장 위험하다. Resilience4j는 이를 방어하는 경량 내결함성(Fault Tolerance) 라이브러리...

Spring MVC 동작 원리

6 분 소요

비유로 먼저 이해하기: MVC는 레스토랑과 같다. 손님 요청을 웨이터(Controller)가 받아 주방(Service)에 전달하고, 셰프가 요리(비즈니스 로직)를 완성하면 접시(View)에 담아 손님에게 돌려준다. 손님은 주방이 어떻게 돌아가는지 알 필요가 없다.

MDC(Mapped Diagnostic Context) — 분산 환경 로그 추적

11 분 소요

새벽 2시에 운영 장애가 났다. 로그를 보니 에러와 정상 로그가 뒤섞여 어느 요청에서 터진 건지 찾을 수가 없다. MDC를 몰랐다면 이 상황에서 로그 전체를 시간순으로 읽어내려가야 한다.

Spring IoC와 DI

7 분 소요

신입 때 이런 경험이 있을 것이다. 서비스 클래스 안에서 new RateDiscountPolicy()를 직접 써뒀는데, 기획이 바뀌어서 FixDiscountPolicy로 교체해야 하는 순간. 수십 개 파일을 열어 new를 바꿔야 했다. IoC와 DI는 이 문제를 해결하기 위해 태어...

Spring Cloud Eureka

6 분 소요

마이크로서비스 환경에서 서비스들은 동적으로 생성·삭제·이동된다. IP와 포트를 하드코딩하면 배포할 때마다 설정을 바꿔야 한다. Spring Cloud Eureka는 이 문제를 해결하는 Service Discovery 솔루션이다. 서비스가 스스로 자신의 위치를 등록하고, 호출자는 이...

Spring Cloud Config

6 분 소요

100개의 마이크로서비스에 DB 비밀번호를 바꿔야 한다면? 각 서비스마다 설정 파일을 수정하고 재배포하면 수십 분이 걸린다. Spring Cloud Config는 모든 서비스의 설정을 한 곳에서 관리하고, 재배포 없이 런타임에 반영하는 중앙 집중 설정 관리 솔루션이다.

Spring Cloud Gateway

5 분 소요

Spring Cloud Gateway는 Spring 생태계의 API Gateway 솔루션이다. Netflix Zuul(블로킹)의 후계자로, Spring WebFlux(Reactor/Netty) 기반의 비동기 논블로킹 방식으로 동작한다. 라우팅, 필터링, 로드밸런싱, 인증, Rate...

Spring @Async

5 분 소요

Spring의 @Async는 메서드를 별도 스레드에서 비동기로 실행하게 만드는 애노테이션이다. 단순히 붙이면 동작하는 것처럼 보이지만, 내부 동작과 주의사항을 모르면 예외가 무시되거나 MDC 컨텍스트가 사라지는 등 운영 장애로 이어질 수 있다.

분산 트랜잭션

8 분 소요

마이크로서비스 아키텍처에서는 단일 비즈니스 작업이 여러 서비스에 걸쳐 실행된다. 각 서비스는 독립적인 데이터베이스를 가지므로 전통적인 ACID 트랜잭션을 사용할 수 없다. 분산 트랜잭션은 이 문제를 해결하기 위한 다양한 패턴을 다룬다.

JPA N+1 문제

12 분 소요

팀 목록을 조회하는 API가 개발 환경에서는 멀쩡하다가 운영에서 수백 ms가 걸린다면, 열에 아홉은 N+1 문제다. 데이터가 적을 때는 보이지 않다가 데이터가 쌓이면서 DB 쿼리가 폭발적으로 늘어나는 것이 이 문제의 특징이다.

JPA 핵심 개념

12 분 소요

Spring Boot로 애플리케이션을 만들다 보면 SQL 한 줄 짜지 않았는데 쿼리가 수십 번 나가거나, 분명히 값을 바꿨는데 DB에 반영이 안 되는 경험을 하게 된다. 이런 문제의 뿌리는 대부분 JPA 내부 동작을 모르는 데 있다.

맨 위로 이동 ↑

JAVA

Java 래퍼 클래스와 오토박싱

6 분 소요

Java는 기본형(primitive type)과 참조형(reference type)이라는 두 가지 타입 체계를 가집니다. 이 둘 사이의 간극을 메우는 것이 래퍼 클래스(Wrapper Class)이며, 오토박싱(Auto-boxing)은 이 변환을 자동화한 Java 5의 핵심 기능입니...

Java Virtual Thread(가상 스레드)

15 분 소요

비유로 먼저 이해하기: 가상 스레드는 비행기 좌석과 같다. 비행기 엔진(OS 스레드)은 몇 개 없지만 좌석(가상 스레드)은 수백 개다. 승객(요청)이 좌석에 앉아 있는 동안 엔진이 교대로 각 좌석을 처리한다. OS 스레드 하나가 수천 개의 가상 스레드를 번갈아 실행하는 것도 ...

Java ThreadLocal — 동작 원리부터 메모리 누수까지

12 분 소요

Java의 멀티스레드 환경에서 스레드 간 공유 없이 각 스레드마다 독립적인 변수를 유지해야 할 때 ThreadLocal을 사용합니다. 이 글에서는 ThreadLocal의 내부 구조부터 메모리 누수 방지, 실무 활용 패턴까지 깊이 있게 다룹니다.

Java 스레드(Thread) — 동시성 프로그래밍

31 분 소요

주문 처리와 이메일 발송을 순차적으로 하면 사용자는 이메일이 발송될 때까지 기다려야 한다. 스레드를 분리하면 주문 처리 응답을 즉시 주고 이메일은 백그라운드에서 보낼 수 있다. 하지만 스레드를 잘못 다루면 데이터가 꼬인다.

Java String

8 분 소요

Java에서 String은 가장 많이 사용되는 클래스이면서, 동시에 가장 많은 오해가 있는 클래스입니다. 불변성(Immutability), String Pool, 성능 최적화, 그리고 Java 11~17에서 추가된 메서드까지 완전히 정리합니다.

Java 스트림(Stream) API

15 분 소요

Java 8의 Stream API는 컬렉션 데이터를 선언적으로 처리하는 강력한 도구입니다. 단순히 for 루프를 대체하는 것이 아니라, 지연 연산(lazy evaluation), 병렬 처리, 함수 합성을 통해 데이터 파이프라인을 구성하는 새로운 패러다임입니다.

Java 리플렉션(Reflection)

16 분 소요

리플렉션은 런타임에 클래스 구조를 분석하고 동적으로 조작하는 강력한 기법입니다. Spring, JPA, Jackson, JUnit이 모두 이를 기반으로 동작합니다. 원리부터 실무 활용까지 상세히 정리합니다.

Java Object 클래스

9 분 소요

Java의 모든 클래스는 명시적으로 상속을 선언하지 않아도 java.lang.Object를 최상위 부모로 가집니다. Object 클래스가 제공하는 메서드들은 Java 객체 시스템의 근간을 이루며, 이를 올바르게 이해하고 오버라이딩하는 것은 Java 개발의 핵심입니다.

Java 네트워크 프로그래밍

13 분 소요

Java는 소켓부터 HTTP 클라이언트까지 풍부한 네트워크 API를 제공합니다. TCP/UDP 저수준 통신부터 NIO 기반 고성능 서버까지 전체를 상세히 정리합니다.

Java 중첩 클래스

8 분 소요

Java는 클래스 안에 클래스를 선언할 수 있습니다. 이를 중첩 클래스(Nested Class)라고 하며, 종류에 따라 동작 방식과 사용 목적이 크게 다릅니다. 잘못 사용하면 메모리 누수의 원인이 되기도 하므로, 각각의 특성을 정확히 이해하는 것이 중요합니다.

Java 람다(Lambda) 표현식

12 분 소요

Java 8에서 도입된 람다(Lambda) 표현식은 Java를 함수형 프로그래밍 언어로 진화시킨 핵심 기능입니다. 단순한 문법 설탕(syntactic sugar)처럼 보이지만, 그 내부 동작 원리부터 실전 활용까지 깊이 있게 이해해야 제대로 쓸 수 있습니다.

Java I/O

13 분 소요

Java의 I/O 시스템은 데이터를 읽고 쓰는 모든 작업의 근간입니다. 고전적인 java.io부터 고성능 NIO, 편리한 NIO.2까지 전체 체계를 상세히 정리합니다.

Java 제네릭(Generics)

21 분 소요

Java 제네릭(Generics)은 클래스, 인터페이스, 메서드를 정의할 때 타입을 파라미터로 사용할 수 있게 해주는 기능입니다. Java 5(2004)에 도입되어 타입 안전성과 코드 재사용성을 동시에 달성하는 핵심 언어 기능으로 자리잡았습니다.

Java 가비지 컬렉터(GC)

17 분 소요

API 응답이 평소엔 10ms인데 가끔 500ms로 튄다. GC 로그를 보면 Stop-the-World가 발생한 시점과 정확히 일치한다. GC 동작 원리를 모르면 튜닝 방향을 잡을 수 없다.

Java 함수형 프로그래밍

20 분 소요

Java는 본래 순수 객체지향 언어지만, Java 8부터 람다와 Stream API를 통해 함수형 프로그래밍 패러다임을 적극 수용했습니다. 함수형 프로그래밍의 핵심 개념을 이해하고 Java에서 어떻게 적용하는지 깊이 있게 살펴봅니다.

Java 예외 처리

11 분 소요

Java의 예외 처리는 단순한 try-catch 문법을 넘어, 시스템의 견고성과 유지보수성을 결정하는 설계 영역입니다. 예외 계층 구조부터 커스텀 예외 설계, Spring의 예외 전략까지 완전히 정리합니다.

Java Enum

9 분 소요

Java의 enum은 단순히 상수 집합을 표현하는 것을 넘어, 필드·메서드·추상 메서드를 가질 수 있는 완전한 클래스입니다. 상수 대신 Enum을 사용해야 하는 이유부터 EnumSet, EnumMap, 싱글톤 패턴까지 완전히 정리합니다.

Java 날짜와 시간 API (java.time)

8 분 소요

Java 8에서 도입된 java.time 패키지는 기존 Date와 Calendar의 고질적인 문제를 해결하고, 불변(Immutable) 설계와 직관적인 API를 제공합니다. 현대 Java 개발에서 날짜·시간 처리의 표준입니다.

CompletableFuture

6 분 소요

상품 정보, 재고, 가격을 각각 다른 API에서 가져와야 한다. 순차적으로 호출하면 300ms + 200ms + 150ms = 650ms가 걸린다. 병렬로 처리하면 300ms면 된다. CompletableFuture가 이 병렬 조합을 깔끔하게 표현해준다.

Java 컬렉션 프레임워크

19 분 소요

ArrayList를 써야 할지 LinkedList를 써야 할지, HashMap과 TreeMap의 차이는 무엇인지 — 컬렉션 선택 하나가 성능을 10배 이상 바꿀 수 있다. 내부 구조를 알아야 올바른 선택이 가능하다.

맨 위로 이동 ↑

SECURITY

맨 위로 이동 ↑

Http

HTTP 기본

최대 1 분 소요

HTTP (HyperText Transfer Protocol)

맨 위로 이동 ↑

DesignPattern

맨 위로 이동 ↑

DB

데이터베이스 샤딩

18 분 소요

단일 MySQL 서버가 감당할 수 있는 쓰기 TPS 한계에 도달했다. 읽기는 레플리카로 분산했지만 쓰기 병목은 해결되지 않는다. 수직 확장(더 좋은 서버)도 한계가 왔다. 다음 선택지가 샤딩이다.

MySQL 옵티마이저 동작 원리

26 분 소요

인덱스를 분명히 걸었는데 EXPLAIN을 보니 Full Table Scan이다. 옵티마이저가 인덱스보다 풀스캔이 더 빠르다고 판단한 것이다. 왜 그런 선택을 했는지 이해하지 못하면 힌트를 줄 수도, 통계를 갱신할 수도 없다.

낙관적 락 / 비관적 락 / 네임드 락

13 분 소요

재고가 1개 남은 상품에 동시 주문이 100건 들어왔다. 락 없이 처리하면 재고가 -99가 될 수 있다. 어떤 락을 어떤 상황에 써야 하는지 모르면 장애가 나서야 알게 된다.

DB 내부 동작 원리

11 분 소요

운영 중인 서비스에서 갑자기 특정 쿼리가 10배 느려졌다. 코드는 그대로인데 왜일까? 통계가 오래되어 옵티마이저가 잘못된 실행 계획을 선택했거나, Buffer Pool이 가득 차 디스크 I/O가 폭발한 것일 수 있다. DB 내부 동작 원리를 모르면 이런 상황에서 무엇을 봐야 할지조...

데이터베이스 인덱스 (MySQL/InnoDB 기준)

22 분 소요

회원 테이블에 1,000만 건이 쌓였다. 특정 이메일 하나를 조회하는 쿼리가 5초 걸린다. 인덱스 하나 추가했더니 3ms로 떨어졌다. 왜 이런 차이가 나는지, 그리고 어떤 컬럼에 걸어야 하는지를 이 글에서 다룬다.

DB 커넥션 풀

6 분 소요

DB 커넥션을 맺는 것은 생각보다 비싸다. TCP 연결, 인증, 세션 초기화까지 수십~수백 밀리초가 걸린다. 매 요청마다 새 커넥션을 만들면 DB가 이 비용만으로 과부하에 걸린다. 커넥션 풀은 미리 만들어 놓은 커넥션을 재사용해 이 비용을 제거한다.

맨 위로 이동 ↑

KAFKA

Kafka 데이터 복제 메커니즘

5 분 소요

브로커 한 대가 갑자기 죽었다. 그 브로커에만 있던 메시지는 영영 사라지는가? Kafka는 처음부터 이 상황을 가정하고 설계됐다. 파티션을 여러 브로커에 복제해두고, 리더가 죽으면 팔로워 중 하나가 즉시 리더를 이어받는다.

Kafka Producer 내부 동작과 신뢰성 설정

6 분 소요

kafkaTemplate.send("orders", event) 한 줄이면 메시지가 전송된다고 생각하기 쉽다. 하지만 이 한 줄 뒤에는 직렬화, 파티셔닝, 배치 누적, 압축, 재시도, ACK 확인까지 수십 가지 동작이 숨어있다. acks 설정 하나 잘못 건드리면 메시지가 유실되거나...

Kafka Outbox 패턴과 CDC 활용

6 분 소요

주문이 DB에 저장됐는데 Kafka 발행이 실패했다. 결제 서비스는 주문을 모른다. 반대로 Kafka 발행은 됐는데 DB 롤백이 됐다. 결제 서비스는 존재하지 않는 주문을 처리한다. 분산 트랜잭션 없이 이 문제를 해결하는 것이 Outbox 패턴이다.

Kafka 내부 동작 원리 — Producer부터 트랜잭션까지

11 분 소요

초당 100만 건의 주문 이벤트가 쏟아지는 쇼핑몰을 상상해보자. producer.send(record)를 호출할 때마다 네트워크 요청이 한 번씩 나간다면 시스템은 버티지 못한다. Kafka Producer는 내부적으로 메시지를 배치로 모으고, 압축하고, 비동기로 전송하며 이 문제를...

Kafka 핵심 개념 정리

11 분 소요

서비스가 성장하면서 주문, 결제, 배달, 통계, 알림 시스템이 서로 직접 API를 호출한다. 하나가 느려지면 전체가 느려지고, 하나가 죽으면 연쇄 장애가 난다. Kafka는 이 결합을 끊는다.

Kafka Consumer 동작 원리와 파티션 할당

7 분 소요

주문 이벤트 처리 속도가 발행 속도를 따라가지 못한다. 컨슈머 인스턴스를 한 대 더 띄우면 해결될까? 파티션이 3개인데 컨슈머가 이미 3개라면 4번째 컨슈머는 아무것도 하지 않고 대기만 한다. 컨슈머 그룹과 파티션 할당 원리를 모르면 장비를 늘려도 성능이 나아지지 않는다.

Kafka Broker 내부 구조와 로그 관리

7 분 소요

Kafka가 초당 수백만 메시지를 처리하면서도 디스크 기반임에도 빠른 이유는 무엇일까? 비결은 브로커 내부의 로그 세그먼트 구조, 페이지 캐시 활용, 제로카피 전송에 있다. 브로커 내부를 이해하면 성능 튜닝 방향이 보인다.

맨 위로 이동 ↑

REDIS

Redis TTL 동작 원리와 메모리 관리

3 분 소요

로그인 세션이 24시간 뒤 자동 만료되지 않는다면 어떻게 될까? 사용자가 로그아웃을 깜빡하면 그 세션은 영원히 메모리에 남아있다. 수백만 명이 사용하는 서비스라면 Redis 메모리가 서서히 고갈되어 결국 장애로 이어진다. TTL은 이 문제를 코드 한 줄로 해결한다.

Redis 데이터 복제(Replication) 동작 원리

4 분 소요

새벽 2시, 서비스가 갑자기 다운됐다는 알림이 온다. Redis 마스터 서버의 디스크가 고장났다. 데이터는? 서비스 재개까지 걸리는 시간은? 복제 없이 단일 Redis만 운영 중이었다면 모든 캐시 데이터가 날아가고 서비스는 멈춘다. 복제(Replication)는 바로 이런 상황에 ...

Redis Lua 스크립트 동작 원리와 활용

9 분 소요

재고 감소 로직을 생각해보자. GET으로 재고를 읽고, 0보다 크면 DECR로 줄인다. 두 명령 사이에 다른 요청이 끼어들면 재고가 -1이 되는 순간이 생긴다. 이 틈을 없애는 것이 Lua 스크립트다. 두 명령을 하나의 원자적 단위로 묶어 Redis 서버 안에서 실행한다.

Redis 분산 락 기본 원리와 구현

6 분 소요

쿠팡 타임세일, 1초에 10만 명이 몰린다. 재고는 딱 1개. 10만 명 중 정확히 1명만 구매에 성공해야 한다. 서버는 10대. 각 서버가 동시에 “재고 있음”을 확인하고 결제를 진행한다면 어떻게 될까?

Redis 분산 락 구현 — Lettuce, Redisson, Redlock

9 분 소요

블랙프라이데이 자정, 한정판 운동화 1켤레에 5만 명이 동시 접속한다. 서버 20대가 동시에 “재고 1개 남음”을 확인하고 저마다 결제를 진행한다면? 한 사람만 사야 할 물건이 20명에게 팔린다. 분산 락은 “지금 이 자원은 내가 쓰고 있으니 기다려라”는 신호를 20대 서버 전체에...

Redis 자료구조와 명령어 활용

13 분 소요

실시간 랭킹을 구현해야 한다면? MySQL로 매 요청마다 ORDER BY score DESC를 돌리면 수천 명이 동시 접속할 때 DB가 버티지 못한다. Redis Sorted Set 하나로 수백만 명의 점수를 실시간으로 정렬해 1ms 안에 응답할 수 있다. Redis가 단순 캐시 ...

Redis 배포 모드 — 싱글, 센티넬, 클러스터

9 분 소요

개발 환경에서 잘 돌아가던 Redis가 프로덕션에서 새벽에 죽었다. 마스터 한 대뿐이었고, 자동 복구 수단도 없었다. 엔지니어가 잠에서 깨 수동으로 레플리카를 마스터로 승격시키기까지 20분이 걸렸다. 센티넬이 있었다면 30초 안에 자동으로 해결됐을 문제다.

맨 위로 이동 ↑

ARCHITECTURE

MSA (마이크로서비스 아키텍처)

6 분 소요

처음에는 작은 쇼핑몰 하나였다. 코드 한 곳에서 회원, 주문, 결제, 배송을 모두 처리했다. 팀이 커지고 기능이 늘면서 빌드는 30분, 배포는 하루에 한 번, 한 줄 수정이 전체 서비스를 다운시킨다. MSA는 이 문제를 해결하기 위해 시스템을 독립적으로 배포 가능한 작은 서비스들로...

이벤트 기반 아키텍처

7 분 소요

전통적인 시스템에서 서비스들은 서로를 직접 호출한다. Order Service가 Payment, Inventory, Notification을 직접 호출하면, 하나라도 다운되면 주문 자체가 실패한다. 이벤트 기반 아키텍처(EDA)는 서비스들이 이벤트를 통해 간접적으로 소통해 결합도를...

맨 위로 이동 ↑

FRONTEND

React

6 분 소요

비유로 시작하기

Next.js

5 분 소요

비유로 시작하기

맨 위로 이동 ↑

JPA

JPA 영속성 관리

3 분 소요

이번 블로깅에서는 JPA가 내부적으로 어떻게 동작하는지 작성할 것이다.

맨 위로 이동 ↑

NETWORK

DNS

6 분 소요

DNS란?

맨 위로 이동 ↑

SERVER

Tomcat vs Netty

5 분 소요

Tomcat과 Netty는 Java 생태계에서 가장 널리 사용되는 두 서버 엔진이다. 둘 다 네트워크 I/O를 처리하지만 설계 철학과 스레드 모델이 근본적으로 다르다. Spring MVC와 Spring WebFlux의 기반이 되는 두 엔진을 이해하면 성능 문제를 더 잘 진단하고 올...

동기/비동기/블로킹/논블로킹

8 분 소요

동기(Synchronous), 비동기(Asynchronous), 블로킹(Blocking), 논블로킹(Non-blocking)은 I/O와 동시성 프로그래밍에서 자주 혼용되는 개념이다. 이 네 가지는 서로 독립된 두 축이며, 조합에 따라 4가지 모드가 만들어진다.

Nginx

7 분 소요

웹 서비스 앞에는 항상 관문이 필요하다. 수만 개의 동시 접속을 처리하고, 뒷단 서버들에 트래픽을 나눠주고, SSL을 종료하고, 정적 파일을 직접 서빙하는 역할이다. Nginx는 이 모든 것을 단 하나의 프로세스 모델로 처리한다.

맨 위로 이동 ↑

AI

AI 개발 도구

4 분 소요

AI 생태계는 2023년 이후 폭발적으로 성장했다. 개발자 워크플로우에 통합되는 코딩 어시스턴트부터 범용 챗봇, 이미지 생성, 인프라 레이어까지 각 영역별 주요 도구를 정리한다.

AI-Driven Development와 하네스 엔지니어링

9 분 소요

AI가 코드를 생성하는 시대가 되면서 개발자의 역할이 바뀌고 있다. AI를 단순히 사용하는 것을 넘어, AI가 올바르게 작동하도록 환경과 제약을 설계하는 하네스 엔지니어링(Harness Engineering)이 새로운 핵심 역량으로 부상했다.

맨 위로 이동 ↑

CLOUD

Docker

4 분 소요

비유로 시작하기

맨 위로 이동 ↑

LOCAL_CACHE

맨 위로 이동 ↑

CACHING

맨 위로 이동 ↑

CICD

CI/CD

6 분 소요

비유로 시작하기

맨 위로 이동 ↑

MONITORING

맨 위로 이동 ↑

SYSTEM_DESIGN

맨 위로 이동 ↑