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

u_innovation님의 프로필 이미지
u_innovation

작성한 질문수

스프링 핵심 원리 - 기본편

IoC, DI, 그리고 컨테이너

2개의 MemoryMemberRepository 인스턴스 생성?

작성

·

32

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

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

[질문 내용]
복습을 하면서 궁금한 점이 생겼습니다.

 

AppConfig에서 memberService메서드와, orderService 메서드에서 동일하게 memberRepository()메서드를 호출하게 되는데요,

public class AppConfig {

    // 생성자 주입(DI)
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    private MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    // 생성자 주입(DI)
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    private DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}

이렇게 되면 힙 영역에서 각각 다른 참조 주소를 가진 MemoryMemberRepository 인스턴스를 생성하는게 맞나요..?

 

동일하게 사용이 되는데 같은 인스턴스를 사용하게 하는 방법은 없는지 궁금합니다 !

답변 2

1

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

아주 날카로운 지적이라고 생각합니다!

AI 인턴의 답변도 참고해보시는 것도 좋지만, 말씀해주신 의문은 아마 학습을 진행하시게 되면 자연스럽게 풀리실 거라 생각합니다 🙂

감사합니다.

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

왜 스프링을 사용하는 것일까?에 대한 의문점이 하나씩 풀어지고 있습니다 ㅎㅎ

스프링컨테이너가 싱글톤을 보장하는 방식도 흥미롭고 너무 너무 재밌네요! ㅎㅎ

날카로운 지적이라는 말씀에 기분이 좋습니다! ㅎㅎ

앞으로도 이렇게 의문점을 가지면서 학습을 하도록 하겠습니다!

답변 감사합니다

 

1

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

질문하신 내용은 스프링의 DI(Dependency Injection)에서 많이 다루는 주제입니다. 현재 AppConfig 클래스에서 memberService와 orderService 메서드가 각각 memberRepository() 메서드를 호출하여 MemoryMemberRepository 인스턴스를 생성하고 있습니다. 이렇게 하면 각각의 호출마다 새로운 인스턴스가 생성되며, 서로 다른 참조 주소를 가집니다.

하지만 스프링 프레임워크에서는 이러한 문제를 해결하기 위해 싱글톤 레지스트리 패턴을 사용하고 있습니다. 스프링에서는 대부분의 빈이 싱글톤 스코프로 관리되기 때문에 한 번 생성된 빈은 스프링 컨테이너에 의해 재사용됩니다.

지금처럼 수동으로 객체를 생성하는 경우, 싱글톤 패턴을 수작업으로 개발자가 구현해야 합니다. 예를 들어, 다음과 같은 방식으로 할 수 있습니다:

public class AppConfig {
    private MemberRepository memberRepository = new MemoryMemberRepository();

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

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

    private DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}

위와 같이 하면 memberRepository는 AppConfig 인스턴스가 생성될 때 한 번만 초기화되고, 모든 서비스에서 같은 객체를 참조하게 됩니다.

다음의 게시물에서 관련된 질문과 답변을 확인하실 수 있습니다:
- AppConfig의 MemoryMemberRepository는 여러번 new해도 되는 걸까요?
- AppConfig에 관한 질문
- new memoryMemberRepository() 의 주소값 문의

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

u_innovation님의 프로필 이미지
u_innovation

작성한 질문수

질문하기