강의

멘토링

로드맵

Inflearn brand logo image

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

김효현님의 프로필 이미지
김효현

작성한 질문수

스프링 핵심 원리 - 기본편

스프링 컨테이너 생성

@Bean 어노테이션 사용에 대한 질문

작성

·

40

·

수정됨

1

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세요. 강의를 보다가 궁금증이 생겨 질문해 봅니다!

@Bean 어노테이션을 달면 해당 인스턴스를 생성하여 스프링 컨테이너에서 관리하는 것으로 알고 있습니다.

만약 서비스가 커지게 된다면, 스프링 컨테이너도 많은 빈을 관리하기 어려워지게 되고 최대한 효율적으로 생성해야 할 것 같다고 생각했습니다.

@Configuration
public class AppConfig {

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

    @Bean
    public DiscountPolicy discountPolicy(){
        //return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

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

    @Bean
    public OrderService orderService(){
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

}

위와 같이 AppConfig 코드를 작성을 하다가 문득 생각이 들었습니다. 'discountPolicy , memberRepository 는 AppConfig 안에서만 사용이 되는 메서드인데, Bean으로 관리하면 효율이 떨어지고 낭비가 아닐까?' 라는 생각이 들게 되었습니다.


여기서 두 가지 질문을 드리고 싶습니다.

  1. 자신의 클래스에서만 사용될 객체라면, @Bean으로 등록하여 관리할 필요가 있을까요?

  2. 자신의 클래스에서만 사용될 객체라면, private로 선언하여 해당 클래스에서 안전하게 사용하고 외부에서 사용 못 하게 감추는 것이 더 좋지 않을까요?

 

답변 2

1

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

AppConfig 클래스는 빈 수동 설정을 위한 클래스입니다. 또한 @Configuration이 선언됨으로 인해 @Bean이 붙은 메서드가 호출될 때 일반적인 메서드처럼 동작하지 않습니다. 이 부분에 대해서는 본강의 섹션6에서 자세히 다루고 있사오니 참고해 주세요.

 

자신의 클래스에서만 사용될 객체라면, @Bean으로 등록하여 관리할 필요가 있을까요?

빈으로 등록하는 것은 단순히 싱글톤 객체로만 쓰려고 하는 게 아닙니다.

스프링의 기능을 지원 받으려면 (예: 스프링에서 제공하는 @Transactional) 빈이어야 합니다.

 

자신의 클래스에서만 사용될 객체라면, private로 선언하여 해당 클래스에서 안전하게 사용하고 외부에서 사용 못 하게 감추는 것이 더 좋지 않을까요?

스프링 컨테이너의 경우 빈 등록을 위해 생성 메서드를 만들 경우 해당 메서드에 private, final 키워드를 허용하지 않습니다.

 

감사합니다.

김효현님의 프로필 이미지
김효현
질문자

좋은 답변 감사합니다!
섹션 6을 보고 더욱 자세히 공부해보겠습니다!

0

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

김효현님의 질문에 대해 설명드리겠습니다.

  1. 자신의 클래스에서만 사용될 객체라면, @Bean으로 등록하여 관리할 필요가 있을까요?

@Bean 어노테이션은 특정 객체를 스프링 컨테이너에 빈으로 등록하여, 스프링이 해당 객체의 생명주기를 관리하게 합니다. 주로 공유 객체나 여러 곳에서 사용되는 객체는 빈으로 등록하여 의존성을 주입받아 사용하는 것이 좋습니다. 자신의 클래스 내부에서만 사용되는 객체라면 굳이 빈으로 등록하지 않아도 무방합니다. 이는 설계를 단순화하고, 클래스 내에서 명시적이고 쉽게 객체를 관리할 수 있도록 합니다.

  1. 자신의 클래스에서만 사용될 객체라면, private로 선언하여 해당 클래스에서 안전하게 사용하고 외부에서 사용 못 하게 감추는 것이 더 좋지 않을까요?

네, 말씀하신 대로 클래스 내부에서만 사용되는 객체는 private으로 선언하여 접근을 제한하는 것이 바람직합니다. 이를 통해 해당 객체가 외부로 노출되지 않고, 클래스의 내부 구현을 보호할 수 있습니다. 이는 객체지향 설계 원칙 중 하나인 정보 은닉(encapsulation)을 유지하는 데도 도움이 됩니다.

관련해서 비슷한 질문과 답변이 다음 URL에 나와 있으니 참고하시면 더욱 좋을 것 같습니다:
- 스프링 빈을 언제 등록해야 할까요?

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

김효현님의 프로필 이미지
김효현

작성한 질문수

질문하기