인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

rweteam님의 프로필 이미지
rweteam

작성한 질문수

스프링 핵심 원리 - 기본편

컴포넌트 스캔과 의존관계 자동 주입 시작하기

@Configuration 을 없앴는데 같은 객체 주입

작성

·

322

0

안녕하세요 다른 질문글에 저같은 경우는 없는 것 같아 질문드립니다.

.

먼저 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 클래스 코드 전문을 함께 올려주세요.
.
감사합니다.

rweteam님의 프로필 이미지
rweteam
질문자

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를 하자 실패했습니다.

MemberServiceImpl, OderServiceImpl쪽 코드도 함께 봐야 알 수 있을 것 같습니다.

AutoAppConfig 내에서 memberRepository가 생성되는 코드가 있는 것으로 예상했는데, 비어있네요.

프로젝트 자체를 올려주시겠어요?

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

rweteam님의 프로필 이미지
rweteam
질문자

감사합니다.

https://drive.google.com/file/d/1dKc3FExCAB0KJnZr2XbVFxLDK7aYyawD/view?usp=sharing

 

1. 실행 방법

AutoAppConfig.java 의 @Configuration을 주석처리하고

AutoAppConfigTest.java의 테스트를 실행했습니다.

 

2. 문제

Configuration을 주석처리했기때문에 isSameAs시 통과하면 안될 것으로 보이는데

통과됩니다.

 

xml 빈설정을 모두 configuration class로 바꾸시고 다시 테스트 해주세요.

@Configuration 유무에 따른 것은 configuration class에 적용된 빈 설정에 대한 것이지 xml 빈 설정 과는 상관없습니다.

rweteam님의 프로필 이미지
rweteam
질문자

답변해주셔서 감사합니다.

xml 빈설정을 모두 configuration class로 바꾸라는게 무슨 뜻인지 잘 모르겠습니다.

혹시몰라 appConfig.xml 을 모두 주석처리했는데 .. 여전히 Same입니다.

죄송합니다. 아래 부분은 제가 잘못 가이드 드렸습니다.

xml 빈설정을 모두 configuration class로 바꾸시고 다시 테스트 해주세요.

@Configuration 유무에 따른 것은 configuration class에 적용된 빈 설정에 대한 것이지 xml 빈 설정 과는 상관없습니다.

 

현재 AppConfig 클래스에 의해 memberRepository()가 주입되고 있습니다.

AppConfig 클래스에서 @Configuration을 제거하면 다른 MemoryRepository 객체가 주입되는 걸 확인하실 수 있습니다.

 

rweteam님의 프로필 이미지
rweteam
질문자

답변감사합니다

@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)

AutoAppConfig에 @ComponentScan 에 필터를 Configuration 적용했는데 상관없지 않나요??

 

* 실제로 AppConfig의 @Configuration 주석처리해도 테스트는 통과안되고 있습니다..

질문자님 코드 다시 천천히 살펴봤습니다.

자동등록과 수동등록이 혼재되어 있네요.

아래 가이드를 따라 다시 테스트 부탁드려요.

 

1. AutoAppConfig.class는 의도하신 테스트를 통과시키는 것과 무관합니다. 클래스 전체를 주석처리해주세요.

2. @Configuration 유무에 따라 동일한 객체를 반환하는지, 새로운 객체를 반환하는지 확인하시려면 @Component에 의해 자동으로 등록되는 것이 아니라 AppConfig.class에 작성하신 것과 같이 수동으로 등록되어야 합니다. OrderServiceImpl과 MemberServiceImpl에서 @Component를 없애주세요.

3. AppConfig를 의존관계 설정 파일로 사용할 것이기 때문에 ApplicationContext를 생성할 때AutoAppConfig를 넘기지 마시고, AppConfig를 넘겨주세요.

4. 이제 AppConfig의 @Configuration 유무를 통해 동일한 memberRepository 객체가 반환되는지 테스트 해주세요.

rweteam님의 프로필 이미지
rweteam
질문자

답변 감사합니다.

자동등록에서도 Configuration 유무에 따라서 같은 객체를 반환하고/안하고를 테스트해볼 수 있는 줄 알았습니다.

자동등록에서는 동일한 객체만 반환하는군요..

그러면 다시 궁금해지는게

AutoAppConfig에 @Configuration을 붙인 이유는 이걸 빈으로 등록하기 위함인거죠??

(왜냐면 자동등록은 동일한 객체만 어차피 반환하니까요)

이후 예제 진행을 위해 붙인 것입니다.

중복 등록과 충돌 편을 참고해주세요.

rweteam님의 프로필 이미지
rweteam

작성한 질문수

질문하기