해결된 질문
작성
·
249
·
수정됨
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은 동일한 상태를 유지하기 때문에, 어느 저장소에서든 같은 회원 정보에 접근할 수 있게 됩니다.
이와 유사한 질문에 대한 답변이 다음 링크에서 찾아볼 수 있습니다.
static
으로 선언되어 있어 모든 인스턴스가 같은 데이터를 공유하게 됨을 설명하고 있습니다.추가적으로, @Configuration과 싱글톤 질문에서도 @Configuration
을 사용하면 스프링이 CGLIB를 통해 같은 빈 인스턴스를 반환하도록 보장해주며, 직접 new
키워드로 객체를 생성하는 것과 @Bean
메소드를 통해 빈을 생성하는 것의 차이에 대해 설명하고 있습니다.
정리해보자면, AppConfig
를 통해 MemoryMemberRepository
객체가 여러 번 생성된 것처럼 보이지만, static
으로 선언된 Map 변수 덕분에 동일한 메모리 상태를 참조하기 때문에, join()
메소드로 저장된 회원 정보를 createOrder()
에서도 참조할 수 있는 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.