“DFS와 BFS의 차이를 설명해 주세요.” 기술 면접과 코딩테스트에서 빠지지 않는 단골 질문입니다. 이름은 알지만 막상 언제 어느 것을 써야 하는지 헷갈리는 경우가 많습니다. DFS BFS 차이 선택 기준을 모르면 문제를 보는 순간 어떤 알고리즘으로 접근해야 할지 판단이 서지 않습니다. 이 글에서는 두 알고리즘의 작동 원리·구현 방법(Python & Java)·시간 복잡도부터, 실전 코딩테스트에서 어떤 상황에 무엇을 써야 […]
Spring Data JPA 쿼리 메서드를 제대로 이해하지 못하면, 단순한 조회 하나에 JPQL을 직접 작성하느라 시간을 낭비하거나, 반대로 메서드 이름이 50자가 넘는 괴물 쿼리를 만들거나, 동적 조건이 필요한 검색 기능 앞에서 막막해집니다. “JPA는 SQL을 자동으로 만들어주니까 편하지 않나요?”라고 생각하는 순간, N+1 문제에 빠지거나 벌크 업데이트 후 영속성 컨텍스트가 오염되는 함정을 밟게 됩니다. 이 글에서는 JpaRepository의 기본 […]
@Transactional 전파 레벨을 정확히 이해하지 못하면, 분명히 @Transactional을 붙였는데 롤백이 안 되거나, 반대로 롤백되면 안 되는 로그 저장까지 같이 롤백되는 장애를 겪게 됩니다. “그냥 서비스 메서드에 @Transactional 달면 되는 거 아닌가요?”라고 생각하는 순간, 자기 호출(Self-Invocation) 함정에 빠지거나, REQUIRES_NEW를 잘못 써서 교착 상태(Deadlock)를 만들거나, readOnly = true를 붙였는데 오히려 성능이 나빠지는 상황이 생깁니다. 이 글에서는 Spring […]
Redis 캐시 전략을 제대로 설계하지 않으면, 캐시가 있는데도 DB에 쿼리가 쏟아지거나, 트래픽이 몰리는 순간 캐시와 DB의 데이터가 달라져 결제 금액이 잘못 표시되거나, 로그인 상태가 갑자기 풀리는 장애를 겪게 됩니다. “Redis 쓰면 빠르다던데”라는 말만 믿고 도입했다가 캐시 스탬피드(Cache Stampede), 데이터 불일치, 세션 유실 같은 장애를 경험하는 팀이 적지 않습니다. Redis는 단순한 속도 부스터가 아닙니다. 올바른 캐시 […]
Spring Batch 설계를 제대로 이해하지 못하면, 수백만 건 데이터를 처리하다 중간에 터진 배치가 처음부터 다시 돌면서 이미 처리된 데이터를 또 처리하거나, 오류 한 건 때문에 전체 작업이 롤백되어 새벽 내내 재실행을 반복하는 지옥을 경험하게 됩니다. Spring Batch는 “그냥 for 루프를 스케줄러로 돌리면 되지 않나?”라는 생각을 완전히 뒤집는 엔터프라이즈급 배치 프레임워크입니다. 청크(Chunk) 기반 처리, 재시작(Restart), Skip·Retry […]
스프링부트 애노테이션을 제대로 이해하지 못하면, 코드는 돌아가는데 왜 돌아가는지 모르는 상태가 됩니다. 매일 쓰는 @RestController, @Autowired, @Transactional… 문서 없이 그냥 복붙하고 계시진 않으신가요? 스프링부트는 애노테이션 기반 프로그래밍이 핵심이기 때문에, 각 애노테이션이 무엇을 해주는지, 언제 써야 하는지, 어떤 실수를 하면 안 되는지를 제대로 알아야 실무에서 진짜 실력을 발휘할 수 있습니다. 이 글에서는 실무에서 가장 빈번하게 등장하는 […]
SQL NoSQL 차이를 제대로 이해하지 못한 채 데이터베이스를 선택하면, 서비스가 커질수록 성능 병목·운영 비용 폭증·데이터 정합성 문제라는 세 가지 고통이 동시에 찾아옵니다. “요즘 MongoDB 많이 쓴다던데”, “Redis는 빠르다던데”라는 말만 듣고 도입했다가 정작 트랜잭션이 필요한 결제 시스템에 NoSQL을 쓰거나, 수억 건의 로그 데이터를 MySQL에 욱여넣는 실수를 저지르는 팀이 적지 않습니다. 이 글에서는 SQL과 NoSQL의 구조적 차이에서 […]
Scheduler 주의사항을 제대로 파악하지 못하면, 어느 날 갑자기 동일한 이메일이 수천 명에게 중복 발송되거나, 정산 금액이 두 배로 계산되거나, 디스크가 꽉 차서 서비스가 멈추는 상황을 경험하게 됩니다. 스케줄러는 “설정해두면 알아서 돌아가겠지”라는 생각으로 방치하기 쉬운 컴포넌트이지만, 실무에서 가장 조용히, 가장 치명적으로 장애를 만들어내는 영역 중 하나입니다. Spring @Scheduled부터 Quartz, 분산 환경의 ShedLock까지 – 이 글에서는 스케줄러를 […]
B+Tree 데이터베이스 인덱스가 왜 B-Tree 대신 선택됐는지 궁금하셨나요? “MySQL 인덱스가 B+Tree 구조라는 건 알겠는데, 왜 굳이 B-Tree가 아닌 B+Tree여야 하나요?” 기술 면접에서도 단골로 등장하고, 실무에서도 인덱스를 올바르게 설계하려면 반드시 이해해야 하는 개념입니다. 이 글에서는 이진 탐색 트리의 한계에서 출발해 B-Tree의 등장 배경, B-Tree와 B+Tree의 구조적 차이, 그리고 데이터베이스가 B+Tree를 선택한 결정적 이유까지 그림과 예시로 단계별로 […]
MSA 단점을 제대로 알고 도입을 결정하셨나요? “요즘 잘 나가는 회사는 다 MSA 씁니다”라는 말에 이끌려 무작정 마이크로서비스 아키텍처를 도입했다가 운영 지옥을 경험하는 팀이 적지 않습니다. Netflix, Amazon, Uber가 MSA로 성공했다는 이야기는 넘쳐나지만, 그 이면에 수백 명의 엔지니어와 수천억 원의 인프라 투자가 있었다는 사실은 잘 알려지지 않습니다. MSA는 분명 강력한 아키텍처입니다. 하지만 모든 팀, 모든 서비스에 […]
MyBatis 사용 이유가 궁금하신가요? “JPA 쓰면 SQL 안 써도 되는데 왜 굳이 MyBatis를?” 이런 질문, 한 번쯤 해보셨을 겁니다. JPA는 반복적인 CRUD를 자동화해주고 객체 중심으로 개발할 수 있어 생산성이 높습니다. 그런데도 국내 금융권·공공기관·대형 커머스 현장에서는 여전히 MyBatis가 압도적으로 많이 쓰입니다. 단순히 “예전부터 써왔으니까”가 아닙니다. SQL 직접 제어, 복잡한 동적 쿼리, 성능 튜닝, 레거시 환경 대응 […]
Hadoop 데이터레이크가 무엇인지 들어봤지만 막상 설명하려면 말문이 막히셨나요? ‘데이터레이크’, ‘하둡 에코시스템’, ‘HDFS’… 처음 접하면 낯선 용어들이 한꺼번에 쏟아져 어디서부터 잡아야 할지 막막합니다. 이 글에서는 거대한 기술 스택을 ‘물탱크와 수도관’처럼 일상적인 비유로 풀어내면서, 데이터레이크의 기본 개념부터 Hadoop 에코시스템의 구성 요소, 실무 활용법까지 한 번에 정리합니다. 끝까지 읽으면 빅데이터 아키텍처의 전체 그림이 명확하게 잡힐 것입니다. 목차 1. […]
파이썬 문법 정리가 필요한데 어디서부터 시작해야 할지 막막하셨나요? 파이썬은 전 세계에서 가장 많이 사용되는 프로그래밍 언어 중 하나이지만, 처음 접하면 낯선 개념들이 쏟아져 당황스러울 수 있습니다. 이 글에서는 변수와 자료형부터 함수, 클래스, 예외 처리까지 파이썬의 핵심 문법을 초보자도 이해할 수 있도록 단계별로 풀어서 설명합니다. 끝까지 읽으면 파이썬 기초 문법의 전체 그림이 한눈에 잡힐 것입니다. 목차 […]
네트워크 장애 유형을 정확히 모르면, 문제가 생겼을 때 어디서부터 손을 대야 할지 막막해집니다. 실무에서는 단순한 케이블 불량부터 복잡한 라우팅 오류까지 다양한 장애가 예고 없이 발생합니다. 이 글에서는 IT 담당자와 네트워크 엔지니어가 현장에서 가장 자주 마주치는 장애 유형을 원인·증상·해결 방법으로 나누어 체계적으로 정리합니다. 이 글 하나로 장애 대응 시간을 확실히 줄일 수 있습니다. 목차 1. 네트워크 […]
리액트(React)를 처음 배울 때도, 한동안 안 쓰다가 다시 잡을 때도, 실무에서 막히는 순간에도 항상 필요한 것이 있습니다. 빠르게 찾아볼 수 있는 핵심 문법 레퍼런스입니다. 리액트 문법 정리는 공식 문서처럼 방대하지 않으면서도, 실제 프로젝트에서 80% 이상의 상황을 커버하는 핵심 패턴들을 한 곳에 담아야 제 역할을 합니다. 오늘은 JSX 기본 규칙부터 Hook 사용법, 조건부 렌더링, 이벤트 처리, […]
“배열을 써야 할까, 해시맵을 써야 할까?” 코딩 테스트를 풀 때도, 실무 시스템을 설계할 때도, 기술 면접에서 화이트보드 앞에 섰을 때도 이 질문은 항상 따라옵니다. 자료구조 선택 가이드가 필요한 이유는 자료구조 하나의 선택이 코드 전체의 시간복잡도와 공간복잡도를 결정하기 때문입니다. 배열 대신 해시맵을 선택하는 것만으로 O(n)이던 탐색이 O(1)로 바뀌고, 큐 대신 힙을 선택하는 것으로 O(n log n)이던 […]
트래픽이 몰리는 서비스에서 갑자기 Connection is not available, request timed out after 30000ms라는 에러가 쏟아지는 상황을 맞닥뜨린 적 있으신가요? DB 쿼리도 느리지 않고, 서버 CPU도 여유 있는데 왜 이런 에러가 날까 당황스러웠던 경험이 있을 것입니다. 원인은 대부분 HikariCP 커넥션 풀 설정에 있습니다. 커넥션 풀은 데이터베이스와 WAS 사이의 가장 중요한 성능·안정성 조율 장치입니다. 설정을 너무 작게 […]
백엔드 서버를 인터넷에 직접 노출하는 서비스는 거의 없습니다. 대부분의 프로덕션 환경에서 외부 요청은 먼저 Nginx 리버스 프록시를 거쳐 내부 애플리케이션 서버로 전달됩니다. “그냥 Node.js나 Django를 직접 80포트에 올리면 안 되나요?”라는 질문을 하는 개발자가 적지 않습니다. 기술적으로는 됩니다. 하지만 보안, 성능, 확장성, 유지보수성 측면에서 Nginx를 앞단에 두는 것이 압도적으로 유리합니다. 이 글에서는 리버스 프록시의 개념부터 Nginx가 […]
Nginx 리버스 프록시 설정은 현대 웹 아키텍처의 핵심 기술입니다. 전 세계 상위 1만 개 웹사이트의 절반 이상이 Nginx를 사용하며, 넷플릭스·깃허브·에어비앤비 같은 대형 서비스들도 Nginx를 프론트 레이어로 사용합니다. 단순히 “설치하면 된다”는 수준을 넘어서, location 블록 매칭 우선순위, upstream 로드밸런싱 알고리즘 선택 기준, 캐시 키 설계, Rate Limiting 전략까지 — 이 내용들을 정확히 알아야 프로덕션 환경에서 Nginx를 […]
다익스트라 알고리즘은 에츠허르 다이크스트라가 1956년 단 20분 만에 고안한 알고리즘으로, 70년이 지난 지금도 네비게이션·네트워크 라우팅·게임 AI·물류 시스템의 핵심에서 작동하고 있습니다. 코딩 테스트에서는 최단 경로 문제의 표준 풀이로, 개발자 면접에서는 그래프 알고리즘 이해의 기준선으로 자리 잡았습니다. “그냥 BFS에 가중치 추가한 것 아닌가요?”라는 질문부터, “왜 음수 가중치에서는 작동하지 않나요?”, “힙을 쓰면 왜 빨라지나요?”까지 — 이 질문들에 논리적으로 […]