Java 접근제어자를 제대로 이해하지 못하면, 모든 필드와 메서드를 public으로 선언해 객체 내부 상태가 외부에서 무분별하게 바뀌거나, protected를 써야 할 자리에 public을 쓰다가 패키지 밖의 클래스가 내부 구현에 직접 의존하게 되어 리팩토링이 불가능해지는 상황을 겪게 됩니다. “어차피 같은 프로젝트 코드인데 다 public으로 해도 되지 않나요?”라는 생각은 객체지향의 핵심 원칙인 캡슐화(Encapsulation)를 포기하는 것과 같습니다. 접근제어자는 단순히 “누가 […]
@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 주입의 불변성 위반, 생성자 주입 없이 발생하는 순환 […]
Spring Data JPA 쿼리 메서드를 제대로 이해하지 못하면, 단순한 조회 하나에 JPQL을 직접 작성하느라 시간을 낭비하거나, 반대로 메서드 이름이 50자가 넘는 괴물 쿼리를 만들거나, 동적 조건이 필요한 검색 기능 앞에서 막막해집니다. “JPA는 SQL을 자동으로 만들어주니까 편하지 않나요?”라고 생각하는 순간, N+1 문제에 빠지거나 벌크 업데이트 후 영속성 컨텍스트가 오염되는 함정을 밟게 됩니다. 이 글에서는 JpaRepository의 기본 […]
@Transactional 전파 레벨을 정확히 이해하지 못하면, 분명히 @Transactional을 붙였는데 롤백이 안 되거나, 반대로 롤백되면 안 되는 로그 저장까지 같이 롤백되는 장애를 겪게 됩니다. “그냥 서비스 메서드에 @Transactional 달면 되는 거 아닌가요?”라고 생각하는 순간, 자기 호출(Self-Invocation) 함정에 빠지거나, REQUIRES_NEW를 잘못 써서 교착 상태(Deadlock)를 만들거나, readOnly = true를 붙였는데 오히려 성능이 나빠지는 상황이 생깁니다. 이 글에서는 Spring […]
Spring Batch 설계를 제대로 이해하지 못하면, 수백만 건 데이터를 처리하다 중간에 터진 배치가 처음부터 다시 돌면서 이미 처리된 데이터를 또 처리하거나, 오류 한 건 때문에 전체 작업이 롤백되어 새벽 내내 재실행을 반복하는 지옥을 경험하게 됩니다. Spring Batch는 “그냥 for 루프를 스케줄러로 돌리면 되지 않나?”라는 생각을 완전히 뒤집는 엔터프라이즈급 배치 프레임워크입니다. 청크(Chunk) 기반 처리, 재시작(Restart), Skip·Retry […]
스프링부트 애노테이션을 제대로 이해하지 못하면, 코드는 돌아가는데 왜 돌아가는지 모르는 상태가 됩니다. 매일 쓰는 @RestController, @Autowired, @Transactional… 문서 없이 그냥 복붙하고 계시진 않으신가요? 스프링부트는 애노테이션 기반 프로그래밍이 핵심이기 때문에, 각 애노테이션이 무엇을 해주는지, 언제 써야 하는지, 어떤 실수를 하면 안 되는지를 제대로 알아야 실무에서 진짜 실력을 발휘할 수 있습니다. 이 글에서는 실무에서 가장 빈번하게 등장하는 […]
Scheduler 주의사항을 제대로 파악하지 못하면, 어느 날 갑자기 동일한 이메일이 수천 명에게 중복 발송되거나, 정산 금액이 두 배로 계산되거나, 디스크가 꽉 차서 서비스가 멈추는 상황을 경험하게 됩니다. 스케줄러는 “설정해두면 알아서 돌아가겠지”라는 생각으로 방치하기 쉬운 컴포넌트이지만, 실무에서 가장 조용히, 가장 치명적으로 장애를 만들어내는 영역 중 하나입니다. Spring @Scheduled부터 Quartz, 분산 환경의 ShedLock까지 – 이 글에서는 스케줄러를 […]
MyBatis 사용 이유가 궁금하신가요? “JPA 쓰면 SQL 안 써도 되는데 왜 굳이 MyBatis를?” 이런 질문, 한 번쯤 해보셨을 겁니다. JPA는 반복적인 CRUD를 자동화해주고 객체 중심으로 개발할 수 있어 생산성이 높습니다. 그런데도 국내 금융권·공공기관·대형 커머스 현장에서는 여전히 MyBatis가 압도적으로 많이 쓰입니다. 단순히 “예전부터 써왔으니까”가 아닙니다. SQL 직접 제어, 복잡한 동적 쿼리, 성능 튜닝, 레거시 환경 대응 […]
트래픽이 몰리는 서비스에서 갑자기 Connection is not available, request timed out after 30000ms라는 에러가 쏟아지는 상황을 맞닥뜨린 적 있으신가요? DB 쿼리도 느리지 않고, 서버 CPU도 여유 있는데 왜 이런 에러가 날까 당황스러웠던 경험이 있을 것입니다. 원인은 대부분 HikariCP 커넥션 풀 설정에 있습니다. 커넥션 풀은 데이터베이스와 WAS 사이의 가장 중요한 성능·안정성 조율 장치입니다. 설정을 너무 작게 […]
GC 동작 원리는 Java 백엔드 개발자라면 반드시 넘어야 할 핵심 관문입니다. “GC가 뭔지 설명해보세요”, “Stop-the-World가 왜 문제인가요?”, “G1GC와 ZGC의 차이는?” — 이 질문들은 신입부터 시니어까지 면접장에서 어김없이 등장합니다. 단순히 “사용하지 않는 메모리를 자동으로 해제한다”는 한 줄 답변으로는 중급 이상 개발자 평가를 통과할 수 없습니다. GC가 어떤 알고리즘으로 쓰레기를 판별하고, JVM 힙 메모리 구조와 어떻게 연동되며, […]
자바 개발자 면접에서 거의 빠지지 않는 질문이 있습니다. “인터페이스와 추상클래스의 차이를 설명해 주세요.” 막상 답하려 하면 머릿속에서 뒤섞이는 두 개념. 인터페이스 추상클래스 차이를 단순히 문법 차이로 외웠다면 실전 설계에서 어느 것을 골라야 할지 흔들립니다. 이 글에서는 개념의 뿌리부터 시작해 문법·사용 목적·실전 적용 기준까지, Java 코드 예시와 함께 단계별로 정리합니다. 읽고 나면 면접 답변은 물론, 실제 […]
Java 멀티스레딩은 백엔드 개발자라면 반드시 넘어야 할 관문입니다. “synchronized와 ReentrantLock의 차이가 뭔가요?”, “volatile은 언제 쓰나요?” — 이 질문들은 자바 개발자 면접에서 중급 이상을 가르는 기준선입니다. 단순히 키워드를 암기하는 것과, 내부 동작 원리를 이해하고 상황에 맞게 선택할 수 있는 것은 전혀 다른 수준입니다. 이 글에서는 세 가지 동기화 메커니즘의 개념·동작 원리·실전 코드·트레이드오프를 한 번에 정리합니다. 목차 […]
프로그래밍을 공부하다 보면 “내 코드는 분명 값을 바꿨는데, 왜 함수 밖으로 나오면 원래대로 돌아가 있지?”라는 의문이 생길 때가 있습니다. 이는 함수의 인자 전달 방식인 Call By Value와 Call By Reference 차이를 정확히 이해하지 못해서 발생하는 현상입니다. 이 두 개념은 단순히 값을 넘기는 방법을 넘어, 프로그램이 메모리를 어떻게 관리하는지와 직결됩니다. 목차 1. Call By Value(값에 의한 호출)의 […]
자바 개발을 하다 보면 문자열을 다루는 일이 거의 매 순간 발생합니다. 하지만 단순하게 String만 사용하다 보면 어느 순간 프로그램의 속도가 느려지거나 메모리 점유율이 치솟는 경험을 하게 됩니다. 오늘 포스팅에서는 String StringBuilder StringBuffer 차이를 명확히 이해하고, 여러분의 코드를 한 단계 업그레이드할 수 있는 성능 최적화 비결을 공유하겠습니다. 목차 1. String의 본질: 왜 불변(Immutable)인가? 자바에서 String 객체는 […]
자바를 배운 지 얼마 안 됐을 때, “멀티스레드 환경에서 안전한 리스트가 필요하면 Vector를 쓰면 된다”는 말을 들어본 적 있으신가요? 그런데 막상 현업에 나와보면 Vector를 쓰는 코드를 거의 볼 수 없습니다. Java Vector 동기화 방식이 처음에는 훌륭해 보이지만, 실제 서비스 환경에서는 심각한 성능 문제와 구조적 결함을 드러내기 때문입니다. 이 글에서는 왜 Vector가 외면받는지, 그리고 지금 당장 무엇으로 교체해야 […]
Spring Boot로 프로젝트를 시작할 때, 가장 먼저 마주치는 파일이 바로 application.properties입니다. 설정 하나 잘못 건드렸다가 서버가 안 뜨거나, DB 연결이 끊기거나, 로그가 쏟아지는 경험 한 번쯤 해보셨죠? 이 글에서는 실무에서 자주 쓰는 핵심 설정들을 한 곳에 정리했습니다. 초보자도 바로 복사해서 쓸 수 있도록 예시 코드와 함께 설명해드릴게요. 1. application.properties란 무엇인가요? application.properties는 Spring Boot 애플리케이션의 동작 […]