--- kind: REFERENCE slug: a-bean-is-not-composition-evidence title: '@Bean이 있다는 것은 조립 증거가 아니다' topic: assembly-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: reference:a-bean-is-not-composition-evidence verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다 --- # @Bean이 있다는 것은 조립 증거가 아니다 ## 목적 클래스에 붙은 애너테이션이나 팩토리의 존재를 그것이 실행 컨텍스트에 있다는 증거로 읽는 것을 막는다. ## 규칙 1. 애너테이션은 후보를 만들 뿐이다 Component 나 Repository 나 Bean 은 이 클래스가 빈이 될 수 있다는 뜻이지 빈이라는 뜻이 아니다. 스캔 범위 밖이거나 조건이 거짓이거나 소유자가 없으면 후보로 끝난다. 2. 이름은 아무것도 보장하지 않는다 이름이 AutoConfiguration 으로 끝나는 클래스가 자동설정 파일에 없으면 등록되지 않는다. 3. 타입이 하나뿐이어도 그것이 빈이라는 뜻은 아니다 구현이 하나뿐인 포트는 그 하나가 조립된다는 인상을 준다. 그 하나에 스테레오타입이 없고 생성하는 코드도 없으면 포트는 비어 있다. 4. 확인은 도달 경로로 한다 세 경로 중 어느 것이 이 클래스를 소유하는지 묻는다. 스캔이면 범위와 제외를, 자동설정이면 imports 파일과 조건을, 명시 조립이면 그 생성 지점을 확인한다. 5. main 참조 0 은 강한 신호다 프로덕션 소스에서 그 타입을 참조하는 파일이 자기 자신뿐이면, 테스트만 그것을 쓴다는 뜻이다. ## 적용 조건 능력이 활성인지 판정할 때 능력 리포트나 지원 매트릭스의 항목을 검증할 때 결함을 보고하기 전에 그 코드가 실제로 도는지 확인할 때 ## 예외 명시적으로 애플리케이션이 제공하도록 설계된 포트는 플랫폼 쪽에 생산자가 없는 것이 정상이다. 그때 물을 것은 출하 애플리케이션이 그것을 제공하는가다. ## 예시 이름이 AutoConfiguration 인 세 클래스가 애너테이션도 Bean 도 imports 항목도 갖지 않은 채 능력 리포트에 Stable 로 올라 있었다. 스캔에서 제외된 다섯 패키지의 컴포넌트 여섯을 두 자동설정 어느 쪽도 만들지 않았다. 두 자동설정은 등록되어 실행되고 있었다. JdbcOutboxRepository 는 2,276 줄이고 스프링 스테레오타입이 없으며 그것을 생성하는 main 코드가 없다. ## 관계 - **스캔에서 뺀 다섯 패키지의 컴포넌트 여섯을 두 자동설정 어느 쪽도 소유하지 않았다** 이 규칙이 필요한 대표 사례다. - **outbox가 둘이고, 출하되는 것은 messaging 플랫폼 쪽이 아니다** 타입이 하나뿐인데도 조립되지 않는 사례다. - **Spring 조립의 세 경로와 각각이 결정하는 것** 이 규칙의 확인 절차가 기대는 구조다.