처음에는 잘 돌아가던 Spring Boot 서비스가 트래픽이 늘면서 응답 시간이 늘어지고, 피크 타임마다 타임아웃 에러가 쏟아지기 시작합니다. 서버 사양을 올려도 근본적으로 나아지지 않는 경우가 많습니다. Spring 성능 최적화는 단순히 코드 몇 줄을 바꾸는 것이 아니라, 어디서 병목이 생기는지를 먼저 파악하고 그 원인에 맞는 방법을 정확히 적용하는 체계적 프로세스입니다. 이 글에서는 실무에서 가장 자주 발생하는 성능 병목과 […]
Java를 처음 설치할 때 “JDK를 받으세요”라는 말을 들었지만, JVM이나 JRE와 무슨 관계인지 모른 채 그냥 설치한 경험이 있으신가요? 면접에서 “JVM이 뭔지 설명해 보세요”라는 질문을 받으면 막막한 경우가 많습니다. JVM JRE JDK 차이를 명확하게 이해하는 것은 단순히 용어를 외우는 것이 아니라, Java가 “한 번 작성하면 어디서든 실행된다(Write Once, Run Anywhere)”는 철학이 어떻게 구현되는지를 이해하는 일입니다. 이 글에서는 […]
“객체지향이 뭔가요?”라는 면접 질문 앞에서 머릿속이 하얘진 경험이 있으신가요? 자바 객체지향 4대 원칙은 단순히 외워야 하는 개념이 아닙니다. 왜 코드를 클래스로 나누는지, 왜 private을 쓰는지, 왜 인터페이스가 필요한지처럼 실제 코드 설계의 모든 판단 뒤에 이 네 가지 원칙이 자리하고 있습니다. 캡슐화·상속·다형성·추상화 각각의 의미와 동작 원리를 실전 코드와 함께 처음부터 끝까지 완벽하게 정리합니다. 목차 1. 객체지향 프로그래밍이란 무엇인가: […]
final이라는 단어는 “마지막”, “변경 불가”라는 의미를 담고 있습니다. 그런데 자바에서 자바 final 키워드는 붙는 위치에 따라 완전히 다른 세 가지 의미로 작동합니다. 변수에 붙이면 재할당을 막고, 메서드에 붙이면 오버라이딩을 차단하고, 클래스에 붙이면 상속 자체를 금지합니다. 단순히 “변경 못 하게 하는 키워드”로만 알고 있다면 불변 객체 설계, 람다에서의 effectively final, String이 왜 final 클래스인지 같은 핵심 개념에서 막히게 […]
“20일선 깨졌는데 그냥 버텨도 될까요?” 주식 투자 커뮤니티에서 가장 자주 올라오는 질문 중 하나입니다. 20일선 이탈 매도가 왜 중요한지 제대로 모르면, 막연한 기대로 버티다가 작은 손실이 큰 손실로 불어나는 경험을 하게 됩니다. 20일 이동평균선은 단순한 평균값이 아닙니다. 한 달간 이 주식을 매매한 모든 투자자의 심리가 압축된 선이며, 그 선이 무너진다는 것은 시장 참여자들의 심리가 집단적으로 돌아섰다는 […]
public static void main(String[] args) — 자바를 처음 배우는 날부터 매일 쓰지만, 왜 static이 붙어야 하는지 제대로 설명하는 사람은 생각보다 많지 않습니다. 자바 static 키워드는 단순히 “객체 없이 호출하는 것”이 아닙니다. 클래스가 JVM에 로딩되는 순간부터 메모리에 올라가 모든 인스턴스가 공유하는, 자바의 메모리 관리 핵심 메커니즘입니다. 이 글에서는 static이 JVM 메모리 어느 영역에 자리 잡는지부터 변수·메서드·블록·내부 클래스까지 각 쓰임새별 동작 […]
자바 개발을 하다 보면 IOException은 반드시 try-catch로 감싸야 하는데, NullPointerException은 왜 그냥 내버려 둬도 컴파일이 될까요? 이 차이의 뿌리에 Checked Exception과 Unchecked Exception의 차이가 있습니다. 이 개념은 단순한 문법 지식을 넘어, 예외를 어떻게 설계하고 어디서 처리해야 하는지를 결정하는 자바 개발의 핵심 철학입니다. 이 글에서는 계층 구조, 컴파일 시점 동작, 실전 코드, 스프링 적용 사례, 커스텀 예외 설계 원칙까지 […]
“차트는 결국 후행지표 아닌가요? 과거를 보여줄 뿐인데 왜 믿어야 하죠?” 주식을 처음 공부하는 분들이 가장 많이 던지는 질문입니다. 주식 차트 보는 법을 배우기 전에 먼저 이 의문을 해결해야 합니다. 차트가 거짓말하지 못하는 이유는 단순합니다. 차트는 누군가의 의견이나 예측이 아니라, 수백만 명의 투자자가 실제 돈을 걸고 체결한 거래의 결과물이기 때문입니다. 이 글에서는 차트가 시장의 진실을 담는 원리부터 […]
데이터를 저장하거나 네트워크로 전송할 때, 직렬화와 역직렬화라는 단어를 반드시 마주치게 됩니다. 처음 들으면 낯설지만, 사실 우리가 매일 사용하는 로그인 세션 유지·API 통신·파일 저장 모두 이 원리 위에서 작동합니다. 이 글에서는 개념의 본질부터 자바 코드 예제, 보안 주의사항, 실전 포맷 선택 기준까지 한 번에 정리합니다. 목차 1. 직렬화와 역직렬화란 무엇인가? 프로그래밍에서 **직렬화(Serialization)**란 메모리에 살아 있는 객체(Object)를, […]
오버로딩 오버라이딩 차이를 정확히 설명하지 못하면, Java 면접에서 “둘 다 메서드 이름이 같은 거 아닌가요?”라는 애매한 답변을 하거나, @Override 어노테이션을 왜 붙이는지 모른 채 복사붙여넣기로 개발하다가 부모 메서드가 조용히 그냥 실행되는 버그를 만들게 됩니다. 오버로딩과 오버라이딩은 이름이 비슷하지만 동작하는 시점도, 목적도, 규칙도 근본적으로 다릅니다. 오버로딩은 컴파일 타임에 결정되는 정적 다형성, 오버라이딩은 런타임에 결정되는 동적 다형성입니다. […]
Java 접근제어자를 제대로 이해하지 못하면, 모든 필드와 메서드를 public으로 선언해 객체 내부 상태가 외부에서 무분별하게 바뀌거나, protected를 써야 할 자리에 public을 쓰다가 패키지 밖의 클래스가 내부 구현에 직접 의존하게 되어 리팩토링이 불가능해지는 상황을 겪게 됩니다. “어차피 같은 프로젝트 코드인데 다 public으로 해도 되지 않나요?”라는 생각은 객체지향의 핵심 원칙인 캡슐화(Encapsulation)를 포기하는 것과 같습니다. 접근제어자는 단순히 “누가 […]
ELK Stack 아키텍처가 무엇인지 들어봤지만 막상 설명하려면 말문이 막히셨나요? “Elasticsearch는 검색 엔진이고, Logstash는 파이프라인이고, Kibana는 대시보드인데… 이게 어떻게 연결되는 거지?”라는 의문, 처음 공부할 때 누구나 갖습니다. 수백만 건의 로그가 쏟아지는 운영 환경에서 “언제 어디서 무슨 오류가 났는지”를 grep 명령어로 찾는 것은 한계가 있습니다. ELK Stack은 분산된 여러 서버의 로그를 한 곳에 모으고, 실시간으로 검색하며, 시각화 […]
@RequestParam @PathVariable 차이를 제대로 이해하지 못하면, 상품 상세 조회 URL을 /products?id=42로 설계해야 할지 /products/42로 설계해야 할지 매번 고민하거나, @PathVariable로 처리해야 하는 리소스 식별자에 쿼리 파라미터를 쓰거나, 선택적 파라미터를 @PathVariable로 선언해 MethodArgumentTypeMismatchException이 발생하는 상황을 겪게 됩니다. 둘 다 “URL에서 값을 꺼내는 어노테이션”이지만 사용 위치와 의미, 필수 여부, REST 설계 관점에서 근본적으로 다릅니다. 이 글에서는 두 어노테이션의 […]
Spring Bean Container가 어떻게 동작하는지 모르면, @Component와 @Bean의 차이를 물어보는 면접 질문 앞에서 막히거나, Bean이 싱글톤이라는 사실을 모르고 상태(State)를 필드에 저장해 멀티스레드 버그를 만들거나, @PostConstruct를 써야 하는 자리에 생성자를 쓰다가 의존성 주입이 완료되지 않은 상태에서 초기화 로직이 실행되는 장애를 겪게 됩니다. Spring이 “마법처럼” 동작한다고 느낀다면, 그 마법의 정체가 바로 IoC 컨테이너가 Bean을 등록·조합·관리하는 과정입니다. 이 […]
@Autowired 동작 원리를 제대로 이해하지 못하면, 분명히 @Autowired를 붙였는데 NullPointerException이 발생하거나, 같은 타입의 Bean이 두 개일 때 NoUniqueBeanDefinitionException으로 서버가 뜨지 않거나, 테스트에서는 잘 되는데 운영에서만 순환 참조 에러가 터지는 당혹스러운 상황을 경험하게 됩니다. “그냥 @Autowired 붙이면 알아서 주입되는 거 아닌가요?”라는 생각은 필드 주입의 테스트 불가 함정, Setter 주입의 불변성 위반, 생성자 주입 없이 발생하는 순환 […]
Apache와 Nginx 의 차이는 웹 개발자와 인프라 엔지니어라면 반드시 정리해야 할 핵심 비교입니다. 두 서버 모두 전 세계 웹 트래픽의 절대다수를 처리하는 양대 산맥이지만, 내부 작동 방식과 강점이 근본적으로 다릅니다. “Nginx가 Apache보다 빠르다”는 말은 절반의 사실입니다. 상황에 따라 Apache가 더 적합한 경우도 분명히 존재하기 때문입니다. 1995년 탄생한 Apache와 2004년 C10K 문제를 해결하기 위해 등장한 Nginx […]
쿠키 세션 JWT 차이는 백엔드 개발자 면접에서 가장 자주 등장하는 인증 관련 질문입니다. 단순히 “쿠키는 브라우저에 저장되고, 세션은 서버에 저장되고, JWT는 토큰 방식입니다”라는 한 줄 답변으로는 중급 이상 평가를 받기 어렵습니다. HTTP가 왜 무상태(Stateless) 프로토콜인지, 그래서 인증 정보를 어떻게 유지하는지, 각 방식이 보안·확장성·구현 복잡도에서 어떤 트레이드오프를 갖는지까지 연결해서 설명할 수 있어야 합니다. 이 글에서는 쿠키·세션·JWT의 […]
“동기랑 비동기가 뭔지는 아는데, 막상 설명하려니 말이 안 나와요.” 개발을 배우다 보면 반드시 넘어야 하는 개념의 벽이 있습니다. 동기 비동기 차이가 바로 그 대표적인 벽입니다. 면접에서 단골로 나오고, 실무에서 API를 호출할 때마다 등장하며, 버그의 상당수가 이 개념을 제대로 이해하지 못해서 발생합니다. 그러나 막상 설명하려 하면 “기다리냐 안 기다리냐의 차이”라는 말만 맴돌고 더 깊이 들어가지 못하는 […]
“모든 경우를 다 뒤지면 너무 느린데, 어떻게 하면 빠르게 답을 찾을 수 있을까?” 코딩 테스트에서 순열·조합·N-Queen·스도쿠 같은 문제를 만났을 때 떠오르는 질문입니다. 백트래킹 알고리즘 가지치기는 바로 이 질문의 답입니다. 완전 탐색(Brute Force)처럼 모든 경우를 시도하되, 현재 경로가 답이 될 수 없다고 판단되는 순간 더 깊이 들어가지 않고 즉시 되돌아오는(Backtrack) 전략입니다. 미로를 탐색할 때 막힌 길을 […]
“VM이랑 Docker가 비슷한 거 아닌가요?” 개발을 처음 배우는 분들이 가장 많이 하는 질문 중 하나입니다. 둘 다 ‘격리된 환경에서 앱을 실행한다’는 목표는 같지만, 작동 방식은 근본적으로 다릅니다. Docker VM 차이를 제대로 모르면 Docker를 써야 할 때 VM을 쓰거나, 그 반대의 선택을 하게 됩니다. 이 글에서는 VM과 Docker의 구조적 차이부터 성능·보안·이식성 비교, 실전에서 어느 것을 선택해야 […]