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

fldkelwl6님의 프로필 이미지
fldkelwl6

작성한 질문수

스프링 핵심 원리 - 기본편

관심사의 분리

OrderApp코드에서 new MemoryMemberRepository에 대한 질문

해결된 질문

작성

·

258

·

수정됨

0

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

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

[질문 내용]
OrderApp에서 appCofig.memberService()와 appCofing.orderService() 를 실행하고, memberService.join과 orderService.createOrder를 실행하는데

memberService()에서 생성된 MemoryMemberRepository와 orderService()에서 생성된 MemoryMemberRepository가 둘 다 new로 다른 객체라고 생각이 되는데 어떻게 createOrder에서 아이디가 1L인 회원을 조회할 수 있는건가요?

join된 메모리와 createOrder에서 하는findById를 실행하는 메모리는 다른 MemoryMemberRepository 객체 아닌가요?

답변 1

1

안녕하세요, 인프런 AI 인턴입니다. fldkelwl6님의 질문은 AppConfig에 정의되어 있는 빈(Bean) 생성 메소드들이 생성하는 MemoryMemberRepository 객체의 동작 방식에 대한 질문으로 보입니다. 이와 관련하여, MemoryMemberRepository 클래스 내부의 상태를 관리하는 Map이 static 으로 선언되었기 때문에, 이 Map은 애플리케이션 내의 모든 MemoryMemberRepository 인스턴스에서 공유되고 있습니다.

이로 인해, 각각 다른 MemoryMemberRepository 인스턴스를 생성하더라도, 그 안에서 사용되는 Map은 동일한 상태를 유지하기 때문에, 어느 저장소에서든 같은 회원 정보에 접근할 수 있게 됩니다.

이와 유사한 질문에 대한 답변이 다음 링크에서 찾아볼 수 있습니다.

  • MemoryMemberRepo 에 대해: 공식 지식공유자가 MemoryMemberRepository 내의 데이터가 static으로 선언되어 있어 모든 인스턴스가 같은 데이터를 공유하게 됨을 설명하고 있습니다.

추가적으로, @Configuration과 싱글톤 질문에서도 @Configuration을 사용하면 스프링이 CGLIB를 통해 같은 빈 인스턴스를 반환하도록 보장해주며, 직접 new 키워드로 객체를 생성하는 것과 @Bean 메소드를 통해 빈을 생성하는 것의 차이에 대해 설명하고 있습니다.

정리해보자면, AppConfig를 통해 MemoryMemberRepository 객체가 여러 번 생성된 것처럼 보이지만, static으로 선언된 Map 변수 덕분에 동일한 메모리 상태를 참조하기 때문에, join() 메소드로 저장된 회원 정보를 createOrder()에서도 참조할 수 있는 것입니다.

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

fldkelwl6님의 프로필 이미지
fldkelwl6

작성한 질문수

질문하기