inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

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

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

353

rweteam

작성한 질문수 16

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());
    }
}

oop spring

답변 1

0

David

안녕하세요. rweteam님, 공식 서포터즈 David입니다.

.
AutoAppConfig 클래스 코드 전문을 함께 올려주세요.
.
감사합니다.

0

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

0

David

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

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

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

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

https://bit.ly/3fX6ygx

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

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

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

0

rweteam

감사합니다.

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

 

1. 실행 방법

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

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

 

2. 문제

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

통과됩니다.

 

0

David

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

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

0

rweteam

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

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

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

0

David

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

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

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

 

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

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

 

0

rweteam

답변감사합니다

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

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

 

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

0

David

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

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

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

 

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

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

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

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

0

rweteam

답변 감사합니다.

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

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

그러면 다시 궁금해지는게

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

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

0

David

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

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

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