inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

관심사의 분리

AppConfig와 스프링 빈 질문

19

애송이

작성한 질문수 3

0


질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
AppConfig의 경우 객체 설정 정보들을 직접 작성해서 설정하는 객체로 이해를 했습니다.

근데 이전에 스프링 빈 관련해서 학습할 때 '스프링 빈으로 등록이 되면 스프링이 알아서 객체를 만들어서 주입을 해준다' 라고 정리를 했었거든요.

그럼 여기서 굳이 AppConfig를 사용하는 이유는 단순히 여러 구현체들을 바꿔가면서 사용할 수 있기 때문인가요? 스프링 빈의 경우 여러 구현체가 등록이 되면 스프링이 자동 생성할 때 어떤 구현체를 사용할 지 몰라서 컴파일 에러가 난다고 알고 있습니다.(물론 특정 어노테이션을 통해서 해결 가능하지만)

스프링빈을 통해서 자동 생성 및 주입이 가능한데, AppConfig가 왜 필요한지, 무슨 차이인지 궁금합니다!

spring 객체지향

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

애송이님, AppConfig를 사용하는 핵심 이유는 객체 생성과 의존관계 설정의 책임을 한곳에서 분리하기 위해서입니다.

스프링 빈으로 등록하면 스프링이 객체를 생성하고 필요한 의존성을 주입해 주지만, 어떤 구현체를 사용할지에 대한 구체적인 의존관계 설정은 여전히 필요합니다.

예를 들어 다음과 같이 서비스가 인터페이스에 의존한다고 가정해 보겠습니다.

public class MemberServiceImpl implements MemberService {
    private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

MemberServiceImpl은 MemberRepository 인터페이스에만 의존하므로, MemoryMemberRepository를 사용할지 다른 구현체를 사용할지는 외부에서 결정해야 합니다. 이 역할을 AppConfig가 담당합니다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

이렇게 하면 MemberServiceImpl은 구체적인 구현체를 직접 알 필요가 없고, 구현체를 변경할 때 AppConfig만 수정하면 됩니다.

반면 컴포넌트 스캔과 @Autowired를 사용하는 방식은 스프링이 빈을 자동으로 찾아 주입해 주는 편리한 방식입니다. 하지만 같은 인터페이스의 구현체가 여러 개라면 어떤 빈을 주입할지 @Primary, @Qualifier 등의 추가 설정이 필요할 수 있습니다.

즉, 두 방식의 차이는 다음과 같습니다.

  • AppConfig 방식: 객체 생성과 구현체 선택을 개발자가 명시적으로 관리
  • 컴포넌트 스캔 방식: 스프링이 빈을 자동으로 검색하고 주입
  • AppConfig의 장점: 구현체 변경, 의존관계 파악, 테스트용 객체 구성 등이 명확함
  • 자동 주입의 장점: 반복적인 설정 코드가 줄어들고 편리함

실무에서는 기본적으로 컴포넌트 스캔과 자동 주입을 많이 사용하지만, 애플리케이션의 주요 의존관계를 명확히 드러내거나 구현체를 선택해야 하는 경우에는 @Configuration과 @Bean을 활용할 수 있습니다.

관련된 기존 답변을 함께 참고해 주세요.

AppConfig와 생성자 관련 질문드립니다

해당 답변에서도 AppConfig는 의존관계 설정의 책임을 맡고, 서비스 구현체는 인터페이스에 의존하도록 분리하는 이유를 설명하고 있습니다. MemberServiceImpl과 OrderServiceImpl의 생성자는 AppConfig 내부에서 호출되며, 이를 통해 구체적인 구현체를 외부에서 주입할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

fieldInjectionTest() 질문

0

7

1

AutoAppConfig의 존재이유

0

13

1

[영한님]Spring Boot 및 프로젝트 생성

0

105

2

퀴즈가 안열려요

0

98

2

회원 도메인 인터페이스 개발

0

88

2

빈 스코프 개념의 중요성

0

88

1

SingletonService가 JVM이 뜰 때 생성되는게 맞나요?

0

139

2

섹션3. 11 회원객체 다이어그램

0

74

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

73

1

코드 자료

0

125

2

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

0

125

2

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

0

142

1

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

0

139

1

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

0

130

1

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

0

124

1

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

0

251

2

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

0

157

1

provider 사용하는 이유

0

154

1

다음 강의 뭘 들어야 할까요

0

187

2

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

0

109

1

beanB

0

131

2

퀴즈다시풀기

0

104

1

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

0

149

2

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

0

119

3