@Configuration 을 없앴는데 같은 객체 주입
353
작성한 질문수 16
안녕하세요 다른 질문글에 저같은 경우는 없는 것 같아 질문드립니다.
.
먼저 AutoAppConfig에 @Configuration을 주석처리하고
테스트코드에서 MemberServiceImpl 과 OrderServiceImpl 빈의 getMemberRepository()가 다른지 테스트 해보자 같은 객체여서 테스트에 실패했습니다. 이유가 무엇일까요?
.
제가 이해하기로는 Configuration을 주석처리하면 객체를 새로 생성해서 메모리가 낭비되는 줄 알았습니다.
.
아래는 제가 사용한 코드입니다.
늘 답변해주셔서 감사합니다.
.
/**
* AutoAppConfig.java
*/
//@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
/**
* AutoAppConfigTest.java
*/
public class AutoAppConfigTest {
@Test
void basicScan(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberServiceImpl memberService1 = ac.getBean(MemberServiceImpl.class);
OrderServiceImpl orderService = ac.getBean(OrderServiceImpl.class);
System.out.println("memberServices's memberRepository = " + memberService1.getMemberRepository() );
System.out.println("orderServices's memberRepository = " + orderService.getMemberRepository());
assertThat(memberService1.getMemberRepository()).isNotSameAs(orderService.getMemberRepository());
}
}
답변 1
0
안녕하세요. rweteam님, 공식 서포터즈 David입니다.
.
AutoAppConfig 클래스 코드 전문을 함께 올려주세요.
.
감사합니다.
0
package hello.core;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
//@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
package hello.core.scan;
import hello.core.AutoAppConfig;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.*;
public class AutoAppConfigTest {
@Test
void basicScan(){
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
// MemberService memberService = ac.getBean(MemberService.class);
// assertThat(memberService).isInstanceOf(MemberService.class);
MemberServiceImpl memberService1 = ac.getBean(MemberServiceImpl.class);
OrderServiceImpl orderService = ac.getBean(OrderServiceImpl.class);
System.out.println("memberServices's memberRepository = " + memberService1.getMemberRepository() );
System.out.println("orderServices's memberRepository = " + orderService.getMemberRepository());
assertThat(memberService1.getMemberRepository()).isNotSameAs(orderService.getMemberRepository());
}
}
전문이 살짝 잘렸네요. 별 내용은 없었습니다.
assertThat 으로 isNotSameAs를 하자 실패했습니다.
0
MemberServiceImpl, OderServiceImpl쪽 코드도 함께 봐야 알 수 있을 것 같습니다.
AutoAppConfig 내에서 memberRepository가 생성되는 코드가 있는 것으로 예상했는데, 비어있네요.
프로젝트 자체를 올려주시겠어요?
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
https://bit.ly/3fX6ygx
주의: 업로드시 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
0
감사합니다.
https://drive.google.com/file/d/1dKc3FExCAB0KJnZr2XbVFxLDK7aYyawD/view?usp=sharing
1. 실행 방법
AutoAppConfig.java 의 @Configuration을 주석처리하고
AutoAppConfigTest.java의 테스트를 실행했습니다.
2. 문제
Configuration을 주석처리했기때문에 isSameAs시 통과하면 안될 것으로 보이는데
통과됩니다.
0
xml 빈설정을 모두 configuration class로 바꾸시고 다시 테스트 해주세요.
@Configuration 유무에 따른 것은 configuration class에 적용된 빈 설정에 대한 것이지 xml 빈 설정 과는 상관없습니다.
0
답변해주셔서 감사합니다.
xml 빈설정을 모두 configuration class로 바꾸라는게 무슨 뜻인지 잘 모르겠습니다.
혹시몰라 appConfig.xml 을 모두 주석처리했는데 .. 여전히 Same입니다.
0
죄송합니다. 아래 부분은 제가 잘못 가이드 드렸습니다.
xml 빈설정을 모두 configuration class로 바꾸시고 다시 테스트 해주세요.
@Configuration 유무에 따른 것은 configuration class에 적용된 빈 설정에 대한 것이지 xml 빈 설정 과는 상관없습니다.
현재 AppConfig 클래스에 의해 memberRepository()가 주입되고 있습니다.
AppConfig 클래스에서 @Configuration을 제거하면 다른 MemoryRepository 객체가 주입되는 걸 확인하실 수 있습니다.
0
답변감사합니다
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
AutoAppConfig에 @ComponentScan 에 필터를 Configuration 적용했는데 상관없지 않나요??
* 실제로 AppConfig의 @Configuration 주석처리해도 테스트는 통과안되고 있습니다..
0
질문자님 코드 다시 천천히 살펴봤습니다.
자동등록과 수동등록이 혼재되어 있네요.
아래 가이드를 따라 다시 테스트 부탁드려요.
1. AutoAppConfig.class는 의도하신 테스트를 통과시키는 것과 무관합니다. 클래스 전체를 주석처리해주세요.
2. @Configuration 유무에 따라 동일한 객체를 반환하는지, 새로운 객체를 반환하는지 확인하시려면 @Component에 의해 자동으로 등록되는 것이 아니라 AppConfig.class에 작성하신 것과 같이 수동으로 등록되어야 합니다. OrderServiceImpl과 MemberServiceImpl에서 @Component를 없애주세요.
3. AppConfig를 의존관계 설정 파일로 사용할 것이기 때문에 ApplicationContext를 생성할 때AutoAppConfig를 넘기지 마시고, AppConfig를 넘겨주세요.
4. 이제 AppConfig의 @Configuration 유무를 통해 동일한 memberRepository 객체가 반환되는지 테스트 해주세요.
0
답변 감사합니다.
자동등록에서도 Configuration 유무에 따라서 같은 객체를 반환하고/안하고를 테스트해볼 수 있는 줄 알았습니다.
자동등록에서는 동일한 객체만 반환하는군요..
그러면 다시 궁금해지는게
AutoAppConfig에 @Configuration을 붙인 이유는 이걸 빈으로 등록하기 위함인거죠??
(왜냐면 자동등록은 동일한 객체만 어차피 반환하니까요)
SingletonService가 JVM이 뜰 때 생성되는게 맞나요?
0
29
1
섹션3. 11 회원객체 다이어그램
0
36
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
35
1
코드 자료
0
80
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
82
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
98
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
104
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
88
1
테스트 속도가 나중에 영향이 있을까요?
0
90
1
gradle 설정 안떠서 질문 남깁니다!
0
140
2
build.gradle로 프로젝트를 여는 이유
0
100
1
provider 사용하는 이유
0
97
1
다음 강의 뭘 들어야 할까요
0
139
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
69
1
beanB
0
91
2
퀴즈다시풀기
0
75
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
102
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
71
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
112
2
도메인의 정의?
0
63
1
ApplicationContext 질문입니다.
0
68
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
98
2
ai api 선정하기 관련 질문
0
135
2
생성자 자동주입 관련해서
0
69
1





