JAVA · SPRING
Spring Framework / Spring Boot 학습 기록. IoC, 생명주기, 트랜잭션, AOP, JPA, HTTP 클라이언트.
이 폴더는 Spring 학습 허브다. 문서가 늘어나도 한 문서가 모든 걸 설명하지 않도록 역할을 나눠 유지한다.
jpa-transaction.md, transaction-propagation-isolation-after-commit.md, transaction-synchronization.md[초안] Filter, Interceptor, AOP: Spring 요청 처리 파이프라인에서의 관심사 분리
Spring 기반 백엔드에서 "요청이 들어와서 컨트롤러에 도달하기 전까지 뭔가 하고 싶다"는 요구는 끊임없이 생긴다. 로깅, 인증, 요청 ID 주입, 요청/응답 바디 감사(audit), 성능 측정, 예외 변환, 트랜잭션 경계 제어, 특정 어노테이션이 붙은 메서드에만 권한 체크 적용 — 이 모든 게 사실상 같은 질문의 변주다. "이 횡단 관심사를 어느 계층에...
[초안] JPA N+1 문제 완전 정복 — 발생 원인부터 EXPLAIN 분석까지
--- JPA N+1 문제는 면접에서 "JPA를 실무에서 써봤나요?"라는 질문 뒤에 반드시 따라오는 주제다. 단순히 "fetch join 쓰면 됩니다"라고 답하는 지원자는 주니어 수준으로 평가된다. 시니어 백엔드 엔지니어라면 다음 세 가지를 함께 설명할 수 있어야 한다. 1. 왜 N+1이 발생하는가 — JPA 프록시와 지연 로딩의 작동 방식 2. 어떤 SQ...
[초안] Spring AOP와 프록시 심층 분석: JDK Dynamic Proxy, CGLIB, ByteBuddy까지
Spring으로 실무를 하다 보면 @Transactional이 걸린 메서드가 이상하게 동작하지 않거나, @Async를 붙였는데 같은 스레드에서 실행되거나, @Cacheable이 캐시를 태우지 않고 무한히 원본 메서드를 호출하는 상황을 만나게 된다. 대부분의 원인은 코드가 아니라 프록시(proxy) 메커니즘에 있다. Spring의 트랜잭션, 비동기, 캐시,...
[초안] Spring Framework vs Spring Boot: 백엔드 개발자가 진짜 알아야 할 차이
Java 백엔드 면접에서 "Spring Framework와 Spring Boot의 차이를 설명해보세요"는 거의 빠지지 않는 단골 질문이다. 표면적인 답변은 누구나 할 수 있다. "Boot는 자동 설정해주고, 내장 톰캣이 있고, 스타터 의존성이 있어요." 하지만 이 수준의 답변은 신입 수준에서 멈춘다. 경력직 백엔드 개발자에게 면접관이 진짜 듣고 싶은 것은...
[초안] Spring TransactionSynchronization 실전: 커밋 이후 외부 호출을 안전하게 묶는 법
백엔드에서 가장 자주 발생하는 데이터 정합성 사고 중 하나는 "DB 트랜잭션은 롤백됐는데 외부 알림은 이미 발송된" 상황이다. 사용자에게 "주문이 접수됐습니다"라는 알림톡은 이미 갔는데, 정작 주문 테이블에는 데이터가 없다. 반대로 "DB에는 저장됐는데 알림이 안 나간" 사고도 흔하다. 두 사고 모두 원인은 같다 — 트랜잭션 경계와 외부 시스템 호출의 경계...
[초안] Spring 트랜잭션 전파, 커머스 주문/결제에서 실전으로 이해하기
CJ푸드빌처럼 매장/배달/예약/결제가 한 트랜잭션 흐름에서 함께 움직이는 커머스 도메인에서는 "이 메서드 하나가 어떤 트랜잭션 안에서 도는가"가 곧 데이터 정합성의 경계가 된다. 주문 저장은 성공했는데 결제 호출은 실패했다, 또는 결제는 통과했는데 알림 발송이 트랜잭션을 같이 끌고 들어가서 전체 롤백되어 사용자 입장에서 "결제는 됐는데 주문은 없는" 상태가...
[초안] Spring 트랜잭션 전파·격리수준·AFTER_COMMIT 실전 정리: Outbox까지 이어지는 한 덩어리
시니어 백엔드 면접에서 "트랜잭션 아세요?"라는 질문은 거의 나오지 않는다. 대신 이런 형태로 들어온다. - "주문이 성공했는데 쿠폰이 안 빠졌어요. 어디부터 볼까요?" - "결제 승인 이후 Kafka 이벤트가 유실됐는데, 트랜잭션과 어떤 관계가 있을까요?" - "트랜잭션 안에서 외부 API 호출하면 왜 위험하죠?" - "REQUIRESNEW를 언제 써봤어...
Application Context의 생명주기
- AbstractApplicationContext.refresh() 메서드의 흐름과 동일하다. - 이 과정 중, 단 한 단계라도 예외가 발생하면 리프레시는 중단되며, has not been refreshed yet 에러가 발생한다. - 1. 준비(prepareRefresh) - 컨텍스트의 상태를 'active'로 전환하기 위한 준비 작업을 한다. - 시작...
InitializingBean 이란?
- InitializingBean은 Spring Framework의 빈 생명주기(Bean LifeCycle) 인터페이스 중 하나 - 빈의 프로퍼티 설정 (Dependency Injection)이 완료된 후, 추가적인 초기화 작업이 필요할 떄 사용하도록 설계 되었음 java public interface InitializingBean { void afterP...
RestClient
- 스프링 부트 3.2에서 새롭게 도입 - RestTemplate이나 WebClient를 사용했을 텐데 RestClient로 그 간극을 메워줄 수 있다. - RestClient란 동기식(Synchronous) API 호출을 위한 현대적인 인터페이스 - 기존 RestTemplate의 고질적인 문제인 "지나치게 많은 오버로딩 메서드"와 WebClient의 장점...
Spring Data JPA 트랜잭션 흔한 실수들
Spring Data JPA + @Transactional을 쓰면서 실수하기 쉬운 패턴들을 정리했다. 대부분 "작동은 하는데 의도대로 작동하지 않는" 케이스들이다. > InnoDB 트랜잭션/MVCC 기본 개념: InnoDB 트랜잭션과 잠금 --- @Transactional은 Spring AOP 프록시로 동작한다. 프록시 바깥에서 호출할 때만 가로챈다. ja...
스프링 프레임워크
- Bean 정의 메타데이터를 읽어서, 객체 그래프를 구성/관리하는 런타임 인프라 - new와 같이 직접 인스턴스를 생성하지 않고, 컨테이너에 구성 정보(메타데이터)를 주면, 그 정보를 기반으로 객체를 생성한다. - 객체 생성 뿐만 아니라, 의존성을 주입하고, 인스턴스의 라이프사이클을 관리한다 - 필요하면 AOP, 트랜잭션 같은 부가기능을 끼워...