inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

[섹션6.중복 등록과 충돌] 동일 이름의 빈 수동, 자동 등록시 오버라이딩 관련하여

해결된 질문

410

송진우

작성한 질문수 13

0

안녕하세요. 질문이 생겼습니다.

 

 

감사합니다.

spring 객체지향

답변 2

3

김영한

안녕하세요. 백엔드해야지님

이렇게 반환하는 타입을 구체적은 타입으로 지정하게 되면

@Component에서 사용하는 타입도 MemoryMemberRepository가 되고,

@Bean으로 등록하는 타입도 MemoryMemberRepository가 됩니다.

둘의 반환 타입까지 완벽히 똑같은 것이지요.

이 경우 타입에 빈의 이름까지 완전히 똑같기 때문에 빈의 정의를 오버라이딩 할 것이 없습니다.

이것은 마치 똑같은 빈이 두 번 컴포넌트 스캔 된 것과 같습니다. 이 경우 하나의 빈만 등록됩니다.

그리고 수동으로 등록한 빈이 우선순위를 가지게 됩니다.

감사합니다.

0

송진우

안녕하세요, 선생님. 먼저 답변 감사합니다.

 

달아주신 답변에서 제가 이해한 내용은

  • 빈 등록시 타입의 구분은 자동 빈 등록시에는 어노테이션이 붙은 구체 타입을, 수동 등록시에는 메서드 반환 타입을 이용한다.

  • 오버라이딩은 같은 빈 이름으로 다른 타입의 객체가 등록되는 상황에 해당되고, 같은 타입의 객체가 등록되는 상황은 오버라이딩으로 취급되지 않는다.

위 내용이 맞을까요?

 

시간 할애해주셔서 감사합니다.

 

1

김영한

네 맞습니다 :)

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
백엔드해야지님의 질문에 대해 답변드리겠습니다.

  1. 같은 이름의 빈이 자동, 수동으로 등록될 때 스프링 부트 버전에 따라 다르게 작동할 수 있습니다. 스프링 부트 2.1 이하 버전에서는 수동 등록된 빈이 자동 등록된 빈을 오버라이딩했지만, 스프링 부트 2.1 이후 버전부터는 이러한 빈 등록 오버라이딩이 기본적으로 허용되지 않습니다. 오버라이딩이 일어나지 않았다면 스프링 부트의 버전을 확인하고 해당 설정을 확인해보셔야 합니다. spring.main.allow-bean-definition-overriding=true 옵션을 통해 오버라이딩을 허용할 수 있습니다.

  2. 메서드의 반환 타입이 실제 등록되는 빈 타입과 다르면 문제가 될 수 있지만, 여기서는 MemberRepository 인터페이스 타입의 구현체인 MemoryMemberRepository를 반환하므로 문제가 없습니다. 빈 수동 등록 메서드의 반환형은 스프링 컨테이너가 관리할 빈 객체의 타입을 결정하는데, 여기서 MemoryMemberRepositoryMemberRepository의 구현체이므로 인터페이스 타입으로 알맞게 등록됩니다.

오버라이딩과 관련된 로그가 없는 경우에는 빈 등록 과정에서 memoryMemberRepository라는 이름의 빈이 다른 설정으로 인해 덮어쓰기 되지 않았거나, 오버라이딩이 허용되지 않도록 설정되어 있을 수 있습니다. 이 경우에는 ApplicationContext에서 빈을 조회할 때 어떤 빈이 실제로 등록되었는지 확인할 필요가 있습니다.

해당 내용에 대한 자세한 설명이 필요하시면, 강의에 있는 Q&A 섹션을 활용하거나 강의를 다시 한번 확인해 보시는 것이 좋을 것 같습니다.

도움이 되셨길 바랍니다.

0

송진우

안녕하세요, 답변 감사합니다.

빈 수동 등록 메서드의 반환형은 스프링 컨테이너가 관리할 빈 객체의 타입을 결정하는데

저는 수동 등록시에 메서드의 반환되는 객체의 타입이 빈 등록시에 이용되는 것으로 생각했는데 이 부분이 잘못됬던거군요.

시간 할애해주셔서 감사합니다.

코드 자료

0

30

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

51

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

75

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

89

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

81

1

테스트 속도가 나중에 영향이 있을까요?

0

77

1

gradle 설정 안떠서 질문 남깁니다!

0

121

2

build.gradle로 프로젝트를 여는 이유

0

85

1

provider 사용하는 이유

0

88

1

다음 강의 뭘 들어야 할까요

0

126

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

64

1

beanB

0

82

2

퀴즈다시풀기

0

67

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

92

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

66

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

106

2

도메인의 정의?

0

59

1

ApplicationContext 질문입니다.

0

63

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

88

2

ai api 선정하기 관련 질문

0

118

2

생성자 자동주입 관련해서

0

64

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

96

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

65

1

12:25

0

77

2