같은 타입의 Spring 빈 두 개 중 무엇이 주입되는가
같은 타입의 빈 두 개를 등록한 작은 Spring 컨텍스트에서 단일 주입 실패, @Primary 기본 선택, @Qualifier 지정, List 전체 주입을 비교한다. 매개변수 이름 보존 여부와 없는 qualifier도 대조해 어디에 선택 의도를 표시할지 설명한다.
빌드노트
Spring Boot 카테고리의 글입니다.
총 48개의 글
같은 타입의 빈 두 개를 등록한 작은 Spring 컨텍스트에서 단일 주입 실패, @Primary 기본 선택, @Qualifier 지정, List 전체 주입을 비교한다. 매개변수 이름 보존 여부와 없는 qualifier도 대조해 어디에 선택 의도를 표시할지 설명한다.
JSON처럼 보이는 본문도 요청 Content-Type이 맞지 않으면 415로 거절된다. 같은 입력의 헤더 누락·text/plain·application/json과 깨진 JSON을 실제 비교해, 매핑 실패와 DTO 변환 실패를 구분하고 헤더 수정 뒤 400이 나타나는 이유를 설명한다.
Spring MVC의 POST 405를 실제 요청 메서드·Allow·클래스와 메서드 매핑으로 좁힌다. 짧은 MockMvc 출력으로 404와 구별하고, consumes 415·필수 인자 400·필터 거절이 멈추는 단계를 비교한다.
Spring 이벤트를 발행했는데 호출이 늦고 리스너 예외까지 돌아온다면 실제 multicaster와 executor 설정을 확인한다. Spring 6.2.19에서 기본 동기 호출과 별도 스레드 실행을 비교하고, latch로 발행 반환과 작업 완료가 다른 시점임을 확인했다.
getIfAvailable의 기본값 Supplier는 빈이 없을 때 호출되며, 선택 기준 없는 빈 두 개의 모호함은 예외로 드러난다. Spring 6.2.11에서 반환값·예외·Supplier 호출 수를 비교해 getIfUnique로 모호함을 허용할지, primary나 qualifier로 빈을 선택할지 설명한다.
서로 다른 빈의 REQUIRED 호출이 같은 트랜잭션에 참여하면, 안쪽 예외를 바깥에서 잡아도 rollback-only 상태는 남는다. Spring 6.2.19·H2에서 정상 호출의 3행 커밋과 예외를 잡은 호출의 최종 0행을 비교하고, 업무상 원자성에 맞는 경계를 판단한다.
@Primary를 바꿔도 List 주입 순서는 바뀌지 않는다. 세 전략 빈의 단일 선택과 목록을 비교하고, @Order 변경 및 등록 순서 반전 결과로 기본 후보와 처리 순서를 따로 설정하는 방법을 설명한다.
Spring MVC에서 이름을 생략한 @RequestParam이 빌드 후 실패할 때, 요청 값보다 MethodParameters를 먼저 확인한다. 같은 컨트롤러를 -parameters 유무로 컴파일해 reflection·MockMvc 결과를 비교하고, 명시적 요청 키와 컴파일 설정 중 선택할 기준을 설명한다.
Spring @Cacheable의 인자 조건은 condition, 반환값에 따른 저장 거부는 unless로 나눈다. 실패·성공 반환값의 실제 본문 실행 수와 캐시 엔트리를 비교하고, 이미 저장된 실패 값에는 새 unless가 적용되지 않는 범위도 확인한다.
사용자 @Bean이 JsonCodec 객체를 반환해도 Object로 선언하면 자동 설정의 타입 조건이 그 Bean을 놓칠 수 있다. ApplicationContextRunner에서 반환 타입과 자동 설정 순서를 바꿔 비교하고, 조건 보고서로 원인을 확인하는 방법을 설명한다.
Spring MVC에서 끝 슬래시 하나로 404가 달라질 때 실제 경로와 버전, 선택된 핸들러를 비교한다. Spring 6.2.12의 독립 실행으로 단일 매핑·두 경로 매핑·308 리다이렉트의 차이를 확인하고 지원할 주소를 정한다.
같은 캐시를 쓰는 두 @Cacheable 메서드의 기본 키에는 메서드 식별자가 없다. Spring 프록시와 로컬 캐시에서 반환값·본문 호출 수·키 타입을 비교하고, 캐시 이름 분리와 종류를 담은 명시 키 중 수정 방법을 고른다.